Compare commits
90 Commits
v0.77.0-cl
...
add-valida
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0e96aa55c | ||
|
|
597752a4bc | ||
|
|
07a244f569 | ||
|
|
eb9385840f | ||
|
|
30b689037a | ||
|
|
ba33c885d5 | ||
|
|
a4ed9e4d47 | ||
|
|
df5767198c | ||
|
|
81c7f3221a | ||
|
|
2cbd8733a1 | ||
|
|
71d1dfe9bd | ||
|
|
459712d25c | ||
|
|
61de2d414d | ||
|
|
0b7cd4c1a7 | ||
|
|
62c033ccf8 | ||
|
|
e637487984 | ||
|
|
8fc43a00f8 | ||
|
|
031d62ca44 | ||
|
|
8c4c357351 | ||
|
|
d8d8191a32 | ||
|
|
a876c0a744 | ||
|
|
c36f913a90 | ||
|
|
ed597f00c0 | ||
|
|
4957d3ae93 | ||
|
|
8835e3493d | ||
|
|
027a1631ef | ||
|
|
d7a6607a25 | ||
|
|
7a58bc58c9 | ||
|
|
88be23c3e3 | ||
|
|
8f095dfbc9 | ||
|
|
72207691a3 | ||
|
|
8998ca652e | ||
|
|
f4ae5f19ff | ||
|
|
d1ea608671 | ||
|
|
ac7ecac2c1 | ||
|
|
64071165c4 | ||
|
|
9c25a33cd9 | ||
|
|
3100d602c4 | ||
|
|
d80908a1fc | ||
|
|
bc17a10550 | ||
|
|
694c185373 | ||
|
|
02f3dfefb9 | ||
|
|
3515686daf | ||
|
|
c116bf05be | ||
|
|
4842e3b912 | ||
|
|
9bdf194d70 | ||
|
|
88aa29e94c | ||
|
|
1dfebed93a | ||
|
|
b36d2ec4c6 | ||
|
|
089f128020 | ||
|
|
e30f95c340 | ||
|
|
2c87d96d75 | ||
|
|
1f9b13dc35 | ||
|
|
d831c1cb88 | ||
|
|
bc72a0a591 | ||
|
|
ad2b75e3f0 | ||
|
|
efd4e30edf | ||
|
|
f79a5a2db6 | ||
|
|
9d8e46e5b2 | ||
|
|
0320285a25 | ||
|
|
e04e58d8b3 | ||
|
|
fc03303c29 | ||
|
|
95b94a9da7 | ||
|
|
3d3dd98549 | ||
|
|
097e4ca948 | ||
|
|
a64908e571 | ||
|
|
0be9ca272b | ||
|
|
e434e3d142 | ||
|
|
4779300dea | ||
|
|
7a225e0a4f | ||
|
|
53d3de4909 | ||
|
|
4ede88cc1f | ||
|
|
800ca9d329 | ||
|
|
b3fa1ad60e | ||
|
|
5b6b5bf359 | ||
|
|
8a479d42ff | ||
|
|
031e78cb20 | ||
|
|
f992ba9106 | ||
|
|
7118829107 | ||
|
|
5aea442939 | ||
|
|
bf385a9f95 | ||
|
|
c52994ff9e | ||
|
|
a1eb52b034 | ||
|
|
c81760bdf7 | ||
|
|
c26277cd42 | ||
|
|
458bd1171b | ||
|
|
a806ddf74f | ||
|
|
b039dc6fa7 | ||
|
|
08309c380c | ||
|
|
4de5c01fd5 |
5
.github/CODEOWNERS
vendored
@@ -6,5 +6,8 @@
|
||||
/frontend/src/container/MetricsApplication @srikanthccv
|
||||
/frontend/src/container/NewWidget/RightContainer/types.ts @srikanthccv
|
||||
/deploy/ @SigNoz/devops
|
||||
/sample-apps/ @SigNoz/devops
|
||||
.github @SigNoz/devops
|
||||
/pkg/config/ @grandwizard28
|
||||
/pkg/errors/ @grandwizard28
|
||||
/pkg/factory/ @grandwizard28
|
||||
/pkg/types/ @grandwizard28
|
||||
|
||||
128
.github/workflows/build.yaml
vendored
@@ -1,48 +1,122 @@
|
||||
name: build-pipeline
|
||||
name: build
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- release/v*
|
||||
tags:
|
||||
- v*
|
||||
|
||||
jobs:
|
||||
build-frontend:
|
||||
enterprise:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install dependencies
|
||||
run: cd frontend && yarn install
|
||||
- name: Build frontend static files
|
||||
shell: bash
|
||||
run: |
|
||||
make build-frontend-static
|
||||
|
||||
build-signoz:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup golang
|
||||
uses: actions/setup-go@v4
|
||||
- name: setup
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: "1.22"
|
||||
- name: Build signoz image
|
||||
- name: setup-qemu
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: setup-buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
version: latest
|
||||
- name: docker-login
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
- name: create-env-file
|
||||
run: |
|
||||
echo 'INTERCOM_APP_ID="${{ secrets.INTERCOM_APP_ID }}"' > frontend/.env
|
||||
echo 'SEGMENT_ID="${{ secrets.SEGMENT_ID }}"' >> frontend/.env
|
||||
echo 'SENTRY_AUTH_TOKEN="${{ secrets.SENTRY_AUTH_TOKEN }}"' >> frontend/.env
|
||||
echo 'SENTRY_ORG="${{ secrets.SENTRY_ORG }}"' >> frontend/.env
|
||||
echo 'SENTRY_PROJECT_ID="${{ secrets.SENTRY_PROJECT_ID }}"' >> frontend/.env
|
||||
echo 'SENTRY_DSN="${{ secrets.SENTRY_DSN }}"' >> frontend/.env
|
||||
echo 'TUNNEL_URL="${{ secrets.TUNNEL_URL }}"' >> frontend/.env
|
||||
echo 'TUNNEL_DOMAIN="${{ secrets.TUNNEL_DOMAIN }}"' >> frontend/.env
|
||||
echo 'POSTHOG_KEY="${{ secrets.POSTHOG_KEY }}"' >> frontend/.env
|
||||
echo 'CUSTOMERIO_ID="${{ secrets.CUSTOMERIO_ID }}"' >> frontend/.env
|
||||
echo 'CUSTOMERIO_SITE_ID="${{ secrets.CUSTOMERIO_SITE_ID }}"' >> frontend/.env
|
||||
- name: github-ref-info
|
||||
shell: bash
|
||||
run: |
|
||||
make build-signoz-amd64
|
||||
GH_REF=${{ github.ref }}
|
||||
if [[ "${{ github.ref_type }}" == "tag" ]]; then
|
||||
PREFIX="refs/tags/"
|
||||
echo "GH_IS_TAG=true" >> $GITHUB_ENV
|
||||
echo "GH_TAG=${GH_REF#$PREFIX}" >> $GITHUB_ENV
|
||||
else
|
||||
PREFIX="refs/heads/"
|
||||
echo "GH_IS_TAG=false" >> $GITHUB_ENV
|
||||
echo "GH_BRANCH_NAME=${GH_REF#$PREFIX}" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: set-version
|
||||
run: |
|
||||
if [ '${{ env.GH_IS_TAG }}' == 'true' ]; then
|
||||
echo "VERSION=${{ env.GH_TAG }}" >> $GITHUB_ENV
|
||||
elif [ '${{ env.GH_BRANCH_NAME }}' == 'main' ]; then
|
||||
echo "VERSION=latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "VERSION=${{ env.GH_BRANCH_NAME }}" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: cross-compilation-tools
|
||||
run: |
|
||||
set -ex
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc-aarch64-linux-gnu musl-tools
|
||||
- name: publish
|
||||
run: make docker-buildx-enterprise
|
||||
|
||||
build-signoz-community:
|
||||
community:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup golang
|
||||
uses: actions/setup-go@v4
|
||||
- name: setup-go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: "1.22"
|
||||
- name: Build signoz community image
|
||||
- name: setup-qemu
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: setup-buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
version: latest
|
||||
- name: docker-login
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
- name: github-ref-info
|
||||
shell: bash
|
||||
run: |
|
||||
make build-signoz-community-amd64
|
||||
GH_REF=${{ github.ref }}
|
||||
if [[ "${{ github.ref_type }}" == "tag" ]]; then
|
||||
PREFIX="refs/tags/"
|
||||
echo "GH_IS_TAG=true" >> $GITHUB_ENV
|
||||
echo "GH_TAG=${GH_REF#$PREFIX}" >> $GITHUB_ENV
|
||||
else
|
||||
PREFIX="refs/heads/"
|
||||
echo "GH_IS_TAG=false" >> $GITHUB_ENV
|
||||
echo "GH_BRANCH_NAME=${GH_REF#$PREFIX}" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: set-version
|
||||
run: |
|
||||
if [ '${{ env.GH_IS_TAG }}' == 'true' ]; then
|
||||
echo "VERSION=${{ env.GH_TAG }}" >> $GITHUB_ENV
|
||||
elif [ '${{ env.GH_BRANCH_NAME }}' == 'main' ]; then
|
||||
echo "VERSION=latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "VERSION=${{ env.GH_BRANCH_NAME }}" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: cross-compilation-tools
|
||||
run: |
|
||||
set -ex
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc-aarch64-linux-gnu musl-tools
|
||||
- name: publish
|
||||
run: make docker-buildx-community
|
||||
|
||||
12
.github/workflows/commitci.yaml
vendored
@@ -25,15 +25,3 @@ jobs:
|
||||
else
|
||||
echo "No references to 'ee' packages found in 'pkg' directory"
|
||||
fi
|
||||
lint:
|
||||
if: |
|
||||
(github.event_name == 'pull_request' && ! github.event.pull_request.head.repo.fork && github.event.pull_request.user.login != 'dependabot[bot]' && ! contains(github.event.pull_request.labels.*.name, 'safe-to-test')) ||
|
||||
(github.event_name == 'pull_request_target' && contains(github.event.pull_request.labels.*.name, 'safe-to-test'))
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: lint
|
||||
uses: wagoid/commitlint-github-action@v5
|
||||
|
||||
27
.github/workflows/goci.yaml
vendored
@@ -34,3 +34,30 @@ jobs:
|
||||
secrets: inherit
|
||||
with:
|
||||
PRIMUS_REF: main
|
||||
build:
|
||||
if: |
|
||||
(github.event_name == 'pull_request' && ! github.event.pull_request.head.repo.fork && github.event.pull_request.user.login != 'dependabot[bot]' && ! contains(github.event.pull_request.labels.*.name, 'safe-to-test')) ||
|
||||
(github.event_name == 'pull_request_target' && contains(github.event.pull_request.labels.*.name, 'safe-to-test'))
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: self-checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: go-install
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: "1.22"
|
||||
- name: qemu-install
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: aarch64-install
|
||||
run: |
|
||||
set -ex
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc-aarch64-linux-gnu musl-tools
|
||||
- name: docker-community
|
||||
shell: bash
|
||||
run: |
|
||||
make docker-build-community
|
||||
- name: docker-enterprise
|
||||
shell: bash
|
||||
run: |
|
||||
make docker-build-enterprise
|
||||
|
||||
2
.github/workflows/gor-signoz-community.yaml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
run: |
|
||||
echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
|
||||
- name: build-frontend
|
||||
run: make build-frontend-static
|
||||
run: make js-build
|
||||
- name: upload-frontend-artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
|
||||
2
.github/workflows/gor-signoz.yaml
vendored
@@ -36,7 +36,7 @@ jobs:
|
||||
echo 'CUSTOMERIO_ID="${{ secrets.CUSTOMERIO_ID }}"' >> .env
|
||||
echo 'CUSTOMERIO_SITE_ID="${{ secrets.CUSTOMERIO_SITE_ID }}"' >> .env
|
||||
- name: build-frontend
|
||||
run: make build-frontend-static
|
||||
run: make js-build
|
||||
- name: upload-frontend-artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
|
||||
134
.github/workflows/push.yaml
vendored
@@ -1,134 +0,0 @@
|
||||
name: push
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
tags:
|
||||
- v*
|
||||
|
||||
jobs:
|
||||
image-build-and-push-signoz:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: setup
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: "1.22"
|
||||
- name: setup-qemu
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: setup-buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
version: latest
|
||||
- name: docker-login
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
- name: create-env-file
|
||||
run: |
|
||||
echo 'INTERCOM_APP_ID="${{ secrets.INTERCOM_APP_ID }}"' > frontend/.env
|
||||
echo 'SEGMENT_ID="${{ secrets.SEGMENT_ID }}"' >> frontend/.env
|
||||
echo 'SENTRY_AUTH_TOKEN="${{ secrets.SENTRY_AUTH_TOKEN }}"' >> frontend/.env
|
||||
echo 'SENTRY_ORG="${{ secrets.SENTRY_ORG }}"' >> frontend/.env
|
||||
echo 'SENTRY_PROJECT_ID="${{ secrets.SENTRY_PROJECT_ID }}"' >> frontend/.env
|
||||
echo 'SENTRY_DSN="${{ secrets.SENTRY_DSN }}"' >> frontend/.env
|
||||
echo 'TUNNEL_URL="${{ secrets.TUNNEL_URL }}"' >> frontend/.env
|
||||
echo 'TUNNEL_DOMAIN="${{ secrets.TUNNEL_DOMAIN }}"' >> frontend/.env
|
||||
echo 'POSTHOG_KEY="${{ secrets.POSTHOG_KEY }}"' >> frontend/.env
|
||||
echo 'CUSTOMERIO_ID="${{ secrets.CUSTOMERIO_ID }}"' >> frontend/.env
|
||||
echo 'CUSTOMERIO_SITE_ID="${{ secrets.CUSTOMERIO_SITE_ID }}"' >> frontend/.env
|
||||
- uses: benjlevesque/short-sha@v2.2
|
||||
id: short-sha
|
||||
- name: branch-name
|
||||
id: branch-name
|
||||
uses: tj-actions/branch-names@v7.0.7
|
||||
- name: docker-tag
|
||||
run: |
|
||||
if [ '${{ steps.branch-name.outputs.is_tag }}' == 'true' ]; then
|
||||
echo "DOCKER_TAG=${{ steps.branch-name.outputs.tag }}" >> $GITHUB_ENV
|
||||
elif [ '${{ steps.branch-name.outputs.current_branch }}' == 'main' ]; then
|
||||
echo "DOCKER_TAG=latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "DOCKER_TAG=${{ steps.branch-name.outputs.current_branch }}" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: cross-compilation-tools
|
||||
run: |
|
||||
set -ex
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc-aarch64-linux-gnu musl-tools
|
||||
- name: publish-signoz
|
||||
run: make build-push-signoz
|
||||
- name: qs-docker-tag
|
||||
run: |
|
||||
if [ '${{ steps.branch-name.outputs.is_tag }}' == 'true' ]; then
|
||||
tag="${{ steps.branch-name.outputs.tag }}"
|
||||
tag="${tag:1}"
|
||||
echo "DOCKER_TAG=${tag}" >> $GITHUB_ENV
|
||||
elif [ '${{ steps.branch-name.outputs.current_branch }}' == 'main' ]; then
|
||||
echo "DOCKER_TAG=latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "DOCKER_TAG=${{ steps.branch-name.outputs.current_branch }}" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: publish-query-service
|
||||
run: |
|
||||
SIGNOZ_DOCKER_IMAGE=query-service make build-push-signoz
|
||||
|
||||
image-build-and-push-signoz-community:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: setup-go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: "1.22"
|
||||
- name: setup-qemu
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: setup-buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
version: latest
|
||||
- name: docker-login
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
- uses: benjlevesque/short-sha@v2.2
|
||||
id: short-sha
|
||||
- name: branch-name
|
||||
id: branch-name
|
||||
uses: tj-actions/branch-names@v7.0.7
|
||||
- name: docker-tag
|
||||
run: |
|
||||
if [ '${{ steps.branch-name.outputs.is_tag }}' == 'true' ]; then
|
||||
echo "DOCKER_TAG=${{ steps.branch-name.outputs.tag }}" >> $GITHUB_ENV
|
||||
elif [ '${{ steps.branch-name.outputs.current_branch }}' == 'main' ]; then
|
||||
echo "DOCKER_TAG=latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "DOCKER_TAG=${{ steps.branch-name.outputs.current_branch }}" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: cross-compilation-tools
|
||||
run: |
|
||||
set -ex
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc-aarch64-linux-gnu musl-tools
|
||||
- name: publish-signoz-community
|
||||
run: make build-push-signoz-community
|
||||
- name: qs-docker-tag
|
||||
run: |
|
||||
if [ '${{ steps.branch-name.outputs.is_tag }}' == 'true' ]; then
|
||||
tag="${{ steps.branch-name.outputs.tag }}"
|
||||
tag="${tag:1}"
|
||||
echo "DOCKER_TAG=${tag}-oss" >> $GITHUB_ENV
|
||||
elif [ '${{ steps.branch-name.outputs.current_branch }}' == 'main' ]; then
|
||||
echo "DOCKER_TAG=latest-oss" >> $GITHUB_ENV
|
||||
else
|
||||
echo "DOCKER_TAG=${{ steps.branch-name.outputs.current_branch }}-oss" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: publish-query-service-oss
|
||||
run: |
|
||||
SIGNOZ_COMMUNITY_DOCKER_IMAGE=query-service make build-push-signoz-community
|
||||
7
.github/workflows/staging-deployment.yaml
vendored
@@ -35,7 +35,7 @@ jobs:
|
||||
read -r -d '' COMMAND <<EOF || true
|
||||
echo "GITHUB_BRANCH: ${GITHUB_BRANCH}"
|
||||
echo "GITHUB_SHA: ${GITHUB_SHA}"
|
||||
export DOCKER_TAG="${GITHUB_SHA:0:7}" # needed for child process to access it
|
||||
export VERSION="${GITHUB_SHA:0:7}" # needed for child process to access it
|
||||
export OTELCOL_TAG="main"
|
||||
export PATH="/usr/local/go/bin/:$PATH" # needed for Golang to work
|
||||
export KAFKA_SPAN_EVAL="true"
|
||||
@@ -49,7 +49,8 @@ jobs:
|
||||
git fetch origin
|
||||
git checkout ${GITHUB_BRANCH}
|
||||
git pull
|
||||
make build-signoz-amd64
|
||||
make run-testing
|
||||
make docker-build-enterprise-amd64
|
||||
export VERSION="${GITHUB_SHA:0:7}-amd64"
|
||||
docker-compose -f deploy/docker/docker-compose.testing.yaml up --build -d
|
||||
EOF
|
||||
gcloud beta compute ssh ${GCP_INSTANCE} --zone ${GCP_ZONE} --ssh-key-expire-after=15m --tunnel-through-iap --project ${GCP_PROJECT} --command "${COMMAND}"
|
||||
|
||||
7
.github/workflows/testing-deployment.yaml
vendored
@@ -35,7 +35,7 @@ jobs:
|
||||
read -r -d '' COMMAND <<EOF || true
|
||||
echo "GITHUB_BRANCH: ${GITHUB_BRANCH}"
|
||||
echo "GITHUB_SHA: ${GITHUB_SHA}"
|
||||
export DOCKER_TAG="${GITHUB_SHA:0:7}" # needed for child process to access it
|
||||
export VERSION="${GITHUB_SHA:0:7}" # needed for child process to access it
|
||||
export DEV_BUILD="1"
|
||||
export PATH="/usr/local/go/bin/:$PATH" # needed for Golang to work
|
||||
docker system prune --force
|
||||
@@ -49,7 +49,8 @@ jobs:
|
||||
# This is added to include the scenerio when new commit in PR is force-pushed
|
||||
git branch -D ${GITHUB_BRANCH}
|
||||
git checkout --track origin/${GITHUB_BRANCH}
|
||||
make build-signoz-amd64
|
||||
make run-testing
|
||||
make docker-build-enterprise-amd64
|
||||
export VERSION="${GITHUB_SHA:0:7}-amd64"
|
||||
docker-compose -f deploy/docker/docker-compose.testing.yaml up --build -d
|
||||
EOF
|
||||
gcloud beta compute ssh ${GCP_INSTANCE} --zone ${GCP_ZONE} --ssh-key-expire-after=15m --tunnel-through-iap --project ${GCP_PROJECT} --command "${COMMAND}"
|
||||
|
||||
1
.gitignore
vendored
@@ -54,6 +54,7 @@ ee/query-service/tests/test-deploy/data/
|
||||
bin/
|
||||
.local/
|
||||
*/query-service/queries.active
|
||||
ee/query-service/db
|
||||
|
||||
# e2e
|
||||
|
||||
|
||||
@@ -77,3 +77,4 @@ Need assistance? Join our Slack community:
|
||||
## Where do I go from here?
|
||||
|
||||
- Set up your [development environment](docs/contributing/development.md)
|
||||
- Deploy and observe [SigNoz in action with OpenTelemetry Demo Application](docs/otel-demo-docs.md)
|
||||
|
||||
294
Makefile
@@ -1,49 +1,44 @@
|
||||
#
|
||||
# Reference Guide - https://www.gnu.org/software/make/manual/make.html
|
||||
#
|
||||
##############################################################
|
||||
# variables
|
||||
##############################################################
|
||||
SHELL := /bin/bash
|
||||
SRC ?= $(shell pwd)
|
||||
NAME ?= signoz
|
||||
OS ?= $(shell uname -s | tr '[A-Z]' '[a-z]')
|
||||
ARCH ?= $(shell uname -m | sed 's/x86_64/amd64/g' | sed 's/aarch64/arm64/g')
|
||||
COMMIT_SHORT_SHA ?= $(shell git rev-parse --short HEAD)
|
||||
BRANCH_NAME ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD))
|
||||
VERSION ?= $(BRANCH_NAME)-$(COMMIT_SHORT_SHA)
|
||||
TIMESTAMP ?= $(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||||
ARCHS = amd64 arm64
|
||||
TARGET_DIR ?= $(shell pwd)/target
|
||||
|
||||
# Build variables
|
||||
BUILD_VERSION ?= $(shell git describe --always --tags)
|
||||
BUILD_HASH ?= $(shell git rev-parse --short HEAD)
|
||||
BUILD_TIME ?= $(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||||
BUILD_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)
|
||||
LICENSE_SIGNOZ_IO ?= https://license.signoz.io/api/v1
|
||||
DEV_LICENSE_SIGNOZ_IO ?= https://staging-license.signoz.io/api/v1
|
||||
ZEUS_URL ?= https://api.signoz.cloud
|
||||
DEV_ZEUS_URL ?= https://api.staging.signoz.cloud
|
||||
DEV_BUILD ?= "" # set to any non-empty value to enable dev build
|
||||
ZEUS_URL ?= https://api.signoz.cloud
|
||||
GO_BUILD_LDFLAG_ZEUS_URL = -X github.com/SigNoz/signoz/ee/query-service/constants.ZeusURL=$(ZEUS_URL)
|
||||
LICENSE_URL ?= https://license.signoz.io/api/v1
|
||||
GO_BUILD_LDFLAG_LICENSE_SIGNOZ_IO = -X github.com/SigNoz/signoz/ee/query-service/constants.LicenseSignozIo=$(LICENSE_URL)
|
||||
|
||||
# Internal variables or constants.
|
||||
FRONTEND_DIRECTORY ?= frontend
|
||||
QUERY_SERVICE_DIRECTORY ?= pkg/query-service
|
||||
EE_QUERY_SERVICE_DIRECTORY ?= ee/query-service
|
||||
STANDALONE_DIRECTORY ?= deploy/docker
|
||||
SWARM_DIRECTORY ?= deploy/docker-swarm
|
||||
CH_HISTOGRAM_QUANTILE_DIRECTORY ?= scripts/clickhouse/histogramquantile
|
||||
GORELEASER_BIN ?= goreleaser
|
||||
GO_BUILD_VERSION_LDFLAGS = -X github.com/SigNoz/signoz/pkg/version.version=$(VERSION) -X github.com/SigNoz/signoz/pkg/version.hash=$(COMMIT_SHORT_SHA) -X github.com/SigNoz/signoz/pkg/version.time=$(TIMESTAMP) -X github.com/SigNoz/signoz/pkg/version.branch=$(BRANCH_NAME)
|
||||
GO_BUILD_ARCHS_COMMUNITY = $(addprefix go-build-community-,$(ARCHS))
|
||||
GO_BUILD_CONTEXT_COMMUNITY = $(SRC)/pkg/query-service
|
||||
GO_BUILD_LDFLAGS_COMMUNITY = $(GO_BUILD_VERSION_LDFLAGS) -X github.com/SigNoz/signoz/pkg/version.variant=community
|
||||
GO_BUILD_ARCHS_ENTERPRISE = $(addprefix go-build-enterprise-,$(ARCHS))
|
||||
GO_BUILD_CONTEXT_ENTERPRISE = $(SRC)/ee/query-service
|
||||
GO_BUILD_LDFLAGS_ENTERPRISE = $(GO_BUILD_VERSION_LDFLAGS) -X github.com/SigNoz/signoz/pkg/version.variant=enterprise $(GO_BUILD_LDFLAG_ZEUS_URL) $(GO_BUILD_LDFLAG_LICENSE_SIGNOZ_IO)
|
||||
|
||||
GOOS ?= $(shell go env GOOS)
|
||||
GOARCH ?= $(shell go env GOARCH)
|
||||
GOPATH ?= $(shell go env GOPATH)
|
||||
|
||||
REPONAME ?= signoz
|
||||
DOCKER_TAG ?= $(BUILD_VERSION)
|
||||
SIGNOZ_DOCKER_IMAGE ?= signoz
|
||||
SIGNOZ_COMMUNITY_DOCKER_IMAGE ?= signoz-community
|
||||
|
||||
# Build-time Go variables
|
||||
PACKAGE?=go.signoz.io/signoz
|
||||
buildVersion=${PACKAGE}/pkg/query-service/version.buildVersion
|
||||
buildHash=${PACKAGE}/pkg/query-service/version.buildHash
|
||||
buildTime=${PACKAGE}/pkg/query-service/version.buildTime
|
||||
gitBranch=${PACKAGE}/pkg/query-service/version.gitBranch
|
||||
licenseSignozIo=${PACKAGE}/ee/query-service/constants.LicenseSignozIo
|
||||
zeusURL=${PACKAGE}/ee/query-service/constants.ZeusURL
|
||||
|
||||
LD_FLAGS=-X ${buildHash}=${BUILD_HASH} -X ${buildTime}=${BUILD_TIME} -X ${buildVersion}=${BUILD_VERSION} -X ${gitBranch}=${BUILD_BRANCH}
|
||||
PROD_LD_FLAGS=-X ${zeusURL}=${ZEUS_URL} -X ${licenseSignozIo}=${LICENSE_SIGNOZ_IO}
|
||||
DEV_LD_FLAGS=-X ${zeusURL}=${DEV_ZEUS_URL} -X ${licenseSignozIo}=${DEV_LICENSE_SIGNOZ_IO}
|
||||
DOCKER_BUILD_ARCHS_COMMUNITY = $(addprefix docker-build-community-,$(ARCHS))
|
||||
DOCKERFILE_COMMUNITY = $(SRC)/pkg/query-service/Dockerfile
|
||||
DOCKER_REGISTRY_COMMUNITY ?= docker.io/signoz/signoz-community
|
||||
DOCKER_BUILD_ARCHS_ENTERPRISE = $(addprefix docker-build-enterprise-,$(ARCHS))
|
||||
DOCKERFILE_ENTERPRISE = $(SRC)/ee/query-service/Dockerfile
|
||||
DOCKER_REGISTRY_ENTERPRISE ?= docker.io/signoz/signoz
|
||||
JS_BUILD_CONTEXT = $(SRC)/frontend
|
||||
|
||||
##############################################################
|
||||
# directories
|
||||
##############################################################
|
||||
$(TARGET_DIR):
|
||||
mkdir -p $(TARGET_DIR)
|
||||
|
||||
##############################################################
|
||||
# common commands
|
||||
@@ -61,10 +56,10 @@ devenv-clickhouse: ## Run clickhouse in devenv
|
||||
docker compose -f compose.yaml up -d
|
||||
|
||||
##############################################################
|
||||
# run commands
|
||||
# go commands
|
||||
##############################################################
|
||||
.PHONY: run-go
|
||||
run-go: ## Runs the go backend server
|
||||
.PHONY: go-run-enterprise
|
||||
go-run-enterprise: ## Runs the enterprise go backend server
|
||||
@SIGNOZ_INSTRUMENTATION_LOGS_LEVEL=debug \
|
||||
SIGNOZ_SQLSTORE_SQLITE_PATH=signoz.db \
|
||||
SIGNOZ_WEB_ENABLED=false \
|
||||
@@ -73,147 +68,102 @@ run-go: ## Runs the go backend server
|
||||
SIGNOZ_TELEMETRYSTORE_PROVIDER=clickhouse \
|
||||
SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://127.0.0.1:9000 \
|
||||
go run -race \
|
||||
./ee/query-service/main.go \
|
||||
--config ./pkg/query-service/config/prometheus.yml \
|
||||
$(GO_BUILD_CONTEXT_ENTERPRISE)/main.go \
|
||||
--config ./conf/prometheus.yml \
|
||||
--cluster cluster \
|
||||
--use-logs-new-schema true \
|
||||
--use-trace-new-schema true
|
||||
|
||||
all: build-push-frontend build-push-signoz
|
||||
.PHONY: go-test
|
||||
go-test: ## Runs go unit tests
|
||||
@go test -race ./...
|
||||
|
||||
# Steps to build static files of frontend
|
||||
build-frontend-static:
|
||||
@echo "------------------"
|
||||
@echo "--> Building frontend static files"
|
||||
@echo "------------------"
|
||||
@cd $(FRONTEND_DIRECTORY) && \
|
||||
rm -rf build && \
|
||||
CI=1 yarn install && \
|
||||
yarn build && \
|
||||
ls -l build
|
||||
.PHONY: go-run-community
|
||||
go-run-community: ## Runs the community go backend server
|
||||
@SIGNOZ_INSTRUMENTATION_LOGS_LEVEL=debug \
|
||||
SIGNOZ_SQLSTORE_SQLITE_PATH=signoz.db \
|
||||
SIGNOZ_WEB_ENABLED=false \
|
||||
SIGNOZ_JWT_SECRET=secret \
|
||||
SIGNOZ_ALERTMANAGER_PROVIDER=signoz \
|
||||
SIGNOZ_TELEMETRYSTORE_PROVIDER=clickhouse \
|
||||
SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://127.0.0.1:9000 \
|
||||
go run -race \
|
||||
$(GO_BUILD_CONTEXT_COMMUNITY)/main.go \
|
||||
--config ./conf/prometheus.yml \
|
||||
--cluster cluster \
|
||||
--use-logs-new-schema true \
|
||||
--use-trace-new-schema true
|
||||
|
||||
# Steps to build static binary of signoz
|
||||
.PHONY: build-signoz-static
|
||||
build-signoz-static:
|
||||
@echo "------------------"
|
||||
@echo "--> Building signoz static binary"
|
||||
@echo "------------------"
|
||||
@if [ $(DEV_BUILD) != "" ]; then \
|
||||
cd $(EE_QUERY_SERVICE_DIRECTORY) && \
|
||||
CGO_ENABLED=1 go build -tags timetzdata -a -o ./bin/signoz-${GOOS}-${GOARCH} \
|
||||
-ldflags "-linkmode external -extldflags '-static' -s -w ${LD_FLAGS} ${DEV_LD_FLAGS}"; \
|
||||
.PHONY: go-build-community $(GO_BUILD_ARCHS_COMMUNITY)
|
||||
go-build-community: ## Builds the go backend server for community
|
||||
go-build-community: $(GO_BUILD_ARCHS_COMMUNITY)
|
||||
$(GO_BUILD_ARCHS_COMMUNITY): go-build-community-%: $(TARGET_DIR)
|
||||
@mkdir -p $(TARGET_DIR)/$(OS)-$*
|
||||
@echo ">> building binary $(TARGET_DIR)/$(OS)-$*/$(NAME)-community"
|
||||
@if [ $* = "arm64" ]; then \
|
||||
CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOARCH=$* GOOS=$(OS) go build -C $(GO_BUILD_CONTEXT_COMMUNITY) -tags timetzdata -o $(TARGET_DIR)/$(OS)-$*/$(NAME)-community -ldflags "-linkmode external -extldflags '-static' -s -w $(GO_BUILD_LDFLAGS_COMMUNITY)"; \
|
||||
else \
|
||||
cd $(EE_QUERY_SERVICE_DIRECTORY) && \
|
||||
CGO_ENABLED=1 go build -tags timetzdata -a -o ./bin/signoz-${GOOS}-${GOARCH} \
|
||||
-ldflags "-linkmode external -extldflags '-static' -s -w ${LD_FLAGS} ${PROD_LD_FLAGS}"; \
|
||||
CGO_ENABLED=1 GOARCH=$* GOOS=$(OS) go build -C $(GO_BUILD_CONTEXT_COMMUNITY) -tags timetzdata -o $(TARGET_DIR)/$(OS)-$*/$(NAME)-community -ldflags "-linkmode external -extldflags '-static' -s -w $(GO_BUILD_LDFLAGS_COMMUNITY)"; \
|
||||
fi
|
||||
|
||||
.PHONY: build-signoz-static-amd64
|
||||
build-signoz-static-amd64:
|
||||
make GOARCH=amd64 build-signoz-static
|
||||
|
||||
.PHONY: build-signoz-static-arm64
|
||||
build-signoz-static-arm64:
|
||||
make CC=aarch64-linux-gnu-gcc GOARCH=arm64 build-signoz-static
|
||||
|
||||
# Steps to build static binary of signoz for all platforms
|
||||
.PHONY: build-signoz-static-all
|
||||
build-signoz-static-all: build-signoz-static-amd64 build-signoz-static-arm64 build-frontend-static
|
||||
|
||||
# Steps to build and push docker image of signoz
|
||||
.PHONY: build-signoz-amd64 build-push-signoz
|
||||
# Step to build docker image of signoz in amd64 (used in build pipeline)
|
||||
build-signoz-amd64: build-signoz-static-amd64 build-frontend-static
|
||||
@echo "------------------"
|
||||
@echo "--> Building signoz docker image for amd64"
|
||||
@echo "------------------"
|
||||
@docker build --file $(EE_QUERY_SERVICE_DIRECTORY)/Dockerfile \
|
||||
--tag $(REPONAME)/$(SIGNOZ_DOCKER_IMAGE):$(DOCKER_TAG) \
|
||||
--build-arg TARGETPLATFORM="linux/amd64" .
|
||||
|
||||
# Step to build and push docker image of query in amd64 and arm64 (used in push pipeline)
|
||||
build-push-signoz: build-signoz-static-all
|
||||
@echo "------------------"
|
||||
@echo "--> Building and pushing signoz docker image"
|
||||
@echo "------------------"
|
||||
@docker buildx build --file $(EE_QUERY_SERVICE_DIRECTORY)/Dockerfile --progress plain \
|
||||
--push --platform linux/arm64,linux/amd64 \
|
||||
--tag $(REPONAME)/$(SIGNOZ_DOCKER_IMAGE):$(DOCKER_TAG) .
|
||||
|
||||
# Step to build docker image of signoz community in amd64 (used in build pipeline)
|
||||
build-signoz-community-amd64:
|
||||
@echo "------------------"
|
||||
@echo "--> Building signoz docker image for amd64"
|
||||
@echo "------------------"
|
||||
make EE_QUERY_SERVICE_DIRECTORY=${QUERY_SERVICE_DIRECTORY} SIGNOZ_DOCKER_IMAGE=${SIGNOZ_COMMUNITY_DOCKER_IMAGE} build-signoz-amd64
|
||||
|
||||
# Step to build and push docker image of signoz community in amd64 and arm64 (used in push pipeline)
|
||||
build-push-signoz-community:
|
||||
@echo "------------------"
|
||||
@echo "--> Building and pushing signoz community docker image"
|
||||
@echo "------------------"
|
||||
make EE_QUERY_SERVICE_DIRECTORY=${QUERY_SERVICE_DIRECTORY} SIGNOZ_DOCKER_IMAGE=${SIGNOZ_COMMUNITY_DOCKER_IMAGE} build-push-signoz
|
||||
|
||||
pull-signoz:
|
||||
@docker-compose -f $(STANDALONE_DIRECTORY)/docker-compose.yaml pull
|
||||
|
||||
run-signoz:
|
||||
@docker-compose -f $(STANDALONE_DIRECTORY)/docker-compose.yaml up --build -d
|
||||
|
||||
run-testing:
|
||||
@docker-compose -f $(STANDALONE_DIRECTORY)/docker-compose.testing.yaml up --build -d
|
||||
|
||||
down-signoz:
|
||||
@docker-compose -f $(STANDALONE_DIRECTORY)/docker-compose.yaml down -v
|
||||
|
||||
check-no-ee-references:
|
||||
@echo "Checking for 'ee' package references in 'pkg' directory..."
|
||||
@if grep -R --include="*.go" '.*/ee/.*' pkg/; then \
|
||||
echo "Error: Found references to 'ee' packages in 'pkg' directory"; \
|
||||
exit 1; \
|
||||
.PHONY: go-build-enterprise $(GO_BUILD_ARCHS_ENTERPRISE)
|
||||
go-build-enterprise: ## Builds the go backend server for enterprise
|
||||
go-build-enterprise: $(GO_BUILD_ARCHS_ENTERPRISE)
|
||||
$(GO_BUILD_ARCHS_ENTERPRISE): go-build-enterprise-%: $(TARGET_DIR)
|
||||
@mkdir -p $(TARGET_DIR)/$(OS)-$*
|
||||
@echo ">> building binary $(TARGET_DIR)/$(OS)-$*/$(NAME)"
|
||||
@if [ $* = "arm64" ]; then \
|
||||
CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOARCH=$* GOOS=$(OS) go build -C $(GO_BUILD_CONTEXT_ENTERPRISE) -tags timetzdata -o $(TARGET_DIR)/$(OS)-$*/$(NAME) -ldflags "-linkmode external -extldflags '-static' -s -w $(GO_BUILD_LDFLAGS_ENTERPRISE)"; \
|
||||
else \
|
||||
echo "No references to 'ee' packages found in 'pkg' directory"; \
|
||||
CGO_ENABLED=1 GOARCH=$* GOOS=$(OS) go build -C $(GO_BUILD_CONTEXT_ENTERPRISE) -tags timetzdata -o $(TARGET_DIR)/$(OS)-$*/$(NAME) -ldflags "-linkmode external -extldflags '-static' -s -w $(GO_BUILD_LDFLAGS_ENTERPRISE)"; \
|
||||
fi
|
||||
|
||||
test:
|
||||
go test ./pkg/...
|
||||
##############################################################
|
||||
# js commands
|
||||
##############################################################
|
||||
.PHONY: js-build
|
||||
js-build: ## Builds the js frontend
|
||||
@echo ">> building js frontend"
|
||||
@cd $(JS_BUILD_CONTEXT) && CI=1 yarn install && yarn build
|
||||
|
||||
########################################################
|
||||
# Goreleaser
|
||||
########################################################
|
||||
.PHONY: gor-snapshot gor-snapshot-histogram-quantile gor-snapshot-signoz gor-snapshot-signoz-community gor-split gor-split-histogram-quantile gor-split-signoz gor-split-signoz-community gor-merge
|
||||
##############################################################
|
||||
# docker commands
|
||||
##############################################################
|
||||
.PHONY: docker-build-community $(DOCKER_BUILD_ARCHS_COMMUNITY)
|
||||
docker-build-community: ## Builds the docker image for community
|
||||
docker-build-community: $(DOCKER_BUILD_ARCHS_COMMUNITY)
|
||||
$(DOCKER_BUILD_ARCHS_COMMUNITY): docker-build-community-%: go-build-community-% js-build
|
||||
@echo ">> building docker image for $(NAME)-community"
|
||||
@docker build -t "$(DOCKER_REGISTRY_COMMUNITY):$(VERSION)-$*" \
|
||||
--build-arg TARGETARCH="$*" \
|
||||
-f $(DOCKERFILE_COMMUNITY) $(SRC)
|
||||
|
||||
gor-snapshot:
|
||||
@if [[ ${GORELEASER_WORKDIR} ]]; then \
|
||||
${GORELEASER_BIN} release --config ${GORELEASER_WORKDIR}/.goreleaser.yaml --clean --snapshot; \
|
||||
else \
|
||||
${GORELEASER_BIN} release --clean --snapshot; \
|
||||
fi
|
||||
.PHONY: docker-buildx-community
|
||||
docker-buildx-community: ## Builds the docker image for community using buildx
|
||||
docker-buildx-community: go-build-community js-build
|
||||
@echo ">> building docker image for $(NAME)-community"
|
||||
@docker buildx build --file $(DOCKERFILE_COMMUNITY) \
|
||||
--progress plain \
|
||||
--platform linux/arm64,linux/amd64 \
|
||||
--push \
|
||||
--tag $(DOCKER_REGISTRY_COMMUNITY):$(VERSION) $(SRC)
|
||||
|
||||
gor-snapshot-histogram-quantile:
|
||||
make GORELEASER_WORKDIR=$(CH_HISTOGRAM_QUANTILE_DIRECTORY) goreleaser-snapshot
|
||||
.PHONY: docker-build-enterprise $(DOCKER_BUILD_ARCHS_ENTERPRISE)
|
||||
docker-build-enterprise: ## Builds the docker image for enterprise
|
||||
docker-build-enterprise: $(DOCKER_BUILD_ARCHS_ENTERPRISE)
|
||||
$(DOCKER_BUILD_ARCHS_ENTERPRISE): docker-build-enterprise-%: go-build-enterprise-% js-build
|
||||
@echo ">> building docker image for $(NAME)"
|
||||
@docker build -t "$(DOCKER_REGISTRY_ENTERPRISE):$(VERSION)-$*" \
|
||||
--build-arg TARGETARCH="$*" \
|
||||
-f $(DOCKERFILE_ENTERPRISE) $(SRC)
|
||||
|
||||
gor-snapshot-signoz: build-frontend-static
|
||||
make GORELEASER_WORKDIR=$(EE_QUERY_SERVICE_DIRECTORY) goreleaser-snapshot
|
||||
|
||||
gor-snapshot-signoz-community: build-frontend-static
|
||||
make GORELEASER_WORKDIR=$(QUERY_SERVICE_DIRECTORY) goreleaser-snapshot
|
||||
|
||||
gor-split:
|
||||
@if [[ ${GORELEASER_WORKDIR} ]]; then \
|
||||
${GORELEASER_BIN} release --config ${GORELEASER_WORKDIR}/.goreleaser.yaml --clean --split; \
|
||||
else \
|
||||
${GORELEASER_BIN} release --clean --split; \
|
||||
fi
|
||||
|
||||
gor-split-histogram-quantile:
|
||||
make GORELEASER_WORKDIR=$(CH_HISTOGRAM_QUANTILE_DIRECTORY) goreleaser-split
|
||||
|
||||
gor-split-signoz: build-frontend-static
|
||||
make GORELEASER_WORKDIR=$(EE_QUERY_SERVICE_DIRECTORY) goreleaser-split
|
||||
|
||||
gor-split-signoz-community: build-frontend-static
|
||||
make GORELEASER_WORKDIR=$(QUERY_SERVICE_DIRECTORY) goreleaser-split
|
||||
|
||||
gor-merge:
|
||||
${GORELEASER_BIN} continue --merge
|
||||
.PHONY: docker-buildx-enterprise
|
||||
docker-buildx-enterprise: ## Builds the docker image for enterprise using buildx
|
||||
docker-buildx-enterprise: go-build-enterprise js-build
|
||||
@echo ">> building docker image for $(NAME)"
|
||||
@docker buildx build --file $(DOCKERFILE_ENTERPRISE) \
|
||||
--progress plain \
|
||||
--platform linux/arm64,linux/amd64 \
|
||||
--push \
|
||||
--tag $(DOCKER_REGISTRY_ENTERPRISE):$(VERSION) $(SRC)
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
# Do not modify this file
|
||||
#
|
||||
|
||||
##################### Version #####################
|
||||
version:
|
||||
banner:
|
||||
# Whether to enable the version banner on startup.
|
||||
enabled: true
|
||||
|
||||
##################### Instrumentation #####################
|
||||
instrumentation:
|
||||
logs:
|
||||
@@ -66,7 +72,6 @@ sqlstore:
|
||||
# The path to the SQLite database file.
|
||||
path: /var/lib/signoz/signoz.db
|
||||
|
||||
|
||||
##################### APIServer #####################
|
||||
apiserver:
|
||||
timeout:
|
||||
@@ -82,21 +87,32 @@ apiserver:
|
||||
# List of routes to exclude from request responselogging.
|
||||
excluded_routes:
|
||||
- /api/v1/health
|
||||
|
||||
- /api/v1/version
|
||||
- /
|
||||
|
||||
##################### TelemetryStore #####################
|
||||
telemetrystore:
|
||||
# Specifies the telemetrystore provider to use.
|
||||
provider: clickhouse
|
||||
# Maximum number of idle connections in the connection pool.
|
||||
max_idle_conns: 50
|
||||
# Maximum number of open connections to the database.
|
||||
max_open_conns: 100
|
||||
# Maximum time to wait for a connection to be established.
|
||||
dial_timeout: 5s
|
||||
# Specifies the telemetrystore provider to use.
|
||||
provider: clickhouse
|
||||
clickhouse:
|
||||
# The DSN to use for ClickHouse.
|
||||
dsn: http://localhost:9000
|
||||
# The DSN to use for clickhouse.
|
||||
dsn: tcp://localhost:9000
|
||||
|
||||
##################### Prometheus #####################
|
||||
prometheus:
|
||||
active_query_tracker:
|
||||
# Whether to enable the active query tracker.
|
||||
enabled: true
|
||||
# The path to use for the active query tracker.
|
||||
path: ""
|
||||
# The maximum number of concurrent queries.
|
||||
max_concurrent: 20
|
||||
|
||||
##################### Alertmanager #####################
|
||||
alertmanager:
|
||||
@@ -109,7 +125,7 @@ alertmanager:
|
||||
# The poll interval for periodically syncing the alertmanager with the config in the store.
|
||||
poll_interval: 1m
|
||||
# The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself.
|
||||
external_url: http://localhost:9093
|
||||
external_url: http://localhost:8080
|
||||
# The global configuration for the alertmanager. All the exahustive fields can be found in the upstream: https://github.com/prometheus/alertmanager/blob/efa05feffd644ba4accb526e98a8c6545d26a783/config/config.go#L833
|
||||
global:
|
||||
# ResolveTimeout is the time after which an alert is declared resolved if it has not been updated.
|
||||
|
||||
@@ -174,13 +174,13 @@ services:
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
signoz:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz:v0.76.0
|
||||
image: signoz/signoz:v0.76.2
|
||||
command:
|
||||
- --config=/root/config/prometheus.yml
|
||||
- --use-logs-new-schema=true
|
||||
- --use-trace-new-schema=true
|
||||
# ports:
|
||||
# - "8080:8080" # signoz port
|
||||
ports:
|
||||
- "8080:8080" # signoz port
|
||||
# - "6060:6060" # pprof port
|
||||
volumes:
|
||||
- ../common/signoz/prometheus.yml:/root/config/prometheus.yml
|
||||
@@ -208,7 +208,7 @@ services:
|
||||
retries: 3
|
||||
otel-collector:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz-otel-collector:0.111.30
|
||||
image: signoz/signoz-otel-collector:v0.111.34
|
||||
command:
|
||||
- --config=/etc/otel-collector-config.yaml
|
||||
- --manager-config=/etc/manager-config.yaml
|
||||
@@ -232,7 +232,7 @@ services:
|
||||
- signoz
|
||||
schema-migrator:
|
||||
!!merge <<: *common
|
||||
image: signoz/signoz-schema-migrator:0.111.30
|
||||
image: signoz/signoz-schema-migrator:v0.111.34
|
||||
deploy:
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
|
||||
@@ -110,13 +110,13 @@ services:
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
signoz:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz:v0.76.0
|
||||
image: signoz/signoz:v0.76.2
|
||||
command:
|
||||
- --config=/root/config/prometheus.yml
|
||||
- --use-logs-new-schema=true
|
||||
- --use-trace-new-schema=true
|
||||
# ports:
|
||||
# - "8080:8080" # signoz port
|
||||
ports:
|
||||
- "8080:8080" # signoz port
|
||||
# - "6060:6060" # pprof port
|
||||
volumes:
|
||||
- ../common/signoz/prometheus.yml:/root/config/prometheus.yml
|
||||
@@ -143,7 +143,7 @@ services:
|
||||
retries: 3
|
||||
otel-collector:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz-otel-collector:0.111.30
|
||||
image: signoz/signoz-otel-collector:v0.111.34
|
||||
command:
|
||||
- --config=/etc/otel-collector-config.yaml
|
||||
- --manager-config=/etc/manager-config.yaml
|
||||
@@ -167,7 +167,7 @@ services:
|
||||
- signoz
|
||||
schema-migrator:
|
||||
!!merge <<: *common
|
||||
image: signoz/signoz-schema-migrator:0.111.30
|
||||
image: signoz/signoz-schema-migrator:v0.111.34
|
||||
deploy:
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
|
||||
@@ -177,7 +177,7 @@ services:
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
signoz:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz:${DOCKER_TAG:-v0.76.0}
|
||||
image: signoz/signoz:${VERSION:-v0.76.2}
|
||||
container_name: signoz
|
||||
command:
|
||||
- --config=/root/config/prometheus.yml
|
||||
@@ -212,7 +212,7 @@ services:
|
||||
# TODO: support otel-collector multiple replicas. Nginx/Traefik for loadbalancing?
|
||||
otel-collector:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz-otel-collector:${OTELCOL_TAG:-0.111.30}
|
||||
image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.111.34}
|
||||
container_name: signoz-otel-collector
|
||||
command:
|
||||
- --config=/etc/otel-collector-config.yaml
|
||||
@@ -238,7 +238,7 @@ services:
|
||||
condition: service_healthy
|
||||
schema-migrator-sync:
|
||||
!!merge <<: *common
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.30}
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34}
|
||||
container_name: schema-migrator-sync
|
||||
command:
|
||||
- sync
|
||||
@@ -249,7 +249,7 @@ services:
|
||||
condition: service_healthy
|
||||
schema-migrator-async:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.30}
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34}
|
||||
container_name: schema-migrator-async
|
||||
command:
|
||||
- async
|
||||
|
||||
@@ -110,15 +110,15 @@ services:
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
signoz:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz:${DOCKER_TAG:-v0.76.0}
|
||||
image: signoz/signoz:${VERSION:-v0.76.2}
|
||||
container_name: signoz
|
||||
command:
|
||||
- --config=/root/config/prometheus.yml
|
||||
- --gateway-url=https://api.staging.signoz.cloud
|
||||
- --use-logs-new-schema=true
|
||||
- --use-trace-new-schema=true
|
||||
# ports:
|
||||
# - "8080:8080" # signoz port
|
||||
ports:
|
||||
- "8080:8080" # signoz port
|
||||
# - "6060:6060" # pprof port
|
||||
volumes:
|
||||
- ../common/signoz/prometheus.yml:/root/config/prometheus.yml
|
||||
@@ -146,7 +146,7 @@ services:
|
||||
retries: 3
|
||||
otel-collector:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz-otel-collector:${OTELCOL_TAG:-0.111.30}
|
||||
image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.111.34}
|
||||
container_name: signoz-otel-collector
|
||||
command:
|
||||
- --config=/etc/otel-collector-config.yaml
|
||||
@@ -168,7 +168,7 @@ services:
|
||||
condition: service_healthy
|
||||
schema-migrator-sync:
|
||||
!!merge <<: *common
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.30}
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34}
|
||||
container_name: schema-migrator-sync
|
||||
command:
|
||||
- sync
|
||||
@@ -180,7 +180,7 @@ services:
|
||||
restart: on-failure
|
||||
schema-migrator-async:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.30}
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34}
|
||||
container_name: schema-migrator-async
|
||||
command:
|
||||
- async
|
||||
|
||||
@@ -110,7 +110,7 @@ services:
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
signoz:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz:${DOCKER_TAG:-v0.76.0}
|
||||
image: signoz/signoz:${VERSION:-v0.76.2}
|
||||
container_name: signoz
|
||||
command:
|
||||
- --config=/root/config/prometheus.yml
|
||||
@@ -144,7 +144,7 @@ services:
|
||||
retries: 3
|
||||
otel-collector:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz-otel-collector:${OTELCOL_TAG:-0.111.30}
|
||||
image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.111.34}
|
||||
container_name: signoz-otel-collector
|
||||
command:
|
||||
- --config=/etc/otel-collector-config.yaml
|
||||
@@ -166,7 +166,7 @@ services:
|
||||
condition: service_healthy
|
||||
schema-migrator-sync:
|
||||
!!merge <<: *common
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.30}
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34}
|
||||
container_name: schema-migrator-sync
|
||||
command:
|
||||
- sync
|
||||
@@ -178,7 +178,7 @@ services:
|
||||
restart: on-failure
|
||||
schema-migrator-async:
|
||||
!!merge <<: *db-depend
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.30}
|
||||
image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34}
|
||||
container_name: schema-migrator-async
|
||||
command:
|
||||
- async
|
||||
|
||||
@@ -61,7 +61,7 @@ This command:
|
||||
|
||||
1. Run the backend server:
|
||||
```bash
|
||||
make run-go
|
||||
make go-run-community
|
||||
```
|
||||
|
||||
2. Verify it's working:
|
||||
|
||||
BIN
docs/img/otel-demo-docker-containers.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
docs/img/otel-demo-helm.png
Normal file
|
After Width: | Height: | Size: 157 KiB |
BIN
docs/img/otel-demo-pods.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
docs/img/otel-demo-services.png
Normal file
|
After Width: | Height: | Size: 306 KiB |
246
docs/otel-demo-docs.md
Normal file
@@ -0,0 +1,246 @@
|
||||
# Configuring OpenTelemetry Demo App with SigNoz
|
||||
|
||||
[The OpenTelemetry Astronomy Shop](https://github.com/open-telemetry/opentelemetry-demo) is an e-commerce web application, with **15 core microservices** in a **distributed system** which communicate over gRPC. Designed as a **polyglot** environment, it leverages a diverse set of programming languages, including Go, Python, .NET, Java, and others, showcasing cross-language instrumentation with OpenTelemetry. The intention is to get a quickstart application to send data and experience SigNoz firsthand.
|
||||
|
||||
This guide provides a step-by-step walkthrough for setting up the **OpenTelemetry Demo App** with **SigNoz** as backend for observability. It outlines steps to export telemetry data to **SigNoz self-hosted with Docker**, **SigNoz self-hosted with Kubernetes** and **SigNoz cloud**.
|
||||
<br/>
|
||||
|
||||
__Table of Contents__
|
||||
- [Send data to SigNoz Self-hosted with Docker](#send-data-to-signoz-self-hosted-with-docker)
|
||||
- [Prerequisites](#prerequisites)
|
||||
- [Clone the OpenTelemetry Demo App Repository](#clone-the-opentelemetry-demo-app-repository)
|
||||
- [Modify OpenTelemetry Collector Config](#modify-opentelemetry-collector-config)
|
||||
- [Start the OpenTelemetry Demo App](#start-the-opentelemetry-demo-app)
|
||||
- [Monitor with SigNoz (Docker)](#monitor-with-signoz-docker)
|
||||
- [Send data to SigNoz Self-hosted with Kubernetes](#send-data-to-signoz-self-hosted-with-kubernetes)
|
||||
- [Prerequisites](#prerequisites-1)
|
||||
- [Install Helm Repo and Charts](#install-helm-repo-and-charts)
|
||||
- [Start the OpenTelemetry Demo App](#start-the-opentelemetry-demo-app-1)
|
||||
- [Moniitor with SigNoz (Kubernetes)](#monitor-with-signoz-kubernetes)
|
||||
- [What's next](#whats-next)
|
||||
|
||||
|
||||
# Send data to SigNoz Self-hosted with Docker
|
||||
|
||||
In this guide you will install the OTel demo application using Docker and send telemetry data to SigNoz hosted with Docker, referred as SigNoz [Docker] from now.
|
||||
|
||||
|
||||
## Prerequisites
|
||||
- Docker and Docker Compose installed
|
||||
- 6 GB of RAM for the application [as per OpenTelemetry documentation]
|
||||
- Nice to have Docker Desktop, for easy monitoring
|
||||
|
||||
|
||||
## Clone the OpenTelemetry Demo App Repository
|
||||
Clone the OTel demo app to any folder of your choice.
|
||||
```sh
|
||||
# Clone the OpenTelemetry Demo repository
|
||||
git clone https://github.com/open-telemetry/opentelemetry-demo.git
|
||||
cd opentelemetry-demo
|
||||
```
|
||||
|
||||
## Modify OpenTelemetry Collector Config
|
||||
|
||||
By default, the collector in the demo application will merge the configuration from two files:
|
||||
|
||||
1. otelcol-config.yml [we don't touch this]
|
||||
2. otelcol-config-extras.yml [we modify this]
|
||||
|
||||
To add SigNoz [Docker] as the backend, open the file `src/otel-collector/otelcol-config-extras.yml` and add the following,
|
||||
```yaml
|
||||
exporters:
|
||||
otlp:
|
||||
endpoint: "http://host.docker.internal:4317"
|
||||
tls:
|
||||
insecure: true
|
||||
debug:
|
||||
verbosity: detailed
|
||||
|
||||
service:
|
||||
pipelines:
|
||||
metrics:
|
||||
exporters: [otlp]
|
||||
traces:
|
||||
exporters: [spanmetrics, otlp]
|
||||
logs:
|
||||
exporters: [otlp]
|
||||
```
|
||||
|
||||
The SigNoz OTel collector [sigNoz's otel-collector service] listens at 4317 port on localhost. When the OTel demo app is running within a Docker container and needs to transmit telemetry data to SigNoz, it cannot directly reference 'localhost' as this would refer to the container's own internal network. Instead, Docker provides a special DNS name, `host.docker.internal`, which resolves to the host machine's IP address from within containers. By configuring the OpenTelemetry Demo application to send data to `host.docker.internal:4317`, we establish a network path that allows the containerized application to transmit telemetry data across the container boundary to the SigNoz OTel collector running on the host machine's port 4317.
|
||||
|
||||
>
|
||||
> Note: When merging extra configuration values with the existing collector config (`src/otel-collector/otelcol-config.yml`), objects are merged and arrays are replaced resulting in previous pipeline configurations getting overridden.
|
||||
The spanmetrics exporter must be included in the array of exporters for the traces pipeline if overridden. Not including this exporter will result in an error.
|
||||
>
|
||||
<br>
|
||||
<u>To send data to SigNoz Cloud</u>
|
||||
|
||||
If you want to send data to cloud instead, open the file `src/otel-collector/otelcol-config-extras.yml` and add the following,
|
||||
```yaml
|
||||
exporters:
|
||||
otlp:
|
||||
endpoint: "https://ingest.{your-region}.signoz.cloud:443"
|
||||
tls:
|
||||
insecure: false
|
||||
headers:
|
||||
signoz-access-token: <SIGNOZ-KEY>
|
||||
debug:
|
||||
verbosity: detailed
|
||||
|
||||
service:
|
||||
pipelines:
|
||||
metrics:
|
||||
exporters: [otlp]
|
||||
traces:
|
||||
exporters: [spanmetrics, otlp]
|
||||
logs:
|
||||
exporters: [otlp]
|
||||
```
|
||||
Remember to replace the region and ingestion key with proper values as obtained from your account.
|
||||
|
||||
|
||||
## Start the OpenTelemetry Demo App
|
||||
|
||||
Both SigNoz and OTel demo app [frontend-proxy service, to be accurate] share common port allocation at 8080. To prevent port allocation conflicts, modify the OTel demo application config to use port 8081 as the `ENVOY_PORT` value as shown below, and run docker compose command.
|
||||
|
||||
```sh
|
||||
ENVOY_PORT=8081 docker compose up -d
|
||||
```
|
||||
This spins up multiple microservices, with OpenTelemetry instrumentation enabled. you can verify this by,
|
||||
```sh
|
||||
docker compose ps -a
|
||||
```
|
||||
The result should look similar to this,
|
||||

|
||||
|
||||
|
||||
|
||||
Navigate to `http://localhost:8081/` where you can access OTel demo app UI. Generate some traffic to send to SigNoz [Docker].
|
||||
|
||||
## Monitor with SigNoz [Docker]
|
||||
Signoz exposes its UI at `http://localhost:8080/`. You should be able to see multiple services listed down as shown in the snapshot below.
|
||||
|
||||
|
||||

|
||||
|
||||
This verifies that your OTel demo app is successfully sending telemetry data to SigNoz [Docker] as expected.
|
||||
|
||||
|
||||
# Send data to SigNoz Self-hosted with Kubernetes
|
||||
|
||||
In this guide you will install the OTel demo application using Helm and send telemetry data to SigNoz hosted with Kubernetes, referred as SigNoz [Kubernetes] from now.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Helm charts installed
|
||||
- 6 GB of free RAM for the application [as per OpenTelemetry documentation]
|
||||
- A kubernetes cluster (EKS, GKE, Minikube)
|
||||
- kubectl [CLI for Kubernetes]
|
||||
|
||||
>Note: We will be installing OTel demo app using Helm charts, since it is recommended by OpenTelemetry. If you wish to install using kubectl, follow [this](https://opentelemetry.io/docs/demo/kubernetes-deployment/#install-using-kubectl).
|
||||
|
||||
|
||||
## Install Helm Repo and Charts
|
||||
You’ll need to **install the Helm repository** to start sending data to SigNoz cloud.
|
||||
|
||||
```sh
|
||||
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
|
||||
```
|
||||
The OpenTelemetry Collector’s configuration is exposed in the Helm chart. All additions made will be merged into the default configuration. We use this capability to add SigNoz as an exporter, and make pipelines as desired.
|
||||
|
||||
For this we have to create a `values.yaml` which will override the existing configurations that comes with the Helm chart.
|
||||
|
||||
```yaml
|
||||
default:
|
||||
env:
|
||||
- name: OTEL_SERVICE_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
apiVersion: v1
|
||||
fieldPath: "metadata.labels['app.kubernetes.io/component']"
|
||||
- name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE
|
||||
value: cumulative
|
||||
- name: OTEL_RESOURCE_ATTRIBUTES
|
||||
value: 'service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo'
|
||||
- name: OTEL_COLLECTOR_NAME
|
||||
value: signoz-otel-collector.<namespace>.svc.cluster.local
|
||||
```
|
||||
Replace namespace with your appropriate namespace. This file will replace the chart’s existing settings with our new ones, ensuring telemetry data is sent to SigNoz [Kubernetes].
|
||||
|
||||
> Note: When merging YAML values with Helm, objects are merged and arrays are replaced. The spanmetrics exporter must be included in the array of exporters for the traces pipeline if overridden. Not including this exporter will result in an error.
|
||||
|
||||
<br>
|
||||
<u>To send data to SigNoz cloud</u>
|
||||
|
||||
If you wish to send data to cloud instance of SigNoz, we have to create a `values.yaml` which will override the existing configurations that comes with the Helm chart.
|
||||
|
||||
```sh
|
||||
opentelemetry-collector:
|
||||
config:
|
||||
exporters:
|
||||
otlp:
|
||||
endpoint: "https://ingest.{your-region}.signoz.cloud:443"
|
||||
tls:
|
||||
insecure: false
|
||||
headers:
|
||||
signoz-access-token: <SIGNOZ-KEY>
|
||||
debug:
|
||||
verbosity: detailed
|
||||
service:
|
||||
pipelines:
|
||||
traces:
|
||||
exporters: [spanmetrics, otlp]
|
||||
metrics:
|
||||
exporters: [otlp]
|
||||
logs:
|
||||
exporters: [otlp]
|
||||
```
|
||||
Make sure to replace the region and key with values obtained from the account
|
||||
|
||||
Now **install the helm chart** with a release name and namespace of your choice. Let's take *my-otel-demo* as the release name and *otel-demo* as the namespace for the context of the code snippet below,
|
||||
|
||||
```sh
|
||||
# Create a new Kubernetes namespace called "otel-demo"
|
||||
kubectl create namespace otel-demo
|
||||
# Install the OpenTelemetry Demo Helm chart with the release name "my-otel-demo"
|
||||
helm install my-otel-demo open-telemetry/opentelemetry-demo --namespace otel-demo -f values.yaml
|
||||
```
|
||||
You should see a similar output on your terminal,
|
||||

|
||||
|
||||
To verify if all the pods are running,
|
||||
```sh
|
||||
kubectl get pods -n otel-demo
|
||||
```
|
||||
The output should look similar to this,
|
||||
|
||||

|
||||
|
||||
## Start the OpenTelemetry Demo App
|
||||
|
||||
To expose the OTel demo app UI [frontend-proxy service] use the following command (replace my-otel-demo with your Helm chart release name):
|
||||
|
||||
```sh
|
||||
kubectl port-forward svc/my-otel-demo-frontend-proxy 8080:8081
|
||||
```
|
||||
Navigate to `http://localhost:8081/` where you can access OTel demo app UI. Generate some traffic to send to SigNoz [Kubernetes].
|
||||
|
||||
|
||||
|
||||
## Monitor with SigNoz [Kubernetes]
|
||||
Signoz exposes it's UI at `http://localhost:8080/`. You should be able to see multiple services listed down as shown in the snapshot below.
|
||||
|
||||
|
||||

|
||||
|
||||
This verifies that your OTel demo app is successfully sending telemetry data to SigNoz [Kubernetes] as expected.
|
||||
|
||||
|
||||
|
||||
# What's next?
|
||||
|
||||
|
||||
|
||||
Don't forget to check our OpenTelemetry [track](https://signoz.io/resource-center/opentelemetry/), guaranteed to take you from a newbie to sensei in no time!
|
||||
|
||||
Also from a fellow OTel fan to another, we at [SigNoz](https://signoz.io/) are building an open-source, OTel native, observability platform (one of its kind). So, show us love - star us on [GitHub](https://github.com/SigNoz/signoz), nitpick our [docs](https://signoz.io/docs/introduction/), or just tell your app we’re the ones who’ll catch its crashes mid-flight and finally shush all the 3am panic calls!
|
||||
@@ -2,22 +2,31 @@ package middleware
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"go.signoz.io/signoz/pkg/types/authtypes"
|
||||
eeTypes "github.com/SigNoz/signoz/ee/types"
|
||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||
"github.com/SigNoz/signoz/pkg/types"
|
||||
"github.com/SigNoz/signoz/pkg/types/authtypes"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type Pat struct {
|
||||
store sqlstore.SQLStore
|
||||
uuid *authtypes.UUID
|
||||
headers []string
|
||||
}
|
||||
|
||||
func NewPat(headers []string) *Pat {
|
||||
return &Pat{uuid: authtypes.NewUUID(), headers: headers}
|
||||
func NewPat(store sqlstore.SQLStore, headers []string) *Pat {
|
||||
return &Pat{store: store, uuid: authtypes.NewUUID(), headers: headers}
|
||||
}
|
||||
|
||||
func (p *Pat) Wrap(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
var values []string
|
||||
var patToken string
|
||||
var pat eeTypes.StorablePersonalAccessToken
|
||||
|
||||
for _, header := range p.headers {
|
||||
values = append(values, r.Header.Get(header))
|
||||
}
|
||||
@@ -27,10 +36,50 @@ func (p *Pat) Wrap(next http.Handler) http.Handler {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
patToken, ok := authtypes.UUIDFromContext(ctx)
|
||||
if !ok {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
err = p.store.BunDB().NewSelect().Model(&pat).Where("token = ?", patToken).Scan(r.Context())
|
||||
if err != nil {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
if pat.ExpiresAt < time.Now().Unix() && pat.ExpiresAt != 0 {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
// get user from db
|
||||
user := types.User{}
|
||||
err = p.store.BunDB().NewSelect().Model(&user).Where("id = ?", pat.UserID).Scan(r.Context())
|
||||
if err != nil {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
jwt := authtypes.Claims{
|
||||
UserID: user.ID,
|
||||
GroupID: user.GroupID,
|
||||
Email: user.Email,
|
||||
OrgID: user.OrgID,
|
||||
}
|
||||
|
||||
ctx = authtypes.NewContextWithClaims(ctx, jwt)
|
||||
|
||||
r = r.WithContext(ctx)
|
||||
|
||||
next.ServeHTTP(w, r)
|
||||
|
||||
pat.LastUsed = time.Now().Unix()
|
||||
_, err = p.store.BunDB().NewUpdate().Model(&pat).Column("last_used").Where("token = ?", patToken).Where("revoked = false").Exec(r.Context())
|
||||
if err != nil {
|
||||
zap.L().Error("Failed to update PAT last used in db, err: %v", zap.Error(err))
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
@@ -30,15 +30,13 @@ builds:
|
||||
- v8.0
|
||||
ldflags:
|
||||
- -s -w
|
||||
- -X github.com/SigNoz/signoz/pkg/query-service/version.version={{ .Version }}
|
||||
- -X main.commit={{ .Commit }} -X main.date={{ .CommitDate }}
|
||||
- -X main.builtBy=goreleaser
|
||||
- -X go.signoz.io/signoz/pkg/query-service/version.buildVersion={{ .Version }}
|
||||
- -X go.signoz.io/signoz/pkg/query-service/version.buildHash={{ .ShortCommit }}
|
||||
- -X go.signoz.io/signoz/pkg/query-service/version.buildTime={{ .Date }}
|
||||
- -X go.signoz.io/signoz/pkg/query-service/version.gitBranch={{ .Branch }}
|
||||
- -X go.signoz.io/signoz/ee/query-service/constants.ZeusURL=https://api.signoz.cloud
|
||||
- -X go.signoz.io/signoz/ee/query-service/constants.LicenseSignozIo=https://license.signoz.io/api/v1
|
||||
- -X github.com/SigNoz/signoz/pkg/version.version=v{{ .Version }}
|
||||
- -X github.com/SigNoz/signoz/pkg/version.variant=enterprise
|
||||
- -X github.com/SigNoz/signoz/pkg/version.hash={{ .ShortCommit }}
|
||||
- -X github.com/SigNoz/signoz/pkg/version.time={{ .CommitTimestamp }}
|
||||
- -X github.com/SigNoz/signoz/pkg/version.branch={{ .Branch }}
|
||||
- -X github.com/SigNoz/signoz/ee/query-service/constants.ZeusURL=https://api.signoz.cloud
|
||||
- -X github.com/SigNoz/signoz/ee/query-service/constants.LicenseSignozIo=https://license.signoz.io/api/v1
|
||||
- >-
|
||||
{{- if eq .Os "linux" }}-linkmode external -extldflags '-static'{{- end }}
|
||||
mod_timestamp: "{{ .CommitTimestamp }}"
|
||||
|
||||
@@ -1,34 +1,21 @@
|
||||
# use a minimal alpine image
|
||||
FROM alpine:3.20.3
|
||||
|
||||
# Add Maintainer Info
|
||||
LABEL maintainer="signoz"
|
||||
|
||||
# define arguments that can be passed during build time
|
||||
ARG TARGETOS TARGETARCH
|
||||
|
||||
# add ca-certificates in case you need them
|
||||
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
|
||||
|
||||
# set working directory
|
||||
WORKDIR /root
|
||||
|
||||
# copy the signoz binary
|
||||
COPY ee/query-service/bin/signoz-${TARGETOS}-${TARGETARCH} /root/signoz
|
||||
ARG OS="linux"
|
||||
ARG TARGETARCH
|
||||
|
||||
# copy prometheus YAML config
|
||||
COPY pkg/query-service/config/prometheus.yml /root/config/prometheus.yml
|
||||
COPY pkg/query-service/templates /root/templates
|
||||
RUN apk update && \
|
||||
apk add ca-certificates && \
|
||||
rm -rf /var/cache/apk/*
|
||||
|
||||
# Make signoz executable for non-root users
|
||||
RUN chmod 755 /root /root/signoz
|
||||
|
||||
# Copy frontend
|
||||
COPY ./target/${OS}-${TARGETARCH}/signoz /root/signoz
|
||||
COPY ./conf/prometheus.yml /root/config/prometheus.yml
|
||||
COPY ./templates/email /root/templates
|
||||
COPY frontend/build/ /etc/signoz/web/
|
||||
|
||||
# run the binary
|
||||
RUN chmod 755 /root /root/signoz
|
||||
|
||||
ENTRYPOINT ["./signoz"]
|
||||
|
||||
CMD ["-config", "/root/config/prometheus.yml"]
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
@@ -3,8 +3,8 @@ package anomaly
|
||||
import (
|
||||
"context"
|
||||
|
||||
querierV2 "go.signoz.io/signoz/pkg/query-service/app/querier/v2"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/queryBuilder"
|
||||
querierV2 "github.com/SigNoz/signoz/pkg/query-service/app/querier/v2"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/queryBuilder"
|
||||
)
|
||||
|
||||
type DailyProvider struct {
|
||||
|
||||
@@ -3,8 +3,8 @@ package anomaly
|
||||
import (
|
||||
"context"
|
||||
|
||||
querierV2 "go.signoz.io/signoz/pkg/query-service/app/querier/v2"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/queryBuilder"
|
||||
querierV2 "github.com/SigNoz/signoz/pkg/query-service/app/querier/v2"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/queryBuilder"
|
||||
)
|
||||
|
||||
type HourlyProvider struct {
|
||||
|
||||
@@ -4,8 +4,8 @@ import (
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"go.signoz.io/signoz/pkg/query-service/common"
|
||||
v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/common"
|
||||
v3 "github.com/SigNoz/signoz/pkg/query-service/model/v3"
|
||||
)
|
||||
|
||||
type Seasonality string
|
||||
|
||||
@@ -5,11 +5,11 @@ import (
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"go.signoz.io/signoz/pkg/query-service/cache"
|
||||
"go.signoz.io/signoz/pkg/query-service/interfaces"
|
||||
v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
|
||||
"go.signoz.io/signoz/pkg/query-service/postprocess"
|
||||
"go.signoz.io/signoz/pkg/query-service/utils/labels"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/cache"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/interfaces"
|
||||
v3 "github.com/SigNoz/signoz/pkg/query-service/model/v3"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/postprocess"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/utils/labels"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -313,6 +313,9 @@ func (p *BaseSeasonalProvider) getScore(
|
||||
series, prevSeries, weekSeries, weekPrevSeries, past2SeasonSeries, past3SeasonSeries *v3.Series, value float64, idx int,
|
||||
) float64 {
|
||||
expectedValue := p.getExpectedValue(series, prevSeries, weekSeries, weekPrevSeries, past2SeasonSeries, past3SeasonSeries, idx)
|
||||
if expectedValue < 0 {
|
||||
expectedValue = p.getMovingAvg(prevSeries, movingAvgWindowSize, idx)
|
||||
}
|
||||
return (value - expectedValue) / p.getStdDev(weekSeries)
|
||||
}
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@ package anomaly
|
||||
import (
|
||||
"context"
|
||||
|
||||
querierV2 "go.signoz.io/signoz/pkg/query-service/app/querier/v2"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/queryBuilder"
|
||||
querierV2 "github.com/SigNoz/signoz/pkg/query-service/app/querier/v2"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/queryBuilder"
|
||||
)
|
||||
|
||||
type WeeklyProvider struct {
|
||||
|
||||
@@ -5,24 +5,24 @@ import (
|
||||
"net/http/httputil"
|
||||
"time"
|
||||
|
||||
"github.com/SigNoz/signoz/ee/query-service/dao"
|
||||
"github.com/SigNoz/signoz/ee/query-service/integrations/gateway"
|
||||
"github.com/SigNoz/signoz/ee/query-service/interfaces"
|
||||
"github.com/SigNoz/signoz/ee/query-service/license"
|
||||
"github.com/SigNoz/signoz/ee/query-service/usage"
|
||||
"github.com/SigNoz/signoz/pkg/alertmanager"
|
||||
baseapp "github.com/SigNoz/signoz/pkg/query-service/app"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/cloudintegrations"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/integrations"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/logparsingpipeline"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/cache"
|
||||
baseint "github.com/SigNoz/signoz/pkg/query-service/interfaces"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
rules "github.com/SigNoz/signoz/pkg/query-service/rules"
|
||||
"github.com/SigNoz/signoz/pkg/signoz"
|
||||
"github.com/SigNoz/signoz/pkg/types/authtypes"
|
||||
"github.com/SigNoz/signoz/pkg/version"
|
||||
"github.com/gorilla/mux"
|
||||
"go.signoz.io/signoz/ee/query-service/dao"
|
||||
"go.signoz.io/signoz/ee/query-service/integrations/gateway"
|
||||
"go.signoz.io/signoz/ee/query-service/interfaces"
|
||||
"go.signoz.io/signoz/ee/query-service/license"
|
||||
"go.signoz.io/signoz/ee/query-service/usage"
|
||||
"go.signoz.io/signoz/pkg/alertmanager"
|
||||
baseapp "go.signoz.io/signoz/pkg/query-service/app"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/cloudintegrations"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/integrations"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/logparsingpipeline"
|
||||
"go.signoz.io/signoz/pkg/query-service/cache"
|
||||
baseint "go.signoz.io/signoz/pkg/query-service/interfaces"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
rules "go.signoz.io/signoz/pkg/query-service/rules"
|
||||
"go.signoz.io/signoz/pkg/query-service/version"
|
||||
"go.signoz.io/signoz/pkg/signoz"
|
||||
"go.signoz.io/signoz/pkg/types/authtypes"
|
||||
)
|
||||
|
||||
type APIHandlerOptions struct {
|
||||
@@ -200,9 +200,8 @@ func (ah *APIHandler) RegisterCloudIntegrationsRoutes(router *mux.Router, am *ba
|
||||
}
|
||||
|
||||
func (ah *APIHandler) getVersion(w http.ResponseWriter, r *http.Request) {
|
||||
version := version.GetVersion()
|
||||
versionResponse := basemodel.GetVersionResponse{
|
||||
Version: version,
|
||||
Version: version.Info.Version(),
|
||||
EE: "Y",
|
||||
SetupCompleted: ah.SetupCompleted,
|
||||
}
|
||||
|
||||
@@ -12,10 +12,10 @@ import (
|
||||
"github.com/gorilla/mux"
|
||||
"go.uber.org/zap"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/constants"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
baseauth "go.signoz.io/signoz/pkg/query-service/auth"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/query-service/constants"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
baseauth "github.com/SigNoz/signoz/pkg/query-service/auth"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
)
|
||||
|
||||
func parseRequest(r *http.Request, req interface{}) error {
|
||||
|
||||
@@ -10,15 +10,15 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/SigNoz/signoz/ee/query-service/constants"
|
||||
eeTypes "github.com/SigNoz/signoz/ee/types"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/auth"
|
||||
baseconstants "github.com/SigNoz/signoz/pkg/query-service/constants"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/dao"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/pkg/types"
|
||||
"github.com/google/uuid"
|
||||
"github.com/gorilla/mux"
|
||||
"go.signoz.io/signoz/ee/query-service/constants"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/query-service/auth"
|
||||
baseconstants "go.signoz.io/signoz/pkg/query-service/constants"
|
||||
"go.signoz.io/signoz/pkg/query-service/dao"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/types"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -118,7 +118,7 @@ func (ah *APIHandler) getOrCreateCloudIntegrationPAT(ctx context.Context, orgId
|
||||
return "", apiErr
|
||||
}
|
||||
|
||||
allPats, err := ah.AppDao().ListPATs(ctx)
|
||||
allPats, err := ah.AppDao().ListPATs(ctx, orgId)
|
||||
if err != nil {
|
||||
return "", basemodel.InternalError(fmt.Errorf(
|
||||
"couldn't list PATs: %w", err,
|
||||
@@ -135,16 +135,13 @@ func (ah *APIHandler) getOrCreateCloudIntegrationPAT(ctx context.Context, orgId
|
||||
zap.String("cloudProvider", cloudProvider),
|
||||
)
|
||||
|
||||
newPAT := model.PAT{
|
||||
Token: generatePATToken(),
|
||||
UserID: integrationUser.ID,
|
||||
Name: integrationPATName,
|
||||
Role: baseconstants.ViewerGroup,
|
||||
ExpiresAt: 0,
|
||||
CreatedAt: time.Now().Unix(),
|
||||
UpdatedAt: time.Now().Unix(),
|
||||
}
|
||||
integrationPAT, err := ah.AppDao().CreatePAT(ctx, newPAT)
|
||||
newPAT := eeTypes.NewGettablePAT(
|
||||
integrationPATName,
|
||||
baseconstants.ViewerGroup,
|
||||
integrationUser.ID,
|
||||
0,
|
||||
)
|
||||
integrationPAT, err := ah.AppDao().CreatePAT(ctx, orgId, newPAT)
|
||||
if err != nil {
|
||||
return "", basemodel.InternalError(fmt.Errorf(
|
||||
"couldn't create cloud integration PAT: %w", err,
|
||||
|
||||
@@ -4,12 +4,12 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/SigNoz/signoz/pkg/errors"
|
||||
"github.com/SigNoz/signoz/pkg/http/render"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/dashboards"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/auth"
|
||||
"github.com/SigNoz/signoz/pkg/types/authtypes"
|
||||
"github.com/gorilla/mux"
|
||||
"go.signoz.io/signoz/pkg/errors"
|
||||
"go.signoz.io/signoz/pkg/http/render"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/dashboards"
|
||||
"go.signoz.io/signoz/pkg/query-service/auth"
|
||||
"go.signoz.io/signoz/pkg/types/authtypes"
|
||||
)
|
||||
|
||||
func (ah *APIHandler) lockDashboard(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
@@ -6,9 +6,10 @@ import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/types"
|
||||
"github.com/google/uuid"
|
||||
"github.com/gorilla/mux"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
)
|
||||
|
||||
func (ah *APIHandler) listDomainsByOrg(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -24,7 +25,7 @@ func (ah *APIHandler) listDomainsByOrg(w http.ResponseWriter, r *http.Request) {
|
||||
func (ah *APIHandler) postDomain(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := context.Background()
|
||||
|
||||
req := model.OrgDomain{}
|
||||
req := types.GettableOrgDomain{}
|
||||
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
RespondError(w, model.BadRequest(err), nil)
|
||||
@@ -54,12 +55,12 @@ func (ah *APIHandler) putDomain(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
req := model.OrgDomain{Id: domainId}
|
||||
req := types.GettableOrgDomain{StorableOrgDomain: types.StorableOrgDomain{ID: domainId}}
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
RespondError(w, model.BadRequest(err), nil)
|
||||
return
|
||||
}
|
||||
req.Id = domainId
|
||||
req.ID = domainId
|
||||
if err := req.Valid(nil); err != nil {
|
||||
RespondError(w, model.BadRequest(err), nil)
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/constants"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/query-service/constants"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@ package api
|
||||
import (
|
||||
"testing"
|
||||
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"github.com/stretchr/testify/assert"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
)
|
||||
|
||||
func TestMergeFeatureSets(t *testing.T) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/integrations/gateway"
|
||||
"github.com/SigNoz/signoz/ee/query-service/integrations/gateway"
|
||||
)
|
||||
|
||||
func (ah *APIHandler) ServeGatewayHTTP(rw http.ResponseWriter, req *http.Request) {
|
||||
|
||||
@@ -3,13 +3,12 @@ package api
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/constants"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/http/render"
|
||||
"go.uber.org/zap"
|
||||
"github.com/SigNoz/signoz/ee/query-service/constants"
|
||||
"github.com/SigNoz/signoz/ee/query-service/integrations/signozio"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
"github.com/SigNoz/signoz/pkg/http/render"
|
||||
)
|
||||
|
||||
type DayWiseBreakdown struct {
|
||||
@@ -48,6 +47,10 @@ type details struct {
|
||||
BillTotal float64 `json:"billTotal"`
|
||||
}
|
||||
|
||||
type Redirect struct {
|
||||
RedirectURL string `json:"redirectURL"`
|
||||
}
|
||||
|
||||
type billingDetails struct {
|
||||
Status string `json:"status"`
|
||||
Data struct {
|
||||
@@ -119,36 +122,31 @@ func (ah *APIHandler) refreshLicensesV3(w http.ResponseWriter, r *http.Request)
|
||||
render.Success(w, http.StatusNoContent, nil)
|
||||
}
|
||||
|
||||
func getCheckoutPortalResponse(redirectURL string) *Redirect {
|
||||
return &Redirect{RedirectURL: redirectURL}
|
||||
}
|
||||
|
||||
func (ah *APIHandler) checkout(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
type checkoutResponse struct {
|
||||
Status string `json:"status"`
|
||||
Data struct {
|
||||
RedirectURL string `json:"redirectURL"`
|
||||
} `json:"data"`
|
||||
checkoutRequest := &model.CheckoutRequest{}
|
||||
if err := json.NewDecoder(r.Body).Decode(checkoutRequest); err != nil {
|
||||
RespondError(w, model.BadRequest(err), nil)
|
||||
return
|
||||
}
|
||||
|
||||
hClient := &http.Client{}
|
||||
req, err := http.NewRequest("POST", constants.LicenseSignozIo+"/checkout", r.Body)
|
||||
license := ah.LM().GetActiveLicense()
|
||||
if license == nil {
|
||||
RespondError(w, model.BadRequestStr("cannot proceed with checkout without license key"), nil)
|
||||
return
|
||||
}
|
||||
|
||||
redirectUrl, err := signozio.CheckoutSession(r.Context(), checkoutRequest, license.Key)
|
||||
if err != nil {
|
||||
RespondError(w, model.InternalError(err), nil)
|
||||
return
|
||||
}
|
||||
req.Header.Add("X-SigNoz-SecretKey", constants.LicenseAPIKey)
|
||||
licenseResp, err := hClient.Do(req)
|
||||
if err != nil {
|
||||
RespondError(w, model.InternalError(err), nil)
|
||||
RespondError(w, err, nil)
|
||||
return
|
||||
}
|
||||
|
||||
// decode response body
|
||||
var resp checkoutResponse
|
||||
if err := json.NewDecoder(licenseResp.Body).Decode(&resp); err != nil {
|
||||
RespondError(w, model.InternalError(err), nil)
|
||||
return
|
||||
}
|
||||
|
||||
ah.Respond(w, resp.Data)
|
||||
ah.Respond(w, getCheckoutPortalResponse(redirectUrl))
|
||||
}
|
||||
|
||||
func (ah *APIHandler) getBilling(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -228,102 +226,28 @@ func (ah *APIHandler) listLicensesV2(w http.ResponseWriter, r *http.Request) {
|
||||
Licenses: licenses,
|
||||
}
|
||||
|
||||
var currentActiveLicenseKey string
|
||||
|
||||
for _, license := range licenses {
|
||||
if license.IsCurrent {
|
||||
currentActiveLicenseKey = license.Key
|
||||
}
|
||||
}
|
||||
|
||||
// For the case when no license is applied i.e community edition
|
||||
// There will be no trial details or license details
|
||||
if currentActiveLicenseKey == "" {
|
||||
ah.Respond(w, resp)
|
||||
return
|
||||
}
|
||||
|
||||
// Fetch trial details
|
||||
hClient := &http.Client{}
|
||||
url := fmt.Sprintf("%s/trial?licenseKey=%s", constants.LicenseSignozIo, currentActiveLicenseKey)
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
zap.L().Error("Error while creating request for trial details", zap.Error(err))
|
||||
// If there is an error in fetching trial details, we will still return the license details
|
||||
// to avoid blocking the UI
|
||||
ah.Respond(w, resp)
|
||||
return
|
||||
}
|
||||
req.Header.Add("X-SigNoz-SecretKey", constants.LicenseAPIKey)
|
||||
trialResp, err := hClient.Do(req)
|
||||
if err != nil {
|
||||
zap.L().Error("Error while fetching trial details", zap.Error(err))
|
||||
// If there is an error in fetching trial details, we will still return the license details
|
||||
// to avoid incorrectly blocking the UI
|
||||
ah.Respond(w, resp)
|
||||
return
|
||||
}
|
||||
defer trialResp.Body.Close()
|
||||
|
||||
trialRespBody, err := io.ReadAll(trialResp.Body)
|
||||
|
||||
if err != nil || trialResp.StatusCode != http.StatusOK {
|
||||
zap.L().Error("Error while fetching trial details", zap.Error(err))
|
||||
// If there is an error in fetching trial details, we will still return the license details
|
||||
// to avoid incorrectly blocking the UI
|
||||
ah.Respond(w, resp)
|
||||
return
|
||||
}
|
||||
|
||||
// decode response body
|
||||
var trialRespData model.SubscriptionServerResp
|
||||
|
||||
if err := json.Unmarshal(trialRespBody, &trialRespData); err != nil {
|
||||
zap.L().Error("Error while decoding trial details", zap.Error(err))
|
||||
// If there is an error in fetching trial details, we will still return the license details
|
||||
// to avoid incorrectly blocking the UI
|
||||
ah.Respond(w, resp)
|
||||
return
|
||||
}
|
||||
|
||||
resp.TrialStart = trialRespData.Data.TrialStart
|
||||
resp.TrialEnd = trialRespData.Data.TrialEnd
|
||||
resp.OnTrial = trialRespData.Data.OnTrial
|
||||
resp.WorkSpaceBlock = trialRespData.Data.WorkSpaceBlock
|
||||
resp.TrialConvertedToSubscription = trialRespData.Data.TrialConvertedToSubscription
|
||||
resp.GracePeriodEnd = trialRespData.Data.GracePeriodEnd
|
||||
|
||||
ah.Respond(w, resp)
|
||||
}
|
||||
|
||||
func (ah *APIHandler) portalSession(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
type checkoutResponse struct {
|
||||
Status string `json:"status"`
|
||||
Data struct {
|
||||
RedirectURL string `json:"redirectURL"`
|
||||
} `json:"data"`
|
||||
portalRequest := &model.PortalRequest{}
|
||||
if err := json.NewDecoder(r.Body).Decode(portalRequest); err != nil {
|
||||
RespondError(w, model.BadRequest(err), nil)
|
||||
return
|
||||
}
|
||||
|
||||
hClient := &http.Client{}
|
||||
req, err := http.NewRequest("POST", constants.LicenseSignozIo+"/portal", r.Body)
|
||||
license := ah.LM().GetActiveLicense()
|
||||
if license == nil {
|
||||
RespondError(w, model.BadRequestStr("cannot request the portal session without license key"), nil)
|
||||
return
|
||||
}
|
||||
|
||||
redirectUrl, err := signozio.PortalSession(r.Context(), portalRequest, license.Key)
|
||||
if err != nil {
|
||||
RespondError(w, model.InternalError(err), nil)
|
||||
return
|
||||
}
|
||||
req.Header.Add("X-SigNoz-SecretKey", constants.LicenseAPIKey)
|
||||
licenseResp, err := hClient.Do(req)
|
||||
if err != nil {
|
||||
RespondError(w, model.InternalError(err), nil)
|
||||
RespondError(w, err, nil)
|
||||
return
|
||||
}
|
||||
|
||||
// decode response body
|
||||
var resp checkoutResponse
|
||||
if err := json.NewDecoder(licenseResp.Body).Decode(&resp); err != nil {
|
||||
RespondError(w, model.InternalError(err), nil)
|
||||
return
|
||||
}
|
||||
|
||||
ah.Respond(w, resp.Data)
|
||||
ah.Respond(w, getCheckoutPortalResponse(redirectUrl))
|
||||
}
|
||||
|
||||
@@ -2,30 +2,21 @@ package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/types"
|
||||
eeTypes "github.com/SigNoz/signoz/ee/types"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/auth"
|
||||
baseconstants "github.com/SigNoz/signoz/pkg/query-service/constants"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"github.com/gorilla/mux"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/query-service/auth"
|
||||
baseconstants "go.signoz.io/signoz/pkg/query-service/constants"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func generatePATToken() string {
|
||||
// Generate a 32-byte random token.
|
||||
token := make([]byte, 32)
|
||||
rand.Read(token)
|
||||
// Encode the token in base64.
|
||||
encodedToken := base64.StdEncoding.EncodeToString(token)
|
||||
return encodedToken
|
||||
}
|
||||
|
||||
func (ah *APIHandler) createPAT(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := context.Background()
|
||||
|
||||
@@ -42,32 +33,21 @@ func (ah *APIHandler) createPAT(w http.ResponseWriter, r *http.Request) {
|
||||
}, nil)
|
||||
return
|
||||
}
|
||||
pat := model.PAT{
|
||||
Name: req.Name,
|
||||
Role: req.Role,
|
||||
ExpiresAt: req.ExpiresInDays,
|
||||
}
|
||||
pat := eeTypes.NewGettablePAT(
|
||||
req.Name,
|
||||
req.Role,
|
||||
user.ID,
|
||||
req.ExpiresInDays,
|
||||
)
|
||||
err = validatePATRequest(pat)
|
||||
if err != nil {
|
||||
RespondError(w, model.BadRequest(err), nil)
|
||||
return
|
||||
}
|
||||
|
||||
// All the PATs are associated with the user creating the PAT.
|
||||
pat.UserID = user.ID
|
||||
pat.CreatedAt = time.Now().Unix()
|
||||
pat.UpdatedAt = time.Now().Unix()
|
||||
pat.LastUsed = 0
|
||||
pat.Token = generatePATToken()
|
||||
|
||||
if pat.ExpiresAt != 0 {
|
||||
// convert expiresAt to unix timestamp from days
|
||||
pat.ExpiresAt = time.Now().Unix() + (pat.ExpiresAt * 24 * 60 * 60)
|
||||
}
|
||||
|
||||
zap.L().Info("Got Create PAT request", zap.Any("pat", pat))
|
||||
var apierr basemodel.BaseApiError
|
||||
if pat, apierr = ah.AppDao().CreatePAT(ctx, pat); apierr != nil {
|
||||
if pat, apierr = ah.AppDao().CreatePAT(ctx, user.OrgID, pat); apierr != nil {
|
||||
RespondError(w, apierr, nil)
|
||||
return
|
||||
}
|
||||
@@ -75,7 +55,7 @@ func (ah *APIHandler) createPAT(w http.ResponseWriter, r *http.Request) {
|
||||
ah.Respond(w, &pat)
|
||||
}
|
||||
|
||||
func validatePATRequest(req model.PAT) error {
|
||||
func validatePATRequest(req types.GettablePAT) error {
|
||||
if req.Role == "" || (req.Role != baseconstants.ViewerGroup && req.Role != baseconstants.EditorGroup && req.Role != baseconstants.AdminGroup) {
|
||||
return fmt.Errorf("valid role is required")
|
||||
}
|
||||
@@ -91,7 +71,7 @@ func validatePATRequest(req model.PAT) error {
|
||||
func (ah *APIHandler) updatePAT(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := context.Background()
|
||||
|
||||
req := model.PAT{}
|
||||
req := types.GettablePAT{}
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
RespondError(w, model.BadRequest(err), nil)
|
||||
return
|
||||
@@ -114,10 +94,10 @@ func (ah *APIHandler) updatePAT(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
req.UpdatedByUserID = user.ID
|
||||
id := mux.Vars(r)["id"]
|
||||
req.UpdatedAt = time.Now().Unix()
|
||||
req.UpdatedAt = time.Now()
|
||||
zap.L().Info("Got Update PAT request", zap.Any("pat", req))
|
||||
var apierr basemodel.BaseApiError
|
||||
if apierr = ah.AppDao().UpdatePAT(ctx, req, id); apierr != nil {
|
||||
if apierr = ah.AppDao().UpdatePAT(ctx, user.OrgID, req, id); apierr != nil {
|
||||
RespondError(w, apierr, nil)
|
||||
return
|
||||
}
|
||||
@@ -136,7 +116,7 @@ func (ah *APIHandler) getPATs(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
zap.L().Info("Get PATs for user", zap.String("user_id", user.ID))
|
||||
pats, apierr := ah.AppDao().ListPATs(ctx)
|
||||
pats, apierr := ah.AppDao().ListPATs(ctx, user.OrgID)
|
||||
if apierr != nil {
|
||||
RespondError(w, apierr, nil)
|
||||
return
|
||||
@@ -157,7 +137,7 @@ func (ah *APIHandler) revokePAT(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
zap.L().Info("Revoke PAT with id", zap.String("id", id))
|
||||
if apierr := ah.AppDao().RevokePAT(ctx, id, user.ID); apierr != nil {
|
||||
if apierr := ah.AppDao().RevokePAT(ctx, user.OrgID, id, user.ID); apierr != nil {
|
||||
RespondError(w, apierr, nil)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -6,11 +6,11 @@ import (
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/anomaly"
|
||||
baseapp "go.signoz.io/signoz/pkg/query-service/app"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/queryBuilder"
|
||||
"go.signoz.io/signoz/pkg/query-service/model"
|
||||
v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
|
||||
"github.com/SigNoz/signoz/ee/query-service/anomaly"
|
||||
baseapp "github.com/SigNoz/signoz/pkg/query-service/app"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/queryBuilder"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
v3 "github.com/SigNoz/signoz/pkg/query-service/model/v3"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@ package api
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
baseapp "go.signoz.io/signoz/pkg/query-service/app"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
baseapp "github.com/SigNoz/signoz/pkg/query-service/app"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
)
|
||||
|
||||
func RespondError(w http.ResponseWriter, apiErr basemodel.BaseApiError, data interface{}) {
|
||||
|
||||
@@ -3,10 +3,10 @@ package api
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/app/db"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
baseapp "go.signoz.io/signoz/pkg/query-service/app"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/query-service/app/db"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
baseapp "github.com/SigNoz/signoz/pkg/query-service/app"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
|
||||
@@ -7,9 +7,11 @@ import (
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
|
||||
"go.signoz.io/signoz/pkg/cache"
|
||||
basechr "go.signoz.io/signoz/pkg/query-service/app/clickhouseReader"
|
||||
"go.signoz.io/signoz/pkg/query-service/interfaces"
|
||||
"github.com/SigNoz/signoz/pkg/cache"
|
||||
"github.com/SigNoz/signoz/pkg/prometheus"
|
||||
basechr "github.com/SigNoz/signoz/pkg/query-service/app/clickhouseReader"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/interfaces"
|
||||
"github.com/SigNoz/signoz/pkg/telemetrystore"
|
||||
)
|
||||
|
||||
type ClickhouseReader struct {
|
||||
@@ -20,8 +22,8 @@ type ClickhouseReader struct {
|
||||
|
||||
func NewDataConnector(
|
||||
localDB *sqlx.DB,
|
||||
ch clickhouse.Conn,
|
||||
promConfigPath string,
|
||||
telemetryStore telemetrystore.TelemetryStore,
|
||||
prometheus prometheus.Prometheus,
|
||||
lm interfaces.FeatureLookup,
|
||||
cluster string,
|
||||
useLogsNewSchema bool,
|
||||
@@ -29,14 +31,10 @@ func NewDataConnector(
|
||||
fluxIntervalForTraceDetail time.Duration,
|
||||
cache cache.Cache,
|
||||
) *ClickhouseReader {
|
||||
chReader := basechr.NewReader(localDB, ch, promConfigPath, lm, cluster, useLogsNewSchema, useTraceNewSchema, fluxIntervalForTraceDetail, cache)
|
||||
chReader := basechr.NewReader(localDB, telemetryStore, prometheus, lm, cluster, useLogsNewSchema, useTraceNewSchema, fluxIntervalForTraceDetail, cache)
|
||||
return &ClickhouseReader{
|
||||
conn: ch,
|
||||
conn: telemetryStore.ClickhouseDB(),
|
||||
appdb: localDB,
|
||||
ClickHouseReader: chReader,
|
||||
}
|
||||
}
|
||||
|
||||
func (r *ClickhouseReader) Start(readerReady chan bool) {
|
||||
r.ClickHouseReader.Start(readerReady)
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@ import (
|
||||
"errors"
|
||||
"strconv"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
|
||||
@@ -12,47 +12,47 @@ import (
|
||||
"github.com/gorilla/handlers"
|
||||
"github.com/jmoiron/sqlx"
|
||||
|
||||
eemiddleware "github.com/SigNoz/signoz/ee/http/middleware"
|
||||
"github.com/SigNoz/signoz/ee/query-service/app/api"
|
||||
"github.com/SigNoz/signoz/ee/query-service/app/db"
|
||||
"github.com/SigNoz/signoz/ee/query-service/constants"
|
||||
"github.com/SigNoz/signoz/ee/query-service/dao"
|
||||
"github.com/SigNoz/signoz/ee/query-service/integrations/gateway"
|
||||
"github.com/SigNoz/signoz/ee/query-service/rules"
|
||||
"github.com/SigNoz/signoz/pkg/alertmanager"
|
||||
"github.com/SigNoz/signoz/pkg/http/middleware"
|
||||
"github.com/SigNoz/signoz/pkg/prometheus"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/auth"
|
||||
"github.com/SigNoz/signoz/pkg/signoz"
|
||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||
"github.com/SigNoz/signoz/pkg/telemetrystore"
|
||||
"github.com/SigNoz/signoz/pkg/types"
|
||||
"github.com/SigNoz/signoz/pkg/types/authtypes"
|
||||
"github.com/SigNoz/signoz/pkg/web"
|
||||
"github.com/rs/cors"
|
||||
"github.com/soheilhy/cmux"
|
||||
eemiddleware "go.signoz.io/signoz/ee/http/middleware"
|
||||
"go.signoz.io/signoz/ee/query-service/app/api"
|
||||
"go.signoz.io/signoz/ee/query-service/app/db"
|
||||
"go.signoz.io/signoz/ee/query-service/auth"
|
||||
"go.signoz.io/signoz/ee/query-service/constants"
|
||||
"go.signoz.io/signoz/ee/query-service/dao"
|
||||
"go.signoz.io/signoz/ee/query-service/integrations/gateway"
|
||||
"go.signoz.io/signoz/ee/query-service/interfaces"
|
||||
"go.signoz.io/signoz/ee/query-service/rules"
|
||||
"go.signoz.io/signoz/pkg/alertmanager"
|
||||
"go.signoz.io/signoz/pkg/http/middleware"
|
||||
"go.signoz.io/signoz/pkg/signoz"
|
||||
"go.signoz.io/signoz/pkg/sqlstore"
|
||||
"go.signoz.io/signoz/pkg/types"
|
||||
"go.signoz.io/signoz/pkg/types/authtypes"
|
||||
"go.signoz.io/signoz/pkg/web"
|
||||
|
||||
licensepkg "go.signoz.io/signoz/ee/query-service/license"
|
||||
"go.signoz.io/signoz/ee/query-service/usage"
|
||||
licensepkg "github.com/SigNoz/signoz/ee/query-service/license"
|
||||
"github.com/SigNoz/signoz/ee/query-service/usage"
|
||||
|
||||
"go.signoz.io/signoz/pkg/query-service/agentConf"
|
||||
baseapp "go.signoz.io/signoz/pkg/query-service/app"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/cloudintegrations"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/dashboards"
|
||||
baseexplorer "go.signoz.io/signoz/pkg/query-service/app/explorer"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/integrations"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/logparsingpipeline"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/opamp"
|
||||
opAmpModel "go.signoz.io/signoz/pkg/query-service/app/opamp/model"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/preferences"
|
||||
"go.signoz.io/signoz/pkg/query-service/cache"
|
||||
baseconst "go.signoz.io/signoz/pkg/query-service/constants"
|
||||
"go.signoz.io/signoz/pkg/query-service/healthcheck"
|
||||
baseint "go.signoz.io/signoz/pkg/query-service/interfaces"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
pqle "go.signoz.io/signoz/pkg/query-service/pqlEngine"
|
||||
baserules "go.signoz.io/signoz/pkg/query-service/rules"
|
||||
"go.signoz.io/signoz/pkg/query-service/telemetry"
|
||||
"go.signoz.io/signoz/pkg/query-service/utils"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/agentConf"
|
||||
baseapp "github.com/SigNoz/signoz/pkg/query-service/app"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/cloudintegrations"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/dashboards"
|
||||
baseexplorer "github.com/SigNoz/signoz/pkg/query-service/app/explorer"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/integrations"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/logparsingpipeline"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/opamp"
|
||||
opAmpModel "github.com/SigNoz/signoz/pkg/query-service/app/opamp/model"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/preferences"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/cache"
|
||||
baseconst "github.com/SigNoz/signoz/pkg/query-service/constants"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/healthcheck"
|
||||
baseint "github.com/SigNoz/signoz/pkg/query-service/interfaces"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
baserules "github.com/SigNoz/signoz/pkg/query-service/rules"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/telemetry"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/utils"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -112,7 +112,7 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := baseexplorer.InitWithDSN(serverOptions.SigNoz.SQLStore.BunDB()); err != nil {
|
||||
if err := baseexplorer.InitWithDSN(serverOptions.SigNoz.SQLStore); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := dashboards.InitDB(serverOptions.SigNoz.SQLStore.BunDB()); err != nil {
|
||||
if err := dashboards.InitDB(serverOptions.SigNoz.SQLStore); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -130,25 +130,23 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
||||
}
|
||||
|
||||
// initiate license manager
|
||||
lm, err := licensepkg.StartManager(serverOptions.SigNoz.SQLStore.SQLxDB(), serverOptions.SigNoz.SQLStore.BunDB())
|
||||
lm, err := licensepkg.StartManager(serverOptions.SigNoz.SQLStore.SQLxDB(), serverOptions.SigNoz.SQLStore)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// set license manager as feature flag provider in dao
|
||||
modelDao.SetFlagProvider(lm)
|
||||
readerReady := make(chan bool)
|
||||
|
||||
fluxIntervalForTraceDetail, err := time.ParseDuration(serverOptions.FluxIntervalForTraceDetail)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var reader interfaces.DataConnector
|
||||
qb := db.NewDataConnector(
|
||||
reader := db.NewDataConnector(
|
||||
serverOptions.SigNoz.SQLStore.SQLxDB(),
|
||||
serverOptions.SigNoz.TelemetryStore.ClickHouseDB(),
|
||||
serverOptions.PromConfigPath,
|
||||
serverOptions.SigNoz.TelemetryStore,
|
||||
serverOptions.SigNoz.Prometheus,
|
||||
lm,
|
||||
serverOptions.Cluster,
|
||||
serverOptions.UseLogsNewSchema,
|
||||
@@ -156,8 +154,6 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
||||
fluxIntervalForTraceDetail,
|
||||
serverOptions.SigNoz.Cache,
|
||||
)
|
||||
go qb.Start(readerReady)
|
||||
reader = qb
|
||||
|
||||
skipConfig := &basemodel.SkipConfig{}
|
||||
if serverOptions.SkipTopLvlOpsPath != "" {
|
||||
@@ -176,9 +172,7 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
||||
c = cache.NewCache(cacheOpts)
|
||||
}
|
||||
|
||||
<-readerReady
|
||||
rm, err := makeRulesManager(
|
||||
serverOptions.PromConfigPath,
|
||||
serverOptions.RuleRepoURL,
|
||||
serverOptions.SigNoz.SQLStore.SQLxDB(),
|
||||
reader,
|
||||
@@ -189,6 +183,8 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
||||
serverOptions.UseTraceNewSchema,
|
||||
serverOptions.SigNoz.Alertmanager,
|
||||
serverOptions.SigNoz.SQLStore,
|
||||
serverOptions.SigNoz.TelemetryStore,
|
||||
serverOptions.SigNoz.Prometheus,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
@@ -217,7 +213,7 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
||||
|
||||
// ingestion pipelines manager
|
||||
logParsingPipelineController, err := logparsingpipeline.NewLogParsingPipelinesController(
|
||||
serverOptions.SigNoz.SQLStore.SQLxDB(), integrationsController.GetPipelinesForInstalledIntegrations,
|
||||
serverOptions.SigNoz.SQLStore, integrationsController.GetPipelinesForInstalledIntegrations,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -233,7 +229,7 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
||||
}
|
||||
|
||||
// start the usagemanager
|
||||
usageManager, err := usage.New(modelDao, lm.GetRepo(), serverOptions.SigNoz.TelemetryStore.ClickHouseDB(), serverOptions.Config.TelemetryStore.ClickHouse.DSN)
|
||||
usageManager, err := usage.New(modelDao, lm.GetRepo(), serverOptions.SigNoz.TelemetryStore.ClickhouseDB(), serverOptions.Config.TelemetryStore.Clickhouse.DSN)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -304,6 +300,11 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
||||
&opAmpModel.AllAgents, agentConfMgr,
|
||||
)
|
||||
|
||||
errorList := reader.PreloadMetricsMetadata(context.Background())
|
||||
for _, er := range errorList {
|
||||
zap.L().Error("failed to preload metrics metadata", zap.Error(er))
|
||||
}
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
@@ -312,7 +313,7 @@ func (s *Server) createPrivateServer(apiHandler *api.APIHandler) (*http.Server,
|
||||
r := baseapp.NewRouter()
|
||||
|
||||
r.Use(middleware.NewAuth(zap.L(), s.serverOptions.Jwt, []string{"Authorization", "Sec-WebSocket-Protocol"}).Wrap)
|
||||
r.Use(eemiddleware.NewPat([]string{"SIGNOZ-API-KEY"}).Wrap)
|
||||
r.Use(eemiddleware.NewPat(s.serverOptions.SigNoz.SQLStore, []string{"SIGNOZ-API-KEY"}).Wrap)
|
||||
r.Use(middleware.NewTimeout(zap.L(),
|
||||
s.serverOptions.Config.APIServer.Timeout.ExcludedRoutes,
|
||||
s.serverOptions.Config.APIServer.Timeout.Default,
|
||||
@@ -345,7 +346,7 @@ func (s *Server) createPublicServer(apiHandler *api.APIHandler, web web.Web) (*h
|
||||
|
||||
// add auth middleware
|
||||
getUserFromRequest := func(ctx context.Context) (*types.GettableUser, error) {
|
||||
user, err := auth.GetUserFromRequestContext(ctx, apiHandler)
|
||||
user, err := auth.GetUserFromReqContext(ctx)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -360,7 +361,7 @@ func (s *Server) createPublicServer(apiHandler *api.APIHandler, web web.Web) (*h
|
||||
am := baseapp.NewAuthMiddleware(getUserFromRequest)
|
||||
|
||||
r.Use(middleware.NewAuth(zap.L(), s.serverOptions.Jwt, []string{"Authorization", "Sec-WebSocket-Protocol"}).Wrap)
|
||||
r.Use(eemiddleware.NewPat([]string{"SIGNOZ-API-KEY"}).Wrap)
|
||||
r.Use(eemiddleware.NewPat(s.serverOptions.SigNoz.SQLStore, []string{"SIGNOZ-API-KEY"}).Wrap)
|
||||
r.Use(middleware.NewTimeout(zap.L(),
|
||||
s.serverOptions.Config.APIServer.Timeout.ExcludedRoutes,
|
||||
s.serverOptions.Config.APIServer.Timeout.Default,
|
||||
@@ -532,7 +533,6 @@ func (s *Server) Stop() error {
|
||||
}
|
||||
|
||||
func makeRulesManager(
|
||||
promConfigPath,
|
||||
ruleRepoURL string,
|
||||
db *sqlx.DB,
|
||||
ch baseint.Reader,
|
||||
@@ -543,16 +543,13 @@ func makeRulesManager(
|
||||
useTraceNewSchema bool,
|
||||
alertmanager alertmanager.Alertmanager,
|
||||
sqlstore sqlstore.SQLStore,
|
||||
telemetryStore telemetrystore.TelemetryStore,
|
||||
prometheus prometheus.Prometheus,
|
||||
) (*baserules.Manager, error) {
|
||||
// create engine
|
||||
pqle, err := pqle.FromConfigPath(promConfigPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create pql engine : %v", err)
|
||||
}
|
||||
|
||||
// create manager opts
|
||||
managerOpts := &baserules.ManagerOptions{
|
||||
PqlEngine: pqle,
|
||||
TelemetryStore: telemetryStore,
|
||||
Prometheus: prometheus,
|
||||
RepoURL: ruleRepoURL,
|
||||
DBConn: db,
|
||||
Context: context.Background(),
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/app/api"
|
||||
baseauth "go.signoz.io/signoz/pkg/query-service/auth"
|
||||
"go.signoz.io/signoz/pkg/query-service/telemetry"
|
||||
"go.signoz.io/signoz/pkg/types"
|
||||
"go.signoz.io/signoz/pkg/types/authtypes"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func GetUserFromRequestContext(ctx context.Context, apiHandler *api.APIHandler) (*types.GettableUser, error) {
|
||||
patToken, ok := authtypes.UUIDFromContext(ctx)
|
||||
if ok && patToken != "" {
|
||||
zap.L().Debug("Received a non-zero length PAT token")
|
||||
ctx := context.Background()
|
||||
dao := apiHandler.AppDao()
|
||||
|
||||
pat, err := dao.GetPAT(ctx, patToken)
|
||||
if err == nil && pat != nil {
|
||||
zap.L().Debug("Found valid PAT: ", zap.Any("pat", pat))
|
||||
if pat.ExpiresAt < time.Now().Unix() && pat.ExpiresAt != 0 {
|
||||
zap.L().Info("PAT has expired: ", zap.Any("pat", pat))
|
||||
return nil, fmt.Errorf("PAT has expired")
|
||||
}
|
||||
group, apiErr := dao.GetGroupByName(ctx, pat.Role)
|
||||
if apiErr != nil {
|
||||
zap.L().Error("Error while getting group for PAT: ", zap.Any("apiErr", apiErr))
|
||||
return nil, apiErr
|
||||
}
|
||||
user, err := dao.GetUser(ctx, pat.UserID)
|
||||
if err != nil {
|
||||
zap.L().Error("Error while getting user for PAT: ", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
telemetry.GetInstance().SetPatTokenUser()
|
||||
dao.UpdatePATLastUsed(ctx, patToken, time.Now().Unix())
|
||||
user.User.GroupID = group.ID
|
||||
user.User.ID = pat.Id
|
||||
return &types.GettableUser{
|
||||
User: user.User,
|
||||
Role: pat.Role,
|
||||
}, nil
|
||||
}
|
||||
if err != nil {
|
||||
zap.L().Error("Error while getting user for PAT: ", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return baseauth.GetUserFromReqContext(ctx)
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"go.signoz.io/signoz/ee/query-service/dao/sqlite"
|
||||
"go.signoz.io/signoz/pkg/sqlstore"
|
||||
"github.com/SigNoz/signoz/ee/query-service/dao/sqlite"
|
||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||
)
|
||||
|
||||
func InitDao(sqlStore sqlstore.SQLStore) (ModelDao, error) {
|
||||
|
||||
@@ -4,14 +4,14 @@ import (
|
||||
"context"
|
||||
"net/url"
|
||||
|
||||
"github.com/SigNoz/signoz/ee/types"
|
||||
basedao "github.com/SigNoz/signoz/pkg/query-service/dao"
|
||||
baseint "github.com/SigNoz/signoz/pkg/query-service/interfaces"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
ossTypes "github.com/SigNoz/signoz/pkg/types"
|
||||
"github.com/SigNoz/signoz/pkg/types/authtypes"
|
||||
"github.com/google/uuid"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
basedao "go.signoz.io/signoz/pkg/query-service/dao"
|
||||
baseint "go.signoz.io/signoz/pkg/query-service/interfaces"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/types"
|
||||
"go.signoz.io/signoz/pkg/types/authtypes"
|
||||
"github.com/uptrace/bun"
|
||||
)
|
||||
|
||||
type ModelDao interface {
|
||||
@@ -20,27 +20,26 @@ type ModelDao interface {
|
||||
// SetFlagProvider sets the feature lookup provider
|
||||
SetFlagProvider(flags baseint.FeatureLookup)
|
||||
|
||||
DB() *sqlx.DB
|
||||
DB() *bun.DB
|
||||
|
||||
// auth methods
|
||||
CanUsePassword(ctx context.Context, email string) (bool, basemodel.BaseApiError)
|
||||
PrepareSsoRedirect(ctx context.Context, redirectUri, email string, jwt *authtypes.JWT) (redirectURL string, apierr basemodel.BaseApiError)
|
||||
GetDomainFromSsoResponse(ctx context.Context, relayState *url.URL) (*model.OrgDomain, error)
|
||||
GetDomainFromSsoResponse(ctx context.Context, relayState *url.URL) (*types.GettableOrgDomain, error)
|
||||
|
||||
// org domain (auth domains) CRUD ops
|
||||
ListDomains(ctx context.Context, orgId string) ([]model.OrgDomain, basemodel.BaseApiError)
|
||||
GetDomain(ctx context.Context, id uuid.UUID) (*model.OrgDomain, basemodel.BaseApiError)
|
||||
CreateDomain(ctx context.Context, d *model.OrgDomain) basemodel.BaseApiError
|
||||
UpdateDomain(ctx context.Context, domain *model.OrgDomain) basemodel.BaseApiError
|
||||
ListDomains(ctx context.Context, orgId string) ([]types.GettableOrgDomain, basemodel.BaseApiError)
|
||||
GetDomain(ctx context.Context, id uuid.UUID) (*types.GettableOrgDomain, basemodel.BaseApiError)
|
||||
CreateDomain(ctx context.Context, d *types.GettableOrgDomain) basemodel.BaseApiError
|
||||
UpdateDomain(ctx context.Context, domain *types.GettableOrgDomain) basemodel.BaseApiError
|
||||
DeleteDomain(ctx context.Context, id uuid.UUID) basemodel.BaseApiError
|
||||
GetDomainByEmail(ctx context.Context, email string) (*model.OrgDomain, basemodel.BaseApiError)
|
||||
GetDomainByEmail(ctx context.Context, email string) (*types.GettableOrgDomain, basemodel.BaseApiError)
|
||||
|
||||
CreatePAT(ctx context.Context, p model.PAT) (model.PAT, basemodel.BaseApiError)
|
||||
UpdatePAT(ctx context.Context, p model.PAT, id string) basemodel.BaseApiError
|
||||
GetPAT(ctx context.Context, pat string) (*model.PAT, basemodel.BaseApiError)
|
||||
UpdatePATLastUsed(ctx context.Context, pat string, lastUsed int64) basemodel.BaseApiError
|
||||
GetPATByID(ctx context.Context, id string) (*model.PAT, basemodel.BaseApiError)
|
||||
GetUserByPAT(ctx context.Context, token string) (*types.GettableUser, basemodel.BaseApiError)
|
||||
ListPATs(ctx context.Context) ([]model.PAT, basemodel.BaseApiError)
|
||||
RevokePAT(ctx context.Context, id string, userID string) basemodel.BaseApiError
|
||||
CreatePAT(ctx context.Context, orgID string, p types.GettablePAT) (types.GettablePAT, basemodel.BaseApiError)
|
||||
UpdatePAT(ctx context.Context, orgID string, p types.GettablePAT, id string) basemodel.BaseApiError
|
||||
GetPAT(ctx context.Context, pat string) (*types.GettablePAT, basemodel.BaseApiError)
|
||||
GetPATByID(ctx context.Context, orgID string, id string) (*types.GettablePAT, basemodel.BaseApiError)
|
||||
GetUserByPAT(ctx context.Context, orgID string, token string) (*ossTypes.GettableUser, basemodel.BaseApiError)
|
||||
ListPATs(ctx context.Context, orgID string) ([]types.GettablePAT, basemodel.BaseApiError)
|
||||
RevokePAT(ctx context.Context, orgID string, id string, userID string) basemodel.BaseApiError
|
||||
}
|
||||
|
||||
@@ -7,15 +7,15 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/SigNoz/signoz/ee/query-service/constants"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
baseauth "github.com/SigNoz/signoz/pkg/query-service/auth"
|
||||
baseconst "github.com/SigNoz/signoz/pkg/query-service/constants"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/utils"
|
||||
"github.com/SigNoz/signoz/pkg/types"
|
||||
"github.com/SigNoz/signoz/pkg/types/authtypes"
|
||||
"github.com/google/uuid"
|
||||
"go.signoz.io/signoz/ee/query-service/constants"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
baseauth "go.signoz.io/signoz/pkg/query-service/auth"
|
||||
baseconst "go.signoz.io/signoz/pkg/query-service/constants"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/query-service/utils"
|
||||
"go.signoz.io/signoz/pkg/types"
|
||||
"go.signoz.io/signoz/pkg/types/authtypes"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -53,7 +53,7 @@ func (m *modelDao) createUserForSAMLRequest(ctx context.Context, email string) (
|
||||
},
|
||||
ProfilePictureURL: "", // Currently unused
|
||||
GroupID: group.ID,
|
||||
OrgID: domain.OrgId,
|
||||
OrgID: domain.OrgID,
|
||||
}
|
||||
|
||||
user, apiErr = m.CreateUser(ctx, user, false)
|
||||
|
||||
@@ -9,32 +9,23 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/types"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
ossTypes "github.com/SigNoz/signoz/pkg/types"
|
||||
"github.com/google/uuid"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// StoredDomain represents stored database record for org domain
|
||||
|
||||
type StoredDomain struct {
|
||||
Id uuid.UUID `db:"id"`
|
||||
Name string `db:"name"`
|
||||
OrgId string `db:"org_id"`
|
||||
Data string `db:"data"`
|
||||
CreatedAt int64 `db:"created_at"`
|
||||
UpdatedAt int64 `db:"updated_at"`
|
||||
}
|
||||
|
||||
// GetDomainFromSsoResponse uses relay state received from IdP to fetch
|
||||
// user domain. The domain is further used to process validity of the response.
|
||||
// when sending login request to IdP we send relay state as URL (site url)
|
||||
// with domainId or domainName as query parameter.
|
||||
func (m *modelDao) GetDomainFromSsoResponse(ctx context.Context, relayState *url.URL) (*model.OrgDomain, error) {
|
||||
func (m *modelDao) GetDomainFromSsoResponse(ctx context.Context, relayState *url.URL) (*types.GettableOrgDomain, error) {
|
||||
// derive domain id from relay state now
|
||||
var domainIdStr string
|
||||
var domainNameStr string
|
||||
var domain *model.OrgDomain
|
||||
var domain *types.GettableOrgDomain
|
||||
|
||||
for k, v := range relayState.Query() {
|
||||
if k == "domainId" && len(v) > 0 {
|
||||
@@ -76,10 +67,14 @@ func (m *modelDao) GetDomainFromSsoResponse(ctx context.Context, relayState *url
|
||||
}
|
||||
|
||||
// GetDomainByName returns org domain for a given domain name
|
||||
func (m *modelDao) GetDomainByName(ctx context.Context, name string) (*model.OrgDomain, basemodel.BaseApiError) {
|
||||
func (m *modelDao) GetDomainByName(ctx context.Context, name string) (*types.GettableOrgDomain, basemodel.BaseApiError) {
|
||||
|
||||
stored := StoredDomain{}
|
||||
err := m.DB().Get(&stored, `SELECT * FROM org_domains WHERE name=$1 LIMIT 1`, name)
|
||||
stored := types.StorableOrgDomain{}
|
||||
err := m.DB().NewSelect().
|
||||
Model(&stored).
|
||||
Where("name = ?", name).
|
||||
Limit(1).
|
||||
Scan(ctx)
|
||||
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
@@ -88,7 +83,7 @@ func (m *modelDao) GetDomainByName(ctx context.Context, name string) (*model.Org
|
||||
return nil, model.InternalError(err)
|
||||
}
|
||||
|
||||
domain := &model.OrgDomain{Id: stored.Id, Name: stored.Name, OrgId: stored.OrgId}
|
||||
domain := &types.GettableOrgDomain{StorableOrgDomain: stored}
|
||||
if err := domain.LoadConfig(stored.Data); err != nil {
|
||||
return nil, model.InternalError(err)
|
||||
}
|
||||
@@ -96,10 +91,14 @@ func (m *modelDao) GetDomainByName(ctx context.Context, name string) (*model.Org
|
||||
}
|
||||
|
||||
// GetDomain returns org domain for a given domain id
|
||||
func (m *modelDao) GetDomain(ctx context.Context, id uuid.UUID) (*model.OrgDomain, basemodel.BaseApiError) {
|
||||
func (m *modelDao) GetDomain(ctx context.Context, id uuid.UUID) (*types.GettableOrgDomain, basemodel.BaseApiError) {
|
||||
|
||||
stored := StoredDomain{}
|
||||
err := m.DB().Get(&stored, `SELECT * FROM org_domains WHERE id=$1 LIMIT 1`, id)
|
||||
stored := types.StorableOrgDomain{}
|
||||
err := m.DB().NewSelect().
|
||||
Model(&stored).
|
||||
Where("id = ?", id).
|
||||
Limit(1).
|
||||
Scan(ctx)
|
||||
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
@@ -108,7 +107,7 @@ func (m *modelDao) GetDomain(ctx context.Context, id uuid.UUID) (*model.OrgDomai
|
||||
return nil, model.InternalError(err)
|
||||
}
|
||||
|
||||
domain := &model.OrgDomain{Id: stored.Id, Name: stored.Name, OrgId: stored.OrgId}
|
||||
domain := &types.GettableOrgDomain{StorableOrgDomain: stored}
|
||||
if err := domain.LoadConfig(stored.Data); err != nil {
|
||||
return nil, model.InternalError(err)
|
||||
}
|
||||
@@ -116,21 +115,24 @@ func (m *modelDao) GetDomain(ctx context.Context, id uuid.UUID) (*model.OrgDomai
|
||||
}
|
||||
|
||||
// ListDomains gets the list of auth domains by org id
|
||||
func (m *modelDao) ListDomains(ctx context.Context, orgId string) ([]model.OrgDomain, basemodel.BaseApiError) {
|
||||
domains := []model.OrgDomain{}
|
||||
func (m *modelDao) ListDomains(ctx context.Context, orgId string) ([]types.GettableOrgDomain, basemodel.BaseApiError) {
|
||||
domains := []types.GettableOrgDomain{}
|
||||
|
||||
stored := []StoredDomain{}
|
||||
err := m.DB().SelectContext(ctx, &stored, `SELECT * FROM org_domains WHERE org_id=$1`, orgId)
|
||||
stored := []types.StorableOrgDomain{}
|
||||
err := m.DB().NewSelect().
|
||||
Model(&stored).
|
||||
Where("org_id = ?", orgId).
|
||||
Scan(ctx)
|
||||
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return []model.OrgDomain{}, nil
|
||||
return domains, nil
|
||||
}
|
||||
return nil, model.InternalError(err)
|
||||
}
|
||||
|
||||
for _, s := range stored {
|
||||
domain := model.OrgDomain{Id: s.Id, Name: s.Name, OrgId: s.OrgId}
|
||||
domain := types.GettableOrgDomain{StorableOrgDomain: s}
|
||||
if err := domain.LoadConfig(s.Data); err != nil {
|
||||
zap.L().Error("ListDomains() failed", zap.Error(err))
|
||||
}
|
||||
@@ -141,14 +143,14 @@ func (m *modelDao) ListDomains(ctx context.Context, orgId string) ([]model.OrgDo
|
||||
}
|
||||
|
||||
// CreateDomain creates a new auth domain
|
||||
func (m *modelDao) CreateDomain(ctx context.Context, domain *model.OrgDomain) basemodel.BaseApiError {
|
||||
func (m *modelDao) CreateDomain(ctx context.Context, domain *types.GettableOrgDomain) basemodel.BaseApiError {
|
||||
|
||||
if domain.Id == uuid.Nil {
|
||||
domain.Id = uuid.New()
|
||||
if domain.ID == uuid.Nil {
|
||||
domain.ID = uuid.New()
|
||||
}
|
||||
|
||||
if domain.OrgId == "" || domain.Name == "" {
|
||||
return model.BadRequest(fmt.Errorf("domain creation failed, missing fields: OrgId, Name "))
|
||||
if domain.OrgID == "" || domain.Name == "" {
|
||||
return model.BadRequest(fmt.Errorf("domain creation failed, missing fields: OrgID, Name "))
|
||||
}
|
||||
|
||||
configJson, err := json.Marshal(domain)
|
||||
@@ -157,14 +159,17 @@ func (m *modelDao) CreateDomain(ctx context.Context, domain *model.OrgDomain) ba
|
||||
return model.InternalError(fmt.Errorf("domain creation failed"))
|
||||
}
|
||||
|
||||
_, err = m.DB().ExecContext(ctx,
|
||||
"INSERT INTO org_domains (id, name, org_id, data, created_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6)",
|
||||
domain.Id,
|
||||
domain.Name,
|
||||
domain.OrgId,
|
||||
configJson,
|
||||
time.Now().Unix(),
|
||||
time.Now().Unix())
|
||||
storableDomain := types.StorableOrgDomain{
|
||||
ID: domain.ID,
|
||||
Name: domain.Name,
|
||||
OrgID: domain.OrgID,
|
||||
Data: string(configJson),
|
||||
TimeAuditable: ossTypes.TimeAuditable{CreatedAt: time.Now(), UpdatedAt: time.Now()},
|
||||
}
|
||||
|
||||
_, err = m.DB().NewInsert().
|
||||
Model(&storableDomain).
|
||||
Exec(ctx)
|
||||
|
||||
if err != nil {
|
||||
zap.L().Error("failed to insert domain in db", zap.Error(err))
|
||||
@@ -175,9 +180,9 @@ func (m *modelDao) CreateDomain(ctx context.Context, domain *model.OrgDomain) ba
|
||||
}
|
||||
|
||||
// UpdateDomain updates stored config params for a domain
|
||||
func (m *modelDao) UpdateDomain(ctx context.Context, domain *model.OrgDomain) basemodel.BaseApiError {
|
||||
func (m *modelDao) UpdateDomain(ctx context.Context, domain *types.GettableOrgDomain) basemodel.BaseApiError {
|
||||
|
||||
if domain.Id == uuid.Nil {
|
||||
if domain.ID == uuid.Nil {
|
||||
zap.L().Error("domain update failed", zap.Error(fmt.Errorf("OrgDomain.Id is null")))
|
||||
return model.InternalError(fmt.Errorf("domain update failed"))
|
||||
}
|
||||
@@ -188,11 +193,19 @@ func (m *modelDao) UpdateDomain(ctx context.Context, domain *model.OrgDomain) ba
|
||||
return model.InternalError(fmt.Errorf("domain update failed"))
|
||||
}
|
||||
|
||||
_, err = m.DB().ExecContext(ctx,
|
||||
"UPDATE org_domains SET data = $1, updated_at = $2 WHERE id = $3",
|
||||
configJson,
|
||||
time.Now().Unix(),
|
||||
domain.Id)
|
||||
storableDomain := &types.StorableOrgDomain{
|
||||
ID: domain.ID,
|
||||
Name: domain.Name,
|
||||
OrgID: domain.OrgID,
|
||||
Data: string(configJson),
|
||||
TimeAuditable: ossTypes.TimeAuditable{UpdatedAt: time.Now()},
|
||||
}
|
||||
|
||||
_, err = m.DB().NewUpdate().
|
||||
Model(storableDomain).
|
||||
Column("data", "updated_at").
|
||||
WherePK().
|
||||
Exec(ctx)
|
||||
|
||||
if err != nil {
|
||||
zap.L().Error("domain update failed", zap.Error(err))
|
||||
@@ -210,9 +223,11 @@ func (m *modelDao) DeleteDomain(ctx context.Context, id uuid.UUID) basemodel.Bas
|
||||
return model.InternalError(fmt.Errorf("domain delete failed"))
|
||||
}
|
||||
|
||||
_, err := m.DB().ExecContext(ctx,
|
||||
"DELETE FROM org_domains WHERE id = $1",
|
||||
id)
|
||||
storableDomain := &types.StorableOrgDomain{ID: id}
|
||||
_, err := m.DB().NewDelete().
|
||||
Model(storableDomain).
|
||||
WherePK().
|
||||
Exec(ctx)
|
||||
|
||||
if err != nil {
|
||||
zap.L().Error("domain delete failed", zap.Error(err))
|
||||
@@ -222,7 +237,7 @@ func (m *modelDao) DeleteDomain(ctx context.Context, id uuid.UUID) basemodel.Bas
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *modelDao) GetDomainByEmail(ctx context.Context, email string) (*model.OrgDomain, basemodel.BaseApiError) {
|
||||
func (m *modelDao) GetDomainByEmail(ctx context.Context, email string) (*types.GettableOrgDomain, basemodel.BaseApiError) {
|
||||
|
||||
if email == "" {
|
||||
return nil, model.BadRequest(fmt.Errorf("could not find auth domain, missing fields: email "))
|
||||
@@ -235,8 +250,12 @@ func (m *modelDao) GetDomainByEmail(ctx context.Context, email string) (*model.O
|
||||
|
||||
parsedDomain := components[1]
|
||||
|
||||
stored := StoredDomain{}
|
||||
err := m.DB().Get(&stored, `SELECT * FROM org_domains WHERE name=$1 LIMIT 1`, parsedDomain)
|
||||
stored := types.StorableOrgDomain{}
|
||||
err := m.DB().NewSelect().
|
||||
Model(&stored).
|
||||
Where("name = ?", parsedDomain).
|
||||
Limit(1).
|
||||
Scan(ctx)
|
||||
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
@@ -245,7 +264,7 @@ func (m *modelDao) GetDomainByEmail(ctx context.Context, email string) (*model.O
|
||||
return nil, model.InternalError(err)
|
||||
}
|
||||
|
||||
domain := &model.OrgDomain{Id: stored.Id, Name: stored.Name, OrgId: stored.OrgId}
|
||||
domain := &types.GettableOrgDomain{StorableOrgDomain: stored}
|
||||
if err := domain.LoadConfig(stored.Data); err != nil {
|
||||
return nil, model.InternalError(err)
|
||||
}
|
||||
|
||||
@@ -3,11 +3,11 @@ package sqlite
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
basedao "go.signoz.io/signoz/pkg/query-service/dao"
|
||||
basedsql "go.signoz.io/signoz/pkg/query-service/dao/sqlite"
|
||||
baseint "go.signoz.io/signoz/pkg/query-service/interfaces"
|
||||
"go.signoz.io/signoz/pkg/sqlstore"
|
||||
basedao "github.com/SigNoz/signoz/pkg/query-service/dao"
|
||||
basedsql "github.com/SigNoz/signoz/pkg/query-service/dao/sqlite"
|
||||
baseint "github.com/SigNoz/signoz/pkg/query-service/interfaces"
|
||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||
"github.com/uptrace/bun"
|
||||
)
|
||||
|
||||
type modelDao struct {
|
||||
@@ -41,6 +41,6 @@ func InitDB(sqlStore sqlstore.SQLStore) (*modelDao, error) {
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func (m *modelDao) DB() *sqlx.DB {
|
||||
func (m *modelDao) DB() *bun.DB {
|
||||
return m.ModelDaoSqlite.DB()
|
||||
}
|
||||
|
||||
@@ -3,65 +3,57 @@ package sqlite
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/types"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/types"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
ossTypes "github.com/SigNoz/signoz/pkg/types"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func (m *modelDao) CreatePAT(ctx context.Context, p model.PAT) (model.PAT, basemodel.BaseApiError) {
|
||||
result, err := m.DB().ExecContext(ctx,
|
||||
"INSERT INTO personal_access_tokens (user_id, token, role, name, created_at, expires_at, updated_at, updated_by_user_id, last_used, revoked) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
|
||||
p.UserID,
|
||||
p.Token,
|
||||
p.Role,
|
||||
p.Name,
|
||||
p.CreatedAt,
|
||||
p.ExpiresAt,
|
||||
p.UpdatedAt,
|
||||
p.UpdatedByUserID,
|
||||
p.LastUsed,
|
||||
p.Revoked,
|
||||
)
|
||||
func (m *modelDao) CreatePAT(ctx context.Context, orgID string, p types.GettablePAT) (types.GettablePAT, basemodel.BaseApiError) {
|
||||
p.StorablePersonalAccessToken.OrgID = orgID
|
||||
_, err := m.DB().NewInsert().
|
||||
Model(&p.StorablePersonalAccessToken).
|
||||
Exec(ctx)
|
||||
if err != nil {
|
||||
zap.L().Error("Failed to insert PAT in db, err: %v", zap.Error(err))
|
||||
return model.PAT{}, model.InternalError(fmt.Errorf("PAT insertion failed"))
|
||||
return types.GettablePAT{}, model.InternalError(fmt.Errorf("PAT insertion failed"))
|
||||
}
|
||||
id, err := result.LastInsertId()
|
||||
if err != nil {
|
||||
zap.L().Error("Failed to get last inserted id, err: %v", zap.Error(err))
|
||||
return model.PAT{}, model.InternalError(fmt.Errorf("PAT insertion failed"))
|
||||
}
|
||||
p.Id = strconv.Itoa(int(id))
|
||||
|
||||
createdByUser, _ := m.GetUser(ctx, p.UserID)
|
||||
if createdByUser == nil {
|
||||
p.CreatedByUser = model.User{
|
||||
p.CreatedByUser = types.PatUser{
|
||||
NotFound: true,
|
||||
}
|
||||
} else {
|
||||
p.CreatedByUser = model.User{
|
||||
Id: createdByUser.ID,
|
||||
Name: createdByUser.Name,
|
||||
Email: createdByUser.Email,
|
||||
CreatedAt: createdByUser.CreatedAt.Unix(),
|
||||
ProfilePictureURL: createdByUser.ProfilePictureURL,
|
||||
NotFound: false,
|
||||
p.CreatedByUser = types.PatUser{
|
||||
User: ossTypes.User{
|
||||
ID: createdByUser.ID,
|
||||
Name: createdByUser.Name,
|
||||
Email: createdByUser.Email,
|
||||
TimeAuditable: ossTypes.TimeAuditable{
|
||||
CreatedAt: createdByUser.CreatedAt,
|
||||
UpdatedAt: createdByUser.UpdatedAt,
|
||||
},
|
||||
ProfilePictureURL: createdByUser.ProfilePictureURL,
|
||||
},
|
||||
NotFound: false,
|
||||
}
|
||||
}
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (m *modelDao) UpdatePAT(ctx context.Context, p model.PAT, id string) basemodel.BaseApiError {
|
||||
_, err := m.DB().ExecContext(ctx,
|
||||
"UPDATE personal_access_tokens SET role=$1, name=$2, updated_at=$3, updated_by_user_id=$4 WHERE id=$5 and revoked=false;",
|
||||
p.Role,
|
||||
p.Name,
|
||||
p.UpdatedAt,
|
||||
p.UpdatedByUserID,
|
||||
id)
|
||||
func (m *modelDao) UpdatePAT(ctx context.Context, orgID string, p types.GettablePAT, id string) basemodel.BaseApiError {
|
||||
_, err := m.DB().NewUpdate().
|
||||
Model(&p.StorablePersonalAccessToken).
|
||||
Column("role", "name", "updated_at", "updated_by_user_id").
|
||||
Where("id = ?", id).
|
||||
Where("org_id = ?", orgID).
|
||||
Where("revoked = false").
|
||||
Exec(ctx)
|
||||
if err != nil {
|
||||
zap.L().Error("Failed to update PAT in db, err: %v", zap.Error(err))
|
||||
return model.InternalError(fmt.Errorf("PAT update failed"))
|
||||
@@ -69,66 +61,82 @@ func (m *modelDao) UpdatePAT(ctx context.Context, p model.PAT, id string) basemo
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *modelDao) UpdatePATLastUsed(ctx context.Context, token string, lastUsed int64) basemodel.BaseApiError {
|
||||
_, err := m.DB().ExecContext(ctx,
|
||||
"UPDATE personal_access_tokens SET last_used=$1 WHERE token=$2 and revoked=false;",
|
||||
lastUsed,
|
||||
token)
|
||||
if err != nil {
|
||||
zap.L().Error("Failed to update PAT last used in db, err: %v", zap.Error(err))
|
||||
return model.InternalError(fmt.Errorf("PAT last used update failed"))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (m *modelDao) ListPATs(ctx context.Context, orgID string) ([]types.GettablePAT, basemodel.BaseApiError) {
|
||||
pats := []types.StorablePersonalAccessToken{}
|
||||
|
||||
func (m *modelDao) ListPATs(ctx context.Context) ([]model.PAT, basemodel.BaseApiError) {
|
||||
pats := []model.PAT{}
|
||||
|
||||
if err := m.DB().Select(&pats, "SELECT * FROM personal_access_tokens WHERE revoked=false ORDER by updated_at DESC;"); err != nil {
|
||||
if err := m.DB().NewSelect().
|
||||
Model(&pats).
|
||||
Where("revoked = false").
|
||||
Where("org_id = ?", orgID).
|
||||
Order("updated_at DESC").
|
||||
Scan(ctx); err != nil {
|
||||
zap.L().Error("Failed to fetch PATs err: %v", zap.Error(err))
|
||||
return nil, model.InternalError(fmt.Errorf("failed to fetch PATs"))
|
||||
}
|
||||
|
||||
patsWithUsers := []types.GettablePAT{}
|
||||
for i := range pats {
|
||||
patWithUser := types.GettablePAT{
|
||||
StorablePersonalAccessToken: pats[i],
|
||||
}
|
||||
|
||||
createdByUser, _ := m.GetUser(ctx, pats[i].UserID)
|
||||
if createdByUser == nil {
|
||||
pats[i].CreatedByUser = model.User{
|
||||
patWithUser.CreatedByUser = types.PatUser{
|
||||
NotFound: true,
|
||||
}
|
||||
} else {
|
||||
pats[i].CreatedByUser = model.User{
|
||||
Id: createdByUser.ID,
|
||||
Name: createdByUser.Name,
|
||||
Email: createdByUser.Email,
|
||||
CreatedAt: createdByUser.CreatedAt.Unix(),
|
||||
ProfilePictureURL: createdByUser.ProfilePictureURL,
|
||||
NotFound: false,
|
||||
patWithUser.CreatedByUser = types.PatUser{
|
||||
User: ossTypes.User{
|
||||
ID: createdByUser.ID,
|
||||
Name: createdByUser.Name,
|
||||
Email: createdByUser.Email,
|
||||
TimeAuditable: ossTypes.TimeAuditable{
|
||||
CreatedAt: createdByUser.CreatedAt,
|
||||
UpdatedAt: createdByUser.UpdatedAt,
|
||||
},
|
||||
ProfilePictureURL: createdByUser.ProfilePictureURL,
|
||||
},
|
||||
NotFound: false,
|
||||
}
|
||||
}
|
||||
|
||||
updatedByUser, _ := m.GetUser(ctx, pats[i].UpdatedByUserID)
|
||||
if updatedByUser == nil {
|
||||
pats[i].UpdatedByUser = model.User{
|
||||
patWithUser.UpdatedByUser = types.PatUser{
|
||||
NotFound: true,
|
||||
}
|
||||
} else {
|
||||
pats[i].UpdatedByUser = model.User{
|
||||
Id: updatedByUser.ID,
|
||||
Name: updatedByUser.Name,
|
||||
Email: updatedByUser.Email,
|
||||
CreatedAt: updatedByUser.CreatedAt.Unix(),
|
||||
ProfilePictureURL: updatedByUser.ProfilePictureURL,
|
||||
NotFound: false,
|
||||
patWithUser.UpdatedByUser = types.PatUser{
|
||||
User: ossTypes.User{
|
||||
ID: updatedByUser.ID,
|
||||
Name: updatedByUser.Name,
|
||||
Email: updatedByUser.Email,
|
||||
TimeAuditable: ossTypes.TimeAuditable{
|
||||
CreatedAt: updatedByUser.CreatedAt,
|
||||
UpdatedAt: updatedByUser.UpdatedAt,
|
||||
},
|
||||
ProfilePictureURL: updatedByUser.ProfilePictureURL,
|
||||
},
|
||||
NotFound: false,
|
||||
}
|
||||
}
|
||||
|
||||
patsWithUsers = append(patsWithUsers, patWithUser)
|
||||
}
|
||||
return pats, nil
|
||||
return patsWithUsers, nil
|
||||
}
|
||||
|
||||
func (m *modelDao) RevokePAT(ctx context.Context, id string, userID string) basemodel.BaseApiError {
|
||||
func (m *modelDao) RevokePAT(ctx context.Context, orgID string, id string, userID string) basemodel.BaseApiError {
|
||||
updatedAt := time.Now().Unix()
|
||||
_, err := m.DB().ExecContext(ctx,
|
||||
"UPDATE personal_access_tokens SET revoked=true, updated_by_user_id = $1, updated_at=$2 WHERE id=$3",
|
||||
userID, updatedAt, id)
|
||||
_, err := m.DB().NewUpdate().
|
||||
Model(&types.StorablePersonalAccessToken{}).
|
||||
Set("revoked = ?", true).
|
||||
Set("updated_by_user_id = ?", userID).
|
||||
Set("updated_at = ?", updatedAt).
|
||||
Where("id = ?", id).
|
||||
Where("org_id = ?", orgID).
|
||||
Exec(ctx)
|
||||
if err != nil {
|
||||
zap.L().Error("Failed to revoke PAT in db, err: %v", zap.Error(err))
|
||||
return model.InternalError(fmt.Errorf("PAT revoke failed"))
|
||||
@@ -136,10 +144,14 @@ func (m *modelDao) RevokePAT(ctx context.Context, id string, userID string) base
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *modelDao) GetPAT(ctx context.Context, token string) (*model.PAT, basemodel.BaseApiError) {
|
||||
pats := []model.PAT{}
|
||||
func (m *modelDao) GetPAT(ctx context.Context, token string) (*types.GettablePAT, basemodel.BaseApiError) {
|
||||
pats := []types.StorablePersonalAccessToken{}
|
||||
|
||||
if err := m.DB().Select(&pats, `SELECT * FROM personal_access_tokens WHERE token=? and revoked=false;`, token); err != nil {
|
||||
if err := m.DB().NewSelect().
|
||||
Model(&pats).
|
||||
Where("token = ?", token).
|
||||
Where("revoked = false").
|
||||
Scan(ctx); err != nil {
|
||||
return nil, model.InternalError(fmt.Errorf("failed to fetch PAT"))
|
||||
}
|
||||
|
||||
@@ -150,13 +162,22 @@ func (m *modelDao) GetPAT(ctx context.Context, token string) (*model.PAT, basemo
|
||||
}
|
||||
}
|
||||
|
||||
return &pats[0], nil
|
||||
patWithUser := types.GettablePAT{
|
||||
StorablePersonalAccessToken: pats[0],
|
||||
}
|
||||
|
||||
return &patWithUser, nil
|
||||
}
|
||||
|
||||
func (m *modelDao) GetPATByID(ctx context.Context, id string) (*model.PAT, basemodel.BaseApiError) {
|
||||
pats := []model.PAT{}
|
||||
func (m *modelDao) GetPATByID(ctx context.Context, orgID string, id string) (*types.GettablePAT, basemodel.BaseApiError) {
|
||||
pats := []types.StorablePersonalAccessToken{}
|
||||
|
||||
if err := m.DB().Select(&pats, `SELECT * FROM personal_access_tokens WHERE id=? and revoked=false;`, id); err != nil {
|
||||
if err := m.DB().NewSelect().
|
||||
Model(&pats).
|
||||
Where("id = ?", id).
|
||||
Where("org_id = ?", orgID).
|
||||
Where("revoked = false").
|
||||
Scan(ctx); err != nil {
|
||||
return nil, model.InternalError(fmt.Errorf("failed to fetch PAT"))
|
||||
}
|
||||
|
||||
@@ -167,26 +188,25 @@ func (m *modelDao) GetPATByID(ctx context.Context, id string) (*model.PAT, basem
|
||||
}
|
||||
}
|
||||
|
||||
return &pats[0], nil
|
||||
patWithUser := types.GettablePAT{
|
||||
StorablePersonalAccessToken: pats[0],
|
||||
}
|
||||
|
||||
return &patWithUser, nil
|
||||
}
|
||||
|
||||
// deprecated
|
||||
func (m *modelDao) GetUserByPAT(ctx context.Context, token string) (*types.GettableUser, basemodel.BaseApiError) {
|
||||
users := []types.GettableUser{}
|
||||
func (m *modelDao) GetUserByPAT(ctx context.Context, orgID string, token string) (*ossTypes.GettableUser, basemodel.BaseApiError) {
|
||||
users := []ossTypes.GettableUser{}
|
||||
|
||||
query := `SELECT
|
||||
u.id,
|
||||
u.name,
|
||||
u.email,
|
||||
u.password,
|
||||
u.created_at,
|
||||
u.profile_picture_url,
|
||||
u.org_id,
|
||||
u.group_id
|
||||
FROM users u, personal_access_tokens p
|
||||
WHERE u.id = p.user_id and p.token=? and p.expires_at >= strftime('%s', 'now');`
|
||||
|
||||
if err := m.DB().Select(&users, query, token); err != nil {
|
||||
if err := m.DB().NewSelect().
|
||||
Model(&users).
|
||||
Column("u.id", "u.name", "u.email", "u.password", "u.created_at", "u.profile_picture_url", "u.org_id", "u.group_id").
|
||||
Join("JOIN personal_access_tokens p ON u.id = p.user_id").
|
||||
Where("p.token = ?", token).
|
||||
Where("p.expires_at >= strftime('%s', 'now')").
|
||||
Where("p.org_id = ?", orgID).
|
||||
Scan(ctx); err != nil {
|
||||
return nil, model.InternalError(fmt.Errorf("failed to fetch user from PAT, err: %v", err))
|
||||
}
|
||||
|
||||
|
||||
@@ -6,3 +6,11 @@ type ValidateLicenseResponse struct {
|
||||
Status status `json:"status"`
|
||||
Data map[string]interface{} `json:"data"`
|
||||
}
|
||||
|
||||
type CheckoutSessionRedirect struct {
|
||||
RedirectURL string `json:"url"`
|
||||
}
|
||||
type CheckoutResponse struct {
|
||||
Status status `json:"status"`
|
||||
Data CheckoutSessionRedirect `json:"data"`
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ import (
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/constants"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/query-service/constants"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
)
|
||||
|
||||
var C *Client
|
||||
@@ -126,10 +126,98 @@ func SendUsage(ctx context.Context, usage model.UsagePayload) *model.ApiError {
|
||||
case 200, 201:
|
||||
return nil
|
||||
case 400, 401:
|
||||
return model.BadRequest(errors.Wrap(fmt.Errorf(string(body)),
|
||||
return model.BadRequest(errors.Wrap(errors.New(string(body)),
|
||||
"bad request error received from license.signoz.io"))
|
||||
default:
|
||||
return model.InternalError(errors.Wrap(fmt.Errorf(string(body)),
|
||||
return model.InternalError(errors.Wrap(errors.New(string(body)),
|
||||
"internal error received from license.signoz.io"))
|
||||
}
|
||||
}
|
||||
|
||||
func CheckoutSession(ctx context.Context, checkoutRequest *model.CheckoutRequest, licenseKey string) (string, *model.ApiError) {
|
||||
hClient := &http.Client{}
|
||||
|
||||
reqString, err := json.Marshal(checkoutRequest)
|
||||
if err != nil {
|
||||
return "", model.BadRequest(err)
|
||||
}
|
||||
|
||||
req, err := http.NewRequestWithContext(ctx, "POST", C.GatewayUrl+"/v2/subscriptions/me/sessions/checkout", bytes.NewBuffer(reqString))
|
||||
if err != nil {
|
||||
return "", model.BadRequest(err)
|
||||
}
|
||||
req.Header.Set("X-Signoz-Cloud-Api-Key", licenseKey)
|
||||
|
||||
response, err := hClient.Do(req)
|
||||
if err != nil {
|
||||
return "", model.BadRequest(err)
|
||||
}
|
||||
body, err := io.ReadAll(response.Body)
|
||||
if err != nil {
|
||||
return "", model.BadRequest(errors.Wrap(err, fmt.Sprintf("failed to read checkout response from %v", C.GatewayUrl)))
|
||||
}
|
||||
defer response.Body.Close()
|
||||
|
||||
switch response.StatusCode {
|
||||
case 201:
|
||||
a := CheckoutResponse{}
|
||||
err = json.Unmarshal(body, &a)
|
||||
if err != nil {
|
||||
return "", model.BadRequest(errors.Wrap(err, "failed to unmarshal zeus checkout response"))
|
||||
}
|
||||
return a.Data.RedirectURL, nil
|
||||
case 400:
|
||||
return "", model.BadRequest(errors.Wrap(errors.New(string(body)),
|
||||
fmt.Sprintf("bad request error received from %v", C.GatewayUrl)))
|
||||
case 401:
|
||||
return "", model.Unauthorized(errors.Wrap(errors.New(string(body)),
|
||||
fmt.Sprintf("unauthorized request error received from %v", C.GatewayUrl)))
|
||||
default:
|
||||
return "", model.InternalError(errors.Wrap(errors.New(string(body)),
|
||||
fmt.Sprintf("internal request error received from %v", C.GatewayUrl)))
|
||||
}
|
||||
}
|
||||
|
||||
func PortalSession(ctx context.Context, checkoutRequest *model.PortalRequest, licenseKey string) (string, *model.ApiError) {
|
||||
hClient := &http.Client{}
|
||||
|
||||
reqString, err := json.Marshal(checkoutRequest)
|
||||
if err != nil {
|
||||
return "", model.BadRequest(err)
|
||||
}
|
||||
|
||||
req, err := http.NewRequestWithContext(ctx, "POST", C.GatewayUrl+"/v2/subscriptions/me/sessions/portal", bytes.NewBuffer(reqString))
|
||||
if err != nil {
|
||||
return "", model.BadRequest(err)
|
||||
}
|
||||
req.Header.Set("X-Signoz-Cloud-Api-Key", licenseKey)
|
||||
|
||||
response, err := hClient.Do(req)
|
||||
if err != nil {
|
||||
return "", model.BadRequest(err)
|
||||
}
|
||||
body, err := io.ReadAll(response.Body)
|
||||
if err != nil {
|
||||
return "", model.BadRequest(errors.Wrap(err, fmt.Sprintf("failed to read portal response from %v", C.GatewayUrl)))
|
||||
}
|
||||
defer response.Body.Close()
|
||||
|
||||
switch response.StatusCode {
|
||||
case 201:
|
||||
a := CheckoutResponse{}
|
||||
err = json.Unmarshal(body, &a)
|
||||
if err != nil {
|
||||
return "", model.BadRequest(errors.Wrap(err, "failed to unmarshal zeus portal response"))
|
||||
}
|
||||
return a.Data.RedirectURL, nil
|
||||
case 400:
|
||||
return "", model.BadRequest(errors.Wrap(errors.New(string(body)),
|
||||
fmt.Sprintf("bad request error received from %v", C.GatewayUrl)))
|
||||
case 401:
|
||||
return "", model.Unauthorized(errors.Wrap(errors.New(string(body)),
|
||||
fmt.Sprintf("unauthorized request error received from %v", C.GatewayUrl)))
|
||||
default:
|
||||
return "", model.InternalError(errors.Wrap(errors.New(string(body)),
|
||||
fmt.Sprintf("internal request error received from %v", C.GatewayUrl)))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
package interfaces
|
||||
|
||||
import (
|
||||
baseint "go.signoz.io/signoz/pkg/query-service/interfaces"
|
||||
baseint "github.com/SigNoz/signoz/pkg/query-service/interfaces"
|
||||
)
|
||||
|
||||
// Connector defines methods for interaction
|
||||
// with o11y data. for example - clickhouse
|
||||
type DataConnector interface {
|
||||
Start(readerReady chan bool)
|
||||
baseint.Reader
|
||||
}
|
||||
|
||||
@@ -9,25 +9,25 @@ import (
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/mattn/go-sqlite3"
|
||||
"github.com/uptrace/bun"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/types"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||
"github.com/SigNoz/signoz/pkg/types"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// Repo is license repo. stores license keys in a secured DB
|
||||
type Repo struct {
|
||||
db *sqlx.DB
|
||||
bundb *bun.DB
|
||||
store sqlstore.SQLStore
|
||||
}
|
||||
|
||||
// NewLicenseRepo initiates a new license repo
|
||||
func NewLicenseRepo(db *sqlx.DB, bundb *bun.DB) Repo {
|
||||
func NewLicenseRepo(db *sqlx.DB, store sqlstore.SQLStore) Repo {
|
||||
return Repo{
|
||||
db: db,
|
||||
bundb: bundb,
|
||||
store: store,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ func (r *Repo) UpdateLicenseV3(ctx context.Context, l *model.LicenseV3) error {
|
||||
|
||||
func (r *Repo) CreateFeature(req *types.FeatureStatus) *basemodel.ApiError {
|
||||
|
||||
_, err := r.bundb.NewInsert().
|
||||
_, err := r.store.BunDB().NewInsert().
|
||||
Model(req).
|
||||
Exec(context.Background())
|
||||
if err != nil {
|
||||
@@ -183,7 +183,7 @@ func (r *Repo) CreateFeature(req *types.FeatureStatus) *basemodel.ApiError {
|
||||
func (r *Repo) GetFeature(featureName string) (types.FeatureStatus, error) {
|
||||
var feature types.FeatureStatus
|
||||
|
||||
err := r.bundb.NewSelect().
|
||||
err := r.store.BunDB().NewSelect().
|
||||
Model(&feature).
|
||||
Where("name = ?", featureName).
|
||||
Scan(context.Background())
|
||||
@@ -212,7 +212,7 @@ func (r *Repo) GetAllFeatures() ([]basemodel.Feature, error) {
|
||||
|
||||
func (r *Repo) UpdateFeature(req types.FeatureStatus) error {
|
||||
|
||||
_, err := r.bundb.NewUpdate().
|
||||
_, err := r.store.BunDB().NewUpdate().
|
||||
Model(&req).
|
||||
Where("name = ?", req.Name).
|
||||
Exec(context.Background())
|
||||
|
||||
@@ -7,18 +7,18 @@ import (
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/uptrace/bun"
|
||||
|
||||
"sync"
|
||||
|
||||
baseconstants "go.signoz.io/signoz/pkg/query-service/constants"
|
||||
"go.signoz.io/signoz/pkg/types"
|
||||
"go.signoz.io/signoz/pkg/types/authtypes"
|
||||
baseconstants "github.com/SigNoz/signoz/pkg/query-service/constants"
|
||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||
"github.com/SigNoz/signoz/pkg/types"
|
||||
"github.com/SigNoz/signoz/pkg/types/authtypes"
|
||||
|
||||
validate "go.signoz.io/signoz/ee/query-service/integrations/signozio"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/query-service/telemetry"
|
||||
validate "github.com/SigNoz/signoz/ee/query-service/integrations/signozio"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/telemetry"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -45,12 +45,12 @@ type Manager struct {
|
||||
activeFeatures basemodel.FeatureSet
|
||||
}
|
||||
|
||||
func StartManager(db *sqlx.DB, bundb *bun.DB, features ...basemodel.Feature) (*Manager, error) {
|
||||
func StartManager(db *sqlx.DB, store sqlstore.SQLStore, features ...basemodel.Feature) (*Manager, error) {
|
||||
if LM != nil {
|
||||
return LM, nil
|
||||
}
|
||||
|
||||
repo := NewLicenseRepo(db, bundb)
|
||||
repo := NewLicenseRepo(db, store)
|
||||
m := &Manager{
|
||||
repo: &repo,
|
||||
}
|
||||
@@ -155,7 +155,7 @@ func (lm *Manager) ValidatorV3(ctx context.Context) {
|
||||
tick := time.NewTicker(validationFrequency)
|
||||
defer tick.Stop()
|
||||
|
||||
lm.ValidateV3(ctx)
|
||||
_ = lm.ValidateV3(ctx)
|
||||
for {
|
||||
select {
|
||||
case <-lm.done:
|
||||
@@ -165,7 +165,7 @@ func (lm *Manager) ValidatorV3(ctx context.Context) {
|
||||
case <-lm.done:
|
||||
return
|
||||
case <-tick.C:
|
||||
lm.ValidateV3(ctx)
|
||||
_ = lm.ValidateV3(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,6 +265,10 @@ func (lm *Manager) ActivateV3(ctx context.Context, licenseKey string) (licenseRe
|
||||
return license, nil
|
||||
}
|
||||
|
||||
func (lm *Manager) GetActiveLicense() *model.LicenseV3 {
|
||||
return lm.activeLicenseV3
|
||||
}
|
||||
|
||||
// CheckFeature will be internally used by backend routines
|
||||
// for feature gating
|
||||
func (lm *Manager) CheckFeature(featureKey string) error {
|
||||
|
||||
@@ -3,89 +3,33 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"go.opentelemetry.io/otel/sdk/resource"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
||||
"go.signoz.io/signoz/ee/query-service/app"
|
||||
"go.signoz.io/signoz/pkg/config"
|
||||
"go.signoz.io/signoz/pkg/config/envprovider"
|
||||
"go.signoz.io/signoz/pkg/config/fileprovider"
|
||||
"go.signoz.io/signoz/pkg/query-service/auth"
|
||||
baseconst "go.signoz.io/signoz/pkg/query-service/constants"
|
||||
"go.signoz.io/signoz/pkg/query-service/version"
|
||||
"go.signoz.io/signoz/pkg/signoz"
|
||||
"go.signoz.io/signoz/pkg/types/authtypes"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
|
||||
prommodel "github.com/prometheus/common/model"
|
||||
|
||||
zapotlpencoder "github.com/SigNoz/zap_otlp/zap_otlp_encoder"
|
||||
zapotlpsync "github.com/SigNoz/zap_otlp/zap_otlp_sync"
|
||||
"github.com/SigNoz/signoz/ee/query-service/app"
|
||||
"github.com/SigNoz/signoz/ee/sqlstore/postgressqlstore"
|
||||
"github.com/SigNoz/signoz/pkg/config"
|
||||
"github.com/SigNoz/signoz/pkg/config/envprovider"
|
||||
"github.com/SigNoz/signoz/pkg/config/fileprovider"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/auth"
|
||||
baseconst "github.com/SigNoz/signoz/pkg/query-service/constants"
|
||||
"github.com/SigNoz/signoz/pkg/signoz"
|
||||
"github.com/SigNoz/signoz/pkg/sqlstore/sqlstorehook"
|
||||
"github.com/SigNoz/signoz/pkg/types/authtypes"
|
||||
"github.com/SigNoz/signoz/pkg/version"
|
||||
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/zapcore"
|
||||
)
|
||||
|
||||
func initZapLog(enableQueryServiceLogOTLPExport bool) *zap.Logger {
|
||||
func initZapLog() *zap.Logger {
|
||||
config := zap.NewProductionConfig()
|
||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
||||
defer stop()
|
||||
|
||||
config.EncoderConfig.EncodeDuration = zapcore.MillisDurationEncoder
|
||||
config.EncoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
|
||||
config.EncoderConfig.TimeKey = "timestamp"
|
||||
config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
|
||||
|
||||
otlpEncoder := zapotlpencoder.NewOTLPEncoder(config.EncoderConfig)
|
||||
consoleEncoder := zapcore.NewJSONEncoder(config.EncoderConfig)
|
||||
defaultLogLevel := zapcore.InfoLevel
|
||||
|
||||
res := resource.NewWithAttributes(
|
||||
semconv.SchemaURL,
|
||||
semconv.ServiceNameKey.String("query-service"),
|
||||
)
|
||||
|
||||
core := zapcore.NewTee(
|
||||
zapcore.NewCore(consoleEncoder, os.Stdout, defaultLogLevel),
|
||||
)
|
||||
|
||||
if enableQueryServiceLogOTLPExport {
|
||||
ctx, cancel := context.WithTimeout(ctx, time.Second*30)
|
||||
defer cancel()
|
||||
conn, err := grpc.DialContext(ctx, baseconst.OTLPTarget, grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||
if err != nil {
|
||||
log.Fatalf("failed to establish connection: %v", err)
|
||||
} else {
|
||||
logExportBatchSizeInt, err := strconv.Atoi(baseconst.LogExportBatchSize)
|
||||
if err != nil {
|
||||
logExportBatchSizeInt = 512
|
||||
}
|
||||
ws := zapcore.AddSync(zapotlpsync.NewOtlpSyncer(conn, zapotlpsync.Options{
|
||||
BatchSize: logExportBatchSizeInt,
|
||||
ResourceSchema: semconv.SchemaURL,
|
||||
Resource: res,
|
||||
}))
|
||||
core = zapcore.NewTee(
|
||||
zapcore.NewCore(consoleEncoder, os.Stdout, defaultLogLevel),
|
||||
zapcore.NewCore(otlpEncoder, zapcore.NewMultiWriteSyncer(ws), defaultLogLevel),
|
||||
)
|
||||
}
|
||||
}
|
||||
logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
|
||||
|
||||
logger, _ := config.Build()
|
||||
return logger
|
||||
}
|
||||
|
||||
func init() {
|
||||
prommodel.NameValidationScheme = prommodel.UTF8Validation
|
||||
}
|
||||
|
||||
func main() {
|
||||
var promConfigPath, skipTopLvlOpsPath string
|
||||
|
||||
@@ -99,7 +43,6 @@ func main() {
|
||||
var useLogsNewSchema bool
|
||||
var useTraceNewSchema bool
|
||||
var cacheConfigPath, fluxInterval, fluxIntervalForTraceDetail string
|
||||
var enableQueryServiceLogOTLPExport bool
|
||||
var preferSpanMetrics bool
|
||||
|
||||
var maxIdleConns int
|
||||
@@ -121,19 +64,15 @@ func main() {
|
||||
flag.StringVar(&cacheConfigPath, "experimental.cache-config", "", "(cache config to use)")
|
||||
flag.StringVar(&fluxInterval, "flux-interval", "5m", "(the interval to exclude data from being cached to avoid incorrect cache for data in motion)")
|
||||
flag.StringVar(&fluxIntervalForTraceDetail, "flux-interval-trace-detail", "2m", "(the interval to exclude data from being cached to avoid incorrect cache for trace data in motion)")
|
||||
flag.BoolVar(&enableQueryServiceLogOTLPExport, "enable.query.service.log.otlp.export", false, "(enable query service log otlp export)")
|
||||
flag.StringVar(&cluster, "cluster", "cluster", "(cluster name - defaults to 'cluster')")
|
||||
flag.StringVar(&gatewayUrl, "gateway-url", "", "(url to the gateway)")
|
||||
flag.BoolVar(&useLicensesV3, "use-licenses-v3", false, "use licenses_v3 schema for licenses")
|
||||
flag.Parse()
|
||||
|
||||
loggerMgr := initZapLog(enableQueryServiceLogOTLPExport)
|
||||
|
||||
loggerMgr := initZapLog()
|
||||
zap.ReplaceGlobals(loggerMgr)
|
||||
defer loggerMgr.Sync() // flushes buffer, if any
|
||||
|
||||
version.PrintVersion()
|
||||
|
||||
config, err := signoz.NewConfig(context.Background(), config.ResolverConfig{
|
||||
Uris: []string{"env:"},
|
||||
ProviderFactories: []config.ProviderFactory{
|
||||
@@ -144,21 +83,29 @@ func main() {
|
||||
MaxIdleConns: maxIdleConns,
|
||||
MaxOpenConns: maxOpenConns,
|
||||
DialTimeout: dialTimeout,
|
||||
Config: promConfigPath,
|
||||
})
|
||||
if err != nil {
|
||||
zap.L().Fatal("Failed to create config", zap.Error(err))
|
||||
}
|
||||
|
||||
version.Info.PrettyPrint(config.Version)
|
||||
|
||||
sqlStoreFactories := signoz.NewSQLStoreProviderFactories()
|
||||
if err := sqlStoreFactories.Add(postgressqlstore.NewFactory(sqlstorehook.NewLoggingFactory())); err != nil {
|
||||
zap.L().Fatal("Failed to add postgressqlstore factory", zap.Error(err))
|
||||
}
|
||||
|
||||
signoz, err := signoz.New(
|
||||
context.Background(),
|
||||
config,
|
||||
signoz.NewCacheProviderFactories(),
|
||||
signoz.NewWebProviderFactories(),
|
||||
signoz.NewSQLStoreProviderFactories(),
|
||||
sqlStoreFactories,
|
||||
signoz.NewTelemetryStoreProviderFactories(),
|
||||
)
|
||||
if err != nil {
|
||||
zap.L().Fatal("Failed to create signoz struct", zap.Error(err))
|
||||
zap.L().Fatal("Failed to create signoz", zap.Error(err))
|
||||
}
|
||||
|
||||
jwtSecret := os.Getenv("SIGNOZ_JWT_SECRET")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
)
|
||||
|
||||
// GettableInvitation overrides base object and adds precheck into
|
||||
|
||||
@@ -3,7 +3,7 @@ package model
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
)
|
||||
|
||||
type ApiError struct {
|
||||
|
||||
@@ -6,8 +6,8 @@ import (
|
||||
"reflect"
|
||||
"time"
|
||||
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"github.com/pkg/errors"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
)
|
||||
|
||||
type License struct {
|
||||
@@ -236,3 +236,11 @@ func ConvertLicenseV3ToLicenseV2(l *LicenseV3) *License {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
type CheckoutRequest struct {
|
||||
SuccessURL string `json:"url"`
|
||||
}
|
||||
|
||||
type PortalRequest struct {
|
||||
SuccessURL string `json:"url"`
|
||||
}
|
||||
|
||||
@@ -4,10 +4,10 @@ import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
"github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.signoz.io/signoz/pkg/query-service/model"
|
||||
)
|
||||
|
||||
func TestNewLicenseV3(t *testing.T) {
|
||||
|
||||
@@ -1,32 +1,7 @@
|
||||
package model
|
||||
|
||||
type User struct {
|
||||
Id string `json:"id" db:"id"`
|
||||
Name string `json:"name" db:"name"`
|
||||
Email string `json:"email" db:"email"`
|
||||
CreatedAt int64 `json:"createdAt" db:"created_at"`
|
||||
ProfilePictureURL string `json:"profilePictureURL" db:"profile_picture_url"`
|
||||
NotFound bool `json:"notFound"`
|
||||
}
|
||||
|
||||
type CreatePATRequestBody struct {
|
||||
Name string `json:"name"`
|
||||
Role string `json:"role"`
|
||||
ExpiresInDays int64 `json:"expiresInDays"`
|
||||
}
|
||||
|
||||
type PAT struct {
|
||||
Id string `json:"id" db:"id"`
|
||||
UserID string `json:"userId" db:"user_id"`
|
||||
CreatedByUser User `json:"createdByUser"`
|
||||
UpdatedByUser User `json:"updatedByUser"`
|
||||
Token string `json:"token" db:"token"`
|
||||
Role string `json:"role" db:"role"`
|
||||
Name string `json:"name" db:"name"`
|
||||
CreatedAt int64 `json:"createdAt" db:"created_at"`
|
||||
ExpiresAt int64 `json:"expiresAt" db:"expires_at"`
|
||||
UpdatedAt int64 `json:"updatedAt" db:"updated_at"`
|
||||
LastUsed int64 `json:"lastUsed" db:"last_used"`
|
||||
Revoked bool `json:"revoked" db:"revoked"`
|
||||
UpdatedByUserID string `json:"updatedByUserId" db:"updated_by_user_id"`
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"go.signoz.io/signoz/pkg/query-service/constants"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/constants"
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
)
|
||||
|
||||
const SSO = "SSO"
|
||||
@@ -157,6 +157,13 @@ var BasicPlan = basemodel.FeatureSet{
|
||||
UsageLimit: -1,
|
||||
Route: "",
|
||||
},
|
||||
basemodel.Feature{
|
||||
Name: basemodel.TraceFunnels,
|
||||
Active: false,
|
||||
Usage: 0,
|
||||
UsageLimit: -1,
|
||||
Route: "",
|
||||
},
|
||||
}
|
||||
|
||||
var ProPlan = basemodel.FeatureSet{
|
||||
@@ -279,6 +286,13 @@ var ProPlan = basemodel.FeatureSet{
|
||||
UsageLimit: -1,
|
||||
Route: "",
|
||||
},
|
||||
basemodel.Feature{
|
||||
Name: basemodel.TraceFunnels,
|
||||
Active: false,
|
||||
Usage: 0,
|
||||
UsageLimit: -1,
|
||||
Route: "",
|
||||
},
|
||||
}
|
||||
|
||||
var EnterprisePlan = basemodel.FeatureSet{
|
||||
@@ -415,4 +429,11 @@ var EnterprisePlan = basemodel.FeatureSet{
|
||||
UsageLimit: -1,
|
||||
Route: "",
|
||||
},
|
||||
basemodel.Feature{
|
||||
Name: basemodel.TraceFunnels,
|
||||
Active: false,
|
||||
Usage: 0,
|
||||
UsageLimit: -1,
|
||||
Route: "",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -11,22 +11,22 @@ import (
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/anomaly"
|
||||
"go.signoz.io/signoz/pkg/query-service/cache"
|
||||
"go.signoz.io/signoz/pkg/query-service/common"
|
||||
"go.signoz.io/signoz/pkg/query-service/model"
|
||||
"github.com/SigNoz/signoz/ee/query-service/anomaly"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/cache"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/common"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
|
||||
querierV2 "go.signoz.io/signoz/pkg/query-service/app/querier/v2"
|
||||
"go.signoz.io/signoz/pkg/query-service/app/queryBuilder"
|
||||
"go.signoz.io/signoz/pkg/query-service/interfaces"
|
||||
v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
|
||||
"go.signoz.io/signoz/pkg/query-service/utils/labels"
|
||||
"go.signoz.io/signoz/pkg/query-service/utils/times"
|
||||
"go.signoz.io/signoz/pkg/query-service/utils/timestamp"
|
||||
querierV2 "github.com/SigNoz/signoz/pkg/query-service/app/querier/v2"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/app/queryBuilder"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/interfaces"
|
||||
v3 "github.com/SigNoz/signoz/pkg/query-service/model/v3"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/utils/labels"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/utils/times"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/utils/timestamp"
|
||||
|
||||
"go.signoz.io/signoz/pkg/query-service/formatter"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/formatter"
|
||||
|
||||
baserules "go.signoz.io/signoz/pkg/query-service/rules"
|
||||
baserules "github.com/SigNoz/signoz/pkg/query-service/rules"
|
||||
|
||||
yaml "gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
@@ -5,10 +5,10 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
basemodel "github.com/SigNoz/signoz/pkg/query-service/model"
|
||||
baserules "github.com/SigNoz/signoz/pkg/query-service/rules"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/utils/labels"
|
||||
"github.com/google/uuid"
|
||||
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||
baserules "go.signoz.io/signoz/pkg/query-service/rules"
|
||||
"go.signoz.io/signoz/pkg/query-service/utils/labels"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -48,7 +48,7 @@ func PrepareTaskFunc(opts baserules.PrepareTaskOptions) (baserules.Task, error)
|
||||
opts.Rule,
|
||||
opts.Logger,
|
||||
opts.Reader,
|
||||
opts.ManagerOpts.PqlEngine,
|
||||
opts.ManagerOpts.Prometheus,
|
||||
baserules.WithSQLStore(opts.SQLStore),
|
||||
)
|
||||
|
||||
@@ -145,7 +145,7 @@ func TestNotification(opts baserules.PrepareTestRuleOptions) (int, *basemodel.Ap
|
||||
parsedRule,
|
||||
opts.Logger,
|
||||
opts.Reader,
|
||||
opts.ManagerOpts.PqlEngine,
|
||||
opts.ManagerOpts.Prometheus,
|
||||
baserules.WithSendAlways(),
|
||||
baserules.WithSendUnmatched(),
|
||||
baserules.WithSQLStore(opts.SQLStore),
|
||||
|
||||
@@ -7,9 +7,9 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/SigNoz/signoz/pkg/query-service/constants"
|
||||
saml2 "github.com/russellhaering/gosaml2"
|
||||
dsig "github.com/russellhaering/goxmldsig"
|
||||
"go.signoz.io/signoz/pkg/query-service/constants"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
|
||||
@@ -15,11 +15,11 @@ import (
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
"go.signoz.io/signoz/ee/query-service/dao"
|
||||
licenseserver "go.signoz.io/signoz/ee/query-service/integrations/signozio"
|
||||
"go.signoz.io/signoz/ee/query-service/license"
|
||||
"go.signoz.io/signoz/ee/query-service/model"
|
||||
"go.signoz.io/signoz/pkg/query-service/utils/encryption"
|
||||
"github.com/SigNoz/signoz/ee/query-service/dao"
|
||||
licenseserver "github.com/SigNoz/signoz/ee/query-service/integrations/signozio"
|
||||
"github.com/SigNoz/signoz/ee/query-service/license"
|
||||
"github.com/SigNoz/signoz/ee/query-service/model"
|
||||
"github.com/SigNoz/signoz/pkg/query-service/utils/encryption"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -165,7 +165,7 @@ func (lm *Manager) UploadUsage() {
|
||||
usageData.CollectorID = usage.CollectorID
|
||||
usageData.ExporterID = usage.ExporterID
|
||||
usageData.Type = usage.Type
|
||||
usageData.Tenant = usage.Tenant
|
||||
usageData.Tenant = "default"
|
||||
usageData.OrgName = orgName
|
||||
usageData.TenantId = lm.tenantID
|
||||
usagesPayload = append(usagesPayload, usageData)
|
||||
|
||||
220
ee/sqlstore/postgressqlstore/dialect.go
Normal file
@@ -0,0 +1,220 @@
|
||||
package postgressqlstore
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"github.com/uptrace/bun"
|
||||
)
|
||||
|
||||
type dialect struct {
|
||||
}
|
||||
|
||||
func (dialect *dialect) MigrateIntToTimestamp(ctx context.Context, bun bun.IDB, table string, column string) error {
|
||||
columnType, err := dialect.GetColumnType(ctx, bun, table, column)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// bigint for postgres and INTEGER for sqlite
|
||||
if columnType != "bigint" {
|
||||
return nil
|
||||
}
|
||||
|
||||
// if the columns is integer then do this
|
||||
if _, err := bun.
|
||||
ExecContext(ctx, `ALTER TABLE `+table+` RENAME COLUMN `+column+` TO `+column+`_old`); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// add new timestamp column
|
||||
if _, err := bun.
|
||||
NewAddColumn().
|
||||
Table(table).
|
||||
ColumnExpr(column + " TIMESTAMP").
|
||||
Exec(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := bun.
|
||||
NewUpdate().
|
||||
Table(table).
|
||||
Set(column + " = to_timestamp(cast(" + column + "_old as INTEGER))").
|
||||
Where("1=1").
|
||||
Exec(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// drop old column
|
||||
if _, err := bun.
|
||||
NewDropColumn().
|
||||
Table(table).
|
||||
Column(column + "_old").
|
||||
Exec(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (dialect *dialect) MigrateIntToBoolean(ctx context.Context, bun bun.IDB, table string, column string) error {
|
||||
columnType, err := dialect.GetColumnType(ctx, bun, table, column)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if columnType != "bigint" {
|
||||
return nil
|
||||
}
|
||||
|
||||
if _, err := bun.
|
||||
ExecContext(ctx, `ALTER TABLE `+table+` RENAME COLUMN `+column+` TO `+column+`_old`); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// add new boolean column
|
||||
if _, err := bun.
|
||||
NewAddColumn().
|
||||
Table(table).
|
||||
ColumnExpr(column + " BOOLEAN").
|
||||
Exec(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// copy data from old column to new column, converting from int to boolean
|
||||
if _, err := bun.NewUpdate().
|
||||
Table(table).
|
||||
Set(column + " = CASE WHEN " + column + "_old = 1 THEN true ELSE false END").
|
||||
Where("1=1").
|
||||
Exec(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// drop old column
|
||||
if _, err := bun.NewDropColumn().Table(table).Column(column + "_old").Exec(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (dialect *dialect) GetColumnType(ctx context.Context, bun bun.IDB, table string, column string) (string, error) {
|
||||
var columnType string
|
||||
|
||||
err := bun.NewSelect().
|
||||
ColumnExpr("data_type").
|
||||
TableExpr("information_schema.columns").
|
||||
Where("table_name = ?", table).
|
||||
Where("column_name = ?", column).
|
||||
Scan(ctx, &columnType)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return columnType, nil
|
||||
}
|
||||
|
||||
func (dialect *dialect) ColumnExists(ctx context.Context, bun bun.IDB, table string, column string) (bool, error) {
|
||||
var count int
|
||||
err := bun.NewSelect().
|
||||
ColumnExpr("COUNT(*)").
|
||||
TableExpr("information_schema.columns").
|
||||
Where("table_name = ?", table).
|
||||
Where("column_name = ?", column).
|
||||
Scan(ctx, &count)
|
||||
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return count > 0, nil
|
||||
}
|
||||
|
||||
func (dialect *dialect) RenameColumn(ctx context.Context, bun bun.IDB, table string, oldColumnName string, newColumnName string) (bool, error) {
|
||||
oldColumnExists, err := dialect.ColumnExists(ctx, bun, table, oldColumnName)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
newColumnExists, err := dialect.ColumnExists(ctx, bun, table, newColumnName)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if !oldColumnExists && newColumnExists {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
_, err = bun.
|
||||
ExecContext(ctx, "ALTER TABLE "+table+" RENAME COLUMN "+oldColumnName+" TO "+newColumnName)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func (dialect *dialect) TableExists(ctx context.Context, bun bun.IDB, table interface{}) (bool, error) {
|
||||
|
||||
count := 0
|
||||
err := bun.
|
||||
NewSelect().
|
||||
ColumnExpr("count(*)").
|
||||
Table("pg_catalog.pg_tables").
|
||||
Where("tablename = ?", bun.Dialect().Tables().Get(reflect.TypeOf(table)).Name).
|
||||
Scan(ctx, &count)
|
||||
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if count == 0 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func (dialect *dialect) RenameTableAndModifyModel(ctx context.Context, bun bun.IDB, oldModel interface{}, newModel interface{}, cb func(context.Context) error) error {
|
||||
exists, err := dialect.TableExists(ctx, bun, newModel)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if exists {
|
||||
return nil
|
||||
}
|
||||
|
||||
_, err = bun.
|
||||
NewCreateTable().
|
||||
IfNotExists().
|
||||
Model(newModel).
|
||||
Exec(ctx)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = cb(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = bun.
|
||||
NewDropTable().
|
||||
IfExists().
|
||||
Model(oldModel).
|
||||
Exec(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (dialect *dialect) AddNotNullDefaultToColumn(ctx context.Context, bun bun.IDB, table string, column, columnType, defaultValue string) error {
|
||||
query := fmt.Sprintf("ALTER TABLE %s ALTER COLUMN %s SET DEFAULT %s, ALTER COLUMN %s SET NOT NULL", table, column, defaultValue, column)
|
||||
if _, err := bun.ExecContext(ctx, query); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -4,13 +4,13 @@ import (
|
||||
"context"
|
||||
"database/sql"
|
||||
|
||||
"github.com/SigNoz/signoz/pkg/factory"
|
||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"github.com/jackc/pgx/v5/stdlib"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/uptrace/bun"
|
||||
"github.com/uptrace/bun/dialect/pgdialect"
|
||||
"go.signoz.io/signoz/pkg/factory"
|
||||
"go.signoz.io/signoz/pkg/sqlstore"
|
||||
)
|
||||
|
||||
type provider struct {
|
||||
@@ -18,7 +18,7 @@ type provider struct {
|
||||
sqldb *sql.DB
|
||||
bundb *sqlstore.BunDB
|
||||
sqlxdb *sqlx.DB
|
||||
dialect *PGDialect
|
||||
dialect *dialect
|
||||
}
|
||||
|
||||
func NewFactory(hookFactories ...factory.ProviderFactory[sqlstore.SQLStoreHook, sqlstore.Config]) factory.ProviderFactory[sqlstore.SQLStore, sqlstore.Config] {
|
||||
@@ -37,7 +37,7 @@ func NewFactory(hookFactories ...factory.ProviderFactory[sqlstore.SQLStoreHook,
|
||||
}
|
||||
|
||||
func New(ctx context.Context, providerSettings factory.ProviderSettings, config sqlstore.Config, hooks ...sqlstore.SQLStoreHook) (sqlstore.SQLStore, error) {
|
||||
settings := factory.NewScopedProviderSettings(providerSettings, "go.signoz.io/signoz/pkg/sqlstore/postgressqlstore")
|
||||
settings := factory.NewScopedProviderSettings(providerSettings, "github.com/SigNoz/signoz/pkg/sqlstore/postgressqlstore")
|
||||
|
||||
pgConfig, err := pgxpool.ParseConfig(config.Postgres.DSN)
|
||||
if err != nil {
|
||||
@@ -60,7 +60,7 @@ func New(ctx context.Context, providerSettings factory.ProviderSettings, config
|
||||
sqldb: sqldb,
|
||||
bundb: sqlstore.NewBunDB(settings, sqldb, pgdialect.New(), hooks),
|
||||
sqlxdb: sqlx.NewDb(sqldb, "postgres"),
|
||||
dialect: &PGDialect{},
|
||||
dialect: new(dialect),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package model
|
||||
package types
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
@@ -6,15 +6,26 @@ import (
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/SigNoz/signoz/ee/query-service/sso"
|
||||
"github.com/SigNoz/signoz/ee/query-service/sso/saml"
|
||||
"github.com/SigNoz/signoz/pkg/types"
|
||||
"github.com/google/uuid"
|
||||
"github.com/pkg/errors"
|
||||
saml2 "github.com/russellhaering/gosaml2"
|
||||
"go.signoz.io/signoz/ee/query-service/sso"
|
||||
"go.signoz.io/signoz/ee/query-service/sso/saml"
|
||||
"go.signoz.io/signoz/pkg/types"
|
||||
"github.com/uptrace/bun"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type StorableOrgDomain struct {
|
||||
bun.BaseModel `bun:"table:org_domains"`
|
||||
|
||||
types.TimeAuditable
|
||||
ID uuid.UUID `json:"id" bun:"id,pk,type:text"`
|
||||
OrgID string `json:"orgId" bun:"org_id,type:text,notnull"`
|
||||
Name string `json:"name" bun:"name,type:varchar(50),notnull,unique"`
|
||||
Data string `json:"-" bun:"data,type:text,notnull"`
|
||||
}
|
||||
|
||||
type SSOType string
|
||||
|
||||
const (
|
||||
@@ -22,13 +33,12 @@ const (
|
||||
GoogleAuth SSOType = "GOOGLE_AUTH"
|
||||
)
|
||||
|
||||
// OrgDomain identify org owned web domains for auth and other purposes
|
||||
type OrgDomain struct {
|
||||
Id uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
OrgId string `json:"orgId"`
|
||||
SsoEnabled bool `json:"ssoEnabled"`
|
||||
SsoType SSOType `json:"ssoType"`
|
||||
// GettableOrgDomain identify org owned web domains for auth and other purposes
|
||||
type GettableOrgDomain struct {
|
||||
StorableOrgDomain
|
||||
|
||||
SsoEnabled bool `json:"ssoEnabled"`
|
||||
SsoType SSOType `json:"ssoType"`
|
||||
|
||||
SamlConfig *SamlConfig `json:"samlConfig"`
|
||||
GoogleAuthConfig *GoogleOAuthConfig `json:"googleAuthConfig"`
|
||||
@@ -36,18 +46,18 @@ type OrgDomain struct {
|
||||
Org *types.Organization
|
||||
}
|
||||
|
||||
func (od *OrgDomain) String() string {
|
||||
return fmt.Sprintf("[%s]%s-%s ", od.Name, od.Id.String(), od.SsoType)
|
||||
func (od *GettableOrgDomain) String() string {
|
||||
return fmt.Sprintf("[%s]%s-%s ", od.Name, od.ID.String(), od.SsoType)
|
||||
}
|
||||
|
||||
// Valid is used a pipeline function to check if org domain
|
||||
// loaded from db is valid
|
||||
func (od *OrgDomain) Valid(err error) error {
|
||||
func (od *GettableOrgDomain) Valid(err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if od.Id == uuid.Nil || od.OrgId == "" {
|
||||
if od.ID == uuid.Nil || od.OrgID == "" {
|
||||
return fmt.Errorf("both id and orgId are required")
|
||||
}
|
||||
|
||||
@@ -55,9 +65,9 @@ func (od *OrgDomain) Valid(err error) error {
|
||||
}
|
||||
|
||||
// ValidNew cheks if the org domain is valid for insertion in db
|
||||
func (od *OrgDomain) ValidNew() error {
|
||||
func (od *GettableOrgDomain) ValidNew() error {
|
||||
|
||||
if od.OrgId == "" {
|
||||
if od.OrgID == "" {
|
||||
return fmt.Errorf("orgId is required")
|
||||
}
|
||||
|
||||
@@ -69,7 +79,7 @@ func (od *OrgDomain) ValidNew() error {
|
||||
}
|
||||
|
||||
// LoadConfig loads config params from json text
|
||||
func (od *OrgDomain) LoadConfig(jsondata string) error {
|
||||
func (od *GettableOrgDomain) LoadConfig(jsondata string) error {
|
||||
d := *od
|
||||
err := json.Unmarshal([]byte(jsondata), &d)
|
||||
if err != nil {
|
||||
@@ -79,21 +89,21 @@ func (od *OrgDomain) LoadConfig(jsondata string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (od *OrgDomain) GetSAMLEntityID() string {
|
||||
func (od *GettableOrgDomain) GetSAMLEntityID() string {
|
||||
if od.SamlConfig != nil {
|
||||
return od.SamlConfig.SamlEntity
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (od *OrgDomain) GetSAMLIdpURL() string {
|
||||
func (od *GettableOrgDomain) GetSAMLIdpURL() string {
|
||||
if od.SamlConfig != nil {
|
||||
return od.SamlConfig.SamlIdp
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (od *OrgDomain) GetSAMLCert() string {
|
||||
func (od *GettableOrgDomain) GetSAMLCert() string {
|
||||
if od.SamlConfig != nil {
|
||||
return od.SamlConfig.SamlCert
|
||||
}
|
||||
@@ -102,7 +112,7 @@ func (od *OrgDomain) GetSAMLCert() string {
|
||||
|
||||
// PrepareGoogleOAuthProvider creates GoogleProvider that is used in
|
||||
// requesting OAuth and also used in processing response from google
|
||||
func (od *OrgDomain) PrepareGoogleOAuthProvider(siteUrl *url.URL) (sso.OAuthCallbackProvider, error) {
|
||||
func (od *GettableOrgDomain) PrepareGoogleOAuthProvider(siteUrl *url.URL) (sso.OAuthCallbackProvider, error) {
|
||||
if od.GoogleAuthConfig == nil {
|
||||
return nil, fmt.Errorf("GOOGLE OAUTH is not setup correctly for this domain")
|
||||
}
|
||||
@@ -111,7 +121,7 @@ func (od *OrgDomain) PrepareGoogleOAuthProvider(siteUrl *url.URL) (sso.OAuthCall
|
||||
}
|
||||
|
||||
// PrepareSamlRequest creates a request accordingly gosaml2
|
||||
func (od *OrgDomain) PrepareSamlRequest(siteUrl *url.URL) (*saml2.SAMLServiceProvider, error) {
|
||||
func (od *GettableOrgDomain) PrepareSamlRequest(siteUrl *url.URL) (*saml2.SAMLServiceProvider, error) {
|
||||
|
||||
// this is the url Idp will call after login completion
|
||||
acs := fmt.Sprintf("%s://%s/%s",
|
||||
@@ -136,9 +146,9 @@ func (od *OrgDomain) PrepareSamlRequest(siteUrl *url.URL) (*saml2.SAMLServicePro
|
||||
return saml.PrepareRequest(issuer, acs, sourceUrl, od.GetSAMLEntityID(), od.GetSAMLIdpURL(), od.GetSAMLCert())
|
||||
}
|
||||
|
||||
func (od *OrgDomain) BuildSsoUrl(siteUrl *url.URL) (ssoUrl string, err error) {
|
||||
func (od *GettableOrgDomain) BuildSsoUrl(siteUrl *url.URL) (ssoUrl string, err error) {
|
||||
|
||||
fmtDomainId := strings.Replace(od.Id.String(), "-", ":", -1)
|
||||
fmtDomainId := strings.Replace(od.ID.String(), "-", ":", -1)
|
||||
|
||||
// build redirect url from window.location sent by frontend
|
||||
redirectURL := fmt.Sprintf("%s://%s%s", siteUrl.Scheme, siteUrl.Host, siteUrl.Path)
|
||||
73
ee/types/personal_access_token.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
"time"
|
||||
|
||||
"github.com/SigNoz/signoz/pkg/types"
|
||||
"github.com/uptrace/bun"
|
||||
)
|
||||
|
||||
type GettablePAT struct {
|
||||
CreatedByUser PatUser `json:"createdByUser"`
|
||||
UpdatedByUser PatUser `json:"updatedByUser"`
|
||||
|
||||
StorablePersonalAccessToken
|
||||
}
|
||||
|
||||
type PatUser struct {
|
||||
types.User
|
||||
NotFound bool `json:"notFound"`
|
||||
}
|
||||
|
||||
func NewGettablePAT(name, role, userID string, expiresAt int64) GettablePAT {
|
||||
return GettablePAT{
|
||||
StorablePersonalAccessToken: NewStorablePersonalAccessToken(name, role, userID, expiresAt),
|
||||
}
|
||||
}
|
||||
|
||||
type StorablePersonalAccessToken struct {
|
||||
bun.BaseModel `bun:"table:personal_access_tokens"`
|
||||
|
||||
types.TimeAuditable
|
||||
OrgID string `json:"orgId" bun:"org_id,type:text,notnull"`
|
||||
ID int `json:"id" bun:"id,pk,autoincrement"`
|
||||
Role string `json:"role" bun:"role,type:text,notnull,default:'ADMIN'"`
|
||||
UserID string `json:"userId" bun:"user_id,type:text,notnull"`
|
||||
Token string `json:"token" bun:"token,type:text,notnull,unique"`
|
||||
Name string `json:"name" bun:"name,type:text,notnull"`
|
||||
ExpiresAt int64 `json:"expiresAt" bun:"expires_at,notnull,default:0"`
|
||||
LastUsed int64 `json:"lastUsed" bun:"last_used,notnull,default:0"`
|
||||
Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"`
|
||||
UpdatedByUserID string `json:"updatedByUserId" bun:"updated_by_user_id,type:text,notnull,default:''"`
|
||||
}
|
||||
|
||||
func NewStorablePersonalAccessToken(name, role, userID string, expiresAt int64) StorablePersonalAccessToken {
|
||||
now := time.Now()
|
||||
if expiresAt != 0 {
|
||||
// convert expiresAt to unix timestamp from days
|
||||
expiresAt = now.Unix() + (expiresAt * 24 * 60 * 60)
|
||||
}
|
||||
|
||||
// Generate a 32-byte random token.
|
||||
token := make([]byte, 32)
|
||||
rand.Read(token)
|
||||
// Encode the token in base64.
|
||||
encodedToken := base64.StdEncoding.EncodeToString(token)
|
||||
|
||||
return StorablePersonalAccessToken{
|
||||
Token: encodedToken,
|
||||
Name: name,
|
||||
Role: role,
|
||||
UserID: userID,
|
||||
ExpiresAt: expiresAt,
|
||||
LastUsed: 0,
|
||||
Revoked: false,
|
||||
UpdatedByUserID: "",
|
||||
TimeAuditable: types.TimeAuditable{
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -1,30 +1,28 @@
|
||||
package model
|
||||
package types
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"context"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"golang.org/x/oauth2"
|
||||
|
||||
"github.com/SigNoz/signoz/ee/query-service/sso"
|
||||
"github.com/coreos/go-oidc/v3/oidc"
|
||||
"go.signoz.io/signoz/ee/query-service/sso"
|
||||
"golang.org/x/oauth2"
|
||||
)
|
||||
|
||||
// SamlConfig contans SAML params to generate and respond to the requests
|
||||
// from SAML provider
|
||||
type SamlConfig struct {
|
||||
SamlEntity string `json:"samlEntity"`
|
||||
SamlIdp string `json:"samlIdp"`
|
||||
SamlCert string `json:"samlCert"`
|
||||
}
|
||||
|
||||
// GoogleOauthConfig contains a generic config to support oauth
|
||||
// GoogleOauthConfig contains a generic config to support oauth
|
||||
type GoogleOAuthConfig struct {
|
||||
ClientID string `json:"clientId"`
|
||||
ClientSecret string `json:"clientSecret"`
|
||||
RedirectURI string `json:"redirectURI"`
|
||||
}
|
||||
|
||||
|
||||
const (
|
||||
googleIssuerURL = "https://accounts.google.com"
|
||||
)
|
||||
@@ -40,7 +38,7 @@ func (g *GoogleOAuthConfig) GetProvider(domain string, siteUrl *url.URL) (sso.OA
|
||||
}
|
||||
|
||||
// default to email and profile scope as we just use google auth
|
||||
// to verify identity and start a session.
|
||||
// to verify identity and start a session.
|
||||
scopes := []string{"email"}
|
||||
|
||||
// this is the url google will call after login completion
|
||||
@@ -61,8 +59,7 @@ func (g *GoogleOAuthConfig) GetProvider(domain string, siteUrl *url.URL) (sso.OA
|
||||
Verifier: provider.Verifier(
|
||||
&oidc.Config{ClientID: g.ClientID},
|
||||
),
|
||||
Cancel: cancel,
|
||||
HostedDomain: domain,
|
||||
Cancel: cancel,
|
||||
HostedDomain: domain,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -90,8 +90,9 @@
|
||||
"less": "^4.1.2",
|
||||
"less-loader": "^10.2.0",
|
||||
"lodash-es": "^4.17.21",
|
||||
"lucide-react": "0.379.0",
|
||||
"lucide-react": "0.427.0",
|
||||
"mini-css-extract-plugin": "2.4.5",
|
||||
"motion": "12.4.13",
|
||||
"overlayscrollbars": "^2.8.1",
|
||||
"overlayscrollbars-react": "^0.5.6",
|
||||
"papaparse": "5.4.1",
|
||||
@@ -215,6 +216,7 @@
|
||||
"eslint-plugin-simple-import-sort": "^7.0.0",
|
||||
"eslint-plugin-sonarjs": "^0.12.0",
|
||||
"husky": "^7.0.4",
|
||||
"image-webpack-loader": "8.1.0",
|
||||
"is-ci": "^3.0.1",
|
||||
"jest-styled-components": "^7.0.8",
|
||||
"lint-staged": "^12.5.0",
|
||||
|
||||
34
frontend/public/Icons/beacon.svg
Normal file
@@ -0,0 +1,34 @@
|
||||
<svg width="33" height="32" viewBox="0 0 33 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M25.3952 7.11163L7.6041 7.08496C4.25702 7.08496 3.16577 8.44291 3.16577 11.2766V20.7C3.16577 23.0181 3.88586 24.8916 7.60633 24.8916L25.3974 24.9183C28.7379 24.9183 29.838 23.487 29.838 20.7267V11.3033C29.8358 8.18954 28.6534 7.11163 25.3952 7.11163Z" fill="#504F4F"/>
|
||||
<path d="M25.8508 22.798H23.922C23.062 22.798 22.6221 22.1224 22.6221 21.2647C22.6221 20.4047 23.062 19.7314 23.922 19.7314H25.8508C26.7107 19.7314 27.1507 20.407 27.1507 21.2647C27.1463 22.0624 26.7063 22.798 25.8508 22.798Z" fill="black"/>
|
||||
<path d="M25.7441 21.7801H24.0108C23.5575 21.7801 23.5686 21.5534 23.5686 21.2646C23.5686 20.9757 23.5575 20.749 24.0108 20.749H25.7441C26.1974 20.749 26.2063 20.9757 26.2063 21.2646C26.204 21.5312 26.1952 21.7801 25.7441 21.7801Z" fill="#8BC34A"/>
|
||||
<path d="M9.08004 22.798H7.15125C6.2913 22.798 5.85132 22.1224 5.85132 21.2647C5.85132 20.4047 6.2913 19.7314 7.15125 19.7314H9.08004C9.93999 19.7314 10.38 20.407 10.38 21.2647C10.38 22.0624 9.93777 22.798 9.08004 22.798Z" fill="black"/>
|
||||
<path d="M8.11556 22.1896C8.62609 22.1896 9.03995 21.7757 9.03995 21.2652C9.03995 20.7547 8.62609 20.3408 8.11556 20.3408C7.60503 20.3408 7.19116 20.7547 7.19116 21.2652C7.19116 21.7757 7.60503 22.1896 8.11556 22.1896Z" fill="#F44336"/>
|
||||
<path d="M20.2592 22.798H18.3305C17.4705 22.798 17.0305 22.1224 17.0305 21.2647C17.0305 20.4047 17.4705 19.7314 18.3305 19.7314H20.2592C21.1192 19.7314 21.5592 20.407 21.5592 21.2647C21.5614 22.0624 21.1192 22.798 20.2592 22.798Z" fill="black"/>
|
||||
<path d="M18.844 20.3408L20.375 21.2652L18.844 22.1896V20.3408Z" fill="#EEEEEE"/>
|
||||
<path d="M12.7423 22.798H14.6711C15.5311 22.798 15.971 22.1224 15.971 21.2647C15.971 20.4047 15.5311 19.7314 14.6711 19.7314H12.7423C11.8824 19.7314 11.4424 20.407 11.4424 21.2647C11.4402 22.0624 11.8824 22.798 12.7423 22.798Z" fill="black"/>
|
||||
<path d="M14.158 20.3408L12.627 21.2652L14.158 22.1896V20.3408Z" fill="#EEEEEE"/>
|
||||
<path d="M26.6225 16.5808C26.6225 17.0519 26.2514 17.4252 25.778 17.4252H7.21345C6.74228 17.4252 6.3689 17.0541 6.3689 16.5808V11.0944C6.3689 10.6233 6.74005 10.25 7.21345 10.25H25.778C26.2492 10.25 26.6225 10.6211 26.6225 11.0944V16.5808Z" fill="#8DCC47"/>
|
||||
<path opacity="0.5" d="M11.5296 13.2373L11.1674 13.5995C11.1119 13.655 11.0208 13.655 10.9652 13.5995L10.603 13.2373C10.5741 13.2084 10.5608 13.1728 10.5608 13.135V12.1262C10.5608 12.0884 10.5763 12.0529 10.603 12.024L10.9652 11.6618C11.0208 11.6062 11.1119 11.6062 11.1674 11.6618L11.5296 12.024C11.5585 12.0529 11.5718 12.0884 11.5718 12.1262V13.135C11.5718 13.175 11.5563 13.2106 11.5296 13.2373Z" fill="black"/>
|
||||
<path opacity="0.5" d="M11.5296 15.6503L11.1674 16.0125C11.1119 16.0681 11.0208 16.0681 10.9652 16.0125L10.603 15.6503C10.5741 15.6215 10.5608 15.5859 10.5608 15.5481V14.5393C10.5608 14.5015 10.5763 14.466 10.603 14.4371L10.9652 14.0749C11.0208 14.0193 11.1119 14.0193 11.1674 14.0749L11.5296 14.4371C11.5585 14.466 11.5718 14.5015 11.5718 14.5393V15.5481C11.5718 15.5881 11.5563 15.6237 11.5296 15.6503Z" fill="black"/>
|
||||
<path opacity="0.5" d="M13.3873 13.2373L13.0251 13.5995C12.9695 13.655 12.8784 13.655 12.8229 13.5995L12.4607 13.2373C12.4318 13.2084 12.4185 13.1728 12.4185 13.135V12.1262C12.4185 12.0884 12.434 12.0529 12.4607 12.024L12.8229 11.6618C12.8784 11.6062 12.9695 11.6062 13.0251 11.6618L13.3873 12.024C13.4162 12.0529 13.4295 12.0884 13.4295 12.1262V13.135C13.4295 13.175 13.414 13.2106 13.3873 13.2373Z" fill="black"/>
|
||||
<path opacity="0.5" d="M16.0323 13.2373L15.6701 13.5995C15.6146 13.655 15.5235 13.655 15.4679 13.5995L15.1057 13.2373C15.0768 13.2084 15.0635 13.1728 15.0635 13.135V12.1262C15.0635 12.0884 15.079 12.0529 15.1057 12.024L15.4679 11.6618C15.5235 11.6062 15.6146 11.6062 15.6701 11.6618L16.0323 12.024C16.0612 12.0529 16.0745 12.0884 16.0745 12.1262V13.135C16.0745 13.175 16.059 13.2106 16.0323 13.2373Z" fill="black"/>
|
||||
<path opacity="0.5" d="M16.0323 15.6503L15.6701 16.0125C15.6146 16.0681 15.5235 16.0681 15.4679 16.0125L15.1057 15.6503C15.0768 15.6215 15.0635 15.5859 15.0635 15.5481V14.5393C15.0635 14.5015 15.079 14.466 15.1057 14.4371L15.4679 14.0749C15.5235 14.0193 15.6146 14.0193 15.6701 14.0749L16.0323 14.4371C16.0612 14.466 16.0745 14.5015 16.0745 14.5393V15.5481C16.0745 15.5881 16.059 15.6237 16.0323 15.6503Z" fill="black"/>
|
||||
<path opacity="0.5" d="M13.6409 11.8868L13.2787 11.5246C13.2232 11.4691 13.2232 11.3779 13.2787 11.3224L13.6409 10.9602C13.6698 10.9313 13.7054 10.918 13.7431 10.918H14.7542C14.792 10.918 14.8275 10.9335 14.8564 10.9602L15.2186 11.3224C15.2742 11.3779 15.2742 11.4691 15.2186 11.5246L14.8564 11.8868C14.8275 11.9157 14.792 11.929 14.7542 11.929H13.7431C13.7031 11.929 13.6676 11.9135 13.6409 11.8868Z" fill="black"/>
|
||||
<path opacity="0.5" d="M13.6409 14.3018L13.2787 13.9396C13.2232 13.8841 13.2232 13.793 13.2787 13.7374L13.6409 13.3752C13.6698 13.3463 13.7054 13.333 13.7431 13.333H14.7542C14.792 13.333 14.8275 13.3486 14.8564 13.3752L15.2186 13.7374C15.2742 13.793 15.2742 13.8841 15.2186 13.9396L14.8564 14.3018C14.8275 14.3307 14.792 14.3441 14.7542 14.3441H13.7431C13.7031 14.3441 13.6676 14.3285 13.6409 14.3018Z" fill="black"/>
|
||||
<path opacity="0.5" d="M13.6409 16.7149L13.2787 16.3527C13.2232 16.2972 13.2232 16.2061 13.2787 16.1505L13.6409 15.7883C13.6698 15.7594 13.7054 15.7461 13.7431 15.7461H14.7542C14.792 15.7461 14.8275 15.7616 14.8564 15.7883L15.2186 16.1505C15.2742 16.2061 15.2742 16.2972 15.2186 16.3527L14.8564 16.7149C14.8275 16.7438 14.792 16.7572 14.7542 16.7572H13.7431C13.7031 16.7572 13.6676 16.7416 13.6409 16.7149Z" fill="black"/>
|
||||
<path opacity="0.5" d="M17.8902 13.2373L17.528 13.5995C17.4725 13.655 17.3814 13.655 17.3258 13.5995L16.9636 13.2373C16.9347 13.2084 16.9214 13.1728 16.9214 13.135V12.1262C16.9214 12.0884 16.9369 12.0529 16.9636 12.024L17.3258 11.6618C17.3814 11.6062 17.4725 11.6062 17.528 11.6618L17.8902 12.024C17.9191 12.0529 17.9324 12.0884 17.9324 12.1262V13.135C17.9324 13.175 17.9169 13.2106 17.8902 13.2373Z" fill="black"/>
|
||||
<path opacity="0.5" d="M20.5374 13.2373L20.1752 13.5995C20.1197 13.655 20.0286 13.655 19.973 13.5995L19.6108 13.2373C19.5819 13.2084 19.5686 13.1728 19.5686 13.135V12.1262C19.5686 12.0884 19.5842 12.0529 19.6108 12.024L19.973 11.6618C20.0286 11.6062 20.1197 11.6062 20.1752 11.6618L20.5374 12.024C20.5663 12.0529 20.5797 12.0884 20.5797 12.1262V13.135C20.5774 13.175 20.5619 13.2106 20.5374 13.2373Z" fill="black"/>
|
||||
<path opacity="0.5" d="M20.5374 15.6503L20.1752 16.0125C20.1197 16.0681 20.0286 16.0681 19.973 16.0125L19.6108 15.6503C19.5819 15.6215 19.5686 15.5859 19.5686 15.5481V14.5393C19.5686 14.5015 19.5842 14.466 19.6108 14.4371L19.973 14.0749C20.0286 14.0193 20.1197 14.0193 20.1752 14.0749L20.5374 14.4371C20.5663 14.466 20.5797 14.5015 20.5797 14.5393V15.5481C20.5774 15.5881 20.5619 15.6237 20.5374 15.6503Z" fill="black"/>
|
||||
<path opacity="0.5" d="M18.1434 11.8868L17.7812 11.5246C17.7256 11.4691 17.7256 11.3779 17.7812 11.3224L18.1434 10.9602C18.1723 10.9313 18.2078 10.918 18.2456 10.918H19.2566C19.2944 10.918 19.33 10.9335 19.3589 10.9602L19.7211 11.3224C19.7766 11.3779 19.7766 11.4691 19.7211 11.5246L19.3589 11.8868C19.33 11.9157 19.2944 11.929 19.2566 11.929H18.2456C18.2056 11.929 18.17 11.9135 18.1434 11.8868Z" fill="black"/>
|
||||
<path opacity="0.5" d="M18.1434 14.3018L17.7812 13.9396C17.7256 13.8841 17.7256 13.793 17.7812 13.7374L18.1434 13.3752C18.1723 13.3463 18.2078 13.333 18.2456 13.333H19.2566C19.2944 13.333 19.33 13.3486 19.3589 13.3752L19.7211 13.7374C19.7766 13.793 19.7766 13.8841 19.7211 13.9396L19.3589 14.3018C19.33 14.3307 19.2944 14.3441 19.2566 14.3441H18.2456C18.2056 14.3441 18.17 14.3285 18.1434 14.3018Z" fill="black"/>
|
||||
<path opacity="0.5" d="M18.1434 16.7149L17.7812 16.3527C17.7256 16.2972 17.7256 16.2061 17.7812 16.1505L18.1434 15.7883C18.1723 15.7594 18.2078 15.7461 18.2456 15.7461H19.2566C19.2944 15.7461 19.33 15.7616 19.3589 15.7883L19.7211 16.1505C19.7766 16.2061 19.7766 16.2972 19.7211 16.3527L19.3589 16.7149C19.33 16.7438 19.2944 16.7572 19.2566 16.7572H18.2456C18.2056 16.7572 18.17 16.7416 18.1434 16.7149Z" fill="black"/>
|
||||
<path opacity="0.5" d="M22.3951 13.2373L22.0329 13.5995C21.9774 13.655 21.8862 13.655 21.8307 13.5995L21.4685 13.2373C21.4396 13.2084 21.4263 13.1728 21.4263 13.135V12.1262C21.4263 12.0884 21.4418 12.0529 21.4685 12.024L21.8307 11.6618C21.8862 11.6062 21.9774 11.6062 22.0329 11.6618L22.3951 12.024C22.424 12.0529 22.4373 12.0884 22.4373 12.1262V13.135C22.4351 13.175 22.4195 13.2106 22.3951 13.2373Z" fill="black"/>
|
||||
<path opacity="0.5" d="M25.0379 13.2373L24.6757 13.5995C24.6202 13.655 24.5291 13.655 24.4735 13.5995L24.1113 13.2373C24.0824 13.2084 24.0691 13.1728 24.0691 13.135V12.1262C24.0691 12.0884 24.0846 12.0529 24.1113 12.024L24.4735 11.6618C24.5291 11.6062 24.6202 11.6062 24.6757 11.6618L25.0379 12.024C25.0668 12.0529 25.0801 12.0884 25.0801 12.1262V13.135C25.0824 13.175 25.0668 13.2106 25.0379 13.2373Z" fill="black"/>
|
||||
<path opacity="0.5" d="M22.3951 15.6503L22.0329 16.0125C21.9774 16.0681 21.8862 16.0681 21.8307 16.0125L21.4685 15.6503C21.4396 15.6215 21.4263 15.5859 21.4263 15.5481V14.5393C21.4263 14.5015 21.4418 14.466 21.4685 14.4371L21.8307 14.0749C21.8862 14.0193 21.9774 14.0193 22.0329 14.0749L22.3951 14.4371C22.424 14.466 22.4373 14.5015 22.4373 14.5393V15.5481C22.4351 15.5881 22.4195 15.6237 22.3951 15.6503Z" fill="black"/>
|
||||
<path opacity="0.5" d="M25.0379 15.6503L24.6757 16.0125C24.6202 16.0681 24.5291 16.0681 24.4735 16.0125L24.1113 15.6503C24.0824 15.6215 24.0691 15.5859 24.0691 15.5481V14.5393C24.0691 14.5015 24.0846 14.466 24.1113 14.4371L24.4735 14.0749C24.5291 14.0193 24.6202 14.0193 24.6757 14.0749L25.0379 14.4371C25.0668 14.466 25.0801 14.5015 25.0801 14.5393V15.5481C25.0824 15.5881 25.0668 15.6237 25.0379 15.6503Z" fill="black"/>
|
||||
<path opacity="0.5" d="M22.6487 11.8868L22.2865 11.5246C22.231 11.4691 22.231 11.3779 22.2865 11.3224L22.6487 10.9602C22.6776 10.9313 22.7132 10.918 22.751 10.918H23.762C23.7998 10.918 23.8353 10.9335 23.8642 10.9602L24.2264 11.3224C24.282 11.3779 24.282 11.4691 24.2264 11.5246L23.8642 11.8868C23.8353 11.9157 23.7998 11.929 23.762 11.929H22.751C22.711 11.929 22.6732 11.9135 22.6487 11.8868Z" fill="black"/>
|
||||
<path opacity="0.5" d="M22.6487 14.3018L22.2865 13.9396C22.231 13.8841 22.231 13.793 22.2865 13.7374L22.6487 13.3752C22.6776 13.3463 22.7132 13.333 22.751 13.333H23.762C23.7998 13.333 23.8353 13.3486 23.8642 13.3752L24.2264 13.7374C24.282 13.793 24.282 13.8841 24.2264 13.9396L23.8642 14.3018C23.8353 14.3307 23.7998 14.3441 23.762 14.3441H22.751C22.711 14.3441 22.6732 14.3285 22.6487 14.3018Z" fill="black"/>
|
||||
<path opacity="0.5" d="M22.6487 16.7149L22.2865 16.3527C22.231 16.2972 22.231 16.2061 22.2865 16.1505L22.6487 15.7883C22.6776 15.7594 22.7132 15.7461 22.751 15.7461H23.762C23.7998 15.7461 23.8353 15.7616 23.8642 15.7883L24.2264 16.1505C24.282 16.2061 24.282 16.2972 24.2264 16.3527L23.8642 16.7149C23.8353 16.7438 23.7998 16.7572 23.762 16.7572H22.751C22.711 16.7572 22.6732 16.7416 22.6487 16.7149Z" fill="black"/>
|
||||
<path d="M25.7801 10.2509C26.2513 10.2509 26.6247 10.622 26.6247 11.0954V16.5805C26.6247 17.0517 26.2535 17.4251 25.7801 17.4251H7.21336C6.74219 17.4251 6.36881 17.0539 6.36881 16.5805V11.0954C6.36881 10.6242 6.73997 10.2509 7.21336 10.2509H25.7801ZM25.7801 9.09961H7.21336C6.111 9.09961 5.21533 9.99528 5.21533 11.0976V16.5828C5.21533 17.6851 6.111 18.5808 7.21336 18.5808H25.7779C26.8803 18.5808 27.7759 17.6851 27.7759 16.5828V11.0954C27.7759 9.99528 26.8803 9.09961 25.7801 9.09961Z" fill="black"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
26
frontend/public/Icons/circus-tent.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10.9732 10.1476L7.56209 10.0176L6.95337 15.8623C6.95337 15.8623 7.88832 15.7973 9.12575 15.7973C10.3632 15.7973 11.4069 15.8848 11.4069 15.8848L10.9732 10.1476Z" fill="#8A2E08"/>
|
||||
<path d="M4.11226 10.9648L3.27731 10.791C3.27731 10.791 3.07232 12.1147 2.88358 12.9347C2.69484 13.7546 2.3811 14.8633 2.3811 14.8633L4.366 15.8495C4.366 15.8495 6.16215 16.007 6.1934 15.9445C6.22465 15.882 7.54833 12.8084 7.54833 12.8084L7.86331 11.626L4.11226 10.9648Z" fill="#FF6110"/>
|
||||
<path d="M10.3207 11.6103L14.4805 10.7441L14.6692 11.2479C14.6692 11.2479 14.9429 12.3928 15.0942 13.0128C15.3379 14.0077 15.6516 14.8989 15.6516 14.8989L13.7855 16.0539L11.8631 15.9914L10.3207 11.6103Z" fill="#FF6110"/>
|
||||
<path d="M3.26727 10.2969C3.26727 10.3256 3.28727 10.5344 3.27727 10.6869C3.26727 10.8393 3.23853 11.0268 3.23853 11.0268C3.23853 11.0268 3.35227 11.0518 3.45726 11.1193C3.56226 11.1868 3.77225 11.4443 3.77225 11.4443C3.77225 11.4443 4.18223 11.2931 4.43096 11.3868C4.81344 11.5306 4.97593 11.8843 4.97593 11.8843C4.97593 11.8843 5.36716 11.5206 5.84589 11.5981C6.31336 11.6731 6.49585 12.1143 6.49585 12.1143C6.49585 12.1143 6.84709 11.8305 7.15457 11.8468C7.5183 11.8655 7.65204 12.133 7.65204 12.133L8.19701 11.0343L4.14598 10.2981H3.26727V10.2969Z" fill="#AF0D03"/>
|
||||
<path d="M2.17737 15.3802L2.39736 14.7977C2.39736 14.7977 3.37231 15.2752 4.07852 15.4852C4.78473 15.6952 5.61719 15.7239 5.61719 15.7239C5.61719 15.7239 5.60719 15.3939 5.30095 15.1552C4.99472 14.9164 4.50975 14.5152 4.50975 14.5152L5.17221 14.294L5.54094 14.1465L6.69713 15.5227L6.32465 16.4501C6.32465 16.4501 5.51219 16.5551 4.21351 16.2214C2.91483 15.8876 2.17737 15.3802 2.17737 15.3802Z" fill="#C9C9C9"/>
|
||||
<path d="M10.2419 10.8418C10.2607 10.918 10.2519 11.5205 10.2519 11.5205L10.6057 11.9217C10.6057 11.9217 10.7969 11.673 11.2369 11.693C11.6769 11.7117 11.8769 11.913 11.8769 11.913C11.8769 11.913 12.1443 11.588 12.5081 11.5218C12.8718 11.4543 13.2243 11.6455 13.2243 11.6455C13.2243 11.6455 13.473 11.1868 13.8355 11.0818C14.1992 10.9768 14.6692 11.2493 14.6692 11.2493L14.4755 10.0693L10.9119 10.3256L10.2419 10.8418Z" fill="#AF0D03"/>
|
||||
<path d="M15.613 14.7792L15.8417 15.3617C15.8417 15.3617 15.1443 15.9067 14.2456 16.1554C13.3468 16.4041 12.0969 16.5041 12.0969 16.5041L11.7319 14.4555L12.9644 14.083L13.6406 14.3717C13.6406 14.3717 13.0419 14.8755 12.8781 15.1067C12.5669 15.5442 12.6781 15.8217 12.6781 15.8217C12.6781 15.8217 13.6331 15.7354 14.3693 15.4204C15.1068 15.103 15.613 14.7792 15.613 14.7792Z" fill="#C9C9C9"/>
|
||||
<path d="M4.97729 14.5015C4.97729 14.5015 5.40102 14.6915 5.61726 14.8452C5.88475 15.0365 6.15223 15.3227 6.23848 15.7814C6.29848 16.0977 6.32472 16.4502 6.32472 16.4502C6.32472 16.4502 6.62096 16.6789 7.20343 15.7052C7.7859 14.7315 8.08213 13.3828 8.13088 12.4279C8.17838 11.4729 8.15963 11.2529 8.15963 11.2529L7.29967 12.6666L6.02849 13.8228L4.97729 14.5015Z" fill="#D92F0A"/>
|
||||
<path d="M8.16709 11.2578C8.16709 11.2578 8.26708 12.1253 7.0984 13.2015C6.37218 13.8702 5.66347 14.3302 5.1785 14.5202C5.01226 14.5852 4.86351 14.5589 4.75852 14.5577C4.41604 14.5527 4.47978 14.4939 4.67102 14.3964C4.89601 14.2814 5.54973 14.0427 6.77341 12.9152C7.75211 12.0128 7.81961 11.1103 7.81961 11.1103L8.16584 10.9229V11.2578H8.16709Z" fill="#FFFEFF"/>
|
||||
<path d="M12.1444 16.4997C12.1444 16.4997 11.7144 16.6522 11.0644 15.7735C10.4145 14.8948 10.2145 13.3374 10.1857 12.8399C10.157 12.3425 10.167 11.4062 10.167 11.4062L11.3619 12.9062C11.3619 12.9062 13.2156 14.3011 13.1868 14.3111C13.1581 14.3211 12.5818 14.6836 12.3656 15.0473C11.9244 15.7823 12.1444 16.4997 12.1444 16.4997Z" fill="#D92F0A"/>
|
||||
<path d="M10.1007 10.9924C10.1007 10.9924 10.0832 11.3199 10.147 11.5686C10.2807 12.0936 10.7419 12.661 11.3419 13.1935C12.1156 13.881 13.0143 14.3597 13.0806 14.3785C13.148 14.3972 13.6255 14.4172 13.6343 14.3685C13.638 14.3522 13.6668 14.281 13.5105 14.1672C13.1893 13.936 12.4781 13.5285 11.8956 13.0685C11.4844 12.7435 10.9569 12.3398 10.4982 11.5074C10.4144 11.3561 10.4444 10.9736 10.4444 10.9736L10.1007 10.9924Z" fill="white"/>
|
||||
<path d="M3.74602 8.15983C3.74602 8.15983 2.75107 8.28982 2.71982 8.43107C2.68857 8.57356 2.79857 10.451 2.79857 10.451C2.79857 10.451 3.2173 10.3735 3.42853 10.4197C3.63977 10.466 4.03725 10.7234 4.03725 10.7234L4.70347 10.3135L5.18344 10.9797C5.18344 10.9797 5.52217 10.8047 5.9909 10.8509C6.45962 10.8972 6.77461 11.2134 6.77461 11.2134L7.42957 10.6747L8.16078 11.2497C8.16078 11.2497 8.49452 10.8609 9.11448 10.8497C9.73445 10.8384 10.1094 11.2947 10.1094 11.2947L10.9281 10.581L11.7356 11.2009C11.7356 11.2009 12.0518 10.9434 12.4143 10.8622C12.7768 10.7797 13.0455 10.9209 13.0455 10.9209L13.5605 10.0085L14.1455 10.4297C14.1455 10.4297 14.333 10.2072 14.6017 10.1722C14.8704 10.1372 15.1979 10.126 15.1979 10.126C15.1979 10.126 15.1742 8.86229 15.1742 8.6748C15.1742 8.48731 15.1042 8.18358 15.0217 8.12483C14.9392 8.06608 14.203 7.90234 14.203 7.90234L3.74602 8.15983Z" fill="#D92F0A"/>
|
||||
<path d="M5.06221 8.70605L4.08601 8.93229L4.03601 10.7247C4.03601 10.7247 4.33349 10.6385 4.63098 10.6697C4.92846 10.7009 5.1822 10.9822 5.1822 10.9822C5.1822 10.9822 5.17595 9.81725 5.18595 9.62101C5.19595 9.42477 5.2722 9.05229 5.31344 8.98104C5.35469 8.90854 5.06221 8.70605 5.06221 8.70605Z" fill="#E1E1E1"/>
|
||||
<path d="M7.63203 9.08691L6.74083 9.41315C6.74083 9.41315 6.71708 10.2381 6.73833 10.5668C6.75833 10.8956 6.77333 11.2156 6.77333 11.2156C6.77333 11.2156 7.17956 11.0806 7.50954 11.1006C7.83827 11.1206 8.1595 11.2518 8.1595 11.2518L8.147 9.48689L7.63203 9.08691Z" fill="#E1E1E1"/>
|
||||
<path d="M10.0795 9.45727C10.0795 9.45727 10.1107 10.126 10.1207 10.4647C10.1307 10.8034 10.1082 11.2984 10.1082 11.2984C10.1082 11.2984 10.5932 11.0509 10.9744 11.0197C11.3544 10.9884 11.7344 11.2047 11.7344 11.2047C11.7344 11.2047 11.7044 10.506 11.6631 9.99224C11.6344 9.63351 11.5294 9.32353 11.5294 9.32353L10.5532 8.7998L10.0795 9.45727Z" fill="#E1E1E1"/>
|
||||
<path d="M13.0443 10.9232C13.0443 10.9232 13.3681 10.567 13.6255 10.4845C13.883 10.402 14.1443 10.432 14.1443 10.432C14.1443 10.432 14.1293 9.59078 14.088 9.20955C14.0468 8.82957 14.0093 8.61083 14.0093 8.61083L12.8143 8.09961L12.8481 9.03956C12.8481 9.03956 12.9893 9.35329 13.0306 9.89826C13.0706 10.4432 13.0443 10.9232 13.0443 10.9232Z" fill="#E1E1E1"/>
|
||||
<path d="M9.05208 4.72754L7.60965 5.37001C7.60965 5.37001 6.29847 6.3537 5.26103 7.00992C4.22358 7.66613 3.62736 7.91612 3.50362 7.96737C3.30613 8.04986 2.98615 8.14736 2.8474 8.24235C2.61742 8.40234 2.71366 8.47734 2.75116 8.48984C2.78866 8.50234 3.9361 9.01606 5.96974 9.3173C8.00338 9.61853 10.7682 9.49604 12.1857 9.22105C13.6018 8.94607 15.0218 8.12611 15.0218 8.12611C15.0218 8.12611 14.903 7.92737 14.1168 7.58614C13.3294 7.24491 12.6606 6.87743 11.5194 6.12997C10.3783 5.3825 10.1033 5.01502 10.1033 5.01502L9.05208 4.72754Z" fill="#FF6110"/>
|
||||
<path d="M7.83206 5.63281C7.83206 5.63281 6.24465 7.25898 4.28975 8.61016C4.07601 8.75765 4.08601 8.93264 4.08601 8.93264C4.08601 8.93264 4.2435 8.99264 4.63098 9.08263C5.02471 9.17388 5.25095 9.19637 5.25095 9.19637C5.25095 9.19637 5.42969 8.99138 5.81092 8.61016C6.49338 7.92769 6.91711 7.38647 7.45083 6.69526C7.80456 6.23653 8.22579 5.68656 8.22579 5.68656L7.83206 5.63281Z" fill="white"/>
|
||||
<path d="M8.5145 5.84187C8.5145 5.84187 7.93703 7.1793 7.66205 7.75677C7.53205 8.02801 7.24207 8.53048 6.97958 8.95046C6.75084 9.31669 6.74084 9.41419 6.74084 9.41419C6.74084 9.41419 7.25457 9.48793 7.5033 9.48793C7.75204 9.48793 8.14577 9.48543 8.14577 9.48543C8.14577 9.48543 8.34326 8.89671 8.55325 7.71678C8.67574 7.03056 8.85448 5.82812 8.85448 5.82812L8.5145 5.84187Z" fill="white"/>
|
||||
<path d="M9.31445 5.89503C9.31445 5.89503 9.44445 7.18371 9.58944 7.86242C9.78568 8.78113 10.0782 9.45609 10.0782 9.45609C10.0782 9.45609 10.5731 9.43609 10.8481 9.40984C11.1231 9.38359 11.5268 9.32235 11.5268 9.32235C11.5268 9.32235 11.0544 8.59489 10.5981 7.86242C10.2969 7.37745 9.73193 6.24876 9.64069 5.81628C9.56319 5.4438 9.31445 5.89503 9.31445 5.89503Z" fill="white"/>
|
||||
<path d="M10.022 5.65878C10.022 5.69753 10.437 6.58248 11.4644 7.69242C12.2906 8.58488 12.8418 9.0436 12.8418 9.0436C12.8418 9.0436 13.313 8.89861 13.5243 8.82111C13.773 8.72987 14.0093 8.61113 14.0093 8.61113C14.0093 8.61113 12.8943 7.83742 12.2381 7.29994C11.5819 6.76247 10.6769 6.01501 10.4282 5.67378C10.1795 5.3313 10.022 5.65878 10.022 5.65878Z" fill="white"/>
|
||||
<path d="M9.03832 3.83621C8.76209 3.85621 8.67084 4.32119 8.5271 4.46618C8.38336 4.60992 7.6084 5.37113 7.6084 5.37113C7.6084 5.37113 7.74589 6.08985 9.11082 6.0761C10.3595 6.06235 10.597 5.47113 10.597 5.47113C10.597 5.47113 9.79953 4.62367 9.61579 4.41368C9.43205 4.20244 9.4058 3.80997 9.03832 3.83621Z" fill="#D92F0A"/>
|
||||
<path d="M9.08454 3.22829C9.08454 3.22829 9.32078 3.15329 9.65701 3.19204C9.99949 3.23204 10.227 3.34328 10.5832 3.33578C11.1282 3.32578 11.5669 3.06955 11.7244 2.92455C11.8819 2.77956 12.0831 2.54457 11.9781 2.46583C11.8731 2.38708 11.4257 2.50583 10.9257 2.30834C10.4845 2.1346 10.2632 1.68087 9.63701 1.60837C9.09829 1.54713 8.9408 1.76837 8.9408 1.76837L9.08454 3.22829Z" fill="#FF6110"/>
|
||||
<path d="M8.87451 1.61133V4.06995L9.26824 3.96495L9.22949 1.61133H8.87451Z" fill="#D92F0A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.0 KiB |
44
frontend/public/Icons/container-plus.svg
Normal file
@@ -0,0 +1,44 @@
|
||||
<svg
|
||||
width="13"
|
||||
height="12"
|
||||
viewBox="0 0 13 12"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M8.5 8H11.5"
|
||||
stroke="white"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
<path
|
||||
d="M10 6.5V9.5"
|
||||
stroke="white"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
<path
|
||||
d="M11 4.99995V3.99995C10.9998 3.82459 10.9535 3.65236 10.8658 3.50053C10.778 3.34871 10.6519 3.22263 10.5 3.13495L7 1.13495C6.84798 1.04718 6.67554 1.00098 6.5 1.00098C6.32446 1.00098 6.15202 1.04718 6 1.13495L2.5 3.13495C2.34813 3.22263 2.22199 3.34871 2.13423 3.50053C2.04647 3.65236 2.00018 3.82459 2 3.99995V7.99995C2.00018 8.17531 2.04647 8.34755 2.13423 8.49937C2.22199 8.65119 2.34813 8.77727 2.5 8.86495L6 10.865C6.15202 10.9527 6.32446 10.9989 6.5 10.9989C6.67554 10.9989 6.84798 10.9527 7 10.865L8 10.295"
|
||||
stroke="white"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
<path
|
||||
d="M4.25 2.13477L8.75 4.70977"
|
||||
stroke="white"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
<path
|
||||
d="M2.14502 3.5L6.50002 6L10.855 3.5"
|
||||
stroke="white"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
<path
|
||||
d="M6.5 11V6"
|
||||
stroke="white"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
52
frontend/public/Icons/cracker.svg
Normal file
@@ -0,0 +1,52 @@
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M7.26714 3.8662C7.49161 3.74063 8.10058 3.44726 9.35185 4.41405C10.6031 5.38083 10.3231 6.16538 10.1819 6.36985C10.0164 6.61099 8.97291 7.45221 8.97291 7.45221L3.20108 14.5809C3.20108 14.5809 2.76991 14.5286 2.19206 14.1286C1.56865 13.6974 1.06748 12.7095 1.4453 11.9939C1.65755 11.5927 6.10588 5.38972 6.95488 4.2118C7.03156 4.10623 7.10601 3.95621 7.26714 3.8662Z"
|
||||
fill="#FE180A"
|
||||
/>
|
||||
<path
|
||||
d="M8.02849 7.3418L3.06787 14.5516C3.06787 14.5516 3.47348 14.6861 3.80018 14.6727C4.2558 14.6549 4.49805 14.4571 4.49805 14.4571L9.24642 7.60072L8.02849 7.3418Z"
|
||||
fill="#CA1837"
|
||||
/>
|
||||
<path
|
||||
d="M1.84641 11.3867L1.57087 11.7978C1.57087 11.7978 1.51976 12.3256 2.17861 12.9911C2.42416 13.2388 2.6797 13.4199 2.9008 13.5533C3.26856 13.7755 3.54299 13.8599 3.54299 13.8599L3.73853 13.5866C3.73853 13.5866 3.4841 13.4988 3.21078 13.3311C2.91857 13.1511 2.5997 12.8833 2.38971 12.6478C1.76641 11.9467 1.84641 11.3867 1.84641 11.3867Z"
|
||||
fill="#FDB900"
|
||||
/>
|
||||
<path
|
||||
d="M5.03675 13.6786L4.8112 14.0052C4.8112 14.0052 4.529 14.0408 4.12124 14.0019C3.87125 13.9785 3.54016 13.8597 3.54016 13.8597L3.73015 13.583C3.73015 13.583 3.95458 13.673 4.30568 13.7086C4.65677 13.7441 5.03675 13.6786 5.03675 13.6786Z"
|
||||
fill="#DF7D15"
|
||||
/>
|
||||
<path
|
||||
d="M7.47943 4.15898C7.19722 4.42564 7.35055 5.08227 8.25828 5.69446C9.19267 6.32554 9.8082 6.23554 9.98708 5.99111C10.1748 5.73335 9.74265 5.04227 9.14157 4.59674C8.51049 4.12899 7.78608 3.869 7.47943 4.15898Z"
|
||||
fill="#A42615"
|
||||
/>
|
||||
<path
|
||||
d="M6.10048 5.39899C6.10048 5.39899 5.99493 5.85008 6.72933 6.58449C7.09709 6.95224 7.35708 7.14001 7.5704 7.26556C7.78705 7.39222 7.94593 7.45889 7.94593 7.45889L8.59146 7.23667L8.62812 6.45783C8.62812 6.45783 7.90705 6.08785 7.42596 5.54565C6.80266 4.84235 6.91377 4.44793 6.94377 4.22461C6.83599 4.35571 6.10048 5.39899 6.10048 5.39899Z"
|
||||
fill="#FDB700"
|
||||
/>
|
||||
<path
|
||||
d="M9.98728 6.57724L9.18066 7.69941C9.18066 7.69941 9.044 7.79051 8.55958 7.67608C8.2707 7.60719 7.94739 7.45942 7.94739 7.45942L8.62957 6.45947C8.62957 6.45947 9.034 6.64502 9.35954 6.67279C9.67285 6.69835 9.98728 6.57724 9.98728 6.57724Z"
|
||||
fill="#DE7F14"
|
||||
/>
|
||||
<path
|
||||
d="M8.40293 4.97806C8.3796 5.1025 8.47404 5.24583 8.63514 5.34582C8.79513 5.44693 8.99735 5.3636 9.00957 5.27471C9.02179 5.18583 9.07067 4.23477 9.4551 4.1881C9.84174 4.14033 10.0195 4.92473 10.7684 5.12694C11.3061 5.27138 11.475 5.1325 11.475 5.1325L11.4039 4.70474C11.4039 4.70474 11.1795 4.84696 10.7328 4.59808C10.2639 4.33699 10.0495 3.61147 9.37288 3.67702C8.67181 3.74479 8.5707 4.52698 8.52293 4.66363C8.47404 4.79918 8.41071 4.93584 8.40293 4.97806Z"
|
||||
fill="#D8A26D"
|
||||
/>
|
||||
<path
|
||||
d="M9.93205 2.54571C9.98539 2.6535 11.2544 4.66376 11.2544 4.66376C11.2544 4.66376 11.2633 7.23741 11.2633 7.32743C11.2633 7.48856 11.3711 7.55079 11.4956 7.39855C11.5645 7.31409 12.5679 5.64721 12.5679 5.64721C12.5679 5.64721 14.2659 6.34397 14.3915 6.40731C14.5171 6.46954 14.5882 6.38953 14.5171 6.23729C14.4459 6.08505 13.328 4.08368 13.328 4.08368C13.328 4.08368 14.4182 2.52904 14.4804 2.40347C14.5426 2.2779 14.4537 2.19789 14.337 2.25123C14.2204 2.30457 12.8713 2.97466 12.8713 2.97466C12.8713 2.97466 12.379 1.55003 12.3435 1.46447C12.2812 1.31223 12.1823 1.28556 12.1379 1.47336C12.0934 1.66116 11.6467 3.2158 11.6467 3.2158C11.6467 3.2158 10.2165 2.46459 10.0921 2.41125C9.96761 2.35791 9.87871 2.43903 9.93205 2.54571Z"
|
||||
fill="#FD8E02"
|
||||
/>
|
||||
<path
|
||||
d="M10.9332 3.33275L11.7021 4.44936L11.6843 6.2726L12.3809 5.03044L13.6764 5.70041L12.7831 4.20826L13.3553 3.27942C13.3553 3.27942 12.6231 3.69051 12.6043 3.64607C12.5854 3.60163 12.282 2.68945 12.282 2.68945L11.9787 3.75273L10.9332 3.33275Z"
|
||||
fill="#FFE268"
|
||||
/>
|
||||
<path
|
||||
d="M11.2556 5.19045L11.2534 4.7427C11.2534 4.7427 11.5212 4.70381 11.7712 4.44272C11.9889 4.21384 12.1523 3.90719 12.3411 4.17495C12.4834 4.37716 12.1689 4.73159 11.9134 4.91714C11.5223 5.20379 11.2556 5.19045 11.2556 5.19045Z"
|
||||
fill="#FCBA03"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
138
frontend/public/Icons/dashboard.svg
Normal file
@@ -0,0 +1,138 @@
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M14.519 14.6685H1.48179C1.39956 14.6685 1.33289 14.6018 1.33289 14.5196V1.4824C1.33289 1.40017 1.39956 1.3335 1.48179 1.3335H14.519C14.6012 1.3335 14.6679 1.40017 14.6679 1.4824V14.5196C14.6679 14.6018 14.6012 14.6685 14.519 14.6685Z"
|
||||
fill="#F2A600"
|
||||
/>
|
||||
<path
|
||||
d="M12.7488 3.25146H3.25098V12.7493H12.7488V3.25146Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
opacity="0.5"
|
||||
d="M14.519 1.3335H1.48179C1.44067 1.3335 1.404 1.35016 1.37622 1.37683L3.2509 3.25117H12.7488L14.6234 1.37683C14.5968 1.35016 14.5601 1.3335 14.519 1.3335Z"
|
||||
fill="#D1762C"
|
||||
/>
|
||||
<path
|
||||
d="M3.25056 3.25163L1.37622 1.37695C1.34955 1.40473 1.33289 1.44141 1.33289 1.48252V14.5197C1.33289 14.5608 1.34955 14.5986 1.37622 14.6253L3.25056 12.7506V3.25163Z"
|
||||
fill="#DE7340"
|
||||
/>
|
||||
<path
|
||||
d="M13.6122 2.38892V13.6126H2.38855V2.38892H13.6122ZM14.2789 1.72217H1.7218V14.2793H14.2789V1.72217Z"
|
||||
fill="#FFCD40"
|
||||
/>
|
||||
<path
|
||||
d="M2.38843 13.6126V2.38892L1.7218 1.72217V14.2793L2.38843 13.6126Z"
|
||||
fill="#A65F3E"
|
||||
/>
|
||||
<path
|
||||
d="M13.6044 2.3888L14.2711 1.72217H1.7218L2.38855 2.3888H13.6044Z"
|
||||
fill="#D1762C"
|
||||
/>
|
||||
<path
|
||||
d="M13.8346 13.8346H2.16644V2.1665H13.8346V13.8346ZM2.38869 13.6124H13.6123V2.38875H2.38869V13.6124Z"
|
||||
fill="#D1762C"
|
||||
/>
|
||||
<path
|
||||
d="M2.38865 13.6124V2.38875L2.16644 2.1665V13.8346L2.38865 13.6124Z"
|
||||
fill="#824A34"
|
||||
/>
|
||||
<path
|
||||
d="M13.6123 2.38871L13.8346 2.1665H2.16644L2.38869 2.38871H13.6123Z"
|
||||
fill="#A65F3E"
|
||||
/>
|
||||
<path
|
||||
d="M12.0566 3.94482H3.94446V12.057H12.0566V3.94482Z"
|
||||
fill="url(#paint0_linear_2447_4817)"
|
||||
/>
|
||||
<path
|
||||
d="M12.0561 7.84766C11.8117 7.91765 11.5972 8.08431 11.4672 8.30319C11.4472 8.33763 11.4295 8.37652 11.3939 8.39763C11.2795 8.43985 11.1484 8.44874 11.0595 8.54873C11.0217 8.31319 10.7362 8.18208 10.5173 8.25541C10.3317 8.30208 10.2395 8.49762 10.2228 8.67539C10.0273 8.61762 9.81176 8.76761 9.79843 8.97093C9.79621 8.98982 9.79621 9.01093 9.78621 9.02648C9.73732 9.07648 9.63844 9.07093 9.57844 9.13092C9.45956 9.22425 9.404 9.38535 9.27734 9.46757C9.99286 9.06426 10.8584 9.12092 11.6383 8.92538C11.7928 8.8876 11.965 8.83983 12.0561 8.70428V7.84766Z"
|
||||
fill="#1B5E20"
|
||||
/>
|
||||
<path
|
||||
d="M12.0566 11.3998C12.0566 11.3998 10.213 11.4953 8.20057 10.8754C6.1881 10.2565 5.26465 9.62321 5.26465 9.62321C5.26465 9.62321 6.61037 9.88431 8.40726 9.59099C9.58408 9.39878 10.4564 8.73326 12.0544 8.70215L12.0566 11.3998Z"
|
||||
fill="#689F38"
|
||||
/>
|
||||
<path
|
||||
d="M7.27824 9.74526C7.2938 9.72415 7.31268 9.70415 7.31935 9.67859C7.32713 9.64748 7.31491 9.61526 7.30602 9.58526C7.28157 9.49749 7.28935 9.40083 7.32602 9.31639C7.3449 9.27195 7.37268 9.23195 7.38601 9.18529C7.40935 9.10529 7.38712 9.01974 7.38268 8.93641C7.37601 8.82308 7.40157 8.70864 7.4549 8.60865C7.46268 8.5942 7.47156 8.57976 7.48712 8.57198C7.52934 8.5531 7.56489 8.61198 7.56934 8.65753C7.58267 8.77308 7.55823 8.89197 7.58267 9.00641C7.61711 9.1664 7.74599 9.30528 7.73711 9.46971C7.73377 9.5286 7.71266 9.58749 7.72377 9.64415C7.73266 9.68748 7.76044 9.72526 7.78377 9.76303C7.84377 9.86081 7.88043 9.9708 7.89154 10.0852C7.90488 10.2219 7.86377 10.3852 7.73599 10.433C7.59711 10.4863 7.4549 10.373 7.34602 10.2986C7.24602 10.2297 7.19825 10.0875 7.20158 9.9708C7.2038 9.8908 7.22936 9.8097 7.27824 9.74526Z"
|
||||
fill="#2E7D32"
|
||||
/>
|
||||
<path
|
||||
d="M10.5363 7.21366C10.0952 7.24589 9.65401 7.27811 9.21173 7.31033C8.99281 7.32588 8.77056 7.34255 8.55498 7.30033C8.45274 7.28033 8.35273 7.247 8.24827 7.24144C8.05825 7.23144 7.87712 7.31255 7.69265 7.35921C7.4904 7.41032 7.27815 7.42032 7.07257 7.3881C6.92922 7.36588 6.78253 7.31922 6.67808 7.21811C6.62585 7.16811 6.58584 7.10478 6.53028 7.05701C6.4625 6.99701 6.37471 6.96368 6.29914 6.91479C5.9791 6.71036 5.90354 6.20927 6.14912 5.91929C6.18913 5.87262 6.2358 5.8304 6.27136 5.7793C6.34026 5.68152 6.36248 5.55931 6.4036 5.44709C6.53362 5.086 6.87255 4.81157 7.25148 4.74935C7.63042 4.68713 8.03491 4.83601 8.2905 5.12266C8.37385 5.21599 8.4483 5.32599 8.56387 5.37265C8.63165 5.39932 8.70722 5.40154 8.77945 5.41043C9.19173 5.46265 9.53732 5.7793 9.7129 6.15594C9.79069 6.32371 9.84514 6.50926 9.97516 6.63925C10.0285 6.69258 10.0929 6.7348 10.1574 6.7748C10.4463 6.95479 10.7486 7.11256 11.0608 7.247C10.9808 7.24144 10.9019 7.237 10.8219 7.23144"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M9.21178 7.31053C8.99286 7.32608 8.77061 7.34275 8.55503 7.30053C8.45279 7.28053 8.35278 7.2472 8.24832 7.24164C8.0583 7.23164 7.87717 7.31275 7.6927 7.35941C7.49045 7.41052 7.2782 7.42052 7.07262 7.3883C6.92927 7.36608 6.78259 7.31942 6.67813 7.21831C6.6259 7.16831 6.58589 7.10498 6.53033 7.05721C6.46255 6.99721 6.37476 6.96388 6.29919 6.91499C6.18362 6.84055 6.11806 6.73722 6.05805 6.61723C6.0436 6.58945 6.0436 6.5639 6.04138 6.53279C6.13806 6.68167 6.3992 6.84166 6.50366 6.725C6.53811 6.62279 6.41587 6.44502 6.37476 6.30391C6.29697 6.03726 6.28919 5.76061 6.38476 5.49951C6.39587 5.4684 6.42365 5.3673 6.46143 5.31396C6.49033 5.53062 6.56589 5.85949 6.72036 6.01393C6.87482 6.16836 7.13263 6.23392 7.31821 6.11837C7.43489 6.04504 7.50379 5.91727 7.58824 5.80838C7.83716 5.48951 8.27166 5.32619 8.66949 5.40285C8.46391 5.52284 8.26388 5.66839 8.14276 5.87282C8.02163 6.07726 7.99274 6.35169 8.12831 6.54835C8.23721 6.70611 8.43501 6.78722 8.62615 6.78389C8.73172 6.78167 8.85062 6.745 8.89396 6.64834C8.91841 6.59279 8.91285 6.52612 8.94063 6.47168C8.99286 6.36724 9.14621 6.35391 9.24956 6.40724C9.35402 6.46168 9.42514 6.56057 9.50515 6.64501C9.80519 6.96055 10.2486 7.08721 10.6686 7.20053C10.6564 7.1972 10.6308 7.2072 10.6175 7.20942C10.5975 7.21276 10.5775 7.21609 10.5575 7.21942C10.5264 7.22498 10.4953 7.23275 10.463 7.22831C10.3964 7.21831 10.3286 7.22942 10.2619 7.23386C10.1052 7.24498 9.94743 7.2572 9.79074 7.26831C9.59849 7.28164 9.40514 7.29608 9.21178 7.31053Z"
|
||||
fill="#C9E3E6"
|
||||
/>
|
||||
<path
|
||||
d="M12.0566 10.4487C8.15943 11.3565 6.30698 9.12659 3.94446 8.87549V12.0564H12.0566V10.4487Z"
|
||||
fill="#8BC34A"
|
||||
/>
|
||||
<path
|
||||
d="M12.0566 10.4487C8.15943 11.3565 6.30698 9.12659 3.94446 8.87549V12.0564H12.0566V10.4487Z"
|
||||
fill="url(#paint1_radial_2447_4817)"
|
||||
/>
|
||||
<path
|
||||
d="M4.92438 9.46168C4.80883 9.49613 4.71328 9.40724 4.61662 9.36058C4.35997 9.17059 4.35997 8.82394 4.37997 8.53395C4.37441 8.46507 4.4233 8.35174 4.50441 8.40063C4.47108 8.23397 4.46774 8.06176 4.49218 7.89399C4.50885 7.76399 4.5544 7.674 4.65995 7.60734C4.66662 7.594 4.66218 7.57845 4.65884 7.564C4.60996 7.3729 4.69884 7.17514 4.70773 6.97737C4.71551 6.82293 4.6744 6.66294 4.72773 6.5185C4.74995 6.45406 4.83106 6.41851 4.8455 6.49962C4.92327 6.80404 5.05771 7.10736 5.03216 7.42735C5.02327 7.47068 5.03993 7.50623 5.07549 7.53178C5.30214 7.734 5.20104 8.0862 5.2377 8.36063C5.34436 8.61284 5.34214 8.89505 5.21548 9.14059C5.15771 9.27614 5.06438 9.40169 4.92438 9.46168Z"
|
||||
fill="#2E7D32"
|
||||
/>
|
||||
<path
|
||||
d="M6.46127 9.63067C5.97019 9.5129 5.95019 9.64289 5.78798 9.60511C5.23023 9.43734 5.57354 8.89404 5.73465 8.76182C5.66687 8.50295 5.84353 8.3974 6.05241 8.14186C6.08574 7.61855 6.58793 7.77076 6.52349 8.22963C6.65682 8.40295 6.7057 8.59294 6.66237 8.8096C6.67571 8.93848 6.80126 9.02292 6.86014 9.13847C6.97458 9.36401 6.78237 9.70733 6.46127 9.63067Z"
|
||||
fill="#689F38"
|
||||
/>
|
||||
<path
|
||||
d="M6.27462 8.77985C6.21573 8.90206 6.04685 8.92762 5.91464 8.89429C5.85353 8.87873 5.78909 8.8454 5.7302 8.86762C5.59243 8.91873 5.5491 9.02984 5.54466 9.14094C5.54466 9.28982 5.69354 9.40648 5.84242 9.41315C5.9913 9.41982 6.13129 9.34204 6.24351 9.24649C6.27684 9.44648 6.58682 9.44093 6.72237 9.32649C6.85125 9.2176 6.7957 9.04317 6.7957 9.04317C6.95014 9.21538 6.94236 9.35093 6.92458 9.49426C6.90792 9.63203 6.78903 9.78535 6.86014 9.89201C6.61349 9.95534 6.49127 9.74313 6.29462 9.65536C6.2224 9.63536 6.14685 9.65647 6.07352 9.67091C5.77131 9.7498 5.43244 9.57203 5.43022 9.2376C5.42799 9.0765 5.51688 8.91762 5.65243 8.82985C5.66798 8.81985 5.68465 8.80985 5.69131 8.79207C5.69798 8.77318 5.69131 8.75318 5.68465 8.7343C5.54688 8.36543 5.90686 8.36876 6.06241 8.12988C6.12462 8.19877 6.22684 8.22765 6.31573 8.2021C6.24573 8.36431 6.04907 8.28654 5.92463 8.35209C5.69354 8.54208 6.07352 8.80874 6.27462 8.77985Z"
|
||||
fill="#2E7D32"
|
||||
/>
|
||||
<path
|
||||
d="M4.61111 8.03417C4.6911 8.17971 4.9022 8.29748 4.85443 8.48747C4.78221 8.4397 4.69443 8.37859 4.60666 8.38192C4.53333 8.4797 4.56222 8.6508 4.61999 8.75191C4.88887 9.11189 5.17885 8.56858 5.20107 8.31415C5.52772 8.69635 5.22885 9.7563 4.63777 9.38743C4.55889 9.3241 4.3289 9.06967 4.34223 8.64524C4.35001 8.38748 4.45334 8.37081 4.51333 8.37859C4.42556 8.24304 4.40889 8.05083 4.44334 7.91195C4.47334 7.79307 4.52555 7.69752 4.60555 7.61974C4.68666 7.53975 4.62777 7.46864 4.62999 7.34642C4.63222 7.16865 4.67888 7.06644 4.71554 6.96533C4.72888 7.15421 4.79887 7.34865 4.76888 7.53641C4.7511 7.61641 4.66221 7.6153 4.62222 7.67307C4.55666 7.78084 4.55111 7.92306 4.61111 8.03417Z"
|
||||
fill="#1B5E20"
|
||||
/>
|
||||
<path
|
||||
d="M5.00664 10.0212C5.04886 10.1578 4.54888 10.0578 4.61888 9.88229C4.66776 9.76007 4.68999 9.6323 4.71443 9.50675C4.73887 9.30787 4.67999 9.1301 4.58777 8.96011C4.60888 8.94122 4.63332 8.92456 4.65888 8.91234C4.85887 9.28343 4.86553 9.15232 5.02997 8.86234C5.06108 8.85901 5.09219 8.86123 5.12218 8.86901C4.92331 9.18455 4.87553 9.65674 5.00664 10.0212Z"
|
||||
fill="url(#paint2_radial_2447_4817)"
|
||||
/>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="paint0_linear_2447_4817"
|
||||
x1="7.35993"
|
||||
y1="10.2856"
|
||||
x2="8.28906"
|
||||
y2="6.97175"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop offset="0.1167" stopColor="#AFE4FE" />
|
||||
<stop offset="0.6082" stopColor="#84C9ED" />
|
||||
<stop offset="1" stopColor="#5FB2DE" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
id="paint1_radial_2447_4817"
|
||||
cx="0"
|
||||
cy="0"
|
||||
r="1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(9.71023 10.5339) rotate(8.61827) scale(3.99428 2.03076)"
|
||||
>
|
||||
<stop stopColor="#D4E157" />
|
||||
<stop offset="1" stopColor="#D4E157" stopOpacity="0" />
|
||||
</radialGradient>
|
||||
<radialGradient
|
||||
id="paint2_radial_2447_4817"
|
||||
cx="0"
|
||||
cy="0"
|
||||
r="1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(5.06834 9.42892) rotate(15.9186) scale(0.528617 0.65868)"
|
||||
>
|
||||
<stop offset="0.4413" stopColor="#A06841" />
|
||||
<stop offset="0.9229" stopColor="#A06841" stopOpacity="0.138" />
|
||||
<stop offset="1" stopColor="#A06841" stopOpacity="0" />
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
79
frontend/public/Icons/dials.svg
Normal file
@@ -0,0 +1,79 @@
|
||||
<svg width="33" height="32" viewBox="0 0 33 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M27.1695 29.336H5.8335C4.36665 29.336 3.1665 28.1359 3.1665 26.669V5.33302C3.1665 3.86617 4.36665 2.66602 5.8335 2.66602H27.1695C28.6364 2.66602 29.8365 3.86617 29.8365 5.33302V26.669C29.8365 28.1359 28.6364 29.336 27.1695 29.336Z" fill="#BDBDBD"/>
|
||||
<g opacity="0.7">
|
||||
<path opacity="0.7" d="M22.9916 26.2917C25.3012 26.2917 27.1736 24.4194 27.1736 22.1097C27.1736 19.8001 25.3012 17.9277 22.9916 17.9277C20.6819 17.9277 18.8096 19.8001 18.8096 22.1097C18.8096 24.4194 20.6819 26.2917 22.9916 26.2917Z" fill="#757575"/>
|
||||
</g>
|
||||
<path d="M22.9916 25.6434C24.9429 25.6434 26.5248 24.0616 26.5248 22.1103C26.5248 20.159 24.9429 18.5771 22.9916 18.5771C21.0403 18.5771 19.4585 20.159 19.4585 22.1103C19.4585 24.0616 21.0403 25.6434 22.9916 25.6434Z" fill="#37474F"/>
|
||||
<path d="M25.8351 20.0134C25.7551 19.9068 25.6706 19.8045 25.5817 19.709L23.3508 21.3578C23.1397 21.5133 23.0952 21.8089 23.2508 22.02C23.4063 22.2311 23.7018 22.2755 23.9129 22.12L26.1239 20.4867C26.0417 20.3223 25.9462 20.1645 25.8351 20.0134Z" fill="white"/>
|
||||
<g opacity="0.7">
|
||||
<path opacity="0.7" d="M19.3027 26.1103C19.5187 26.1103 19.6938 25.9352 19.6938 25.7192C19.6938 25.5032 19.5187 25.3281 19.3027 25.3281C19.0867 25.3281 18.9116 25.5032 18.9116 25.7192C18.9116 25.9352 19.0867 26.1103 19.3027 26.1103Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M18.0207 24.0048C18.2367 24.0048 18.4118 23.8297 18.4118 23.6137C18.4118 23.3978 18.2367 23.2227 18.0207 23.2227C17.8047 23.2227 17.6296 23.3978 17.6296 23.6137C17.6296 23.8297 17.8047 24.0048 18.0207 24.0048Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M17.8362 21.624C18.0522 21.624 18.2273 21.4489 18.2273 21.2329C18.2273 21.0169 18.0522 20.8418 17.8362 20.8418C17.6202 20.8418 17.4451 21.0169 17.4451 21.2329C17.4451 21.4489 17.6202 21.624 17.8362 21.624Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M18.7536 19.3798C18.9696 19.3798 19.1447 19.2047 19.1447 18.9887C19.1447 18.7728 18.9696 18.5977 18.7536 18.5977C18.5376 18.5977 18.3625 18.7728 18.3625 18.9887C18.3625 19.2047 18.5376 19.3798 18.7536 19.3798Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M20.6565 17.7548C20.8725 17.7548 21.0476 17.5797 21.0476 17.3637C21.0476 17.1478 20.8725 16.9727 20.6565 16.9727C20.4405 16.9727 20.2654 17.1478 20.2654 17.3637C20.2654 17.5797 20.4405 17.7548 20.6565 17.7548Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M22.9929 17.206C23.2089 17.206 23.384 17.0309 23.384 16.8149C23.384 16.5989 23.2089 16.4238 22.9929 16.4238C22.7769 16.4238 22.6018 16.5989 22.6018 16.8149C22.6018 17.0309 22.7769 17.206 22.9929 17.206Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M25.3266 17.7548C25.5426 17.7548 25.7177 17.5797 25.7177 17.3637C25.7177 17.1478 25.5426 16.9727 25.3266 16.9727C25.1106 16.9727 24.9355 17.1478 24.9355 17.3637C24.9355 17.5797 25.1106 17.7548 25.3266 17.7548Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M27.2307 19.3798C27.4467 19.3798 27.6218 19.2047 27.6218 18.9887C27.6218 18.7728 27.4467 18.5977 27.2307 18.5977C27.0147 18.5977 26.8396 18.7728 26.8396 18.9887C26.8396 19.2047 27.0147 19.3798 27.2307 19.3798Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M28.1465 21.624C28.3625 21.624 28.5376 21.4489 28.5376 21.2329C28.5376 21.0169 28.3625 20.8418 28.1465 20.8418C27.9305 20.8418 27.7554 21.0169 27.7554 21.2329C27.7554 21.4489 27.9305 21.624 28.1465 21.624Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M27.9643 24.0048C28.1803 24.0048 28.3554 23.8297 28.3554 23.6137C28.3554 23.3978 28.1803 23.2227 27.9643 23.2227C27.7483 23.2227 27.5732 23.3978 27.5732 23.6137C27.5732 23.8297 27.7483 24.0048 27.9643 24.0048Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M26.6799 26.1123C26.8959 26.1123 27.071 25.9372 27.071 25.7212C27.071 25.5052 26.8959 25.3301 26.6799 25.3301C26.4639 25.3301 26.2888 25.5052 26.2888 25.7212C26.2888 25.9372 26.4639 26.1123 26.6799 26.1123Z" fill="#212121"/>
|
||||
</g>
|
||||
<path d="M20.2146 21.612C20.4479 20.6099 21.1901 19.7299 22.1434 19.341C22.2678 19.2899 22.4611 19.2966 22.5189 19.4521C22.5878 19.6388 22.5545 19.7655 22.3434 19.8854C21.719 20.2432 21.2079 21.0121 21.019 21.7965C20.9634 22.0253 20.7279 22.1609 20.5012 22.0942C20.2968 22.0298 20.1657 21.8209 20.2146 21.612Z" fill="#2F7889"/>
|
||||
<g opacity="0.7">
|
||||
<path opacity="0.7" d="M10.0121 26.2927C12.3217 26.2927 14.1941 24.4204 14.1941 22.1107C14.1941 19.8011 12.3217 17.9287 10.0121 17.9287C7.70242 17.9287 5.83008 19.8011 5.83008 22.1107C5.83008 24.4204 7.70242 26.2927 10.0121 26.2927Z" fill="#757575"/>
|
||||
</g>
|
||||
<path d="M10.0122 25.6444C11.9635 25.6444 13.5453 24.0626 13.5453 22.1113C13.5453 20.16 11.9635 18.5781 10.0122 18.5781C8.06085 18.5781 6.479 20.16 6.479 22.1113C6.479 24.0626 8.06085 25.6444 10.0122 25.6444Z" fill="#37474F"/>
|
||||
<path d="M13.4795 21.4261C13.4528 21.295 13.4195 21.1684 13.3795 21.0439L10.6596 21.5839C10.4041 21.635 10.2374 21.8839 10.2885 22.1394C10.3396 22.395 10.5885 22.5616 10.844 22.5105L13.5417 21.975C13.5328 21.795 13.5172 21.6106 13.4795 21.4261Z" fill="white"/>
|
||||
<g opacity="0.7">
|
||||
<path opacity="0.7" d="M6.3259 26.1123C6.5419 26.1123 6.717 25.9372 6.717 25.7212C6.717 25.5052 6.5419 25.3301 6.3259 25.3301C6.10991 25.3301 5.93481 25.5052 5.93481 25.7212C5.93481 25.9372 6.10991 26.1123 6.3259 26.1123Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M5.04148 24.0048C5.25747 24.0048 5.43257 23.8297 5.43257 23.6137C5.43257 23.3978 5.25747 23.2227 5.04148 23.2227C4.82549 23.2227 4.65039 23.3978 4.65039 23.6137C4.65039 23.8297 4.82549 24.0048 5.04148 24.0048Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M4.85911 21.624C5.0751 21.624 5.2502 21.4489 5.2502 21.2329C5.2502 21.0169 5.0751 20.8418 4.85911 20.8418C4.64311 20.8418 4.46802 21.0169 4.46802 21.2329C4.46802 21.4489 4.64311 21.624 4.85911 21.624Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M5.77464 19.3798C5.99063 19.3798 6.16573 19.2047 6.16573 18.9887C6.16573 18.7728 5.99063 18.5977 5.77464 18.5977C5.55864 18.5977 5.38354 18.7728 5.38354 18.9887C5.38354 19.2047 5.55864 19.3798 5.77464 19.3798Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M7.67942 17.7548C7.89541 17.7548 8.07051 17.5797 8.07051 17.3637C8.07051 17.1478 7.89541 16.9727 7.67942 16.9727C7.46343 16.9727 7.28833 17.1478 7.28833 17.3637C7.28833 17.5797 7.46343 17.7548 7.67942 17.7548Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M10.0134 17.206C10.2294 17.206 10.4045 17.0309 10.4045 16.8149C10.4045 16.5989 10.2294 16.4238 10.0134 16.4238C9.79741 16.4238 9.62231 16.5989 9.62231 16.8149C9.62231 17.0309 9.79741 17.206 10.0134 17.206Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M12.3489 17.7548C12.5648 17.7548 12.7399 17.5797 12.7399 17.3637C12.7399 17.1478 12.5648 16.9727 12.3489 16.9727C12.1329 16.9727 11.9578 17.1478 11.9578 17.3637C11.9578 17.5797 12.1329 17.7548 12.3489 17.7548Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M14.2517 19.3798C14.4677 19.3798 14.6428 19.2047 14.6428 18.9887C14.6428 18.7728 14.4677 18.5977 14.2517 18.5977C14.0357 18.5977 13.8606 18.7728 13.8606 18.9887C13.8606 19.2047 14.0357 19.3798 14.2517 19.3798Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M15.1697 21.624C15.3856 21.624 15.5607 21.4489 15.5607 21.2329C15.5607 21.0169 15.3856 20.8418 15.1697 20.8418C14.9537 20.8418 14.7786 21.0169 14.7786 21.2329C14.7786 21.4489 14.9537 21.624 15.1697 21.624Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M14.9851 24.0048C15.2011 24.0048 15.3762 23.8297 15.3762 23.6137C15.3762 23.3978 15.2011 23.2227 14.9851 23.2227C14.7691 23.2227 14.594 23.3978 14.594 23.6137C14.594 23.8297 14.7691 24.0048 14.9851 24.0048Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M13.7026 26.1123C13.9186 26.1123 14.0937 25.9372 14.0937 25.7212C14.0937 25.5052 13.9186 25.3301 13.7026 25.3301C13.4866 25.3301 13.3115 25.5052 13.3115 25.7212C13.3115 25.9372 13.4866 26.1123 13.7026 26.1123Z" fill="#212121"/>
|
||||
</g>
|
||||
<path d="M7.26146 21.612C7.49478 20.6099 8.23697 19.7299 9.19025 19.341C9.31469 19.2899 9.50801 19.2966 9.56579 19.4521C9.63467 19.6388 9.60134 19.7655 9.39024 19.8854C8.76583 20.2432 8.25474 21.0121 8.06587 21.7965C8.01031 22.0253 7.77477 22.1609 7.54812 22.0942C7.34368 22.0298 7.21258 21.8209 7.26146 21.612Z" fill="#2F7889"/>
|
||||
<g opacity="0.7">
|
||||
<path opacity="0.7" d="M22.9916 14.2322C25.3012 14.2322 27.1736 12.3598 27.1736 10.0502C27.1736 7.74051 25.3012 5.86816 22.9916 5.86816C20.6819 5.86816 18.8096 7.74051 18.8096 10.0502C18.8096 12.3598 20.6819 14.2322 22.9916 14.2322Z" fill="#757575"/>
|
||||
</g>
|
||||
<path d="M22.9914 13.5839C24.9427 13.5839 26.5245 12.002 26.5245 10.0507C26.5245 8.09942 24.9427 6.51758 22.9914 6.51758C21.0401 6.51758 19.4583 8.09942 19.4583 10.0507C19.4583 12.002 21.0401 13.5839 22.9914 13.5839Z" fill="#37474F"/>
|
||||
<path d="M20.1765 7.91402C20.0965 8.02068 20.0232 8.13179 19.9565 8.24289L22.1675 9.91836C22.3764 10.0761 22.672 10.0361 22.8297 9.82725C22.9875 9.61837 22.9475 9.32283 22.7386 9.16507L20.5476 7.50293C20.4165 7.62959 20.2899 7.76514 20.1765 7.91402Z" fill="white"/>
|
||||
<g opacity="0.7">
|
||||
<path opacity="0.7" d="M19.3027 14.0517C19.5187 14.0517 19.6938 13.8766 19.6938 13.6606C19.6938 13.4446 19.5187 13.2695 19.3027 13.2695C19.0867 13.2695 18.9116 13.4446 18.9116 13.6606C18.9116 13.8766 19.0867 14.0517 19.3027 14.0517Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M18.0207 11.9462C18.2367 11.9462 18.4118 11.7711 18.4118 11.5552C18.4118 11.3392 18.2367 11.1641 18.0207 11.1641C17.8047 11.1641 17.6296 11.3392 17.6296 11.5552C17.6296 11.7711 17.8047 11.9462 18.0207 11.9462Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M17.8362 9.56538C18.0522 9.56538 18.2273 9.39029 18.2273 9.17429C18.2273 8.9583 18.0522 8.7832 17.8362 8.7832C17.6202 8.7832 17.4451 8.9583 17.4451 9.17429C17.4451 9.39029 17.6202 9.56538 17.8362 9.56538Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M18.7536 7.32124C18.9696 7.32124 19.1447 7.14615 19.1447 6.93015C19.1447 6.71416 18.9696 6.53906 18.7536 6.53906C18.5376 6.53906 18.3625 6.71416 18.3625 6.93015C18.3625 7.14615 18.5376 7.32124 18.7536 7.32124Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M20.6565 5.69624C20.8725 5.69624 21.0476 5.52115 21.0476 5.30515C21.0476 5.08916 20.8725 4.91406 20.6565 4.91406C20.4405 4.91406 20.2654 5.08916 20.2654 5.30515C20.2654 5.52115 20.4405 5.69624 20.6565 5.69624Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M22.9929 5.14742C23.2089 5.14742 23.384 4.97232 23.384 4.75632C23.384 4.54033 23.2089 4.36523 22.9929 4.36523C22.7769 4.36523 22.6018 4.54033 22.6018 4.75632C22.6018 4.97232 22.7769 5.14742 22.9929 5.14742Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M25.3266 5.69624C25.5426 5.69624 25.7177 5.52115 25.7177 5.30515C25.7177 5.08916 25.5426 4.91406 25.3266 4.91406C25.1106 4.91406 24.9355 5.08916 24.9355 5.30515C24.9355 5.52115 25.1106 5.69624 25.3266 5.69624Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M27.2307 7.32124C27.4467 7.32124 27.6218 7.14615 27.6218 6.93015C27.6218 6.71416 27.4467 6.53906 27.2307 6.53906C27.0147 6.53906 26.8396 6.71416 26.8396 6.93015C26.8396 7.14615 27.0147 7.32124 27.2307 7.32124Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M28.1465 9.56538C28.3625 9.56538 28.5376 9.39029 28.5376 9.17429C28.5376 8.9583 28.3625 8.7832 28.1465 8.7832C27.9305 8.7832 27.7554 8.9583 27.7554 9.17429C27.7554 9.39029 27.9305 9.56538 28.1465 9.56538Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M27.9641 11.9462C28.1801 11.9462 28.3552 11.7711 28.3552 11.5552C28.3552 11.3392 28.1801 11.1641 27.9641 11.1641C27.7481 11.1641 27.573 11.3392 27.573 11.5552C27.573 11.7711 27.7481 11.9462 27.9641 11.9462Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M26.6799 14.0537C26.8959 14.0537 27.071 13.8786 27.071 13.6626C27.071 13.4466 26.8959 13.2715 26.6799 13.2715C26.4639 13.2715 26.2888 13.4466 26.2888 13.6626C26.2888 13.8786 26.4639 14.0537 26.6799 14.0537Z" fill="#212121"/>
|
||||
</g>
|
||||
<path d="M20.6813 11.8558C20.2324 11.1447 20.1613 10.6692 20.1902 9.97143C20.1991 9.78255 20.2857 9.46479 20.5657 9.51146C20.819 9.55368 20.7924 9.78033 20.8124 9.93588C20.8946 10.5358 21.0368 10.8625 21.379 11.4136C21.5034 11.6136 21.4323 11.8758 21.2257 11.9913C21.039 12.0913 20.7968 12.038 20.6813 11.8558Z" fill="#2F7889"/>
|
||||
<g opacity="0.7">
|
||||
<path opacity="0.7" d="M10.0121 14.2331C12.3217 14.2331 14.1941 12.3608 14.1941 10.0511C14.1941 7.74149 12.3217 5.86914 10.0121 5.86914C7.70242 5.86914 5.83008 7.74149 5.83008 10.0511C5.83008 12.3608 7.70242 14.2331 10.0121 14.2331Z" fill="#757575"/>
|
||||
</g>
|
||||
<path d="M10.0122 13.5849C11.9635 13.5849 13.5453 12.003 13.5453 10.0517C13.5453 8.1004 11.9635 6.51855 10.0122 6.51855C8.06085 6.51855 6.479 8.1004 6.479 10.0517C6.479 12.003 8.06085 13.5849 10.0122 13.5849Z" fill="#37474F"/>
|
||||
<path d="M12.6169 7.66324C12.5258 7.56546 12.4303 7.47436 12.3325 7.3877L10.2904 9.26537C10.0971 9.44314 10.0859 9.74091 10.2615 9.93423C10.4393 10.1276 10.737 10.1387 10.9303 9.96312L12.9569 8.10321C12.8547 7.94989 12.7436 7.80101 12.6169 7.66324Z" fill="white"/>
|
||||
<g opacity="0.7">
|
||||
<path opacity="0.7" d="M6.3259 14.0537C6.5419 14.0537 6.717 13.8786 6.717 13.6626C6.717 13.4466 6.5419 13.2715 6.3259 13.2715C6.10991 13.2715 5.93481 13.4466 5.93481 13.6626C5.93481 13.8786 6.10991 14.0537 6.3259 14.0537Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M5.04173 11.9462C5.25772 11.9462 5.43282 11.7711 5.43282 11.5552C5.43282 11.3392 5.25772 11.1641 5.04173 11.1641C4.82573 11.1641 4.65063 11.3392 4.65063 11.5552C4.65063 11.7711 4.82573 11.9462 5.04173 11.9462Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M4.85935 9.56538C5.07535 9.56538 5.25044 9.39029 5.25044 9.17429C5.25044 8.9583 5.07535 8.7832 4.85935 8.7832C4.64336 8.7832 4.46826 8.9583 4.46826 9.17429C4.46826 9.39029 4.64336 9.56538 4.85935 9.56538Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M5.77464 7.32124C5.99063 7.32124 6.16573 7.14615 6.16573 6.93015C6.16573 6.71416 5.99063 6.53906 5.77464 6.53906C5.55864 6.53906 5.38354 6.71416 5.38354 6.93015C5.38354 7.14615 5.55864 7.32124 5.77464 7.32124Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M7.67966 5.69624C7.89566 5.69624 8.07075 5.52115 8.07075 5.30515C8.07075 5.08916 7.89566 4.91406 7.67966 4.91406C7.46367 4.91406 7.28857 5.08916 7.28857 5.30515C7.28857 5.52115 7.46367 5.69624 7.67966 5.69624Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M10.0134 5.14742C10.2294 5.14742 10.4045 4.97232 10.4045 4.75632C10.4045 4.54033 10.2294 4.36523 10.0134 4.36523C9.79741 4.36523 9.62231 4.54033 9.62231 4.75632C9.62231 4.97232 9.79741 5.14742 10.0134 5.14742Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M12.3489 5.69624C12.5648 5.69624 12.7399 5.52115 12.7399 5.30515C12.7399 5.08916 12.5648 4.91406 12.3489 4.91406C12.1329 4.91406 11.9578 5.08916 11.9578 5.30515C11.9578 5.52115 12.1329 5.69624 12.3489 5.69624Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M14.2517 7.32124C14.4677 7.32124 14.6428 7.14615 14.6428 6.93015C14.6428 6.71416 14.4677 6.53906 14.2517 6.53906C14.0357 6.53906 13.8606 6.71416 13.8606 6.93015C13.8606 7.14615 14.0357 7.32124 14.2517 7.32124Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M15.1697 9.56538C15.3856 9.56538 15.5607 9.39029 15.5607 9.17429C15.5607 8.9583 15.3856 8.7832 15.1697 8.7832C14.9537 8.7832 14.7786 8.9583 14.7786 9.17429C14.7786 9.39029 14.9537 9.56538 15.1697 9.56538Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M14.9853 11.9462C15.2013 11.9462 15.3764 11.7711 15.3764 11.5552C15.3764 11.3392 15.2013 11.1641 14.9853 11.1641C14.7693 11.1641 14.5942 11.3392 14.5942 11.5552C14.5942 11.7711 14.7693 11.9462 14.9853 11.9462Z" fill="#212121"/>
|
||||
<path opacity="0.7" d="M13.7026 14.0537C13.9186 14.0537 14.0937 13.8786 14.0937 13.6626C14.0937 13.4466 13.9186 13.2715 13.7026 13.2715C13.4866 13.2715 13.3115 13.4466 13.3115 13.6626C13.3115 13.8786 13.4866 14.0537 13.7026 14.0537Z" fill="#212121"/>
|
||||
</g>
|
||||
<path d="M7.26146 9.54854C7.49478 8.54637 8.23697 7.66642 9.19025 7.27755C9.31469 7.22644 9.50801 7.23311 9.56579 7.38866C9.63467 7.57531 9.60134 7.70197 9.39024 7.82197C8.76583 8.17973 8.25474 8.94858 8.06587 9.73298C8.01031 9.96186 7.77477 10.0974 7.54812 10.0307C7.34368 9.96852 7.21258 9.75742 7.26146 9.54854Z" fill="#2F7889"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 15 KiB |
8
frontend/public/Icons/eight-ball.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14.9494 13.9422C16.2318 12.4261 17.3268 9.70245 16.1956 6.57511C15.6443 5.05269 15.0219 4.20274 14.2969 3.66277C13.8557 3.33403 12.0933 2.50658 9.75965 2.86781C8.05349 3.13279 5.77487 4.20899 4.29369 5.96014C2.85752 7.6613 1.74883 9.00498 1.69758 10.3099C1.63133 11.9886 2.89627 13.431 3.05001 13.6647C3.32374 14.0797 5.19115 16.4521 8.69971 16.5733C11.797 16.6796 13.8144 15.2847 14.9494 13.9422Z" fill="#403D3E"/>
|
||||
<path d="M4.55363 2.73722C2.93746 3.89091 1.12131 6.25079 1.44754 9.56061C1.60628 11.1718 2.00251 12.1492 2.57123 12.8504C2.91746 13.2779 4.41988 14.5491 6.77351 14.7366C9.14588 14.9253 10.9495 14.3941 12.8332 13.0842C16.6617 10.4206 16.098 6.39328 15.9343 5.92456C15.7705 5.45583 14.5444 2.69598 11.1733 1.71478C8.19844 0.849823 5.98355 1.71478 4.55363 2.73722Z" fill="#5E6367"/>
|
||||
<path d="M7.39353 2.96109C5.61737 2.89734 3.91996 4.28852 3.75622 6.00593C3.59248 7.72209 4.65492 9.02952 6.30983 9.29576C7.96475 9.56074 9.87839 8.5558 10.2634 6.45091C10.6609 4.28227 9.08969 3.02234 7.39353 2.96109Z" fill="white"/>
|
||||
<path d="M7.94217 5.90066C7.94217 5.90066 8.36965 5.81192 8.45465 5.18195C8.53839 4.56198 8.23091 4.03326 7.51345 3.84327C6.73349 3.63703 6.20477 4.06576 6.06727 4.51698C5.87603 5.14445 6.15852 5.44319 6.15852 5.44319C6.15852 5.44319 5.39356 5.62693 5.33231 6.52938C5.27481 7.38058 5.85603 7.83806 6.43975 7.97805C7.16096 8.15179 7.97842 7.9543 8.17841 7.03435C8.34465 6.27689 7.94217 5.90066 7.94217 5.90066Z" fill="#303030"/>
|
||||
<path d="M6.73983 4.75411C6.67109 5.01284 6.80858 5.26283 7.07857 5.33157C7.3698 5.40532 7.63479 5.30908 7.70603 5.01159C7.76853 4.74786 7.64354 4.51537 7.33605 4.44037C7.08357 4.37788 6.81483 4.47162 6.73983 4.75411Z" fill="white"/>
|
||||
<path d="M6.95978 6.03974C6.6323 5.93849 6.19982 6.06473 6.13107 6.50471C6.06233 6.94469 6.32606 7.16968 6.67104 7.23217C7.01603 7.29467 7.34226 7.11343 7.40601 6.76095C7.4685 6.40972 7.28601 6.13973 6.95978 6.03974Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
7
frontend/public/Icons/floppy-disc.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M29.374 7.98958V27.4342C29.374 28.5055 28.505 29.3745 27.4337 29.3745H4.56866C3.49742 29.3745 2.62842 28.5055 2.62842 27.4342V4.56915C2.62842 3.4979 3.49742 2.62891 4.56866 2.62891H24.4912C25.2824 2.62891 26.0336 2.98228 26.5381 3.59347L28.7695 6.3027C29.1606 6.77832 29.374 7.37395 29.374 7.98958Z" fill="#616161"/>
|
||||
<path d="M24.8782 29.3742H7.11157V17.6128C7.11157 17.2105 7.43828 16.8838 7.84055 16.8838H24.1515C24.5538 16.8838 24.8805 17.2105 24.8805 17.6128V29.3742H24.8782Z" fill="white"/>
|
||||
<path d="M24.8782 26.6523H7.11157V29.3744H24.8782V26.6523Z" fill="#7190F9"/>
|
||||
<path d="M5.50049 2.62891V13.2414C5.50049 13.637 5.84942 13.9459 6.3117 13.9459H23.3472C23.8094 13.9459 24.1673 13.6392 24.1673 13.2414V2.62891H5.50049Z" fill="#424242"/>
|
||||
<path d="M9.5564 2.62891V12.6346C9.5564 13.008 9.81865 13.2969 10.1654 13.2969H22.9358C23.2826 13.2969 23.5515 13.008 23.5515 12.6346V2.62891H9.5564ZM20.8845 12.1168C20.8845 12.2768 20.7534 12.4079 20.5933 12.4079H16.7306C16.5706 12.4079 16.4395 12.2768 16.4395 12.1168V3.80905C16.4395 3.64903 16.5706 3.51791 16.7306 3.51791H20.5933C20.7534 3.51791 20.8845 3.64903 20.8845 3.80905V12.1168Z" fill="#E0E0E0"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
15
frontend/public/Icons/hello-wave.svg
Normal file
@@ -0,0 +1,15 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M11.2531 19.2411C10.5948 18.7127 4.48175 12.767 4.41342 12.702C4.14343 12.432 3.97344 12.1519 3.92677 11.8952C3.87844 11.6285 3.96011 11.3952 4.17676 11.1785C4.37842 10.9768 4.62507 10.8701 4.89006 10.8701C5.21337 10.8701 5.54502 11.0234 5.82168 11.3018L8.5932 13.9655C8.64153 14.0122 8.70486 14.0355 8.76652 14.0355C8.83152 14.0355 8.89485 14.0105 8.94318 13.9621C9.03984 13.8655 9.03984 13.7088 8.94485 13.6121L4.52008 9.04153C4.07677 8.59815 3.86844 7.91973 4.39508 7.39299C4.59674 7.1913 4.84339 7.08462 5.10838 7.08462C5.4317 7.08462 5.76335 7.23797 6.04 7.51634L10.5664 11.9302C10.6148 11.9769 10.6781 12.0019 10.7414 12.0019C10.8047 12.0019 10.8697 11.9769 10.9181 11.9286C11.0147 11.8319 11.0164 11.6752 10.9197 11.5769L5.48336 6.00282C5.23171 5.75112 5.08005 5.44942 5.05338 5.15605C5.02838 4.85768 5.13338 4.58098 5.35837 4.35595C5.56002 4.15426 5.80668 4.04758 6.07166 4.04758C6.39498 4.04758 6.72663 4.20093 7.00328 4.47763L12.548 9.88497C12.5963 9.93164 12.6597 9.95665 12.723 9.95665C12.7863 9.95665 12.8513 9.93164 12.8996 9.88331C12.9963 9.78663 12.998 9.62994 12.9013 9.53159L8.87485 5.39274C8.62153 5.13938 8.46987 4.83934 8.44487 4.54597C8.41987 4.2476 8.52487 3.9709 8.74986 3.74587C8.95151 3.54418 9.19817 3.4375 9.46315 3.4375C9.78647 3.4375 10.1181 3.59085 10.3948 3.86922C11.8714 5.3194 15.7262 9.11154 15.8562 9.25156C16.3511 9.59327 16.4511 9.07654 16.4761 8.7415C16.5044 8.35145 16.0578 6.98961 16.3178 5.76446C16.7544 4.13592 18.0127 4.40262 18.041 4.41596C18.731 4.73933 18.5993 5.22272 18.3544 6.19451L18.3294 6.3862C18.0727 7.65636 19.8359 11.4202 19.9659 11.7019C20.6576 13.2154 21.4542 16.2841 18.816 18.9228C15.9245 21.8148 12.3447 20.3329 11.2531 19.2411Z" fill="url(#paint0_radial_2434_27914)"/>
|
||||
<path d="M14.9634 20.8642C13.1902 20.8642 11.6819 20.0158 11.087 19.4274C10.552 18.9907 7.17551 15.7302 4.42565 13.0616C4.31399 12.9532 4.249 12.8916 4.24233 12.8832C3.93068 12.5715 3.73736 12.2465 3.68236 11.9398C3.61903 11.5914 3.72736 11.2764 4.00068 11.0013C4.25066 10.7513 4.55731 10.6196 4.89063 10.6196C5.28228 10.6196 5.67559 10.7996 5.99891 11.1247L8.76709 13.785L4.34066 9.21443C3.83069 8.70437 3.57403 7.85926 4.219 7.21585C4.46899 6.96582 4.77564 6.83413 5.10895 6.83413C5.5006 6.83413 5.89391 7.01416 6.21723 7.3392L10.7403 11.7497L5.30561 6.17739C5.01562 5.88735 4.8373 5.5323 4.80563 5.17893C4.77397 4.80221 4.90396 4.45717 5.18228 4.1788C5.43227 3.92877 5.73892 3.79709 6.07224 3.79709C6.46221 3.79709 6.85553 3.97544 7.18051 4.30048L12.7236 9.70616L8.6971 5.56731C8.40545 5.27561 8.22712 4.92056 8.19712 4.56718C8.16546 4.19214 8.29545 3.84709 8.57377 3.56873C8.82376 3.31869 9.13041 3.18701 9.46372 3.18701C9.85537 3.18701 10.2487 3.36703 10.572 3.69207L11.7736 4.87056C13.9152 6.97082 15.7051 8.72937 15.8967 8.92606C15.99 9.00107 16.1117 9.02941 16.1634 9.00441C16.1967 8.98774 16.2334 8.91106 16.2267 8.74937C16.2167 8.466 16.1767 8.11429 16.135 7.74258C16.0517 6.99582 15.965 6.22239 16.0734 5.71233C16.31 4.82722 16.775 4.45217 17.1217 4.29048C17.5983 4.07046 18.0599 4.14713 18.1483 4.1888C19.0149 4.59552 18.8432 5.27561 18.6066 6.21906L18.6016 6.24239L18.5749 6.43742C18.4016 7.29086 19.2915 9.64949 20.1815 11.5714L20.1948 11.5981C20.7898 12.8982 21.8614 16.2336 18.9949 19.1007C17.6766 20.4158 16.25 20.8642 14.9634 20.8642ZM4.89063 11.1197C4.69397 11.1197 4.50732 11.2013 4.35399 11.3547C4.19567 11.5131 4.14067 11.6664 4.174 11.8498C4.21067 12.0515 4.35899 12.2915 4.59065 12.5248C4.59231 12.5265 4.65898 12.5915 4.77397 12.7015C8.6771 16.4903 11.0336 18.7423 11.4103 19.0457L11.4303 19.064C12.3502 19.9841 15.7684 21.6176 18.6399 18.7456C21.2848 16.1003 20.2898 13.0116 19.7382 11.8048L19.7265 11.7798C19.1532 10.5429 17.85 7.54256 18.0816 6.34574L18.1199 6.09571C18.3766 5.07558 18.3916 4.86222 17.9566 4.65219C17.8283 4.62886 16.9083 4.51718 16.5567 5.82901C16.4684 6.24739 16.5534 7.01249 16.6283 7.68757C16.6717 8.06929 16.7117 8.431 16.7217 8.73271C16.7383 9.20776 16.5134 9.38945 16.3767 9.45613C16.0984 9.59115 15.7667 9.47613 15.5601 9.30278L15.5384 9.28277C15.4367 9.17276 13.0185 6.8008 11.4186 5.2306L10.2154 4.04879C9.80537 3.63707 9.27707 3.56873 8.92209 3.92377C8.74876 4.09713 8.67043 4.30048 8.68876 4.52551C8.70876 4.76054 8.83542 5.00557 9.04708 5.21727L13.0819 9.35612C13.2719 9.54947 13.2719 9.86618 13.0785 10.0595C12.8935 10.2446 12.5669 10.2479 12.3769 10.0645L6.82886 4.65553C6.41888 4.24548 5.88891 4.17714 5.5356 4.53218C5.36227 4.70553 5.28394 4.90889 5.30228 5.13392C5.32394 5.36895 5.4506 5.61565 5.66059 5.82401L11.0986 11.4014C11.2903 11.5947 11.2886 11.9114 11.0953 12.1048C10.9103 12.2898 10.5837 12.2932 10.3937 12.1098L5.86558 7.69424C5.4556 7.28086 4.92563 7.21418 4.57231 7.56923C4.14067 8.00095 4.37066 8.53601 4.69731 8.86439L9.12541 13.4383C9.3154 13.6316 9.31373 13.9467 9.12041 14.1384C8.93375 14.3251 8.61044 14.3267 8.42045 14.145L5.64892 11.4814C5.4156 11.2464 5.14728 11.1197 4.89063 11.1197Z" fill="#EDA600"/>
|
||||
<path d="M15.4581 9.09033C14.5431 10.9589 14.6614 13.5742 16.0347 15.6728C16.1897 15.9562 16.4547 15.8178 16.3197 15.5261C14.6614 11.9774 16.3997 9.42037 16.3997 9.42037L15.4581 9.09033Z" fill="#EDA600"/>
|
||||
<path d="M11.8613 2.08448C12.3646 1.9528 12.9013 1.96446 13.4229 2.08615C13.9412 2.21116 14.4595 2.47453 14.8445 2.90458C15.2212 3.3313 15.4528 3.8497 15.5311 4.3931C15.6045 4.9315 15.5361 5.48657 15.2811 5.94663C15.2512 5.4299 15.1612 4.95484 15.0095 4.51645C14.9312 4.29809 14.8395 4.08973 14.7278 3.89304C14.6179 3.69801 14.4879 3.50466 14.3495 3.3463C14.0679 3.02126 13.6862 2.7679 13.2579 2.57121C12.8279 2.36785 12.3596 2.21783 11.8613 2.08448Z" fill="#B0BEC5"/>
|
||||
<path d="M11.9998 3.66264C12.2781 3.48595 12.6264 3.44928 12.9547 3.50762C13.2864 3.56596 13.603 3.73098 13.853 3.95935C14.1013 4.19104 14.278 4.48274 14.388 4.78612C14.4413 4.9378 14.468 5.09782 14.493 5.25284C14.5013 5.41286 14.5013 5.57288 14.4763 5.7329C14.3613 5.61122 14.2713 5.48954 14.1863 5.37119C14.088 5.25951 14.0113 5.14116 13.923 5.03281C13.7497 4.81779 13.5813 4.62276 13.3997 4.44941C13.213 4.28105 13.0164 4.1327 12.788 4.00435C12.5614 3.87267 12.3064 3.76265 11.9998 3.66264Z" fill="#90A4AE"/>
|
||||
<path d="M2.47047 14.2246C2.70546 14.6847 2.95045 15.1114 3.23543 15.4881C3.51875 15.8648 3.84373 16.1849 4.22205 16.3932C4.40537 16.4949 4.62369 16.5832 4.83701 16.6499C5.052 16.7183 5.27532 16.7649 5.50531 16.7966C5.96529 16.8533 6.4486 16.8433 6.96024 16.7649C6.56359 17.11 6.03362 17.2933 5.49365 17.3333C4.94701 17.37 4.39204 17.2517 3.8954 16.9716C3.39542 16.6866 3.02877 16.2332 2.79879 15.7515C2.5688 15.2664 2.44547 14.7447 2.47047 14.2246Z" fill="#B0BEC5"/>
|
||||
<path d="M4.04627 14.0312C4.20793 14.3113 4.36792 14.5363 4.54291 14.733C4.71623 14.9297 4.90289 15.0914 5.10621 15.2381C5.31287 15.3798 5.53952 15.5048 5.78618 15.6298C5.9095 15.6931 6.04116 15.7431 6.17116 15.8165C6.30615 15.8748 6.44281 15.9365 6.58613 16.0248C6.43448 16.0815 6.27948 16.1148 6.12116 16.1398C5.9645 16.1465 5.80284 16.1548 5.64285 16.1332C5.32287 16.0898 5.00288 15.9782 4.7229 15.7831C4.44791 15.5848 4.21959 15.3097 4.0946 14.998C3.96794 14.688 3.93127 14.3413 4.04627 14.0312Z" fill="#90A4AE"/>
|
||||
<defs>
|
||||
<radialGradient id="paint0_radial_2434_27914" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(8.67256 7.66634) rotate(-45.0051) scale(15.1685)">
|
||||
<stop offset="0.3533" stop-color="#FFCA28"/>
|
||||
<stop offset="0.8723" stop-color="#FFB300"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.3 KiB |
104
frontend/public/Icons/hurray.svg
Normal file
@@ -0,0 +1,104 @@
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M1.71673 14.5874C1.96899 14.8607 3.00801 14.384 3.82811 14.0017C4.44263 13.7161 6.90183 12.7071 8.1242 12.1837C8.45424 12.0426 8.9343 11.8581 9.2799 11.4036C9.58661 10.9991 10.4 9.28113 8.76206 7.54091C7.09963 5.77403 5.38719 6.26186 4.74711 6.71526C4.3704 6.98196 4.06369 7.58314 3.9259 7.88874C3.3436 9.18001 2.5135 11.5459 2.17568 12.476C1.92787 13.1616 1.4667 14.3162 1.71673 14.5874Z"
|
||||
fill="#FFC107"
|
||||
/>
|
||||
<path
|
||||
d="M3.76148 8.27783C3.77704 8.47119 3.81592 8.78567 3.94925 9.39131C4.04035 9.80691 4.18924 10.2425 4.31034 10.5303C4.67365 11.396 5.18363 11.7449 5.70027 12.025C6.578 12.5006 7.17463 12.5895 7.17463 12.5895L6.45912 12.8817C6.45912 12.8817 6.02581 12.7917 5.43473 12.5006C4.87142 12.2228 4.28479 11.7527 3.85592 10.8326C3.67037 10.4337 3.5626 10.0469 3.50038 9.74024C3.42372 9.36019 3.4115 9.14461 3.4115 9.14461L3.76148 8.27783Z"
|
||||
fill="#FF8F00"
|
||||
/>
|
||||
<path
|
||||
d="M2.88245 10.5312C2.88245 10.5312 2.97133 11.2523 3.56685 12.1623C4.26459 13.2267 5.23899 13.4011 5.23899 13.4011L4.59124 13.6678C4.59124 13.6678 3.86795 13.4467 3.18021 12.5078C2.75134 11.9223 2.63135 11.2223 2.63135 11.2223L2.88245 10.5312Z"
|
||||
fill="#FF8F00"
|
||||
/>
|
||||
<path
|
||||
d="M2.26575 12.2402C2.26575 12.2402 2.42796 12.8624 2.7835 13.3268C3.20681 13.8813 3.74567 14.0424 3.74567 14.0424L3.24903 14.2624C3.24903 14.2624 2.87238 14.1835 2.46018 13.6613C2.14687 13.2646 2.05798 12.8091 2.05798 12.8091L2.26575 12.2402Z"
|
||||
fill="#FF8F00"
|
||||
/>
|
||||
<g opacity="0.44">
|
||||
<path
|
||||
opacity="0.44"
|
||||
d="M1.99553 13.8201C1.97331 13.7701 1.97331 13.7134 1.99664 13.6645L4.82649 7.79492L5.29203 9.54514L2.31441 13.8468C2.23441 13.9668 2.05442 13.9513 1.99553 13.8201Z"
|
||||
fill="#FFFDE7"
|
||||
/>
|
||||
</g>
|
||||
<path
|
||||
d="M5.51737 10.1336C6.83975 11.6804 8.3455 11.4871 8.84667 11.0959C9.34896 10.7037 9.74567 9.35571 8.42884 7.83441C7.04867 6.24088 5.48625 6.69538 5.12509 7.03987C4.76394 7.38435 4.30388 8.71452 5.51737 10.1336Z"
|
||||
fill="url(#paint0_linear_2434_23047)"
|
||||
/>
|
||||
<path
|
||||
d="M10.059 10.7698C9.57673 10.3654 9.32003 10.4376 8.97554 10.5809C8.53104 10.7654 7.83206 10.902 6.88306 10.5809L7.16865 9.89321C7.73205 10.0832 8.13988 9.99098 8.49215 9.78321C8.94554 9.51656 9.56561 9.15102 10.5302 9.96098C10.9325 10.2987 11.3447 10.5232 11.647 10.421C11.867 10.3476 11.9837 10.0199 12.0426 9.75877C12.0481 9.73544 12.057 9.66877 12.0637 9.60989C12.117 9.20213 12.2059 8.32218 12.8616 7.8722C13.5628 7.39111 14.2995 7.39111 14.2995 7.39111L14.4329 8.71549C14.094 8.66549 13.8584 8.73438 13.6595 8.84437C12.9105 9.26102 13.5628 10.8609 12.3971 11.3987C11.2758 11.9198 10.359 11.0209 10.059 10.7698Z"
|
||||
fill="#03A9F4"
|
||||
/>
|
||||
<path
|
||||
d="M5.93365 9.08114L5.45145 8.64886C6.33696 7.65985 6.10364 6.93309 5.93365 6.40413C5.89921 6.29745 5.86699 6.19633 5.84588 6.09965C5.77032 5.75739 5.75477 5.45957 5.7781 5.19954C5.43812 4.77615 5.28813 4.33276 5.27813 4.30276C5.07147 3.67712 5.22702 3.06705 5.58367 2.49475C6.30474 1.3335 7.61023 1.3335 7.61023 1.3335L8.04576 2.4992C7.71467 2.48586 6.62917 2.50253 6.29585 3.02815C5.87476 3.69046 6.15141 4.0994 6.17141 4.14607C6.25252 4.0405 6.33474 3.95605 6.40807 3.89048C6.94026 3.4182 7.40246 3.35042 7.69689 3.37709C8.02798 3.40709 8.32797 3.57378 8.5424 3.84715C8.77683 4.14718 8.87349 4.53723 8.79905 4.89172C8.72683 5.23732 8.49685 5.52958 8.15131 5.71516C7.54801 6.03964 7.04581 5.99519 6.70916 5.88296C6.71139 5.89074 6.7125 5.89963 6.71472 5.9074C6.72694 5.96297 6.75138 6.04075 6.78027 6.13077C6.97693 6.73973 7.34246 7.70652 5.93365 9.08114ZM6.75027 4.91061C6.81471 4.95728 6.88249 4.99618 6.95248 5.02396C7.1858 5.11731 7.44024 5.08619 7.72911 4.93061C7.8991 4.83949 7.9191 4.7417 7.92577 4.70948C7.94576 4.6128 7.91243 4.48945 7.84021 4.39721C7.77688 4.31609 7.70356 4.27387 7.61578 4.26498C7.44912 4.25053 7.22358 4.3561 6.99804 4.55723C6.89026 4.65391 6.80805 4.77282 6.75027 4.91061Z"
|
||||
fill="#F44336"
|
||||
/>
|
||||
<path
|
||||
d="M7.86428 9.26219L7.17419 9.2433C7.17419 9.2433 7.50201 7.39196 8.56326 7.08081C8.76217 7.02302 8.97998 6.96412 9.19889 6.9319C9.32891 6.9119 9.53449 6.88189 9.63561 6.84411C9.65895 6.66964 9.58561 6.44739 9.50337 6.19514C9.43892 5.99956 9.37225 5.79842 9.33669 5.57839C9.26779 5.14945 9.38225 4.77052 9.65895 4.50937C9.99677 4.19266 10.5424 4.09154 11.158 4.23156C11.5092 4.31157 11.7681 4.48381 11.9959 4.63494C12.3215 4.85164 12.5115 4.96165 12.9094 4.69384C13.3905 4.36935 12.7616 3.09919 12.4271 2.36577L13.675 1.8457C13.8428 2.21242 14.6529 4.09932 14.1184 5.17612C13.9384 5.53839 13.6283 5.77842 13.2216 5.86843C12.3371 6.06623 11.8192 5.72175 11.4414 5.4706C11.2625 5.3517 11.1058 5.25835 10.9358 5.20946C9.75452 4.87275 11.4036 6.61075 10.6313 7.39196C10.1679 7.85979 9.03554 7.98314 8.9622 8.00092C8.23322 8.1765 7.86428 9.26219 7.86428 9.26219Z"
|
||||
fill="#F48FB1"
|
||||
/>
|
||||
<path
|
||||
d="M5.77735 5.19971C5.75624 5.44414 5.74624 5.58969 5.80957 5.90745C6.11511 6.13188 6.78063 6.13188 6.78063 6.13188C6.75175 6.04189 6.72619 5.96411 6.71508 5.90856C6.71286 5.90078 6.71175 5.89189 6.70953 5.88412C6.03289 5.54636 5.77735 5.19971 5.77735 5.19971Z"
|
||||
fill="#C92B27"
|
||||
/>
|
||||
<path
|
||||
d="M4.3926 6.29422L3.24377 5.73092L3.81597 4.9043L4.71703 5.50093L4.3926 6.29422Z"
|
||||
fill="#FFC107"
|
||||
/>
|
||||
<path
|
||||
d="M2.69866 4.73376C2.11203 4.65487 1.51428 4.15712 1.44873 4.10046L2.02537 3.42383C2.1998 3.5716 2.56978 3.81936 2.81755 3.85269L2.69866 4.73376Z"
|
||||
fill="#FB8C00"
|
||||
/>
|
||||
<path
|
||||
d="M3.73454 3.25204L2.89014 2.97539C2.9868 2.67985 3.01235 2.36097 2.96236 2.05321L3.84009 1.91211C3.9123 2.35875 3.87564 2.82206 3.73454 3.25204Z"
|
||||
fill="#03A9F4"
|
||||
/>
|
||||
<path
|
||||
d="M9.87734 2.40185L9.00903 2.5918L9.25976 3.73797L10.1281 3.54802L9.87734 2.40185Z"
|
||||
fill="#FB8C00"
|
||||
/>
|
||||
<path
|
||||
d="M11.1633 2.8636L10.5522 2.21808C10.8722 1.91476 10.9456 1.51812 10.9456 1.51367L11.8233 1.657C11.8122 1.72699 11.7 2.35585 11.1633 2.8636Z"
|
||||
fill="#FFC107"
|
||||
/>
|
||||
<path
|
||||
d="M12.2788 6.0445L11.5026 6.28711L11.7677 7.13551L12.544 6.8929L12.2788 6.0445Z"
|
||||
fill="#FB8C00"
|
||||
/>
|
||||
<path
|
||||
d="M11.7289 13.4486L10.8456 13.3442C10.8833 13.0298 10.6489 12.6442 10.5845 12.5587L11.2955 12.0254C11.3489 12.0954 11.8122 12.7365 11.7289 13.4486Z"
|
||||
fill="#F44336"
|
||||
/>
|
||||
<path
|
||||
d="M14.2643 12.3224C13.9321 12.2724 13.5921 12.2524 13.2566 12.2647L13.2266 11.3758C13.6165 11.3625 14.011 11.3847 14.3965 11.4436L14.2643 12.3224Z"
|
||||
fill="#FB8C00"
|
||||
/>
|
||||
<path
|
||||
d="M13.6938 12.9134L13.0693 13.5459L13.9287 14.3944L14.5532 13.7619L13.6938 12.9134Z"
|
||||
fill="#F48FB1"
|
||||
/>
|
||||
<path
|
||||
d="M11.8765 8.66102L11.2344 7.92676L10.5001 8.56893L11.1423 9.30319L11.8765 8.66102Z"
|
||||
fill="#F44336"
|
||||
/>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="paint0_linear_2434_23047"
|
||||
x1="9.15497"
|
||||
y1="7.7609"
|
||||
x2="5.84707"
|
||||
y2="9.74564"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop offset="0.0235" stopColor="#8F4700" />
|
||||
<stop offset="1" stopColor="#703E2D" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.5 KiB |
8
frontend/public/Icons/logs.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2.91663 3.20801L2.91663 11.083" stroke="white" stroke-width="1.16667"/>
|
||||
<ellipse cx="6.41663" cy="3.20833" rx="3.5" ry="1.45833" stroke="white" stroke-width="1.16667"/>
|
||||
<ellipse cx="6.41663" cy="3.16439" rx="0.875" ry="0.364583" fill="white"/>
|
||||
<path d="M9.91663 11.083C9.91663 11.7273 8.34962 12.2497 6.41663 12.2497C4.48363 12.2497 2.91663 11.7273 2.91663 11.083" stroke="white" stroke-width="1.16667"/>
|
||||
<path d="M5.25 6.41699V7.53424C5.25 7.56276 5.27062 7.58709 5.29874 7.59178L6.95126 7.8672C6.97938 7.87189 7 7.89623 7 7.92474V9.91699" stroke="white" stroke-width="1.16667" stroke-linecap="round"/>
|
||||
<path d="M9.91663 3.20801V6.31109C9.91663 6.35691 9.96702 6.38484 10.0059 6.36056L12.1819 5.00054C12.2155 4.97954 12.2598 4.99742 12.2694 5.03586L12.5341 6.09457C12.5388 6.11339 12.5338 6.13332 12.5209 6.14774L9.9316 9.0247C9.92196 9.03541 9.91663 9.04931 9.91663 9.06373V11.083" stroke="white" stroke-width="1.16667"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
4
frontend/public/Icons/play-back.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6 9.5L1.5 6L6 2.5V9.5Z" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M11.5 9.5L7 6L11.5 2.5V9.5Z" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 303 B |
12
frontend/public/Icons/spinner-half-blue.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g opacity="0.2">
|
||||
<mask id="path-1-inside-1_2586_2806" fill="white">
|
||||
<path d="M15.0588 8.00023C15.0588 11.8987 11.8985 15.0591 7.99999 15.0591C4.10151 15.0591 0.941162 11.8987 0.941162 8.00023C0.941162 4.10175 4.10151 0.941406 7.99999 0.941406C11.8985 0.941406 15.0588 4.10175 15.0588 8.00023ZM3.48234 8.00023C3.48234 10.4953 5.50496 12.5179 7.99999 12.5179C10.495 12.5179 12.5176 10.4953 12.5176 8.00023C12.5176 5.5052 10.495 3.48258 7.99999 3.48258C5.50496 3.48258 3.48234 5.5052 3.48234 8.00023Z"/>
|
||||
</mask>
|
||||
<path d="M15.0588 8.00023C15.0588 11.8987 11.8985 15.0591 7.99999 15.0591C4.10151 15.0591 0.941162 11.8987 0.941162 8.00023C0.941162 4.10175 4.10151 0.941406 7.99999 0.941406C11.8985 0.941406 15.0588 4.10175 15.0588 8.00023ZM3.48234 8.00023C3.48234 10.4953 5.50496 12.5179 7.99999 12.5179C10.495 12.5179 12.5176 10.4953 12.5176 8.00023C12.5176 5.5052 10.495 3.48258 7.99999 3.48258C5.50496 3.48258 3.48234 5.5052 3.48234 8.00023Z" stroke="#4E74F8" stroke-width="3.25792" mask="url(#path-1-inside-1_2586_2806)"/>
|
||||
</g>
|
||||
<mask id="path-2-inside-2_2586_2806" fill="white">
|
||||
<path d="M7.99999 15.0591C9.8721 15.0591 11.6675 14.3154 12.9913 12.9916C14.3151 11.6678 15.0588 9.87235 15.0588 8.00023C15.0588 6.12811 14.3151 4.33267 12.9913 3.00889C11.6675 1.6851 9.8721 0.941407 7.99999 0.941406L7.99999 3.48258C9.19814 3.48258 10.3472 3.95855 11.1944 4.80577C12.0417 5.65299 12.5176 6.80208 12.5176 8.00023C12.5176 9.19838 12.0417 10.3475 11.1944 11.1947C10.3472 12.0419 9.19814 12.5179 7.99999 12.5179L7.99999 15.0591Z"/>
|
||||
</mask>
|
||||
<path d="M7.99999 15.0591C9.8721 15.0591 11.6675 14.3154 12.9913 12.9916C14.3151 11.6678 15.0588 9.87235 15.0588 8.00023C15.0588 6.12811 14.3151 4.33267 12.9913 3.00889C11.6675 1.6851 9.8721 0.941407 7.99999 0.941406L7.99999 3.48258C9.19814 3.48258 10.3472 3.95855 11.1944 4.80577C12.0417 5.65299 12.5176 6.80208 12.5176 8.00023C12.5176 9.19838 12.0417 10.3475 11.1944 11.1947C10.3472 12.0419 9.19814 12.5179 7.99999 12.5179L7.99999 15.0591Z" stroke="#4E74F8" stroke-width="3.25792" mask="url(#path-2-inside-2_2586_2806)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
10
frontend/public/Icons/spinner.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<mask id="path-1-inside-1_2434_32242" fill="white">
|
||||
<path d="M15.0588 8.00023C15.0588 11.8987 11.8985 15.0591 7.99999 15.0591C4.10151 15.0591 0.941162 11.8987 0.941162 8.00023C0.941162 4.10175 4.10151 0.941406 7.99999 0.941406C11.8985 0.941406 15.0588 4.10175 15.0588 8.00023ZM2.63528 8.00023C2.63528 10.9631 5.03714 13.3649 7.99999 13.3649C10.9628 13.3649 13.3647 10.9631 13.3647 8.00023C13.3647 5.03738 10.9628 2.63552 7.99999 2.63552C5.03714 2.63552 2.63528 5.03738 2.63528 8.00023Z"/>
|
||||
</mask>
|
||||
<path d="M15.0588 8.00023C15.0588 11.8987 11.8985 15.0591 7.99999 15.0591C4.10151 15.0591 0.941162 11.8987 0.941162 8.00023C0.941162 4.10175 4.10151 0.941406 7.99999 0.941406C11.8985 0.941406 15.0588 4.10175 15.0588 8.00023ZM2.63528 8.00023C2.63528 10.9631 5.03714 13.3649 7.99999 13.3649C10.9628 13.3649 13.3647 10.9631 13.3647 8.00023C13.3647 5.03738 10.9628 2.63552 7.99999 2.63552C5.03714 2.63552 2.63528 5.03738 2.63528 8.00023Z" stroke="white" stroke-opacity="0.2" stroke-width="3.25792" mask="url(#path-1-inside-1_2434_32242)"/>
|
||||
<mask id="path-2-inside-2_2434_32242" fill="white">
|
||||
<path d="M15.0588 8.00023C15.0588 7.07325 14.8762 6.15535 14.5215 5.29893C14.1667 4.44252 13.6468 3.66436 12.9913 3.00889C12.3359 2.35342 11.5577 1.83347 10.7013 1.47873C9.84486 1.12399 8.92696 0.941406 7.99999 0.941406L7.99999 2.63552C8.70449 2.63552 9.40209 2.77429 10.053 3.04389C10.7038 3.31349 11.2952 3.70865 11.7934 4.20681C12.2916 4.70497 12.6867 5.29637 12.9563 5.94725C13.2259 6.59812 13.3647 7.29573 13.3647 8.00023H15.0588Z"/>
|
||||
</mask>
|
||||
<path d="M15.0588 8.00023C15.0588 7.07325 14.8762 6.15535 14.5215 5.29893C14.1667 4.44252 13.6468 3.66436 12.9913 3.00889C12.3359 2.35342 11.5577 1.83347 10.7013 1.47873C9.84486 1.12399 8.92696 0.941406 7.99999 0.941406L7.99999 2.63552C8.70449 2.63552 9.40209 2.77429 10.053 3.04389C10.7038 3.31349 11.2952 3.70865 11.7934 4.20681C12.2916 4.70497 12.6867 5.29637 12.9563 5.94725C13.2259 6.59812 13.3647 7.29573 13.3647 8.00023H15.0588Z" stroke="white" stroke-width="3.25792" mask="url(#path-2-inside-2_2434_32242)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
4
frontend/public/Icons/status-inprogress-pill.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<ellipse cx="8" cy="7.99998" rx="8" ry="7.99998" fill="#4568DC"/>
|
||||
<circle cx="7.99992" cy="7.99967" r="4.33333" fill="#4568DC" stroke="white" stroke-width="0.666667" stroke-dasharray="1.33 1.33"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 300 B |
5
frontend/public/Icons/status-skipped-pill.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<ellipse cx="8" cy="7.99998" rx="8" ry="7.99998" fill="#FFCD56"/>
|
||||
<path d="M5 5.5L8 8.5L11 5.5" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M11 10.5H5" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 348 B |
78
frontend/public/Icons/triangle-ruler.svg
Normal file
@@ -0,0 +1,78 @@
|
||||
<svg width="33" height="32" viewBox="0 0 33 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.25049 15.7774L9.51287 11.3613L20.0986 23.8473L16.6515 24.1807L8.25049 15.7774Z" fill="#BF8400"/>
|
||||
<path d="M3.16675 3.07961V29.3362H29.4234C29.5767 29.3362 29.6523 29.1518 29.5434 29.0429L3.46012 2.95959C3.35122 2.85069 3.16675 2.92625 3.16675 3.07961ZM8.63854 15.1345L17.833 24.18H8.63854V15.1345Z" fill="#EAA700"/>
|
||||
<path d="M8.24961 24.4043L3.16675 29.3352H29.4234C29.5767 29.3352 29.6523 29.1507 29.5434 29.0418L28.3655 27.8641L8.24961 24.4043Z" fill="#BF8400"/>
|
||||
<path d="M3.85938 3.73486V28.4846C3.85938 28.5713 3.92827 28.6402 4.01495 28.6402H28.7647C28.9025 28.6402 28.9736 28.4713 28.8758 28.3735L4.12607 3.62596C4.02828 3.52817 3.85938 3.59707 3.85938 3.73486ZM8.69776 15.403L17.0988 23.8041H8.69776V15.403Z" fill="url(#paint0_linear_2445_43701)"/>
|
||||
<path d="M4.51082 6.18231C4.39971 6.29342 4.39971 6.47563 4.51082 6.58674L4.73525 6.81117C4.84636 6.92227 5.02857 6.92227 5.13967 6.81117L6.22628 5.72456L5.59743 5.0957L4.51082 6.18231Z" fill="#795548"/>
|
||||
<path d="M5.59763 5.09766L5.07544 5.61985L5.70207 6.24649L6.22427 5.72429L5.59763 5.09766Z" fill="url(#paint1_linear_2445_43701)"/>
|
||||
<path d="M8.68929 10.361C8.57818 10.4721 8.57818 10.6543 8.68929 10.7654L8.91372 10.9899C9.02482 11.101 9.20704 11.101 9.31814 10.9899L10.4048 9.90327L9.7759 9.27441L8.68929 10.361Z" fill="#795548"/>
|
||||
<path d="M9.77561 9.27441L9.25342 9.79661L9.88005 10.4255L10.4022 9.90327L9.77561 9.27441Z" fill="url(#paint2_linear_2445_43701)"/>
|
||||
<path d="M12.8668 14.5378C12.7557 14.6489 12.7557 14.8311 12.8668 14.9422L13.0912 15.1666C13.2023 15.2777 13.3845 15.2777 13.4956 15.1666L14.5822 14.08L13.9534 13.4512L12.8668 14.5378Z" fill="#795548"/>
|
||||
<path d="M13.9529 13.4512L13.4285 13.9734L14.0573 14.6022L14.5795 14.08L13.9529 13.4512Z" fill="url(#paint3_linear_2445_43701)"/>
|
||||
<path d="M17.0457 18.7175C16.9346 18.8286 16.9346 19.0108 17.0457 19.1219L17.2702 19.3463C17.3813 19.4574 17.5635 19.4574 17.6746 19.3463L18.7612 18.2597L18.1323 17.6309L17.0457 18.7175Z" fill="#795548"/>
|
||||
<path d="M18.1296 17.6309L17.6074 18.1531L18.2363 18.7819L18.7585 18.2597L18.1296 17.6309Z" fill="url(#paint4_linear_2445_43701)"/>
|
||||
<path d="M21.2244 22.8962C21.1133 23.0073 21.1133 23.1895 21.2244 23.3006L21.4489 23.525C21.56 23.6361 21.7422 23.6361 21.8533 23.525L22.9399 22.4384L22.3111 21.8096L21.2244 22.8962Z" fill="#795548"/>
|
||||
<path d="M22.3083 21.8096L21.7861 22.3318L22.415 22.9606L22.9372 22.4384L22.3083 21.8096Z" fill="url(#paint5_linear_2445_43701)"/>
|
||||
<path d="M25.4032 27.0739C25.292 27.185 25.292 27.3672 25.4032 27.4783L25.6276 27.7028C25.7387 27.8139 25.9209 27.8139 26.032 27.7028L27.1186 26.6162L26.4898 25.9873L25.4032 27.0739Z" fill="#795548"/>
|
||||
<path d="M26.4875 25.9873L25.9653 26.5095L26.5942 27.1384L27.1164 26.6162L26.4875 25.9873Z" fill="url(#paint6_linear_2445_43701)"/>
|
||||
<path d="M9.84236 13.2214C9.73126 13.3325 9.73126 13.5147 9.84236 13.6258L10.2312 14.0147C10.3423 14.1258 10.5245 14.1258 10.6357 14.0147L12.4644 12.1859L11.6712 11.3926L9.84236 13.2214Z" fill="#795548"/>
|
||||
<path d="M11.7822 11.2812L11.2578 11.8034L12.0511 12.5967L12.5733 12.0745L11.7822 11.2812Z" fill="url(#paint7_linear_2445_43701)"/>
|
||||
<path d="M14.0213 17.3991C13.9102 17.5102 13.9102 17.6924 14.0213 17.8035L14.4102 18.1924C14.5213 18.3035 14.7035 18.3035 14.8146 18.1924L16.6434 16.3636L15.8501 15.5703L14.0213 17.3991Z" fill="#795548"/>
|
||||
<path d="M15.959 15.459L15.4368 15.9812L16.2301 16.7745L16.7523 16.2523L15.959 15.459Z" fill="url(#paint8_linear_2445_43701)"/>
|
||||
<path d="M5.66536 9.04266C5.55425 9.15377 5.55425 9.33598 5.66536 9.44708L6.05423 9.83595C6.16533 9.94706 6.34755 9.94706 6.45865 9.83595L8.28744 8.00716L7.49415 7.21387L5.66536 9.04266Z" fill="#795548"/>
|
||||
<path d="M7.6052 7.10254L7.08301 7.62473L7.87408 8.41803L8.39627 7.89583L7.6052 7.10254Z" fill="url(#paint9_linear_2445_43701)"/>
|
||||
<path d="M18.1988 21.5778C18.0877 21.6889 18.0877 21.8711 18.1988 21.9822L18.5877 22.3711C18.6988 22.4822 18.881 22.4822 18.9921 22.3711L20.8209 20.5423L20.0276 19.749L18.1988 21.5778Z" fill="#795548"/>
|
||||
<path d="M20.1367 19.6377L19.6145 20.1599L20.4078 20.9532L20.93 20.431L20.1367 19.6377Z" fill="url(#paint10_linear_2445_43701)"/>
|
||||
<path d="M22.3778 25.7556C22.2667 25.8667 22.2667 26.0489 22.3778 26.16L22.7666 26.5488C22.8777 26.6599 23.0599 26.6599 23.1711 26.5488L24.9998 24.72L24.2066 23.9268L22.3778 25.7556Z" fill="#795548"/>
|
||||
<path d="M24.3154 23.8154L23.7932 24.3376L24.5865 25.1309L25.1087 24.6087L24.3154 23.8154Z" fill="url(#paint11_linear_2445_43701)"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_2445_43701" x1="9.0951" y1="23.4067" x2="20.3432" y2="12.1586" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.5456" stop-color="#FDD835"/>
|
||||
<stop offset="0.7758" stop-color="#F9A825"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_2445_43701" x1="5.38405" y1="5.93783" x2="5.73014" y2="5.59174" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_2445_43701" x1="9.56189" y1="10.1167" x2="9.90798" y2="9.77059" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_2445_43701" x1="13.739" y1="14.2933" x2="14.0851" y2="13.9472" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear_2445_43701" x1="17.9178" y1="18.4728" x2="18.2639" y2="18.1268" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear_2445_43701" x1="22.0964" y1="22.6514" x2="22.4425" y2="22.3053" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint6_linear_2445_43701" x1="26.2755" y1="26.829" x2="26.6216" y2="26.4829" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint7_linear_2445_43701" x1="11.6945" y1="12.1617" x2="11.9778" y2="11.8783" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint8_linear_2445_43701" x1="15.8733" y1="16.3393" x2="16.1566" y2="16.0559" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint9_linear_2445_43701" x1="7.51756" y1="7.98312" x2="7.80095" y2="7.69973" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint10_linear_2445_43701" x1="20.0509" y1="20.5178" x2="20.3342" y2="20.2345" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint11_linear_2445_43701" x1="24.2294" y1="24.6955" x2="24.5128" y2="24.4121" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5D4037" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="#5D4037"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.2 KiB |
60
frontend/public/Icons/wrench.svg
Normal file
@@ -0,0 +1,60 @@
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M2.30535 14.0629C3.04433 14.8019 3.94222 14.5452 4.46117 13.954C4.99124 13.3495 5.2735 12.9984 5.2735 12.9984C5.93469 12.0249 8.66614 8.77116 10.9975 6.42975C11.322 6.5631 11.6665 6.63311 12.0121 6.63311C12.6277 6.63311 13.2445 6.42086 13.7379 5.99525C14.3335 5.48186 14.6691 4.73843 14.6602 3.955C14.6591 3.90055 14.6302 3.84943 14.5824 3.82276C14.5347 3.79609 14.4769 3.79609 14.4291 3.82276L12.8233 4.74954C12.0477 4.48173 11.5887 3.68385 11.7465 2.88598L13.3467 1.96253C13.3945 1.93474 13.4234 1.88474 13.4234 1.82918C13.4234 1.77361 13.3945 1.72361 13.3467 1.69583C12.3077 1.08797 10.9875 1.2591 10.1363 2.11032C9.62071 2.62594 9.33845 3.33937 9.36179 4.06723C9.37512 4.49284 9.48736 4.89734 9.68627 5.2585C7.11039 7.8266 3.96778 10.6036 3.1499 11.2237C3.1499 11.2237 2.65761 11.5804 2.18756 12.0638C1.72416 12.5405 1.55192 13.3095 2.30535 14.0629ZM2.84653 12.9261C2.84653 12.5994 3.111 12.3338 3.43882 12.3338C3.76664 12.3338 4.03112 12.5983 4.03112 12.9261C4.03112 13.2528 3.76664 13.5184 3.43882 13.5184C3.111 13.5184 2.84653 13.2528 2.84653 12.9261Z"
|
||||
fill="#82AEC0"
|
||||
/>
|
||||
<path
|
||||
d="M9.33398 5.60826C9.44953 5.4938 9.5673 5.37823 9.6873 5.25822C9.48842 4.89706 9.3762 4.49256 9.36287 4.06695C9.35398 3.77803 9.39287 3.49244 9.47509 3.22018C9.54841 3.10017 9.66396 2.97126 9.73729 3.04905C9.7073 3.99472 9.98173 4.9804 10.6395 5.66049C10.9661 5.99831 11.3905 6.24167 11.8461 6.35613C12.0705 6.41281 12.3038 6.43836 12.536 6.42503C12.6727 6.41725 13.0549 6.27612 13.1316 6.38058C13.1316 6.38058 13.1316 6.38391 13.1316 6.38502C12.7782 6.54949 12.3949 6.63172 12.0116 6.63172C11.6661 6.63172 11.3205 6.56171 10.9972 6.42836C10.2428 7.18624 9.61841 7.86854 9.09399 8.47862C9.3562 7.983 10.1284 7.06955 10.335 6.72062C10.3817 6.64172 10.4461 6.43948 10.2995 6.25723C10.0917 6.00164 9.66619 5.76383 9.33398 5.60826Z"
|
||||
fill="#2F7889"
|
||||
/>
|
||||
<path
|
||||
d="M6.18641 9.52893C6.24641 9.46671 6.18974 9.36227 6.1053 9.38116C5.94753 9.4156 5.71977 9.50559 5.44867 9.72558C4.91759 10.1567 3.51544 11.3211 3.34212 11.551C3.16879 11.781 3.86431 11.5477 4.10874 11.5044C4.30984 11.4677 5.71088 10.0233 6.18641 9.52893Z"
|
||||
fill="#B9E4EA"
|
||||
/>
|
||||
<path
|
||||
d="M11.0483 2.10366C10.7517 2.31588 10.485 2.56808 10.2072 2.80474C10.1361 2.86585 10.0306 2.92695 9.95726 2.86918C9.87726 2.80585 9.92726 2.67808 9.98726 2.59586C10.5128 1.87368 11.4938 1.35704 12.4427 1.56258C11.9427 1.72368 11.4927 1.7859 11.0483 2.10366Z"
|
||||
fill="#B9E4EA"
|
||||
/>
|
||||
<path
|
||||
d="M13.4078 4.58291C13.2912 4.65291 13.1289 4.74624 13.0367 4.7729C12.9245 4.80401 12.6067 4.68069 12.5145 4.60736C12.8945 4.35959 13.3178 4.08294 13.6978 3.83517C13.7411 3.8074 13.7845 3.77851 13.8345 3.76296C13.8933 3.74407 13.9578 3.74629 14.02 3.74851C14.1067 3.75296 14.53 3.73851 14.58 3.81295C14.63 3.8885 14.4544 3.96183 14.3966 3.99628C14.0667 4.19293 13.7367 4.38737 13.4078 4.58291Z"
|
||||
fill="#2F7889"
|
||||
/>
|
||||
<path
|
||||
d="M8.86729 8.68619L7.62402 7.25293C7.17404 7.67624 6.72851 8.08844 6.30298 8.47842L6.66518 8.39954C6.82406 8.3662 6.9885 8.41509 7.10405 8.52953L7.68402 9.1795C7.80623 9.30171 7.82623 9.51392 7.77957 9.68058L7.71513 9.98834C8.08177 9.56503 8.46953 9.12616 8.86729 8.68619Z"
|
||||
fill="#2F7889"
|
||||
/>
|
||||
<path
|
||||
d="M14.3782 13.8579L13.6336 14.5013C13.3469 14.7491 12.9113 14.7158 12.6657 14.4291L3.84131 3.77776L4.97589 2.92432L14.4349 12.9C14.6904 13.1789 14.6638 13.6112 14.3782 13.8579Z"
|
||||
fill="#A06841"
|
||||
/>
|
||||
<path
|
||||
d="M4.64795 4.75126L6.74784 7.28669C7.0756 6.79338 7.24226 6.2023 7.37669 5.45567L5.34902 3.31689C5.18459 3.45133 5.04348 3.61355 4.9346 3.79576C4.76239 4.08574 4.67239 4.41461 4.64795 4.75126Z"
|
||||
fill="#7D5133"
|
||||
/>
|
||||
<path
|
||||
d="M8.81067 1.43737C6.88376 1.41514 6.17034 1.58627 5.09687 2.51417C4.77461 2.79198 4.45346 3.06979 4.13119 3.34872C3.78115 3.65098 3.31554 3.91546 3.38888 4.43774C3.41555 4.62888 3.47445 4.82224 3.43889 5.01115C3.40444 5.19006 3.19663 5.27896 3.04884 5.17673C2.90993 5.08116 2.75658 4.96337 2.58545 4.94336C2.42543 4.92558 2.25652 4.97559 2.13539 5.08338L1.38863 5.7468C1.38863 5.7468 1.28195 6.1813 2.11761 7.12697C2.95327 8.07264 3.49111 8.00486 3.49111 8.00486L4.19342 7.387C4.31122 7.28366 4.37234 7.13142 4.369 6.97473C4.36567 6.79137 4.25899 6.64913 4.19454 6.48467C4.18231 6.45355 4.1123 6.34243 4.23454 6.2413C4.34344 6.14685 4.56792 6.17907 4.69571 6.21352C4.8235 6.24797 4.94574 6.30242 5.07465 6.33576C5.32579 6.40132 5.44358 6.28464 5.61805 6.13462C5.77251 6.00127 6.70263 5.19784 7.01267 4.92892C7.63163 4.39329 6.68818 3.4554 6.68818 3.4554C6.24368 2.952 8.94068 1.68629 8.94068 1.68629C9.13849 1.61739 9.07848 1.43959 8.81067 1.43737Z"
|
||||
fill="#82AEC0"
|
||||
/>
|
||||
<path
|
||||
d="M5.07585 6.33655C5.12807 6.34988 5.17363 6.35433 5.21585 6.35322C5.21585 6.34655 5.21585 6.33877 5.21585 6.33211C5.20474 6.21211 5.13918 6.10323 5.07252 6.00212C4.65588 5.36771 4.13813 4.80108 3.54482 4.32888C3.49594 4.28999 3.44483 4.25111 3.3915 4.21777C3.38039 4.28555 3.37817 4.35888 3.38928 4.43776C3.41594 4.62886 3.47483 4.82219 3.43927 5.01107C3.4015 5.20661 3.19706 5.26105 3.04041 5.18772C3.44816 5.45104 3.79703 5.80213 4.05146 6.21545C4.08591 6.271 4.12035 6.32989 4.16035 6.38322C4.1659 6.32877 4.19034 6.27655 4.2359 6.24211C4.34478 6.14767 4.56921 6.17989 4.69698 6.21434C4.82587 6.24767 4.94697 6.30211 5.07585 6.33655Z"
|
||||
fill="#2F7889"
|
||||
/>
|
||||
<path
|
||||
d="M2.77746 6.57238C3.36299 7.18457 3.69186 7.81898 3.51187 7.99119C3.33299 8.1623 2.71302 7.80565 2.1275 7.19457C1.54197 6.58349 1.20977 5.91908 1.38865 5.74687C1.56753 5.57576 2.19194 5.96019 2.77746 6.57238Z"
|
||||
fill="#2F7889"
|
||||
/>
|
||||
<path
|
||||
d="M5.05664 3.4082C5.52217 3.21043 5.93659 2.78601 6.47879 2.31826C6.63322 2.18493 6.82988 2.05827 7.03098 1.96272C7.10653 1.92717 7.07876 1.81384 6.99543 1.81495C6.71655 1.81939 6.46768 1.90383 6.22325 2.01049C5.88104 2.15938 5.57884 2.38492 5.28774 2.61824C5.08775 2.77823 4.61889 3.17377 4.32335 3.42375C4.26779 3.47042 4.31112 3.54375 4.38334 3.54375C4.59111 3.54597 4.70777 3.55708 5.05664 3.4082Z"
|
||||
fill="#B9E4EA"
|
||||
/>
|
||||
<path
|
||||
d="M2.12439 5.3515C1.92773 5.5726 2.17883 5.63259 2.61992 5.99702C2.93101 6.25478 3.2621 6.01591 3.26544 5.77481C3.26766 5.55815 3.21322 5.44149 2.89879 5.24373C2.58436 5.04596 2.30215 5.15151 2.12439 5.3515Z"
|
||||
fill="#B9E4EA"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.8 KiB |
17
frontend/public/Images/activeDot.svg
Normal file
@@ -0,0 +1,17 @@
|
||||
<svg width="46" height="46" viewBox="0 0 46 46" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d_2445_31698)">
|
||||
<circle cx="23" cy="23" r="3" fill="#51E7A8"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d_2445_31698" x="0" y="0" width="46" height="46" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset/>
|
||||
<feGaussianBlur stdDeviation="10"/>
|
||||
<feComposite in2="hardAlpha" operator="out"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.317647 0 0 0 0 0.905882 0 0 0 0 0.658824 0 0 0 0.6 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_2445_31698"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_2445_31698" result="shape"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 910 B |
891
frontend/public/Images/allInOne.svg
Normal file
@@ -0,0 +1,891 @@
|
||||
<svg width="189" height="536" viewBox="0 0 189 536" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_2434_21797)">
|
||||
<path d="M126.756 568.295L126.756 329.756L126.756 24.3083C126.756 20.2857 123.495 17.0248 119.473 17.0248H57.5084C53.4859 17.0248 50.2249 20.2857 50.2249 24.3083V82.1939C50.2249 86.2165 46.964 89.4774 42.9414 89.4774H-147.722" stroke="#E5484D" stroke-opacity="0.1" stroke-width="7.2835"/>
|
||||
<path d="M126.756 568.295L126.756 329.756L126.756 24.3083C126.756 20.2857 123.495 17.0248 119.473 17.0248H57.5084C53.4859 17.0248 50.2249 20.2857 50.2249 24.3083V82.4853C50.2249 86.5078 46.964 89.7688 42.9414 89.7688H-147.722" stroke="#E5484D" stroke-width="0.87402"/>
|
||||
<path d="M137.682 568.295L137.682 322.39L137.682 7.28355C137.682 3.26098 134.421 4.47147e-05 130.398 4.47147e-05H65.1235C61.1009 4.47147e-05 57.84 3.26098 57.84 7.28355V109.951C57.84 113.974 54.5791 117.235 50.5565 117.235H-148.669" stroke="#4E74F8" stroke-opacity="0.1" stroke-width="7.2835"/>
|
||||
<path d="M137.682 568.295L137.682 322.39L137.682 7.28355C137.682 3.26098 134.421 4.47147e-05 130.398 4.47147e-05H65.1235C61.1009 4.47147e-05 57.84 3.26098 57.84 7.28355V109.951C57.84 113.974 54.5791 117.235 50.5565 117.235H-148.669" stroke="#4E74F8" stroke-width="0.87402"/>
|
||||
<path d="M116.195 568.295L116.195 329.757L116.195 35.9623C116.195 31.9398 112.934 28.6788 108.912 28.6788H46.9474C42.9248 28.6788 39.6639 31.9398 39.6639 35.9623V55.1726C39.6639 59.1951 36.403 62.4561 32.3804 62.4561H-149.798" stroke="#FFCD56" stroke-opacity="0.1" stroke-width="7.2835"/>
|
||||
<path d="M116.195 568.295L116.195 329.757L116.195 35.9623C116.195 31.9398 112.934 28.6788 108.912 28.6788H46.9474C42.9248 28.6788 39.6639 31.9398 39.6639 35.9623V55.1726C39.6639 59.1951 36.403 62.4561 32.3804 62.4561H-149.798" stroke="#FFCD56" stroke-width="0.87402"/>
|
||||
<rect x="66.7788" y="63.1685" width="121.016" height="49.0787" fill="#121317"/>
|
||||
<rect x="79" y="230" width="96" height="32" fill="#121317"/>
|
||||
<rect x="85" y="444" width="84" height="48" fill="#121317"/>
|
||||
<g clip-path="url(#clip1_2434_21797)">
|
||||
<line x1="152.792" y1="380.059" x2="158.176" y2="374.675" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="384.917" x2="158.176" y2="379.534" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="389.776" x2="158.176" y2="384.392" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="394.635" x2="158.176" y2="389.251" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="399.494" x2="158.176" y2="394.11" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="404.352" x2="158.176" y2="398.969" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="409.211" x2="158.176" y2="403.827" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="414.07" x2="158.176" y2="408.686" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="418.929" x2="158.176" y2="413.545" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="423.788" x2="158.176" y2="418.404" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="428.646" x2="158.176" y2="423.263" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="433.505" x2="158.176" y2="428.121" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="438.364" x2="158.176" y2="432.98" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="443.223" x2="158.176" y2="437.839" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="448.081" x2="158.176" y2="442.698" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="452.94" x2="158.176" y2="447.556" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="457.799" x2="158.176" y2="452.415" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="462.658" x2="158.176" y2="457.274" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="467.517" x2="158.176" y2="462.133" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="472.375" x2="158.176" y2="466.992" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="477.234" x2="158.176" y2="471.85" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="482.093" x2="158.176" y2="476.709" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="486.952" x2="158.176" y2="481.568" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="491.81" x2="158.176" y2="486.427" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="496.669" x2="158.176" y2="491.285" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="501.528" x2="158.176" y2="496.144" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="152.792" y1="506.387" x2="158.176" y2="501.003" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="153.016" y="374.899" width="5.12133" height="131.45" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip2_2434_21797)">
|
||||
<line x1="150.429" y1="380.059" x2="155.813" y2="374.675" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="384.917" x2="155.813" y2="379.534" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="389.776" x2="155.813" y2="384.392" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="394.635" x2="155.813" y2="389.251" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="399.494" x2="155.813" y2="394.11" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="404.352" x2="155.813" y2="398.969" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="409.211" x2="155.813" y2="403.827" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="414.07" x2="155.813" y2="408.686" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="418.929" x2="155.813" y2="413.545" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="423.788" x2="155.813" y2="418.404" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="428.646" x2="155.813" y2="423.263" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="433.505" x2="155.813" y2="428.121" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="438.364" x2="155.813" y2="432.98" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="443.223" x2="155.813" y2="437.839" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="448.081" x2="155.813" y2="442.698" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="452.94" x2="155.813" y2="447.556" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="457.799" x2="155.813" y2="452.415" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="462.658" x2="155.813" y2="457.274" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="467.517" x2="155.813" y2="462.133" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="472.375" x2="155.813" y2="466.992" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="477.234" x2="155.813" y2="471.85" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="482.093" x2="155.813" y2="476.709" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="486.952" x2="155.813" y2="481.568" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="491.81" x2="155.813" y2="486.427" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="496.669" x2="155.813" y2="491.285" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="501.528" x2="155.813" y2="496.144" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="150.429" y1="506.387" x2="155.813" y2="501.003" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="150.653" y="374.899" width="5.12133" height="131.45" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip3_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 380.151)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 385.01)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 389.869)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 394.728)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 399.586)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 404.445)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 409.304)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 414.163)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 419.021)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 423.88)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 428.739)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 433.598)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 438.457)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 443.315)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 448.174)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 453.033)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 457.892)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 462.75)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 467.609)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 472.468)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 477.327)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 482.186)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 487.044)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 491.903)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 496.762)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 501.621)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 100.77 506.479)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.12133" height="131.45" transform="matrix(-1 0 0 1 100.507 374.768)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip4_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 273.031)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 276.315)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 279.598)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 282.882)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 286.165)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 289.449)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 292.732)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 296.016)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 299.299)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 302.583)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 305.866)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.251" height="34.6566" transform="matrix(-1 0 0 1 111.139 267.647)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip5_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 123.377)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 126.661)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 129.944)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 133.228)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 136.511)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 139.795)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 143.079)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 146.362)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 149.646)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 152.929)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 111.337 156.212)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.251" height="34.6566" transform="matrix(-1 0 0 1 111.139 117.994)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip6_2434_21797)">
|
||||
<line x1="142.355" y1="272.938" x2="147.739" y2="267.555" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="276.222" x2="147.739" y2="270.838" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="279.505" x2="147.739" y2="274.121" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="282.789" x2="147.739" y2="277.405" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="286.072" x2="147.739" y2="280.688" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="289.356" x2="147.739" y2="283.972" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="292.64" x2="147.739" y2="287.256" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="295.923" x2="147.739" y2="290.539" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="299.206" x2="147.739" y2="293.823" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="302.49" x2="147.739" y2="297.106" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="305.773" x2="147.739" y2="300.389" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="142.514" y="267.779" width="5.251" height="34.6566" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip7_2434_21797)">
|
||||
<line x1="142.355" y1="123.285" x2="147.739" y2="117.901" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="126.568" x2="147.739" y2="121.184" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="129.852" x2="147.739" y2="124.468" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="133.135" x2="147.739" y2="127.751" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="136.418" x2="147.739" y2="131.035" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="139.702" x2="147.739" y2="134.318" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="142.986" x2="147.739" y2="137.602" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="146.269" x2="147.739" y2="140.885" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="149.553" x2="147.739" y2="144.169" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="152.836" x2="147.739" y2="147.452" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="142.355" y1="156.12" x2="147.739" y2="150.736" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="142.514" y="118.125" width="5.251" height="34.6566" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip8_2434_21797)">
|
||||
<line x1="161.521" y1="476.939" x2="166.905" y2="471.556" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="480.223" x2="166.905" y2="474.839" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="483.506" x2="166.905" y2="478.122" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="486.79" x2="166.905" y2="481.406" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="490.073" x2="166.905" y2="484.689" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="493.357" x2="166.905" y2="487.973" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="496.641" x2="166.905" y2="491.257" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="499.924" x2="166.905" y2="494.54" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="503.207" x2="166.905" y2="497.824" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="506.491" x2="166.905" y2="501.107" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="161.521" y1="509.774" x2="166.905" y2="504.39" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="161.68" y="471.78" width="5.251" height="34.6566" rx="2.6255" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip9_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 477.032)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 480.316)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 483.599)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 486.883)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 490.166)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 493.45)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 496.733)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 500.017)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 503.3)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 506.583)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 92.1709 509.867)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.251" height="34.6566" rx="2.6255" transform="matrix(-1 0 0 1 91.973 471.648)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip10_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 168.799)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 172.083)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 175.366)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 178.649)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 181.933)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 185.216)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 188.5)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 191.783)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 195.067)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 198.35)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 88.7576 201.634)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.251" height="34.6566" rx="2.6255" transform="matrix(-1 0 0 1 88.56 163.415)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip11_2434_21797)">
|
||||
<line x1="164.672" y1="168.706" x2="170.055" y2="163.322" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="171.99" x2="170.055" y2="166.606" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="175.273" x2="170.055" y2="169.889" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="178.557" x2="170.055" y2="173.173" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="181.84" x2="170.055" y2="176.456" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="185.123" x2="170.055" y2="179.74" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="188.407" x2="170.055" y2="183.023" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="191.69" x2="170.055" y2="186.307" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="194.974" x2="170.055" y2="189.59" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="198.257" x2="170.055" y2="192.873" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="164.672" y1="201.541" x2="170.055" y2="196.157" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="164.831" y="163.546" width="5.251" height="34.6566" rx="2.6255" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="170.082" y="168.009" width="6.8263" height="1.83785" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="170.082" y="175.886" width="6.8263" height="1.83785" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="170.082" y="183.762" width="6.8263" height="1.83785" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="170.082" y="191.639" width="6.8263" height="1.83785" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="76.8764" y="168.009" width="6.56375" height="1.83785" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="76.8764" y="175.886" width="6.56375" height="1.83785" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="76.8764" y="183.762" width="6.56375" height="1.83785" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="76.8764" y="191.639" width="6.56375" height="1.83785" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip12_2434_21797)">
|
||||
<rect width="5.251" height="32.0311" transform="matrix(0 -1 -1 0 141.595 497.116)" fill="#0B0C0E"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 136.211 497.183)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 131.352 497.183)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 126.494 497.183)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 121.635 497.183)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 116.776 497.183)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 111.917 497.183)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 107.059 497.183)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="-0.131275" width="4.98845" height="31.7686" transform="matrix(0 -1 -1 0 141.332 496.854)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip13_2434_21797)">
|
||||
<rect width="2.36714" height="28.7698" transform="matrix(0 -1 -1 0 141.323 502.489)" fill="#0B0C0E"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 135.939 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 133.706 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 131.473 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 129.24 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 127.006 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 124.773 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 122.54 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 120.306 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 118.073 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 115.84 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 113.607 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 111.374 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(0.707107 -0.707107 -0.707107 -0.707107 109.14 503.998)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="-0.131275" width="2.10459" height="28.5073" transform="matrix(0 -1 -1 0 141.061 502.227)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip14_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 380.151)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 385.01)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 389.869)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 394.728)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 399.586)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 404.445)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 409.304)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 414.163)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 419.021)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 423.88)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 428.739)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 433.598)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 438.457)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 443.315)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 448.174)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 453.033)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 457.892)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 462.75)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 467.609)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 472.468)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 477.327)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 482.186)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 487.044)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 491.903)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 496.762)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 501.621)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 103.133 506.479)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.12133" height="131.45" transform="matrix(-1 0 0 1 102.871 374.768)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="97.8805" y="374.899" width="2.75678" height="24.6797" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="153.016" y="374.899" width="2.75678" height="24.6797" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip15_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 235.749)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 240.608)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 245.467)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 250.326)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 255.184)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 260.043)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 264.902)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 269.761)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 274.62)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 279.478)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 284.337)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 289.196)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 294.055)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 298.913)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 303.772)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 308.631)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 313.49)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 318.349)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 323.207)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 328.066)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 332.925)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 337.784)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 342.642)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 347.501)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 352.36)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 357.219)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 171.396 362.077)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.12133" height="131.45" transform="matrix(-1 0 0 1 171.133 230.365)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip16_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 235.749)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 240.608)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 245.467)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 250.326)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 255.184)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 260.043)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 264.902)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 269.761)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 274.62)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 279.478)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 284.337)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 289.196)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 294.055)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 298.913)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 303.772)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 308.631)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 313.49)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 318.349)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 323.207)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 328.066)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 332.925)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 337.784)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 342.642)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 347.501)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 352.36)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 357.219)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 169.033 362.077)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.12133" height="131.45" transform="matrix(-1 0 0 1 168.771 230.365)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="166.143" y="230.497" width="2.75678" height="24.6797" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip17_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 86.0952)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 90.9541)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 95.8125)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 100.671)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 105.53)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 110.389)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 115.248)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 120.106)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 124.965)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 129.824)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 134.683)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 139.542)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 144.4)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 149.259)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 154.118)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 158.977)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 163.835)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 168.694)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 173.553)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 178.412)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 183.271)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 188.129)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 192.988)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 197.847)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 202.706)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 207.564)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 184.523 212.423)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.12133" height="131.45" transform="matrix(-1 0 0 1 184.261 80.7114)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip18_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 86.0952)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 90.9541)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 95.8125)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 100.671)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 105.53)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 110.389)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 115.248)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 120.106)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 124.965)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 129.824)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 134.683)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 139.542)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 144.4)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 149.259)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 154.118)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 158.977)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 163.835)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 168.694)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 173.553)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 178.412)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 183.271)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 188.129)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 192.988)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 197.847)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 202.706)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 207.564)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 182.161 212.423)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.12133" height="131.45" transform="matrix(-1 0 0 1 181.898 80.7114)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="179.271" y="80.8427" width="2.75678" height="24.6797" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip19_2434_21797)">
|
||||
<line x1="84.5288" y1="235.656" x2="89.9126" y2="230.272" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="240.515" x2="89.9126" y2="235.131" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="245.374" x2="89.9126" y2="239.99" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="250.233" x2="89.9126" y2="244.849" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="255.091" x2="89.9126" y2="249.707" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="259.95" x2="89.9126" y2="254.566" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="264.809" x2="89.9126" y2="259.425" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="269.668" x2="89.9126" y2="264.284" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="274.527" x2="89.9126" y2="269.143" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="279.385" x2="89.9126" y2="274.001" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="284.244" x2="89.9126" y2="278.86" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="289.103" x2="89.9126" y2="283.719" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="293.962" x2="89.9126" y2="288.578" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="298.82" x2="89.9126" y2="293.436" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="303.679" x2="89.9126" y2="298.295" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="308.538" x2="89.9126" y2="303.154" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="313.397" x2="89.9126" y2="308.013" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="318.256" x2="89.9126" y2="312.872" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="323.114" x2="89.9126" y2="317.73" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="327.973" x2="89.9126" y2="322.589" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="332.832" x2="89.9126" y2="327.448" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="337.691" x2="89.9126" y2="332.307" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="342.549" x2="89.9126" y2="337.165" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="347.408" x2="89.9126" y2="342.024" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="352.267" x2="89.9126" y2="346.883" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="357.126" x2="89.9126" y2="351.742" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="84.5288" y1="361.984" x2="89.9126" y2="356.6" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="84.7529" y="230.497" width="5.12133" height="131.45" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip20_2434_21797)">
|
||||
<line x1="82.166" y1="235.656" x2="87.5498" y2="230.272" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="240.515" x2="87.5498" y2="235.131" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="245.374" x2="87.5498" y2="239.99" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="250.233" x2="87.5498" y2="244.849" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="255.091" x2="87.5498" y2="249.707" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="259.95" x2="87.5498" y2="254.566" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="264.809" x2="87.5498" y2="259.425" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="269.668" x2="87.5498" y2="264.284" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="274.526" x2="87.5498" y2="269.142" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="279.385" x2="87.5498" y2="274.001" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="284.244" x2="87.5498" y2="278.86" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="289.103" x2="87.5498" y2="283.719" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="293.961" x2="87.5498" y2="288.577" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="298.82" x2="87.5498" y2="293.436" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="303.679" x2="87.5498" y2="298.295" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="308.538" x2="87.5498" y2="303.154" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="313.397" x2="87.5498" y2="308.013" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="318.256" x2="87.5498" y2="312.872" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="323.115" x2="87.5498" y2="317.731" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="327.973" x2="87.5498" y2="322.589" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="332.832" x2="87.5498" y2="327.448" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="337.69" x2="87.5498" y2="332.306" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="342.55" x2="87.5498" y2="337.166" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="347.409" x2="87.5498" y2="342.025" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="352.267" x2="87.5498" y2="346.883" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="357.126" x2="87.5498" y2="351.742" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="82.166" y1="361.985" x2="87.5498" y2="356.601" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="82.3901" y="230.497" width="5.12133" height="131.45" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip21_2434_21797)">
|
||||
<line x1="95.2934" y1="269.788" x2="100.677" y2="264.404" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="273.072" x2="100.677" y2="267.688" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="276.355" x2="100.677" y2="270.971" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="279.639" x2="100.677" y2="274.255" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="282.922" x2="100.677" y2="277.538" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="286.206" x2="100.677" y2="280.822" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="289.489" x2="100.677" y2="284.105" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="292.772" x2="100.677" y2="287.389" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="296.056" x2="100.677" y2="290.672" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="299.339" x2="100.677" y2="293.955" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="302.623" x2="100.677" y2="297.239" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="305.907" x2="100.677" y2="300.523" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="309.19" x2="100.677" y2="303.806" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="312.474" x2="100.677" y2="307.09" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="315.757" x2="100.677" y2="310.373" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="319.04" x2="100.677" y2="313.657" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="322.324" x2="100.677" y2="316.94" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="325.607" x2="100.677" y2="320.223" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="328.891" x2="100.677" y2="323.507" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="332.174" x2="100.677" y2="326.79" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="335.458" x2="100.677" y2="330.074" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="338.741" x2="100.677" y2="333.357" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="342.025" x2="100.677" y2="336.641" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="345.308" x2="100.677" y2="339.924" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="348.592" x2="100.677" y2="343.208" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="351.875" x2="100.677" y2="346.491" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="355.159" x2="100.677" y2="349.775" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="95.5175" y="264.628" width="5.12133" height="90.4917" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip22_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 269.881)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 273.165)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 276.448)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 279.731)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 283.015)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 286.298)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 289.582)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 292.865)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 296.149)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 299.432)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 302.716)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 306)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 309.283)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 312.566)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 315.85)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 319.133)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 322.417)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 325.7)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 328.983)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 332.267)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 335.551)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 338.834)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 342.118)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 345.401)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 348.685)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 351.968)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 355.251)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.12133" height="90.4917" transform="matrix(-1 0 0 1 158.006 264.497)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="84.7529" y="230.497" width="2.75678" height="24.6797" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip23_2434_21797)">
|
||||
<line x1="71.4013" y1="86.0024" x2="76.7852" y2="80.6185" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="90.8613" x2="76.7852" y2="85.4774" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="95.7197" x2="76.7852" y2="90.3358" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="100.579" x2="76.7852" y2="95.1947" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="105.437" x2="76.7852" y2="100.054" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="110.296" x2="76.7852" y2="104.912" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="115.155" x2="76.7852" y2="109.771" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="120.014" x2="76.7852" y2="114.63" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="124.873" x2="76.7852" y2="119.489" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="129.731" x2="76.7852" y2="124.348" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="134.59" x2="76.7852" y2="129.206" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="139.449" x2="76.7852" y2="134.065" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="144.308" x2="76.7852" y2="138.924" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="149.166" x2="76.7852" y2="143.783" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="154.025" x2="76.7852" y2="148.641" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="158.884" x2="76.7852" y2="153.5" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="163.743" x2="76.7852" y2="158.359" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="168.602" x2="76.7852" y2="163.218" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="173.46" x2="76.7852" y2="168.077" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="178.319" x2="76.7852" y2="172.935" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="183.178" x2="76.7852" y2="177.794" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="188.037" x2="76.7852" y2="182.653" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="192.895" x2="76.7852" y2="187.512" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="197.754" x2="76.7852" y2="192.37" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="202.613" x2="76.7852" y2="197.229" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="207.472" x2="76.7852" y2="202.088" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="71.4013" y1="212.331" x2="76.7852" y2="206.947" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="71.6254" y="80.8427" width="5.12133" height="131.45" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip24_2434_21797)">
|
||||
<line x1="69.0385" y1="86.0024" x2="74.4224" y2="80.6185" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="90.8613" x2="74.4224" y2="85.4774" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="95.7197" x2="74.4224" y2="90.3358" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="100.579" x2="74.4224" y2="95.1947" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="105.437" x2="74.4224" y2="100.054" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="110.296" x2="74.4224" y2="104.912" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="115.155" x2="74.4224" y2="109.771" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="120.014" x2="74.4224" y2="114.63" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="124.873" x2="74.4224" y2="119.489" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="129.731" x2="74.4224" y2="124.348" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="134.59" x2="74.4224" y2="129.206" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="139.449" x2="74.4224" y2="134.065" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="144.308" x2="74.4224" y2="138.924" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="149.166" x2="74.4224" y2="143.783" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="154.025" x2="74.4224" y2="148.641" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="158.884" x2="74.4224" y2="153.5" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="163.743" x2="74.4224" y2="158.359" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="168.602" x2="74.4224" y2="163.218" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="173.46" x2="74.4224" y2="168.077" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="178.319" x2="74.4224" y2="172.935" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="183.178" x2="74.4224" y2="177.794" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="188.037" x2="74.4224" y2="182.653" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="192.895" x2="74.4224" y2="187.512" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="197.754" x2="74.4224" y2="192.37" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="202.613" x2="74.4224" y2="197.229" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="207.472" x2="74.4224" y2="202.088" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="69.0385" y1="212.331" x2="74.4224" y2="206.947" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="69.2626" y="80.8427" width="5.12133" height="131.45" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="71.6254" y="80.8427" width="2.75678" height="24.6797" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip25_2434_21797)">
|
||||
<line x1="95.2934" y1="120.134" x2="100.677" y2="114.75" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="123.418" x2="100.677" y2="118.034" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="126.701" x2="100.677" y2="121.317" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="129.985" x2="100.677" y2="124.601" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="133.269" x2="100.677" y2="127.885" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="136.552" x2="100.677" y2="131.168" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="139.835" x2="100.677" y2="134.452" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="143.119" x2="100.677" y2="137.735" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="146.402" x2="100.677" y2="141.018" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="149.685" x2="100.677" y2="144.302" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="152.969" x2="100.677" y2="147.585" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="156.252" x2="100.677" y2="150.869" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="159.536" x2="100.677" y2="154.152" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="162.82" x2="100.677" y2="157.436" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="166.103" x2="100.677" y2="160.719" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="169.387" x2="100.677" y2="164.003" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="172.67" x2="100.677" y2="167.286" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="175.954" x2="100.677" y2="170.57" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="179.237" x2="100.677" y2="173.853" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="182.52" x2="100.677" y2="177.137" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="185.804" x2="100.677" y2="180.42" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="189.087" x2="100.677" y2="183.703" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="192.371" x2="100.677" y2="186.987" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="195.654" x2="100.677" y2="190.27" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="198.938" x2="100.677" y2="193.554" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="202.221" x2="100.677" y2="196.837" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="95.2934" y1="205.505" x2="100.677" y2="200.121" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="95.5175" y="114.975" width="5.12133" height="90.4917" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip26_2434_21797)">
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 120.227)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 123.511)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 126.794)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 130.078)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 133.361)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 136.645)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 139.928)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 143.211)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 146.495)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 149.778)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 153.062)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 156.345)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 159.629)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 162.913)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 166.196)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 169.479)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 172.763)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 176.046)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 179.33)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 182.613)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 185.896)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 189.18)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 192.464)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 195.747)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 199.031)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 202.314)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="7.61395" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 158.269 205.598)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<rect x="-0.131275" y="0.131275" width="5.12133" height="90.4917" transform="matrix(-1 0 0 1 158.006 114.843)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="95.5175" y="264.628" width="2.6255" height="62.6156" transform="rotate(-90 95.5175 264.628)" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="95.5175" y="114.974" width="2.6255" height="62.6156" transform="rotate(-90 95.5175 114.974)" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M102.213 269.223V269.091H102.081H100.768V264.628H111.27V269.091H109.958H109.826V269.223V270.667H107.07V269.223V269.091H106.938H104.313H104.182V269.223V270.667H102.213V269.223Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M102.213 119.569V119.437H102.081H100.768V114.974H111.27V119.437H109.958H109.826V119.569V121.013H107.07V119.569V119.437H106.938H104.313H104.182V119.569V121.013H102.213V119.569Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M105.232 332.103H105.101V331.972V330.659H100.637V341.161H105.101V339.848V339.717H105.232H106.676V336.96H105.232H105.101V336.829V334.204V334.072H105.232H106.676V332.103H105.232Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M105.232 182.45H105.101V182.319V181.006H100.637V191.508H105.101V190.195V190.064H105.232H106.676V187.307H105.232H105.101V187.176V184.55V184.419H105.232H106.676V182.45H105.232Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M78.3205 52.8812V52.75H78.4517H79.7645V48.2866H69.2625V52.75H70.5752H70.7065V52.8812V54.3253H73.4633V52.8812V52.75H73.5946H76.2201H76.3513V52.8812V54.3253H78.3205V52.8812Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M175.464 52.8812V52.75H175.333H174.02V48.2866H184.522V52.75H183.209H183.078V52.8812V54.3253H180.321V52.8812V52.75H180.19H177.564H177.433V52.8812V54.3253H175.464V52.8812Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M183.078 52.8812V52.75H183.209H184.522V48.2866H174.02V52.75H175.333H175.464V52.8812V54.3253H178.221V52.8812V52.75H178.352H180.978H181.109V52.8812V54.3253H183.078V52.8812Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M70.7066 52.8812V52.75H70.5754H69.2626V48.2866H79.7646V52.75H78.4519H78.3206V52.8812V54.3253H75.5638V52.8812V52.75H75.4325H72.807H72.6758V52.8812V54.3253H70.7066V52.8812Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M148.421 332.103H148.553V331.972V330.659H153.016V341.161H148.553V339.848V339.717H148.421H146.977V336.96H148.421H148.553V336.829V334.204V334.072H148.421H146.977V332.103H148.421Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M148.421 182.45H148.553V182.319V181.006H153.016V191.508H148.553V190.195V190.064H148.421H146.977V187.307H148.421H148.553V187.176V184.55V184.419H148.421H146.977V182.45H148.421Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M151.572 269.223V269.091H151.703H153.016V264.628H142.514V269.091H143.827H143.958V269.223V270.667H146.715V269.223V269.091H146.846H149.472H149.603V269.223V270.667H151.572V269.223Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M151.572 119.569V119.437H151.703H153.016V114.974H142.514V119.437H143.827H143.958V119.569V121.013H146.715V119.569V119.437H146.846H149.472H149.603V119.569V121.013H151.572V119.569Z" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="102.475" y="497.116" width="48.5718" height="3.1506" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="102.475" y="502.367" width="48.5718" height="1.83785" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="102.475" y="302.435" width="48.5718" height="1.83785" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="102.475" y="152.782" width="48.5718" height="1.83785" fill="#0B0C0E" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="104.707" y1="444.081" x2="104.707" y2="455.108" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M150.233 459.177C135.481 466.665 118.041 466.665 103.289 459.177C118.041 451.689 135.481 451.689 150.233 459.177Z" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<mask id="path-636-inside-1_2434_21797" fill="white">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M150.784 444.081H102.869V456.155C117.956 448.615 135.729 448.66 150.784 456.289V444.081ZM150.784 456.289C150.698 456.333 150.611 456.377 150.524 456.42H150.784V456.289Z"/>
|
||||
</mask>
|
||||
<path d="M102.869 444.081V443.818H102.606V444.081H102.869ZM150.784 444.081H151.047V443.818H150.784V444.081ZM102.869 456.155H102.606V456.58L102.986 456.39L102.869 456.155ZM150.784 456.289L150.666 456.523L151.047 456.717V456.289H150.784ZM150.784 456.289H151.047V455.862L150.666 456.055L150.784 456.289ZM150.524 456.42L150.406 456.186L150.524 456.683V456.42ZM150.784 456.42V456.683H151.047V456.42H150.784ZM102.869 444.343H150.784V443.818H102.869V444.343ZM103.131 456.155V444.081H102.606V456.155H103.131ZM102.986 456.39C117.999 448.887 135.685 448.931 150.666 456.523L150.903 456.055C135.774 448.388 117.913 448.343 102.752 455.92L102.986 456.39ZM150.522 444.081V456.289H151.047V444.081H150.522ZM150.666 456.055C150.579 456.099 150.493 456.142 150.406 456.186L150.641 456.655C150.729 456.612 150.816 456.568 150.903 456.523L150.666 456.055ZM150.784 456.158H150.524V456.683H150.784V456.158ZM150.522 456.289V456.42H151.047V456.289H150.522Z" fill="#62687C" mask="url(#path-636-inside-1_2434_21797)"/>
|
||||
<path d="M126.761 456.104C128.18 457.906 128.18 460.449 126.761 462.251C125.342 460.449 125.342 457.906 126.761 456.104Z" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="126.104" y1="459.177" x2="127.417" y2="459.177" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="126.367" y1="458.39" x2="127.155" y2="458.39" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="126.367" y1="459.965" x2="127.155" y2="459.965" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="126.63" y1="460.753" x2="126.892" y2="460.753" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="126.63" y1="457.602" x2="126.892" y2="457.602" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M132.8 456.104C134.218 457.906 134.218 460.449 132.8 462.251C131.381 460.449 131.381 457.906 132.8 456.104Z" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="132.143" y1="459.177" x2="133.456" y2="459.177" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="132.406" y1="458.39" x2="133.193" y2="458.39" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="132.406" y1="459.965" x2="133.193" y2="459.965" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="132.668" y1="460.753" x2="132.931" y2="460.753" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="132.668" y1="457.602" x2="132.931" y2="457.602" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M138.838 456.104C140.257 457.906 140.257 460.449 138.838 462.251C137.419 460.449 137.419 457.906 138.838 456.104Z" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="138.182" y1="459.177" x2="139.495" y2="459.177" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="138.444" y1="458.39" x2="139.232" y2="458.39" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="138.444" y1="459.965" x2="139.232" y2="459.965" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="138.707" y1="460.753" x2="138.97" y2="460.753" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="138.707" y1="457.602" x2="138.97" y2="457.602" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M120.722 456.104C122.141 457.906 122.141 460.449 120.722 462.251C119.303 460.449 119.303 457.906 120.722 456.104Z" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="120.066" y1="459.177" x2="121.379" y2="459.177" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="120.329" y1="458.39" x2="121.116" y2="458.39" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="120.329" y1="459.965" x2="121.116" y2="459.965" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="120.591" y1="460.753" x2="120.854" y2="460.753" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="120.591" y1="457.602" x2="120.854" y2="457.602" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M114.684 456.104C116.103 457.906 116.103 460.449 114.684 462.251C113.265 460.449 113.265 457.906 114.684 456.104Z" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="114.027" y1="459.177" x2="115.34" y2="459.177" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="114.29" y1="458.39" x2="115.077" y2="458.39" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="114.29" y1="459.965" x2="115.077" y2="459.965" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="114.552" y1="460.753" x2="114.815" y2="460.753" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="114.552" y1="457.602" x2="114.815" y2="457.602" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M149.209 444.081V455.371" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M157.414 250.109C138.095 259.915 115.255 259.915 95.9363 250.109C115.255 240.303 138.095 240.303 157.414 250.109Z" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<mask id="path-670-inside-2_2434_21797" fill="white">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M158.136 230.339H95.3862V246.152C115.144 236.277 138.42 236.336 158.136 246.327C158.022 246.385 157.908 246.442 157.794 246.499H158.136V230.339Z"/>
|
||||
</mask>
|
||||
<path d="M95.3862 230.339V229.995H95.0424V230.339H95.3862ZM158.136 230.339H158.48V229.995H158.136V230.339ZM95.3862 246.152H95.0424V246.708L95.5399 246.459L95.3862 246.152ZM158.136 246.327L158.291 246.634L158.896 246.327L158.291 246.02L158.136 246.327ZM157.794 246.499L157.641 246.191L157.794 246.843V246.499ZM158.136 246.499V246.843H158.48V246.499H158.136ZM95.3862 230.683H158.136V229.995H95.3862V230.683ZM95.7301 246.152V230.339H95.0424V246.152H95.7301ZM95.5399 246.459C115.2 236.633 138.361 236.692 157.98 246.634L158.291 246.02C138.478 235.98 115.087 235.921 95.2325 245.844L95.5399 246.459ZM157.98 246.02C157.867 246.078 157.754 246.135 157.641 246.191L157.948 246.807C158.062 246.749 158.177 246.692 158.291 246.634L157.98 246.02ZM158.136 246.155H157.794V246.843H158.136V246.155ZM157.792 230.339V246.499H158.48V230.339H157.792Z" fill="#62687C" mask="url(#path-670-inside-2_2434_21797)"/>
|
||||
<path d="M126.675 246.084C128.533 248.444 128.533 251.775 126.675 254.135C124.817 251.775 124.817 248.444 126.675 246.084Z" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="125.815" y1="250.11" x2="127.535" y2="250.11" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="126.159" y1="249.079" x2="127.191" y2="249.079" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="126.159" y1="251.142" x2="127.191" y2="251.142" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="126.503" y1="252.172" x2="126.847" y2="252.172" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="126.503" y1="248.047" x2="126.847" y2="248.047" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<path d="M134.583 246.084C136.441 248.444 136.441 251.775 134.583 254.135C132.725 251.775 132.725 248.444 134.583 246.084Z" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="133.723" y1="250.11" x2="135.443" y2="250.11" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="134.067" y1="249.079" x2="135.099" y2="249.079" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="134.067" y1="251.142" x2="135.099" y2="251.142" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="134.411" y1="252.172" x2="134.755" y2="252.172" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="134.411" y1="248.047" x2="134.755" y2="248.047" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<path d="M142.491 246.084C144.35 248.444 144.35 251.775 142.491 254.135C140.633 251.775 140.633 248.444 142.491 246.084Z" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="141.632" y1="250.11" x2="143.351" y2="250.11" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="141.976" y1="249.079" x2="143.007" y2="249.079" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="141.976" y1="251.142" x2="143.007" y2="251.142" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="142.319" y1="252.172" x2="142.663" y2="252.172" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="142.319" y1="248.047" x2="142.663" y2="248.047" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<path d="M118.767 246.084C120.625 248.444 120.625 251.775 118.767 254.135C116.909 251.775 116.909 248.444 118.767 246.084Z" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="117.907" y1="250.11" x2="119.627" y2="250.11" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="118.251" y1="249.079" x2="119.283" y2="249.079" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="118.251" y1="251.142" x2="119.283" y2="251.142" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="118.595" y1="252.172" x2="118.939" y2="252.172" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="118.595" y1="248.047" x2="118.939" y2="248.047" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<path d="M110.859 246.084C112.717 248.444 112.717 251.775 110.859 254.135C109.001 251.775 109.001 248.444 110.859 246.084Z" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="109.999" y1="250.11" x2="111.718" y2="250.11" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="110.343" y1="249.079" x2="111.374" y2="249.079" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="110.343" y1="251.142" x2="111.374" y2="251.142" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="110.687" y1="252.172" x2="111.031" y2="252.172" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<line x1="110.687" y1="248.047" x2="111.031" y2="248.047" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<path d="M156.073 230.339V245.124" stroke="#62687C" stroke-width="0.343833"/>
|
||||
<path d="M170.519 90.7001C143.583 104.373 111.736 104.373 84.799 90.7001C111.736 77.0273 143.583 77.0273 170.519 90.7001Z" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<mask id="path-704-inside-3_2434_21797" fill="white">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M171.526 63.1328H84.0322V85.1812C111.581 71.4127 144.035 71.4943 171.526 85.4258C171.367 85.5061 171.209 85.586 171.05 85.6654H171.526V63.1328Z"/>
|
||||
</mask>
|
||||
<path d="M84.0322 63.1328V62.8703H83.7697V63.1328H84.0322ZM171.526 63.1328H171.788V62.8703H171.526V63.1328ZM84.0322 85.1812H83.7697V85.6059L84.1496 85.416L84.0322 85.1812ZM171.526 85.4258L171.644 85.66L172.107 85.4258L171.644 85.1916L171.526 85.4258ZM171.05 85.6654L170.932 85.4306L171.05 85.928V85.6654ZM171.526 85.6654V85.928H171.788V85.6654H171.526ZM84.0322 63.3954H171.526V62.8703H84.0322V63.3954ZM84.2948 85.1812V63.1328H83.7697V85.1812H84.2948ZM84.1496 85.416C111.624 71.6848 143.991 71.7661 171.407 85.66L171.644 85.1916C144.08 71.2225 111.538 71.1407 83.9149 84.9463L84.1496 85.416ZM171.407 85.1916C171.249 85.2717 171.091 85.3514 170.932 85.4306L171.167 85.9002C171.326 85.8206 171.486 85.7406 171.644 85.66L171.407 85.1916ZM171.526 85.4029H171.05V85.928H171.526V85.4029ZM171.263 63.1328V85.6654H171.788V63.1328H171.263Z" fill="#62687C" mask="url(#path-704-inside-3_2434_21797)"/>
|
||||
<path d="M127.659 85.0873C130.25 88.3781 130.25 93.0222 127.659 96.313C125.068 93.0222 125.068 88.3781 127.659 85.0873Z" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="126.461" y1="90.6997" x2="128.858" y2="90.6997" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="126.94" y1="89.2622" x2="128.378" y2="89.2622" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="126.94" y1="92.1387" x2="128.378" y2="92.1387" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="127.419" y1="93.5767" x2="127.899" y2="93.5767" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="127.419" y1="87.8238" x2="127.899" y2="87.8238" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<path d="M138.686 85.0873C141.277 88.3781 141.277 93.0222 138.686 96.313C136.095 93.0222 136.095 88.3781 138.686 85.0873Z" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="137.487" y1="90.6997" x2="139.884" y2="90.6997" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="137.967" y1="89.2622" x2="139.405" y2="89.2622" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="137.967" y1="92.1387" x2="139.405" y2="92.1387" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="138.446" y1="93.5767" x2="138.925" y2="93.5767" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="138.446" y1="87.8238" x2="138.925" y2="87.8238" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<path d="M149.712 85.0873C152.303 88.3781 152.303 93.0222 149.712 96.313C147.121 93.0222 147.121 88.3781 149.712 85.0873Z" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="148.514" y1="90.6997" x2="150.911" y2="90.6997" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="148.993" y1="89.2622" x2="150.431" y2="89.2622" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="148.993" y1="92.1387" x2="150.431" y2="92.1387" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="149.473" y1="93.5767" x2="149.952" y2="93.5767" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="149.473" y1="87.8238" x2="149.952" y2="87.8238" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<path d="M116.633 85.0873C119.224 88.3781 119.224 93.0222 116.633 96.313C114.042 93.0222 114.042 88.3781 116.633 85.0873Z" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="115.434" y1="90.6997" x2="117.831" y2="90.6997" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="115.914" y1="89.2622" x2="117.352" y2="89.2622" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="115.914" y1="92.1387" x2="117.352" y2="92.1387" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="116.393" y1="93.5767" x2="116.872" y2="93.5767" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="116.393" y1="87.8238" x2="116.872" y2="87.8238" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<path d="M105.606 85.0873C108.197 88.3781 108.197 93.0222 105.606 96.313C103.015 93.0222 103.015 88.3781 105.606 85.0873Z" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="104.407" y1="90.6997" x2="106.805" y2="90.6997" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="104.887" y1="89.2622" x2="106.325" y2="89.2622" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="104.887" y1="92.1387" x2="106.325" y2="92.1387" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="105.366" y1="93.5767" x2="105.846" y2="93.5767" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<line x1="105.366" y1="87.8238" x2="105.846" y2="87.8238" stroke="#62687C" stroke-width="0.479417"/>
|
||||
<path d="M168.649 63.1338V83.7487" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="86.5907" y="65.6152" width="4.94927" height="9.71435" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="89.5688" y="69.04" width="4.94927" height="2.86454" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M103 374.899H106.1C106.494 374.899 106.884 374.973 107.25 375.119V375.119C108.149 375.477 109.164 375.396 109.994 374.9L110.581 374.55C111.851 373.792 113.431 373.775 114.718 374.506V374.506C115.174 374.765 115.676 374.935 116.196 375.005L119.694 375.48C120.704 375.617 121.728 375.606 122.735 375.448L124.224 375.214C125.55 375.006 126.904 375.065 128.207 375.389V375.389C129 375.586 129.814 375.686 130.632 375.686H132.837C134.12 375.686 135.369 375.272 136.397 374.505V374.505C137.426 373.738 138.675 373.323 139.958 373.323H141.458C142.541 373.323 143.594 373.685 144.449 374.35V374.35C145.541 375.2 146.944 375.545 148.306 375.299L150.522 374.899" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M89.8728 361.64H94.6521C95.293 361.64 95.9221 361.813 96.4727 362.141V362.141C97.8079 362.937 99.5049 362.773 100.664 361.738L101.622 360.881C103.493 359.21 106.31 359.176 108.22 360.801V360.801C108.866 361.351 109.642 361.729 110.474 361.898L116 363.02C117.485 363.322 119.019 363.298 120.494 362.951L122.978 362.367C124.994 361.893 127.105 362.026 129.046 362.748L129.233 362.818C130.405 363.254 131.646 363.478 132.897 363.478H135.738C138.092 363.478 140.335 362.475 141.906 360.721V360.721C143.476 358.967 145.719 357.964 148.074 357.964H149.334C151.277 357.964 153.123 358.813 154.388 360.288V360.288C156.06 362.237 158.704 363.05 161.183 362.379L163.912 361.64" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<path d="M76.7451 211.987H83.2746C84.1129 211.987 84.942 212.161 85.7094 212.498V212.498C87.5892 213.325 89.7601 213.142 91.4743 212.011L92.7286 211.183C95.3802 209.434 98.8094 209.396 101.499 211.086V211.086C102.445 211.68 103.503 212.072 104.608 212.238L113.511 213.573C114.624 213.74 115.756 213.726 116.865 213.534L123.463 212.389C124.987 212.124 126.551 212.199 128.043 212.609L131.098 213.449C132.005 213.698 132.941 213.825 133.881 213.825H140.115C142.553 213.825 144.915 212.976 146.796 211.425L147.663 210.711C149.544 209.159 151.906 208.311 154.344 208.311H157.787C160.142 208.311 162.42 209.156 164.206 210.693V210.693C166.503 212.669 169.583 213.477 172.554 212.883L177.039 211.987" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="-0.131275" y="0.131275" width="8.9267" height="17.3283" transform="matrix(-1 0 0 1 176.777 117.993)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="-0.131275" y="0.131275" width="8.9267" height="5.251" transform="matrix(-1 0 0 1 171.526 124.032)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="160.63" y="118.124" width="8.9267" height="17.3283" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="165.881" y="124.163" width="8.9267" height="5.251" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="-0.131275" y="0.131275" width="8.9267" height="17.3283" transform="matrix(-1 0 0 1 92.892 117.993)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="-0.131275" y="0.131275" width="8.9267" height="5.251" transform="matrix(-1 0 0 1 87.641 124.032)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="76.7453" y="118.124" width="8.9267" height="17.3283" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="81.9963" y="124.163" width="8.9267" height="5.251" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<rect x="62.1738" y="34.1088" width="127.074" height="14.1777" fill="#121317" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<g clip-path="url(#clip27_2434_21797)">
|
||||
<line x1="164.607" y1="48.3247" x2="178.784" y2="34.1474" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="170.382" y1="48.3247" x2="184.56" y2="34.1474" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="176.158" y1="48.3247" x2="190.335" y2="34.1474" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="181.934" y1="48.3247" x2="196.111" y2="34.1474" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line x1="187.709" y1="48.3247" x2="201.887" y2="34.1474" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip28_2434_21797)">
|
||||
<line y1="-0.131275" x2="20.0497" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 86.7222 48.4175)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="20.0497" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 80.9465 48.4175)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="20.0497" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 75.1707 48.4175)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="20.0497" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 69.395 48.4175)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
<line y1="-0.131275" x2="20.0497" y2="-0.131275" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 63.6194 48.4175)" stroke="#62687C" stroke-width="0.26255"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_2434_21797">
|
||||
<rect width="340" height="536" fill="white" transform="translate(-151)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip1_2434_21797">
|
||||
<rect x="152.885" y="374.768" width="5.38388" height="131.712" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip2_2434_21797">
|
||||
<rect x="150.522" y="374.768" width="5.38388" height="131.712" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip3_2434_21797">
|
||||
<rect width="5.38388" height="131.712" transform="matrix(-1 0 0 1 100.77 374.768)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip4_2434_21797">
|
||||
<rect width="5.51355" height="34.9192" transform="matrix(-1 0 0 1 111.402 267.647)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip5_2434_21797">
|
||||
<rect width="5.51355" height="34.9192" transform="matrix(-1 0 0 1 111.402 117.994)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip6_2434_21797">
|
||||
<rect x="142.383" y="267.647" width="5.51355" height="34.9192" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip7_2434_21797">
|
||||
<rect x="142.383" y="117.994" width="5.51355" height="34.9192" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip8_2434_21797">
|
||||
<rect x="161.549" y="471.648" width="5.51355" height="34.9192" rx="2.75678" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip9_2434_21797">
|
||||
<rect width="5.51355" height="34.9192" rx="2.75678" transform="matrix(-1 0 0 1 92.2356 471.648)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip10_2434_21797">
|
||||
<rect width="5.51355" height="34.9192" rx="2.75678" transform="matrix(-1 0 0 1 88.8225 163.415)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip11_2434_21797">
|
||||
<rect x="164.699" y="163.415" width="5.51355" height="34.9192" rx="2.75678" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip12_2434_21797">
|
||||
<rect width="5.251" height="32.0311" transform="matrix(0 -1 -1 0 141.595 497.116)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip13_2434_21797">
|
||||
<rect width="2.36714" height="28.7698" transform="matrix(0 -1 -1 0 141.323 502.489)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip14_2434_21797">
|
||||
<rect width="5.38388" height="131.712" transform="matrix(-1 0 0 1 103.133 374.768)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip15_2434_21797">
|
||||
<rect width="5.38388" height="131.712" transform="matrix(-1 0 0 1 171.396 230.365)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip16_2434_21797">
|
||||
<rect width="5.38388" height="131.712" transform="matrix(-1 0 0 1 169.033 230.365)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip17_2434_21797">
|
||||
<rect width="5.38388" height="131.712" transform="matrix(-1 0 0 1 184.523 80.7114)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip18_2434_21797">
|
||||
<rect width="5.38388" height="131.712" transform="matrix(-1 0 0 1 182.161 80.7114)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip19_2434_21797">
|
||||
<rect x="84.6216" y="230.365" width="5.38388" height="131.712" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip20_2434_21797">
|
||||
<rect x="82.2588" y="230.365" width="5.38388" height="131.712" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip21_2434_21797">
|
||||
<rect x="95.3862" y="264.497" width="5.38388" height="90.7543" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip22_2434_21797">
|
||||
<rect width="5.38388" height="90.7543" transform="matrix(-1 0 0 1 158.269 264.497)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip23_2434_21797">
|
||||
<rect x="71.4941" y="80.7114" width="5.38388" height="131.712" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip24_2434_21797">
|
||||
<rect x="69.1313" y="80.7114" width="5.38388" height="131.712" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip25_2434_21797">
|
||||
<rect x="95.3862" y="114.843" width="5.38388" height="90.7543" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip26_2434_21797">
|
||||
<rect width="5.38388" height="90.7543" transform="matrix(-1 0 0 1 158.269 114.843)" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip27_2434_21797">
|
||||
<rect width="24.6797" height="14.7028" fill="white" transform="translate(164.699 33.9775)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip28_2434_21797">
|
||||
<rect width="24.6797" height="14.7028" fill="white" transform="matrix(-1 0 0 1 86.7222 33.9775)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 105 KiB |
458
frontend/public/Images/dotted-divider.svg
Normal file
@@ -0,0 +1,458 @@
|
||||
<svg
|
||||
width="1348"
|
||||
height="8"
|
||||
viewBox="0 0 1348 8"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<rect width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="12" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="18" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="24" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="30" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="36" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="42" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="48" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="54" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="60" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="66" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="72" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="78" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="84" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="90" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="96" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="102" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="108" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="114" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="120" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="126" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="132" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="138" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="144" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="150" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="156" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="162" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="168" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="174" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="180" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="186" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="192" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="198" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="204" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="210" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="216" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="222" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="228" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="234" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="240" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="246" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="252" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="258" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="264" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="270" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="276" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="282" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="288" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="294" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="300" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="306" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="312" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="318" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="324" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="330" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="336" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="342" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="348" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="354" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="360" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="366" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="372" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="378" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="384" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="390" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="396" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="402" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="408" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="414" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="420" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="426" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="432" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="438" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="444" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="450" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="456" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="462" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="468" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="474" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="480" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="486" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="492" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="498" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="504" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="510" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="516" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="522" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="528" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="534" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="540" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="546" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="552" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="558" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="564" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="570" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="576" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="582" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="588" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="594" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="600" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="606" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="612" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="618" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="624" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="630" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="636" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="642" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="648" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="654" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="660" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="666" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="672" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="678" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="684" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="690" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="696" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="702" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="708" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="714" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="720" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="726" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="732" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="738" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="744" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="750" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="756" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="762" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="768" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="774" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="780" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="786" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="792" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="798" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="804" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="810" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="816" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="822" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="828" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="834" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="840" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="846" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="852" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="858" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="864" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="870" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="876" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="882" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="888" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="894" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="900" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="906" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="912" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="918" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="924" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="930" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="936" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="942" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="948" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="954" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="960" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="966" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="972" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="978" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="984" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="990" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="996" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1002" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1008" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1014" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1020" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1026" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1032" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1038" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1044" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1050" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1056" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1062" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1068" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1074" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1080" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1086" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1092" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1098" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1104" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1110" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1116" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1122" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1128" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1134" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1140" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1146" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1152" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1158" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1164" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1170" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1176" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1182" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1188" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1194" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1200" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1206" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1212" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1218" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1224" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1230" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1236" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1242" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1248" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1254" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1260" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1266" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1272" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1278" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1284" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1290" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1296" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1302" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1308" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1314" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1320" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1326" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1332" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1338" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1344" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="6" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="12" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="18" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="24" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="30" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="36" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="42" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="48" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="54" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="60" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="66" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="72" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="78" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="84" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="90" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="96" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="102" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="108" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="114" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="120" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="126" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="132" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="138" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="144" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="150" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="156" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="162" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="168" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="174" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="180" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="186" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="192" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="198" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="204" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="210" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="216" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="222" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="228" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="234" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="240" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="246" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="252" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="258" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="264" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="270" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="276" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="282" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="288" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="294" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="300" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="306" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="312" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="318" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="324" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="330" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="336" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="342" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="348" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="354" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="360" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="366" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="372" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="378" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="384" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="390" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="396" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="402" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="408" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="414" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="420" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="426" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="432" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="438" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="444" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="450" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="456" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="462" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="468" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="474" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="480" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="486" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="492" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="498" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="504" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="510" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="516" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="522" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="528" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="534" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="540" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="546" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="552" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="558" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="564" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="570" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="576" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="582" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="588" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="594" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="600" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="606" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="612" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="618" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="624" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="630" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="636" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="642" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="648" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="654" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="660" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="666" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="672" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="678" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="684" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="690" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="696" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="702" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="708" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="714" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="720" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="726" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="732" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="738" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="744" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="750" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="756" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="762" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="768" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="774" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="780" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="786" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="792" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="798" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="804" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="810" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="816" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="822" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="828" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="834" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="840" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="846" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="852" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="858" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="864" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="870" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="876" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="882" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="888" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="894" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="900" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="906" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="912" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="918" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="924" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="930" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="936" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="942" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="948" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="954" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="960" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="966" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="972" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="978" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="984" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="990" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="996" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1002" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1008" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1014" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1020" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1026" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1032" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1038" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1044" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1050" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1056" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1062" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1068" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1074" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1080" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1086" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1092" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1098" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1104" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1110" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1116" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1122" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1128" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1134" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1140" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1146" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1152" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1158" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1164" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1170" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1176" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1182" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1188" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1194" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1200" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1206" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1212" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1218" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1224" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1230" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1236" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1242" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1248" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1254" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1260" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1266" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1272" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1278" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1284" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1290" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1296" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1302" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1308" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1314" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1320" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1326" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1332" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1338" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
<rect x="1344" y="6" width="2" height="2" rx="1" fill="#242834" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 31 KiB |
1002
frontend/public/Images/perilianBackground.svg
Normal file
|
After Width: | Height: | Size: 95 KiB |
@@ -5,6 +5,7 @@
|
||||
"SERVICE_METRICS": "SigNoz | Service Metrics",
|
||||
"SERVICE_MAP": "SigNoz | Service Map",
|
||||
"TRACE": "SigNoz | Trace",
|
||||
"HOME": "SigNoz | Home",
|
||||
"TRACE_DETAIL": "SigNoz | Trace Detail",
|
||||
"TRACES_EXPLORER": "SigNoz | Traces Explorer",
|
||||
"SETTINGS": "SigNoz | Settings",
|
||||
@@ -39,6 +40,7 @@
|
||||
"LIST_LICENSES": "SigNoz | List of Licenses",
|
||||
"WORKSPACE_LOCKED": "SigNoz | Workspace Locked",
|
||||
"WORKSPACE_SUSPENDED": "SigNoz | Workspace Suspended",
|
||||
"WORKSPACE_ACCESS_RESTRICTED": "SigNoz | Workspace Access Restricted",
|
||||
"SUPPORT": "SigNoz | Support",
|
||||
"DEFAULT": "Open source Observability Platform | SigNoz",
|
||||
"ALERT_HISTORY": "SigNoz | Alert Rule History",
|
||||
|
||||