This commit is contained in:
Your Name
2025-05-25 18:12:09 +08:00
commit b3e1645bf2
70 changed files with 6109 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
bin/

37
Makefile Normal file
View File

@@ -0,0 +1,37 @@
# Variables
BINARY_NAME=jetbra-free
BIN_DIR=./bin
EMBED_FILE=internal/util/bindata.go
GO_BINDATA=go-bindata
SRC_DIRS=static/... templates/...
all: build
build: bindata-access
go build -o ./bin/$(BINARY_NAME) cmd/main.go
run: build
./bin/$(BINARY_NAME)
build-all: build-mac build-mac-arm build-windows build-linux
build-mac: bindata-access
GOOS=darwin GOARCH=amd64 go build -o $(BIN_DIR)/$(BINARY_NAME)-darwin-amd64 cmd/main.go
build-mac-arm: bindata-access
GOOS=darwin GOARCH=arm64 go build -o $(BIN_DIR)/$(BINARY_NAME)-darwin-arm64 cmd/main.go
build-windows: bindata-access
GOOS=windows GOARCH=amd64 go build -o $(BIN_DIR)/$(BINARY_NAME)-windows-amd64.exe cmd/main.go
build-linux: bindata-access
GOOS=linux GOARCH=amd64 go build -o $(BIN_DIR)/$(BINARY_NAME)-linux-amd64 cmd/main.go
clean:
rm -rf ./bin/
install-bindata:
go install github.com/go-bindata/go-bindata/v3/go-bindata@latest
bindata-access:
go-bindata -o internal/util/access.go -pkg util $(SRC_DIRS)

45
README.md Normal file
View File

@@ -0,0 +1,45 @@
<img src="image.gif">
## introduce
Only once click, automatically activated
## dev
install go-bindata
```bash
go install github.com/go-bindata/go-bindata/v3/go-bindata@latest
export PATH=$PATH:$(go env GOPATH)/bin
go-bindata --version
go-bindata -o internal/util/access.go -pkg util static/... templates/...
go run cmd/main.go
```
## run it !
mac linux windows
```
make run
```
## make it !
mac or linux
```bash
make run
make build-all
make clean
```
windows use powershell run:
```powershell
.\build.ps1
```
## Stargazers over time
[![Stargazers over time](https://starchart.cc/saxpjexck/lsix.svg?variant=adaptive)](https://starchart.cc/saxpjexck/lsix)

30
build.ps1 Normal file
View File

@@ -0,0 +1,30 @@
$ErrorActionPreference = "Stop"
# macOS arm64
$env:GOOS = "darwin"
$env:GOARCH = "arm64"
go build -o ./bin/jetbra-free-darwin-arm64 cmd/main.go
# macOS amd64
$env:GOARCH = "amd64"
go build -o ./bin/jetbra-free-darwin-amd64 cmd/main.go
# Windows amd64
$env:GOOS = "windows"
$env:GOARCH = "amd64"
go build -o ./bin/jetbra-free-windows-amd64.exe cmd/main.go
# Windows arm64
$env:GOOS = "windows"
$env:GOARCH = "arm64"
go build -o ./bin/jetbra-free-windows-arm64.exe cmd/main.go
# Linux amd64
$env:GOOS = "linux"
$env:GOARCH = "amd64"
go build -o ./bin/jetbra-free-linux-amd64 cmd/main.go
# Linux arm64
$env:GOOS = "linux"
$env:GOARCH = "arm64"
go build -o ./bin/jetbra-free-linux-arm64 cmd/main.go

98
cmd/main.go Normal file
View File

@@ -0,0 +1,98 @@
package main
import (
"fmt"
"log"
"net/http"
"os"
"os/exec"
"path/filepath"
"runtime"
"time"
"jetbra-free/internal/certificate"
"jetbra-free/internal/core"
"jetbra-free/internal/util"
"github.com/gin-gonic/gin"
)
func cors() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method
origin := c.Request.Header.Get("Origin")
if origin != "" {
c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
c.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type")
c.Header("Access-Control-Allow-Credentials", "true")
}
if method == "OPTIONS" {
c.AbortWithStatus(http.StatusNoContent)
}
c.Next()
}
}
func init() {
binDir, _ := os.Executable()
binDir = filepath.Dir(binDir)
err := util.ExtractAssets(binDir)
if err != nil {
panic(fmt.Sprintf("Failed to extract assets: %v", err))
}
core.PluginsInit()
certificate.Run()
core.LicenseInit()
}
func main() {
fmt.Println(" _ _ _ _____ ")
fmt.Println(" | | ___| |_| |__ _ __ __ _ | ___| __ ___ ___ ")
fmt.Println(" _ | |/ _ \\ __| '_ \\| '__/ _` | | |_ | '__/ _ \\/ _ \\")
fmt.Println("| |_| | __/ |_| |_) | | | (_| | | _|| | | __/ __/")
fmt.Println(" \\___/ \\___|\\__|_.__/|_| \\__,_| |_| |_| \\___|\\___|")
address := "127.0.0.1:8123"
log.Printf("Server running at: http://%s\n", address)
gin.SetMode(gin.ReleaseMode)
// init route
r := gin.Default()
r.Use(cors())
binDir, _ := os.Executable()
binDir = filepath.Dir(binDir)
r.Static("/static", filepath.Join(binDir, "static"))
r.LoadHTMLGlob(filepath.Join(binDir, "templates/*"))
r.GET("/", core.Index)
r.POST("/generateLicense", core.GenerateLicenseHandler)
r.POST("/crack", core.CrackHandler)
go func() {
time.Sleep(500 * time.Millisecond)
url := fmt.Sprintf("http://%s", address)
err := openBrowser(url)
if err != nil {
fmt.Println("Please open the browser manually:", err)
}
}()
r.Run(address)
}
func openBrowser(url string) error {
switch runtime.GOOS {
case "linux":
return exec.Command("xdg-open", url).Start()
case "windows":
return exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
case "darwin":
return exec.Command("open", url).Start()
default:
return nil
}
}

36
go.mod Normal file
View File

@@ -0,0 +1,36 @@
module jetbra-free
go 1.24.3
require (
github.com/gin-gonic/gin v1.10.0
golang.org/x/text v0.15.0
)
require (
github.com/bytedance/sonic v1.11.6 // indirect
github.com/bytedance/sonic/loader v0.1.1 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.20.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
golang.org/x/arch v0.8.0 // indirect
golang.org/x/crypto v0.23.0 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/sys v0.20.0 // indirect
google.golang.org/protobuf v1.34.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

89
go.sum Normal file
View File

@@ -0,0 +1,89 @@
github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

BIN
image.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 MiB

View File

@@ -0,0 +1,266 @@
package certificate
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"crypto/x509/pkix"
"encoding/pem"
"flag"
"fmt"
"jetbra-free/internal/util"
"log"
"math/big"
"os"
"path/filepath"
"regexp"
"strings"
"time"
)
var (
forceDelete bool
binDir = util.GetBinDir()
certPath = filepath.Join(binDir, "jetbra.pem")
keyPath = filepath.Join(binDir, "jetbra.key")
powerPath = filepath.Join(binDir, "power.txt")
jaNetfilterpowerConf = filepath.Join(binDir, "static", "ja-netfilter", "config-jetbrains", "power.conf")
)
func init() {
flag.BoolVar(&forceDelete, "f", false, "force delete existing files")
flag.Parse()
if forceDelete {
DeleteFile(certPath)
DeleteFile(keyPath)
DeleteFile(powerPath)
}
}
func Run() {
log.Printf("Start Generate Certificate...")
GenCertificate()
filePath := filepath.Join(powerPath)
file, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
content, err := generateEqualResult()
if err != nil {
log.Fatal(err)
}
_, err = file.WriteString(content)
if err != nil {
log.Fatal(err)
}
startMarker := "; jetbra-free-start"
endMarker := "; jetbra-free-end"
fileContent, err := os.ReadFile(jaNetfilterpowerConf)
if err != nil && !os.IsNotExist(err) {
log.Fatal(err)
}
fileStr := string(fileContent)
if strings.Contains(fileStr, startMarker) && strings.Contains(fileStr, endMarker) {
re := regexp.MustCompile(fmt.Sprintf(`(?s)%s.*?%s`, regexp.QuoteMeta(startMarker), regexp.QuoteMeta(endMarker)))
fileStr = re.ReplaceAllString(fileStr, fmt.Sprintf("%s\n%s\n%s", startMarker, content, endMarker))
} else {
fileStr += fmt.Sprintf("\n%s\n%s\n%s", startMarker, content, endMarker)
}
err = os.WriteFile(jaNetfilterpowerConf, []byte(fileStr), 0644)
if err != nil {
log.Fatal(err)
}
log.Printf("Generate Certificate Finished")
}
func FileExists(filename string) bool {
_, err := os.Stat(filename)
return !os.IsNotExist(err)
}
func DeleteFile(filename string) error {
if FileExists(filename) {
return os.Remove(filename)
}
return nil
}
func GenCertificate() error {
if FileExists(keyPath) && FileExists(certPath) {
return nil
}
privateKey, err := rsa.GenerateKey(rand.Reader, 4096)
if err != nil {
panic(err)
}
notBefore := time.Now().AddDate(0, 0, -1)
notAfter := time.Now().AddDate(10, 0, 0)
serialNumber, err := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128))
if err != nil {
panic(err)
}
caTemplate := x509.Certificate{
SerialNumber: serialNumber,
Subject: pkix.Name{CommonName: "JetProfile CA"},
Issuer: pkix.Name{CommonName: "JetProfile CA"},
NotBefore: notBefore,
NotAfter: notAfter,
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
BasicConstraintsValid: true,
IsCA: true,
}
_, err = x509.CreateCertificate(rand.Reader, &caTemplate, &caTemplate, &privateKey.PublicKey, privateKey)
if err != nil {
panic(err)
}
serialNumber, err = rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128))
if err != nil {
panic(err)
}
template := x509.Certificate{
SerialNumber: serialNumber,
Subject: pkix.Name{CommonName: "jetbra-free"},
Issuer: pkix.Name{CommonName: "JetProfile CA"},
NotBefore: notBefore,
NotAfter: notAfter,
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
BasicConstraintsValid: true,
}
certBytes, err := x509.CreateCertificate(rand.Reader, &template, &caTemplate, &privateKey.PublicKey, privateKey)
if err != nil {
panic(err)
}
certFile, err := os.Create(certPath)
if err != nil {
panic(err)
}
defer certFile.Close()
pem.Encode(certFile, &pem.Block{
Type: "CERTIFICATE",
Bytes: certBytes,
})
keyFile, err := os.Create(keyPath)
if err != nil {
panic(err)
}
defer keyFile.Close()
pem.Encode(keyFile, &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(privateKey),
})
fmt.Printf("Private key saved to %s\n", keyPath)
fmt.Printf("Certificate saved to %s\n", certPath)
return nil
}
func printCertificateDetails(crt *x509.Certificate) {
fmt.Println("Certificate Details:")
fmt.Printf(" Subject: %s\n", crt.Subject)
fmt.Printf(" Issuer: %s\n", crt.Issuer)
fmt.Printf(" Serial Number: %s\n", crt.SerialNumber)
fmt.Printf(" Not Before: %s\n", crt.NotBefore)
fmt.Printf(" Not After: %s\n", crt.NotAfter)
fmt.Printf(" Signature Algorithm: %s\n", crt.SignatureAlgorithm)
fmt.Printf(" Public Key Algorithm: %s\n", crt.PublicKeyAlgorithm)
fmt.Println(" Extensions:")
for _, ext := range crt.Extensions {
fmt.Printf(" OID: %s, Critical: %t, Value: %x\n", ext.Id, ext.Critical, ext.Value)
}
switch pub := crt.PublicKey.(type) {
case *rsa.PublicKey:
fmt.Printf(" RSA Public Key:\n")
fmt.Printf(" Modulus: %x\n", pub.N)
fmt.Printf(" Exponent: %d\n", pub.E)
default:
fmt.Println(" Public Key: (unsupported type)")
}
}
func loadCertificate(filename string) (*x509.Certificate, error) {
certPem, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
certBlock, _ := pem.Decode(certPem)
cert, err := x509.ParseCertificate(certBlock.Bytes)
if err != nil {
return nil, err
}
return cert, nil
}
func extractSignature(cert *x509.Certificate) *big.Int {
return new(big.Int).SetBytes(cert.Signature)
}
func extractPublicKeyExponent(cert *x509.Certificate) int {
return cert.PublicKey.(*rsa.PublicKey).E
}
func extractPublicKey(cert *x509.Certificate) *rsa.PublicKey {
return cert.PublicKey.(*rsa.PublicKey)
}
func calculateR(x, y *big.Int, jetbraPublicKey *rsa.PublicKey) *big.Int {
r := new(big.Int)
r.Exp(x, y, jetbraPublicKey.N)
return r
}
func generateEqualResult() (string, error) {
jetbraCertificate, err := loadCertificate(certPath)
if err != nil {
return "", err
}
if os.Getenv("DEBUG") == "1" {
printCertificateDetails(jetbraCertificate)
}
x := extractSignature(jetbraCertificate)
y := extractPublicKeyExponent(jetbraCertificate)
rootCertificate, err := loadCertificate(filepath.Join(binDir, "static", "root_certificate.pem"))
if err != nil {
return "", err
}
if os.Getenv("DEBUG") == "1" {
printCertificateDetails(rootCertificate)
}
z := extractPublicKey(rootCertificate).N
r := calculateR(x, big.NewInt(int64(y)), extractPublicKey(jetbraCertificate))
output := fmt.Sprintf("EQUAL,%d,%d,%d->%d", x, y, z, r)
if os.Getenv("DEBUG") == "1" {
println(output)
}
return output, nil
}

37
internal/core/apps.go Normal file
View File

@@ -0,0 +1,37 @@
package core
import (
"net/http"
"path"
"time"
"github.com/gin-gonic/gin"
)
func Index(c *gin.Context) {
expiryDate := time.Now().AddDate(10, 0, 0).Format("2006-01-02")
apps := []Plugin{
{Name: "IntelliJ IDEA", Code: "II,PCWMP,PSI", Icon: path.Join("static", "icons", "IntelliJ_IDEA_icon.svg"), IsFree: false, Describe: "IDE for Java and Kotlin developers", Tags: []string{"Java", "Kotlin", "Spring"}, CrackStatus: GetCrackStatus("IntelliJIdea")},
{Name: "PyCharm", Code: "PC,PCWMP,PSI", Icon: path.Join("static", "icons", "PyCharm_icon.svg"), IsFree: false, Describe: "IDE for Python developers and data scientists", Tags: []string{"Python", "Django", "Jupyter"}, CrackStatus: GetCrackStatus("PyCharm")},
{Name: "PhpStorm", Code: "PS,PCWMP,PSI", Icon: path.Join("static", "icons", "PhpStorm_icon.svg"), IsFree: false, Describe: "IDE for PHP developers", Tags: []string{"PHP", "Laravel", "Symfony"}, CrackStatus: GetCrackStatus("PhpStorm")},
{Name: "GoLand", Code: "GO,PCWMP,PSI", Icon: path.Join("static", "icons", "GoLand_icon.svg"), IsFree: false, Describe: "IDE for Go developers", Tags: []string{"Go (Golang)", "JavaScript", "TypeScript"}, CrackStatus: GetCrackStatus("GoLand")},
{Name: "DataGrip", Code: "DB,PSI", Icon: path.Join("static", "icons", "DataGrip_icon.svg"), IsFree: false, Describe: "Tool for multiple databases", Tags: []string{"Databases", "SQL", "NoSQL"}, CrackStatus: GetCrackStatus("DataGrip")},
{Name: "DataSpell", Code: "DS,PCWMP,PSI", Icon: path.Join("static", "icons", "DataSpell_icon.svg"), IsFree: false, Describe: "Tool for data analysis", Tags: []string{"Databases", "SQL", "NoSQL"}, CrackStatus: GetCrackStatus("DataSpell")},
{Name: "RubyMine", Code: "RM,PCWMP,PSI", Icon: path.Join("static", "icons", "RubyMine_icon.svg"), IsFree: false, Describe: "IDE for Ruby and Rails developers", Tags: []string{"Ruby on Rails (RoR)", "Hotwire", "RuboCop"}, CrackStatus: GetCrackStatus("RubyMine")},
{Name: "Rider", Code: "RD,DC,DPN,PCWMP,PSI", Icon: path.Join("static", "icons", "Rider_icon.svg"), IsFree: true, Describe: "IDE for .NET and game developers", Tags: []string{"C#", ".NET", "ASP.NET"}, CrackStatus: GetCrackStatus("Rider")},
{Name: "CLion", Code: "CL,PCWMP,PSI", Icon: path.Join("static", "icons", "CLion_icon.svg"), IsFree: true, Describe: "IDE for C and C++ developers", Tags: []string{"C", "C++", "CMake"}, CrackStatus: GetCrackStatus("CLion")},
{Name: "RustRover", Code: "RR,PCWMP,PSI", Icon: path.Join("static", "icons", "RustRover_icon.svg"), IsFree: true, Describe: "IDE for Rust developers", Tags: []string{"Rust", "SQL", "JavaScript"}, CrackStatus: GetCrackStatus("RustRover")},
{Name: "WebStorm", Code: "WS,PCWMP,PSI", Icon: path.Join("static", "icons", "WebStorm_icon.svg"), IsFree: true, Describe: "IDE for JavaScript and TypeScript developers", Tags: []string{"JavaScript", "TypeScript", "React"}, CrackStatus: GetCrackStatus("WebStorm")},
}
c.HTML(http.StatusOK, "/index.html", gin.H{
"title": "License Generator",
"licenseeName": "Evaluator",
"assigneeName": "Evaluator",
"expiryDate": expiryDate,
"apps": apps,
"plugins": AllPluginList,
"jaNetfilter": jaNetfilter,
})
}

345
internal/core/crack.go Normal file
View File

@@ -0,0 +1,345 @@
package core
import (
"bufio"
"fmt"
"log"
"net/http"
"os"
"path/filepath"
"runtime"
"strings"
"github.com/gin-gonic/gin"
"golang.org/x/text/encoding/unicode"
"golang.org/x/text/transform"
)
var (
addOpens1 = "--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED"
addOpens2 = "--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED"
agentLine = "-javaagent:" + jaNetfilter + "=jetbrains"
)
func setUserConfigPath() string {
switch runtime.GOOS {
case "windows":
return filepath.Join(os.Getenv("APPDATA"), "JetBrains")
case "darwin":
return filepath.Join(os.Getenv("HOME"), "Library", "Application Support", "JetBrains")
default: // Linux
return filepath.Join(os.Getenv("HOME"), ".config", "JetBrains")
}
}
type CrackRequest struct {
App string `json:"app"`
Status string `json:"status"`
License License `json:"license"`
}
func CrackHandler(c *gin.Context) {
var req CrackRequest
if err := c.ShouldBindJSON(&req); err != nil {
log.Printf("❌ Parsing request failed: %v", err)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
app := req.App
status := req.Status
log.Printf("🚀 Start processing the request: app=%s, status=%s", app, status)
action := ""
if app == "IntelliJ IDEA" {
app = "IntelliJIdea"
}
currentStatus := GetCrackStatus(app)
path := setUserConfigPath()
dirs, err := os.ReadDir(path)
if err != nil {
log.Printf("❌ Failed to read directory: %v", err)
c.JSON(500, gin.H{
"error": "Failed to read directory",
"detail": err.Error(),
})
return
}
backup := false
setkey := false
for _, dir := range dirs {
if !dir.IsDir() {
continue
}
if !strings.HasPrefix(dir.Name(), app) {
continue
}
dirPath := filepath.Join(path, dir.Name())
// vmoptionsFiles
vmoptionsFiles, _ := filepath.Glob(filepath.Join(dirPath, "*.vmoptions"))
// keyfile
keyfile := filepath.Join(dirPath, strings.ToLower(app)+".key")
if strings.HasSuffix(keyfile, "intellijidea.key") {
keyfile = filepath.Join(dirPath, "idea.key")
}
if status == "Cracked" {
for _, file := range vmoptionsFiles {
backupPath := file + ".jetbra-free.bak"
if currentStatus == "UnCracked" {
data, err := os.ReadFile(file)
if err == nil {
log.Printf("📦 Backup vmoptions: %s", backupPath)
_ = os.WriteFile(backupPath, data, 0644)
}
err = editVmoptionsFile(file)
if err != nil {
fmt.Printf("Failed to patch %s: %v\n", file, err)
}
backup = true
}
}
licenseStr, _ := GenerateLicense(&req.License)
if currentStatus == "UnCracked" {
keyBackupPath := keyfile + ".jetbra-free.bak"
data, err := os.ReadFile(keyfile)
if err == nil {
_ = os.WriteFile(keyBackupPath, data, 0644)
log.Printf("🔑 Backup key: %s", keyBackupPath)
}
}
if err := setKeyFile(keyfile, licenseStr); err != nil {
log.Printf("❌ Failed to set key file: %v", err)
}
setkey = true
if setkey && !backup {
action = "CrackedWithoutBackup"
} else {
action = "Cracked"
}
} else if status == "UnCracked" {
for _, file := range vmoptionsFiles {
if err := revertVmoptionsFile(file); err != nil {
log.Printf("❌ Restore failed: %v", err)
}
}
if err := revertKeyFile(keyfile); err != nil {
log.Printf("❌ Failed to restore key file: %v", err)
}
action = "UnCracked"
}
}
if action != "" {
c.JSON(200, gin.H{"msg": action})
return
}
c.JSON(200, gin.H{"msg": "ERROR"})
}
func setKeyFile(keyPath string, licenseStr string) error {
content := "\uFFFF<certificate-key>\n" + licenseStr
encoder := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewEncoder()
utf16Content, _, err := transform.String(encoder, content)
if err != nil {
return err
}
log.Printf("🔑 Write key: %s", keyPath)
return os.WriteFile(keyPath, []byte(utf16Content), 0644)
}
func revertKeyFile(keyPath string) error {
backupPath := keyPath + ".jetbra-free.bak"
if _, err := os.Stat(backupPath); err == nil {
err := os.Rename(backupPath, keyPath)
if err != nil {
return err
}
log.Printf("🔑 Revert key: %s", keyPath)
return nil
}
if _, err := os.Stat(keyPath); err == nil {
log.Printf("🔑 Delete key: %s", keyPath)
return os.Remove(keyPath)
}
return nil
}
func editVmoptionsFile(path string) error {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
var (
lines []string
hasAddOpens1 bool
hasAddOpens2 bool
hasJavaAgent bool
)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, addOpens1) {
hasAddOpens1 = true
}
if strings.Contains(line, addOpens2) {
hasAddOpens2 = true
}
if strings.HasPrefix(line, "-javaagent:") && strings.Contains(line, "=jetbrains") {
hasJavaAgent = true
lines = append(lines, agentLine)
continue
}
lines = append(lines, line)
}
if err := scanner.Err(); err != nil {
return err
}
if !hasAddOpens1 {
lines = append(lines, addOpens1)
}
if !hasAddOpens2 {
lines = append(lines, addOpens2)
}
if !hasJavaAgent {
lines = append(lines, agentLine)
}
log.Printf("📄 Edit vmoptions: %s", path)
return os.WriteFile(path, []byte(strings.Join(lines, "\n")), 0644)
}
func revertVmoptionsFile(path string) error {
backupPath := path + ".jetbra-free.bak"
_, err := os.Stat(backupPath)
if err == nil {
data, err := os.ReadFile(backupPath)
if err != nil {
println("Error reading backup file:", err)
return err
}
if err := os.WriteFile(path, data, 0644); err != nil {
println("Error writing to vmoptions file:", err)
return err
}
log.Println("📄 Revert vmoptions:", path)
return os.Remove(backupPath)
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
var lines []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
trim := strings.TrimSpace(line)
if trim == addOpens1 {
continue
}
if trim == addOpens2 {
continue
}
if strings.HasPrefix(trim, "-javaagent:") && strings.Contains(trim, "=jetbrains") {
continue
}
lines = append(lines, line)
}
if err := scanner.Err(); err != nil {
return err
}
log.Printf("📄 Remove the hack in the vmoptions file: %s", path)
return os.WriteFile(path, []byte(strings.Join(lines, "\n")), 0644)
}
func GetCrackStatus(appPrefix string) string {
app := appPrefix
if app == "IntelliJIdea" {
app = "IntelliJ IDEA"
}
path := setUserConfigPath()
dirs, err := os.ReadDir(path)
if err != nil {
log.Printf("❌ Failed to read directory: %v\n", err)
return "error"
}
cracked := true
found := false
for _, dir := range dirs {
if !dir.IsDir() {
continue
}
if !strings.HasPrefix(dir.Name(), appPrefix) {
continue
}
found = true
dirPath := filepath.Join(path, dir.Name())
pattern := "*.vmoptions"
files, _ := filepath.Glob(filepath.Join(dirPath, pattern))
for _, file := range files {
data, err := os.ReadFile(file)
if err != nil {
cracked = false
continue
}
content := string(data)
lines := strings.Split(content, "\n")
hasAddOpens1 := false
hasAddOpens2 := false
hasAgentLine := false
for _, line := range lines {
trim := strings.TrimSpace(line)
if trim == addOpens1 {
hasAddOpens1 = true
}
if trim == addOpens2 {
hasAddOpens2 = true
}
if trim == agentLine {
hasAgentLine = true
}
}
if !(hasAddOpens1 && hasAddOpens2 && hasAgentLine) {
cracked = false
log.Printf("🔒 %s Current Status: UnCracked 📄 %s\n", app, file)
} else {
log.Printf("🎉 %s Current Status: Cracked 📄 %s\n", app, file)
}
}
}
if !found {
fmt.Printf(" %s: Uninstall \n", app)
return "Uninstall"
}
if cracked {
return "Cracked"
}
return "UnCracked"
}

129
internal/core/license.go Normal file
View File

@@ -0,0 +1,129 @@
package core
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"crypto/x509"
"encoding/base64"
"encoding/json"
"encoding/pem"
"fmt"
"log"
"math/big"
"net/http"
"os"
"github.com/gin-gonic/gin"
)
func LicenseInit() {
log.Printf("Start LicenseInit...")
// load private key and certificate
privateKeyPEM, err := os.ReadFile(keyPath)
if err != nil {
panic("failed to read jetbra.key file, cause: " + err.Error())
}
block, _ := pem.Decode(privateKeyPEM)
privateKey, err = x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
panic("parsing jetbra.key file failed, cause: " + err.Error())
}
crtPEM, err := os.ReadFile(certPath)
if err != nil {
panic("failed to read jetbra.pem file, cause: " + err.Error())
}
block, _ = pem.Decode(crtPEM)
crt, err = x509.ParseCertificate(block.Bytes)
if err != nil {
panic("parsing jetbra.pem file failed, cause: " + err.Error())
}
log.Printf("LicenseInit Finished")
}
var (
privateKey *rsa.PrivateKey
crt *x509.Certificate
)
type License struct {
Products []Product `json:"products"`
LicenseID string `json:"licenseId"`
LicenseeName string `json:"licenseeName"`
AssigneeName string `json:"assigneeName"`
AssigneeEmail string `json:"assigneeEmail"`
LicenseRestriction string `json:"licenseRestriction"`
Metadata string `json:"metadata"`
Hash string `json:"hash"`
GracePeriodDays int `json:"gracePeriodDays"`
CheckConcurrentUse bool `json:"checkConcurrentUse"`
AutoProlongated bool `json:"autoProlongated"`
IsAutoProlongated bool `json:"isAutoProlongated"`
}
type Product struct {
Code string `json:"code"`
FallbackDate string `json:"fallbackDate"`
PaidUpTo string `json:"paidUpTo"`
Extended bool `json:"extended"`
}
func generateLicenseID() string {
const allowedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
const licenseLength = 10
b := make([]byte, licenseLength)
for i := range b {
index, _ := rand.Int(rand.Reader, big.NewInt(int64(len(allowedCharacters))))
b[i] = allowedCharacters[index.Int64()]
}
return string(b)
}
func GenerateLicenseHandler(c *gin.Context) {
var license License
if err := c.ShouldBindJSON(&license); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
licenseStr, err := GenerateLicense(&license)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"license": licenseStr})
}
func GenerateLicense(license *License) (string, error) {
license.LicenseID = generateLicenseID()
licenseBytes, err := json.Marshal(license)
if err != nil {
return "", fmt.Errorf("failed to marshal license: %w", err)
}
if os.Getenv("DEBUG") == "1" {
log.Printf("licenseStr: %s\n", licenseBytes)
}
// Sign the license using SHA1withRSA
hashed := sha1.Sum(licenseBytes)
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA1, hashed[:])
if err != nil {
return "", fmt.Errorf("failed to sign license: %w", err)
}
licensePartBase64 := base64.StdEncoding.EncodeToString(licenseBytes)
signatureBase64 := base64.StdEncoding.EncodeToString(signature)
crtBase64 := base64.StdEncoding.EncodeToString(crt.Raw)
licenseResult := fmt.Sprintf("%s-%s-%s-%s", license.LicenseID, licensePartBase64, signatureBase64, crtBase64)
if os.Getenv("DEBUG") == "1" {
fmt.Printf("licenseResult: %s\n", licenseResult)
}
return licenseResult, nil
}

197
internal/core/plugins.go Normal file
View File

@@ -0,0 +1,197 @@
package core
import (
"encoding/json"
"fmt"
"jetbra-free/internal/util"
"log"
"net/http"
"os"
"path"
"path/filepath"
"strconv"
"sync"
"time"
)
const (
pluginBaseUrl = "https://plugins.jetbrains.com"
)
var (
binDir = util.GetBinDir()
certPath = filepath.Join(binDir, "jetbra.pem")
keyPath = filepath.Join(binDir, "jetbra.key")
powerPath = filepath.Join(binDir, "power.txt")
jaNetfilter = filepath.Join(binDir, "static", "ja-netfilter", "ja-netfilter.jar")
pluginJsonFile = filepath.Join(binDir, "plugins.json")
client = http.Client{Timeout: 60 * time.Second}
AllPluginList []*Plugin
)
type ListPluginResponse struct {
Plugins []*Plugin `json:"plugins,omitempty"`
CorrectedQuery string `json:"correctedQuery,omitempty"`
Total int `json:"total,omitempty"`
}
type Plugin struct {
Code string `json:"code,omitempty"`
Name string `json:"name"`
PricingModel string `json:"pricingModel"`
Icon string `json:"icon"`
Id int `json:"id"`
IsFree bool `json:"isFree"`
Describe string `json:"describe"`
Tags []string `json:"tags"`
LicenseKey string `json:"licenseKey"`
CrackStatus string `json:"crackstatus"`
}
type PluginDetail struct {
PurchaseInfo struct {
BuyUrl any `json:"buyUrl"`
PurchaseTerms any `json:"purchaseTerms"`
ProductCode string `json:"productCode"`
TrialPeriod int `json:"trialPeriod"`
Optional bool `json:"optional"`
} `json:"purchaseInfo"`
Id int `json:"id"`
}
func PluginsInit() {
log.Printf("Start PluginsInit...")
var skipFetch bool
info, err := os.Stat(pluginJsonFile)
if err == nil {
modTime := info.ModTime()
if time.Since(modTime) < 10*time.Minute {
log.Printf("Skipping remote fetch because the plugin file was updated within the last 10 minutes.")
skipFetch = true
}
pluginFile, err := os.OpenFile(pluginJsonFile, os.O_RDONLY, 0644)
if err == nil {
defer pluginFile.Close()
err = json.NewDecoder(pluginFile).Decode(&AllPluginList)
if err != nil {
panic(err)
}
}
}
if !skipFetch {
loadAllPlugin()
savePlugin()
}
log.Printf("PluginsInit Finished")
}
func loadAllPlugin() {
pluginIdCodeMap := make(map[int]string, len(AllPluginList))
for _, plugin := range AllPluginList {
pluginIdCodeMap[plugin.Id] = plugin.Code
}
pluginList, err := client.Get(pluginBaseUrl + "/api/searchPlugins?max=10000&offset=0")
if err != nil {
panic(err)
}
defer pluginList.Body.Close()
var listPluginResponse ListPluginResponse
err = json.NewDecoder(pluginList.Body).Decode(&listPluginResponse)
if err != nil {
panic(err)
}
for i, plugin := range listPluginResponse.Plugins {
if plugin.PricingModel == "FREE" {
continue
}
if pluginIdCodeMap[plugin.Id] != "" {
continue
}
fmt.Println("found new plugin ", plugin.Name, plugin.PricingModel)
if plugin.Icon == "" || plugin.Icon == "https://plugins.jetbrains.com" {
listPluginResponse.Plugins[i].Icon = path.Join("static", "icons", "Plugin_icon.svg")
} else {
listPluginResponse.Plugins[i].Icon = pluginBaseUrl + listPluginResponse.Plugins[i].Icon
}
AllPluginList = append(AllPluginList, listPluginResponse.Plugins[i])
}
found := false
for _, plugin := range AllPluginList {
if plugin.Name == "dotCover" {
found = true
break
}
}
if !found {
AllPluginList = append(AllPluginList, &Plugin{
Name: "dotCover",
Code: "DC",
Icon: path.Join("static", "icons", "dotCover_icon.svg"),
Tags: []string{"C#", ".NET", "ASP.NET"},
})
log.Println("Inserted new plugin: dotCover")
} else {
log.Println("dotCover plugin already exists, skipping insertion.")
}
var wg sync.WaitGroup
codeChan := make(chan struct {
idx int
code string
}, len(AllPluginList))
for idx, plugin := range AllPluginList {
if plugin.Code == "" {
wg.Add(1)
go func(i int, id int, name string) {
defer wg.Done()
code := getCodeByPluginID(id)
fmt.Println("new plugin code ", name, code)
codeChan <- struct {
idx int
code string
}{i, code}
}(idx, plugin.Id, plugin.Name)
}
}
go func() {
wg.Wait()
close(codeChan)
}()
for item := range codeChan {
AllPluginList[item.idx].Code = item.code
}
}
func getCodeByPluginID(id int) string {
pluginDetailResp, err := client.Get(pluginBaseUrl + "/api/plugins/" + strconv.Itoa(id))
if err != nil {
panic(err)
}
defer pluginDetailResp.Body.Close()
var pluginDetail PluginDetail
err = json.NewDecoder(pluginDetailResp.Body).Decode(&pluginDetail)
if err != nil {
panic(err)
}
return pluginDetail.PurchaseInfo.ProductCode
}
func savePlugin() {
f, err := os.Create(pluginJsonFile)
if err != nil {
panic(err)
}
err = json.NewEncoder(f).Encode(AllPluginList)
if err != nil {
panic(err)
}
}

1480
internal/util/access.go Normal file

File diff suppressed because one or more lines are too long

29
internal/util/bindata.go Normal file
View File

@@ -0,0 +1,29 @@
package util
import (
"fmt"
"os"
"path/filepath"
)
func ExtractAssets(outputDir string) error {
for _, name := range AssetNames() {
data, err := Asset(name)
if err != nil {
return err
}
destPath := filepath.Join(outputDir, name)
err = os.MkdirAll(filepath.Dir(destPath), os.ModePerm)
if err != nil {
return err
}
err = os.WriteFile(destPath, data, os.ModePerm)
if err != nil {
fmt.Printf("Write to the file failed, please close the ide and try again: %s:warning: %v\n", destPath, err)
continue
}
}
return nil
}

14
internal/util/path.go Normal file
View File

@@ -0,0 +1,14 @@
package util
import (
"os"
"path/filepath"
)
func GetBinDir() string {
exePath, err := os.Executable()
if err != nil {
panic(err)
}
return filepath.Dir(exePath)
}

898
static/css/common.css Normal file
View File

@@ -0,0 +1,898 @@
/* !*@mod*!
&_size_xs {} /* size xs is technically possible^ but not allowed by styleguide * /
*/
:root {
--wh-flow-unit-xs: 6px;
--wh-flow-unit-sm: 16px;
--wh-flow-unit: 24px;
--wh-flow-unit-m: 32px;
--wh-spacer: 32px;
--wh-spacer-sm: 16px;
--wh-max-width-xl: 820px;
--wh-max-width-l: 706px;
--wh-max-width-m: 540px;
--wh-max-width-s: 460px;
--wh-max-width-xs: 320px;
--wh-article-list-width: 716px;
--wh-transition-xfast: 100ms;
--wh-transition-fast: 300ms;
--wh-transition-medium: 500ms;
--wh-transition-long: 1000ms;
--wh-sidebar-width-xxlg: 310px;
--wh-sidebar-width-xlg: 300px;
--wh-sidebar-width-lg: 272px;
--wh-virtual-toc-width: 210px;
--wh-header-height-lg: 70px;
--wh-header-height-sm: 48px;
--wh-gap-xs: 8px;
--wh-gap-sm: 16px;
--wh-gap-m: 22px;
--wh-gap-lg: 32px;
--wh-max-width: calc(1520px - var(--wh-gap-m) * 2);
--wh-max-width-content: calc(
var(--wh-max-width) - var(--wh-sidebar-width-xxlg)
);
--wh-max-width-article: 952px;
--wh-app-fallback-width: 360px;
--wh-app-fallback-image-height: 325px;
--wh-app-fallback-width-sm: 300px;
--wh-app-fallback-height-sm: 300px;
}
._rs-typography_theme_dark_19db458_1 {
--rs-theme-dark: 1;
}
._rs-text_hardness_hard_19db458_1 {
--_rs-typography-hardness-color: var(
--rs-color-hard,
rgb(
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(28 + var(--_rs-theme-dark-coefficient, 0) * 227)
)
);
}
._rs-text_hardness_auto_19db458_1 {
--_rs-typography-hardness-color: initial;
}
._rs-h2_19db458_1 {
--_rs-typography-letter-spacing: normal;
--_rs-typography-text-transform: initial;
--_rs-typography-font-variant-numeric: initial;
--_rs-typography-font-family: var(
--rs-font-family-headers,
var(
--rs-font-family-jb-sans,
"JetBrains Sans",
Inter,
system-ui,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
Roboto,
Oxygen,
Ubuntu,
Cantarell,
"Droid Sans",
"Helvetica Neue",
Arial,
sans-serif
)
);
--_rs-typography-font-size: var(--rs-h2-font-size, 35px);
--_rs-typography-font-weight: var(--rs-font-weight-semi-bold, 600);
--_rs-typography-line-height: var(--rs-h2-line-height, 42px);
--_rs-typography-base-color: var(
--_rs-typography-heading-hardness-color,
var(
--rs-color-hard,
rgb(
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(28 + var(--_rs-theme-dark-coefficient, 0) * 227)
)
)
);
--_rs-typography-text-auto-offset: 0;
--_rs-typography-ul-list-li-padding-left: initial;
--_rs-typography-ol-list-li-padding-left: initial;
--_rs-typography-list-li-margin-top-from-text: initial;
--_rs-typography-link-standalone-border-offset-from-text-base: 1.12em;
--_rs-typography-link-external-standalone-border-offset-from-text-base: 1em;
--_rs-typography-link-border-bottom-width-from-text: 2px;
}
@media screen and (max-width: 640px) {
._rs-h2_19db458_1 {
--_rs-typography-font-size: var(--rs-h2-font-size-mobile, 28px);
--_rs-typography-line-height: var(--rs-h2-line-height-mobile, 32px);
}
}
._rs-h3_19db458_1 {
--_rs-typography-letter-spacing: normal;
--_rs-typography-text-transform: initial;
--_rs-typography-font-variant-numeric: initial;
--_rs-typography-font-family: var(
--rs-font-family-ui,
var(
--rs-font-family-jb-sans,
"JetBrains Sans",
Inter,
system-ui,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
Roboto,
Oxygen,
Ubuntu,
Cantarell,
"Droid Sans",
"Helvetica Neue",
Arial,
sans-serif
)
);
--_rs-typography-font-size: var(--rs-h3-font-size, 20px);
--_rs-typography-font-weight: var(--rs-font-weight-semi-bold, 600);
--_rs-typography-line-height: var(--rs-h3-line-height, 28px);
--_rs-typography-base-color: var(
--_rs-typography-heading-hardness-color,
var(
--rs-color-hard,
rgb(
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(28 + var(--_rs-theme-dark-coefficient, 0) * 227)
)
)
);
--_rs-typography-text-auto-offset: 0;
--_rs-typography-ul-list-li-padding-left: initial;
--_rs-typography-ol-list-li-padding-left: initial;
--_rs-typography-list-li-margin-top-from-text: initial;
--_rs-typography-link-standalone-border-offset-from-text-base: 1.15em;
--_rs-typography-link-external-standalone-border-offset-from-text-base: 1.02em;
--_rs-typography-link-border-bottom-width-from-text: 2px;
}
._rs-text-2_19db458_1 {
--_rs-typography-letter-spacing: 0.0015em;
--_rs-typography-text-transform: initial;
--_rs-typography-font-variant-numeric: initial;
--_rs-typography-font-family: var(
--rs-font-family-ui,
var(
--rs-font-family-jb-sans,
"JetBrains Sans",
Inter,
system-ui,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
Roboto,
Oxygen,
Ubuntu,
Cantarell,
"Droid Sans",
"Helvetica Neue",
Arial,
sans-serif
)
);
--_rs-typography-font-size: var(--rs-text-2-font-size, 16px);
--_rs-typography-font-weight: var(--rs-font-weight-regular, 400);
--_rs-typography-line-height: var(--rs-text-2-line-height, 24px);
--_rs-typography-base-color: var(
--_rs-typography-hardness-color,
var(
--rs-color-average,
rgba(
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(28 + var(--_rs-theme-dark-coefficient, 0) * 227),
0.7
)
)
);
--_rs-typography-text-auto-offset: 16px;
--_rs-typography-ul-list-li-padding-left: 22px;
--_rs-typography-ol-list-li-padding-left: 26px;
--_rs-typography-list-li-margin-top-from-text: 16px;
--_rs-typography-link-standalone-border-offset-from-text-base: 1.15em;
--_rs-typography-link-external-standalone-border-offset-from-text-base: 1.02em;
--_rs-typography-link-border-bottom-width-from-text: 1px;
}
@media screen and (max-width: 640px) {
._rs-text-2_19db458_1 {
--_rs-typography-list-li-margin-top-from-text: 12px;
}
}
._rs-text-3_19db458_1 {
--_rs-typography-letter-spacing: 0.0045em;
--_rs-typography-text-transform: initial;
--_rs-typography-font-variant-numeric: initial;
--_rs-typography-font-family: var(
--rs-font-family-ui,
var(
--rs-font-family-jb-sans,
"JetBrains Sans",
Inter,
system-ui,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
Roboto,
Oxygen,
Ubuntu,
Cantarell,
"Droid Sans",
"Helvetica Neue",
Arial,
sans-serif
)
);
--_rs-typography-font-size: var(--rs-text-3-font-size, 13px);
--_rs-typography-font-weight: var(--rs-font-weight-regular, 400);
--_rs-typography-line-height: var(--rs-text-3-line-height, 20px);
--_rs-typography-base-color: var(
--_rs-typography-hardness-color,
var(
--rs-color-average,
rgba(
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(28 + var(--_rs-theme-dark-coefficient, 0) * 227),
0.7
)
)
);
--_rs-typography-text-auto-offset: 8px;
--_rs-typography-ul-list-li-padding-left: 28px;
--_rs-typography-ol-list-li-padding-left: 21px;
--_rs-typography-list-li-margin-top-from-text: 8px;
--_rs-typography-link-standalone-border-offset-from-text-base: 1.15em;
--_rs-typography-link-external-standalone-border-offset-from-text-base: 1.02em;
--_rs-typography-link-border-bottom-width-from-text: 1px;
}
._rs-h2_19db458_1,
._rs-h3_19db458_1,
._rs-text-2_19db458_1,
._rs-text-3_19db458_1 {
--_rs-theme-dark: var(
--_rs-internal-force-theme-dark-consult-rescui-before-using,
var(--rs-theme-dark, 0)
);
--_rs-theme-flip: var(--rs-theme-flip, 0);
--_rs-theme-dark-coefficient: calc(
var(--_rs-theme-dark) * (1 - var(--_rs-theme-flip)) + var(--_rs-theme-flip) *
(1 - var(--_rs-theme-dark))
);
--_rs-theme-light-coefficient: calc(1 - var(--_rs-theme-dark-coefficient));
color: var(--_rs-typography-base-color);
font-family: var(--_rs-typography-font-family);
font-feature-settings: "kern", "liga", "calt";
font-size: var(--_rs-typography-font-size);
font-variant-numeric: var(--_rs-typography-font-variant-numeric);
font-weight: var(--_rs-typography-font-weight);
letter-spacing: var(
--rs-text-base-letter-spacing,
var(--_rs-typography-letter-spacing)
);
line-height: var(--_rs-typography-line-height);
text-transform: var(--_rs-typography-text-transform);
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
:root {
--wt-offset-top-unit: 24px;
}
@media screen and (max-width: 640px) {
:root {
--wt-offset-top-unit: 16px;
}
}
.wt-section {
background-color: #fff;
background-color: var(--rs-color-white, #fff);
box-sizing: border-box;
padding-bottom: 96px;
padding-bottom: calc(var(--wt-offset-top-unit, 24px) * 4);
padding-top: 1px;
}
.wt-container {
box-sizing: border-box;
margin-left: auto;
margin-right: auto;
max-width: 1276px;
padding-left: 22px;
padding-right: 22px;
width: 100%;
}
@media screen and (max-width: 1276px) {
.wt-container {
max-width: 996px;
padding-left: 22px;
padding-right: 22px;
}
}
@media screen and (max-width: 1000px) {
.wt-container {
max-width: 100%;
padding-left: 22px;
padding-right: 22px;
}
}
@media screen and (max-width: 640px) {
.wt-container {
max-width: 100%;
padding-left: 16px;
padding-right: 16px;
}
}
[class*="wt-col"] {
box-sizing: border-box;
flex-basis: calc(
8.33333% * var(--wt-col-count) - var(--wt-horizontal-layout-gutter) * 2
);
max-width: calc(
8.33333% * var(--wt-col-count) - var(--wt-horizontal-layout-gutter) * 2
);
}
[class*="wt-col"],
[class*="wt-col"].wt-row {
margin-left: var(--wt-horizontal-layout-gutter);
margin-right: var(--wt-horizontal-layout-gutter);
}
.wt-col_align-self_end {
align-self: flex-end;
}
.wt-col-inline {
--wt-col-count: 0;
flex-basis: auto;
max-width: 100%;
}
.wt-col-4 {
--wt-col-count: 4;
}
.wt-col-12 {
--wt-col-count: 12;
}
@media screen and (max-width: 1000px) {
[class*="wt-col-md"] {
box-sizing: border-box;
flex-basis: calc(
8.33333% * var(--wt-col-count) - var(--wt-horizontal-layout-gutter) * 2
);
max-width: calc(
8.33333% * var(--wt-col-count) - var(--wt-horizontal-layout-gutter) * 2
);
}
[class*="wt-col-md"],
[class*="wt-col-md"].wt-row {
margin-left: var(--wt-horizontal-layout-gutter);
margin-right: var(--wt-horizontal-layout-gutter);
}
.wt-col-md-6 {
--wt-col-count: 6;
}
}
@media screen and (max-width: 640px) {
[class*="wt-col-sm"] {
box-sizing: border-box;
flex-basis: calc(
8.33333% * var(--wt-col-count) - var(--wt-horizontal-layout-gutter) * 2
);
max-width: calc(
8.33333% * var(--wt-col-count) - var(--wt-horizontal-layout-gutter) * 2
);
}
[class*="wt-col-sm"],
[class*="wt-col-sm"].wt-row {
margin-left: var(--wt-horizontal-layout-gutter);
margin-right: var(--wt-horizontal-layout-gutter);
}
.wt-col-sm-12 {
--wt-col-count: 12;
}
}
.wt-row {
--wt-horizontal-layout-gutter: 0px;
box-sizing: border-box;
flex-wrap: wrap;
margin-left: calc(var(--wt-horizontal-layout-gutter) * -1);
margin-right: calc(var(--wt-horizontal-layout-gutter) * -1);
}
.wt-row {
display: flex;
}
.wt-row_nowrap {
flex-wrap: nowrap;
}
.wt-row_align-items_center {
align-items: center;
}
.wt-row_size_m {
--wt-horizontal-layout-gutter: 16px;
}
.wt-row_size_s {
--wt-horizontal-layout-gutter: 8px;
}
.wt-row_size_xs {
--wt-horizontal-layout-gutter: 6px;
}
@media screen and (max-width: 640px) {
.wt-row_size_m {
--wt-horizontal-layout-gutter: 8px;
}
}
.wt-offset-top-8 {
margin-top: 8px;
}
.wt-offset-top-16 {
margin-top: 16px;
}
.wt-offset-top-32 {
margin-top: 32px;
margin-top: calc(var(--wt-offset-top-unit, 24px) * 1.33333);
}
.wt-offset-top-48 {
margin-top: 48px;
margin-top: calc(var(--wt-offset-top-unit, 24px) * 2);
}
.wt-offset-top-96 {
margin-top: 96px;
margin-top: calc(var(--wt-offset-top-unit, 24px) * 4);
}
@media screen and (max-width: 640px) {
.wt-display-sm-none {
display: none;
}
}
:root {
--animated-list-text-color: #fcf84a;
--animated-list-top-before-offset: -30px;
--animated-list-top-after-offset: 30px;
--animated-list-text-align: left;
}
:root {
--jb-color-grey-dense: #bebebe;
--jb-color-grey-active: #5f5f5f;
--jb-floating-toc-z-index: 1030;
}
:root {
--gamedev-color-dot-active: #c8ff00;
}
:root {
--marquee-duration: 60s;
--marquee-direction: normal;
--marquee-gap: 16px;
}
@keyframes marquee {
0% {
transform: translateX(0);
}
to {
transform: translateX(calc(-100% - var(--marquee-gap)));
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes _fadeInTopToBottom_1bktizr_1 {
0% {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInBottomToTop_1bktizr_1 {
0% {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInLeftToRight_1bktizr_1 {
0% {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInRightToLeft_1bktizr_1 {
0% {
opacity: 0;
transform: translateX(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInTopToBottom_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInBottomToTop_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInLeftToRight_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInRightToLeft_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
._alignIconLeft_1i6xjbl_7 {
--_rs-tag-flex-direction: row;
}
._sizeXs_1i6xjbl_18 {
--_rs-tag-vertical-padding: 2px;
--_rs-tag-base-horizontal-padding: 8px;
--_rs-tag-uppercase-horizontal-padding: var(
--_rs-tag-base-horizontal-padding
);
--_rs-tag-icon-size: 20px;
--_rs-tag-border-radius: 4px;
--_rs-typography-letter-spacing: var(--rs-text-3-letter-spacing, 0.0045em);
--_rs-typography-text-transform: initial;
--_rs-typography-font-variant-numeric: initial;
--_rs-typography-font-family: var(
--rs-font-family-ui,
var(
--rs-font-family-jb-sans,
"JetBrains Sans",
Inter,
system-ui,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
Roboto,
Oxygen,
Ubuntu,
Cantarell,
"Droid Sans",
"Helvetica Neue",
Arial,
sans-serif
)
);
--_rs-typography-font-size: var(--rs-text-3-font-size, 13px);
--_rs-typography-font-weight: var(--rs-font-weight-regular, 400);
--_rs-typography-line-height: var(--rs-text-3-line-height, 20px);
--_rs-typography-base-color: var(
--_rs-typography-hardness-color,
var(
--rs-color-average,
rgba(
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(25 + var(--_rs-theme-dark-coefficient, 0) * 230),
calc(28 + var(--_rs-theme-dark-coefficient, 0) * 227),
0.7
)
)
);
--_rs-typography-text-auto-offset: 8px;
--_rs-typography-ul-list-li-padding-left: 28px;
--_rs-typography-ol-list-li-padding-left: 21px;
--_rs-typography-list-li-margin-top-from-text: 8px;
--_rs-typography-link-standalone-border-offset-from-text-base: 1.15em;
--_rs-typography-link-external-standalone-border-offset-from-text-base: 1.02em;
--_rs-typography-link-border-bottom-width-from-text: 1px;
}
._main_1i6xjbl_31 {
--_rs-tag-border-width: 1px;
--_rs-tag-horizontal-padding: var(
--_rs-tag-horizontal-padding-or-initial,
var(--_rs-tag-base-horizontal-padding)
);
align-items: center;
background: transparent;
border: var(--_rs-tag-border-width) solid transparent;
box-sizing: border-box;
display: inline-flex;
flex-direction: var(--_rs-tag-flex-direction);
font-family: var(--_rs-typography-font-family);
font-feature-settings: "kern", "liga", "calt";
font-size: var(--_rs-typography-font-size);
font-variant-numeric: var(--_rs-typography-font-variant-numeric);
font-weight: var(--_rs-typography-font-weight);
gap: 8px;
justify-content: center;
letter-spacing: var(
--rs-text-base-letter-spacing,
var(--_rs-typography-letter-spacing)
);
line-height: var(--_rs-typography-line-height);
outline: none;
padding: calc(var(--_rs-tag-vertical-padding) - var(--_rs-tag-border-width))
calc(var(--_rs-tag-horizontal-padding) - var(--_rs-tag-border-width));
position: relative;
text-align: center;
text-decoration: none;
text-transform: var(--_rs-typography-text-transform);
text-transform: var(--_rs-tag-text-transform);
white-space: nowrap;
}
._main_imuztz_1 {
border-radius: var(--_rs-tag-border-radius);
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@media screen and (max-width: 640px) {
:root {
--wt-flow-unit: 16px;
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes wt-icon-rotate {
to {
transform: rotate(1turn);
}
}
:root {
--helper-blocks-height: 600px;
}
@media screen and (max-width: 640px) {
:root {
--helper-blocks-height: 400px;
}
}
:root {
--formatted-price-composition-text-align: left;
}
@keyframes WtLoadingAnimation {
0% {
background-position: 100% 0;
}
to {
background-position: -50% 0;
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
:root {
--dotnet-to-product-bg-violet: #281c74;
--dotnet-to-product-tag-bg-violet: #1b1358;
--dotnet-to-product-colored-text-color-theme-purple: #d31ac1;
}
@keyframes _fadeInTopToBottom_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInBottomToTop_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInLeftToRight_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInRightToLeft_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
:root {
--slideshow-tab-width: 412px;
--slideshow-tab-lg-width: 240px;
}
@keyframes _loader_7ednin_1 {
0% {
left: -30%;
}
40% {
left: 50%;
}
60% {
left: 80%;
}
to {
left: 130%;
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}

346
static/css/custom.css Normal file
View File

@@ -0,0 +1,346 @@
.card {
position: relative;
}
.ribbon {
position: absolute;
width: 160px;
padding: 5px 0;
background: rgb(21 160 210);
color: #161998;
font-weight: bold;
text-align: center;
transform: rotate(45deg);
top: 20px;
right: -35px;
cursor: pointer;
pointer-events: auto;
}
.ribbon:hover {
color: transparent;
}
.ribbon:hover::after {
content: attr(data-hover-text);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
color: rgb(227, 7, 7);
font-weight: bold;
pointer-events: none;
}
.hidden {
display: none;
}
.ribbon-wrapper {
position: absolute;
top: 0;
right: 0;
overflow: hidden;
width: 100px;
height: 100px;
pointer-events: none;
}
.copy-button {
position: absolute;
top: 0;
right: 0;
background-color: #04aa6d;
border: none;
color: white;
padding: 8px 16px;
text-align: center;
text-decoration: none;
border-radius: 8px;
cursor: pointer;
font-size: 14px;
transition: background-color 0.3s ease;
z-index: 10;
width: 70px;
height: 40px;
white-space: nowrap;
overflow: hidden;
}
.copy-button:hover {
background-color: #057e47;
}
.code-block {
position: relative;
background-color: #f5f5f5;
color: #333;
padding: 20px;
border-radius: 5px;
font-family: "Courier New", Courier, monospace;
font-size: 14px;
white-space: pre-wrap;
word-wrap: break-word;
border: 1px solid #ddd;
}
.icon {
width: 64px;
height: 64px;
background-size: contain;
background-repeat: no-repeat;
}
.license-key {
color: rgba(169, 167, 167, 0.6);
max-width: 100%;
max-height: 3.6em;
overflow: auto;
white-space: pre-wrap;
word-break: break-all;
font-family: monospace;
padding: 4px 8px;
border-radius: 4px;
box-sizing: border-box;
line-height: 1.2em;
margin-top: 16px;
scrollbar-width: none;
-ms-overflow-style: none;
}
.license-key::-webkit-scrollbar {
display: none;
}
.form-content {
line-height: 1.8;
}
.jetbra-button {
background-color: #04aa6d;
border: none;
color: white;
padding: 8px 24px;
text-align: center;
text-decoration: none;
display: inline-block;
border-radius: 16px;
box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
transition-duration: 0.4s;
}
.jetbra-button:hover {
background-color: #057e47;
color: white;
}
.form {
background-color: #15172b;
border-radius: 20px;
box-sizing: border-box;
height: 500px;
padding: 20px;
width: 320px;
}
.title {
color: #eee;
font-family: sans-serif;
font-size: 36px;
font-weight: 600;
margin-top: 30px;
}
.subtitle {
color: #eee;
font-family: sans-serif;
font-size: 16px;
font-weight: 600;
margin-top: 10px;
}
.input-container {
height: 50px;
position: relative;
width: 100%;
}
.ic1 {
margin-top: 40px;
}
.ic2 {
margin-top: 30px;
}
.input {
background-color: #303245;
border-radius: 12px;
border: 0;
box-sizing: border-box;
color: #eee;
font-size: 18px;
height: 100%;
outline: 0;
padding: 4px 20px 0;
width: 100%;
}
.cut {
background-color: #15172b;
border-radius: 10px;
height: 20px;
left: 20px;
position: absolute;
top: -20px;
transform: translateY(0);
transition: transform 200ms;
width: 96px;
}
.cut-short {
width: 80px;
}
.input:focus ~ .cut,
.input:not(:placeholder-shown) ~ .cut {
transform: translateY(8px);
}
.placeholder {
color: #65657b;
font-family: sans-serif;
left: 20px;
line-height: 14px;
pointer-events: none;
position: absolute;
transform-origin: 0 50%;
transition: transform 200ms, color 200ms;
top: 20px;
}
.input:focus ~ .placeholder,
.input:not(:placeholder-shown) ~ .placeholder {
transform: translateY(-30px) translateX(10px) scale(0.75);
}
.input:not(:placeholder-shown) ~ .placeholder {
color: #808097;
}
.input:focus ~ .placeholder {
color: #dc2f55;
}
.submit {
background-color: #08d;
border-radius: 12px;
border: 0;
box-sizing: border-box;
color: #eee;
cursor: pointer;
font-size: 18px;
height: 50px;
margin-top: 38px;
text-align: center;
width: 100%;
}
.submit:active {
background-color: #06b;
}
.mask {
transition: 0.2s;
position: absolute;
z-index: -1;
width: 88%;
height: 100%;
bottom: 0;
border-radius: 1.5rem;
background-color: var(--grey-600);
left: 50%;
transform: translateX(-50%);
}
#mask {
position: fixed;
top: 0;
left: 0;
z-index: 998;
width: 100%;
height: 100%;
display: none;
background-color: #000;
opacity: 0.5;
overflow: hidden;
}
#form {
position: fixed;
top: 20%;
left: 40%;
width: 40%;
height: 500px;
z-index: 999;
display: none;
}
.form {
background-color: #15172b;
border-radius: 20px;
box-sizing: border-box;
height: 500px;
padding: 20px;
width: 320px;
}
.search-container {
display: flex;
justify-content: center;
margin-top: 20px;
}
.search-input {
width: 300px;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
font-size: 16px;
}
.code-block {
background-color: #f5f5f5;
color: #333;
padding: 10px;
border-radius: 5px;
font-family: "Courier New", Courier, monospace;
font-size: 14px;
white-space: pre-wrap;
word-wrap: break-word;
border: 1px solid #ddd;
}
#mask-info {
position: fixed;
top: 0;
left: 0;
z-index: 998;
width: 100%;
height: 100%;
display: none;
background-color: rgba(0, 0, 0, 0.5);
}
#form-info {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 800px;
background-color: #1e1e2f;
color: #ffffff;
border-radius: 12px;
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
z-index: 999;
display: none;
padding: 20px;
}

621
static/css/index.css Normal file
View File

@@ -0,0 +1,621 @@
.ides-languages-product-card {
background-color: transparent;
border: 1px solid var(--rs-color-white-t50);
border-radius: 16px;
padding: 24px 24px 16px;
}
.ides-languages-product-card__language-tags {
border-radius: 12px;
}
.ides-languages-product-card:hover {
border-color: var(--rs-color-white);
text-decoration: none;
}
.ides-languages-product-card__wrap {
height: 100%;
}
.ides-languages-product-card__icon svg {
height: 64px;
width: 64px;
}
.ide-products-section {
scroll-margin-top: 70px;
}
.find-ide-section {
background: linear-gradient(
180deg,
rgba(28, 0, 107, 0),
rgba(28, 0, 107, 0.35) 80%,
rgba(28, 0, 107, 0)
);
}
:root {
--slide-img-width: 1100px;
--slide-img-height: 620px;
}
:root {
--bg-img-width: 1622px;
--bg-img-height: 818px;
}
:root {
--text-color-violet: #9c34ed;
--bg-color-black: #000010;
}
.background-black {
background-color: var(--bg-color-black);
}
a {
--jb-default-link-color: #18a3fa;
--jb-default-link-text-decoration: none;
color: var(--jb-default-link-color);
cursor: pointer;
-webkit-text-decoration: var(--jb-default-link-text-decoration);
text-decoration: var(--jb-default-link-text-decoration);
}
a:hover {
--jb-default-link-color: #0887d7;
}
a:active,
a:focus {
--jb-default-link-color: #0573b8;
}
a:hover {
--jb-default-link-text-decoration: underline;
}
:root {
--rs-color-danger: #f45c4a;
--rs-color-danger-bg: rgba(244, 92, 74, 0.2);
--rs-color-success: #4dbb5f;
--rs-color-success-bg: rgba(77, 187, 95, 0.2);
--rs-color-warning: #f3c033;
--rs-color-warning-bg: rgba(243, 192, 51, 0.2);
--rs-color-primary-light-theme: #6b57ff;
--rs-color-primary-dim-light-theme: #8979ff;
--rs-color-primary-fog-light-theme: #e1ddff;
--rs-color-primary-t-dim-light-theme: rgba(107, 87, 255, 0.8);
--rs-color-primary-t-fog-light-theme: rgba(107, 87, 255, 0.2);
--rs-color-primary-dark-theme: #8473ff;
--rs-color-primary-dim-dark-theme: #6f61d2;
--rs-color-primary-fog-dark-theme: #2e2b49;
--rs-color-primary-t-dim-dark-theme: rgba(132, 115, 255, 0.8);
--rs-color-primary-t-fog-dark-theme: rgba(132, 115, 255, 0.3);
--rs-color-black: #19191c;
--rs-color-white: #fff;
--rs-color-black-t95: rgba(25, 25, 28, 0.95);
--rs-color-black-t90: rgba(25, 25, 28, 0.9);
--rs-color-black-t80: rgba(25, 25, 28, 0.8);
--rs-color-black-t70: rgba(25, 25, 28, 0.7);
--rs-color-black-t60: rgba(25, 25, 28, 0.6);
--rs-color-black-t50: rgba(25, 25, 28, 0.5);
--rs-color-black-t40: rgba(25, 25, 28, 0.4);
--rs-color-black-t30: rgba(25, 25, 28, 0.3);
--rs-color-black-t20: rgba(25, 25, 28, 0.2);
--rs-color-black-t10: rgba(25, 25, 28, 0.1);
--rs-color-black-t5: rgba(25, 25, 28, 0.05);
--rs-color-white-t5: hsla(0, 0%, 100%, 0.05);
--rs-color-white-t10: hsla(0, 0%, 100%, 0.1);
--rs-color-white-t20: hsla(0, 0%, 100%, 0.2);
--rs-color-white-t30: hsla(0, 0%, 100%, 0.3);
--rs-color-white-t40: hsla(0, 0%, 100%, 0.4);
--rs-color-white-t50: hsla(0, 0%, 100%, 0.5);
--rs-color-white-t60: hsla(0, 0%, 100%, 0.6);
--rs-color-white-t70: hsla(0, 0%, 100%, 0.7);
--rs-color-white-t80: hsla(0, 0%, 100%, 0.8);
--rs-color-white-t90: hsla(0, 0%, 100%, 0.9);
--rs-color-white-t95: hsla(0, 0%, 100%, 0.95);
--rs-color-grey-95: #252528;
--rs-color-grey-90: #303033;
--rs-color-grey-80: #474749;
--rs-color-grey-70: #5e5e60;
--rs-color-grey-60: #757577;
--rs-color-grey-50: #8c8c8e;
--rs-color-grey-40: #a3a3a4;
--rs-color-grey-30: #bababb;
--rs-color-grey-20: #d1d1d2;
--rs-color-grey-10: #e8e8e8;
--rs-color-grey-5: #f4f4f4;
}
:root {
--wt-color-white: #fff;
--wt-color-white-60: hsla(0, 0%, 100%, 0.6);
--wt-color-white-30: hsla(0, 0%, 100%, 0.3);
--wt-color-white-20: hsla(0, 0%, 100%, 0.2);
--wt-color-white-10: hsla(0, 0%, 100%, 0.1);
--wt-color-white-5: hsla(0, 0%, 100%, 0.05);
--wt-color-dark: #27282c;
--wt-color-dark-70: rgba(39, 40, 44, 0.7);
--wt-color-dark-40: rgba(39, 40, 44, 0.4);
--wt-color-dark-20: rgba(39, 40, 44, 0.2);
--wt-color-dark-5: rgba(39, 40, 44, 0.05);
--wt-color-grey: #3c3d40;
--wt-color-grey-light: #f4f4f4;
--wt-color-grey-dark: #323236;
--wt-color-primary-light-theme: #167dff;
--wt-color-primary-light-theme-80: rgba(22, 125, 255, 0.8);
--wt-color-primary-light-theme-20: rgba(22, 125, 255, 0.2);
--wt-color-primary-dark-theme: #4ca6ff;
--wt-color-primary-dark-theme-80: rgba(76, 166, 255, 0.8);
--wt-color-primary-dark-theme-20: rgba(76, 166, 255, 0.2);
--wt-color-error: #ef341e;
--wt-color-success: #4dbb5f;
--wt-color-warning: #f3c033;
}
@font-face {
font-family: JetBrains Sans;
font-style: normal;
font-weight: 100 900;
src: url(https://resources.jetbrains.com/storage/jetbrains-sans/google-fonts/v1.309/variable/JetBrainsSans[wght].woff2)
format("woff2 supports variations"),
url(https://resources.jetbrains.com/storage/jetbrains-sans/google-fonts/v1.309/variable/JetBrainsSans[wght].woff2)
format("woff2-variations"),
url(https://resources.jetbrains.com/storage/jetbrains-sans/google-fonts/v1.309/variable/JetBrainsSans[wght].ttf)
format("truetype-variations");
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes _fadeInTopToBottom_1t4sa2o_1 {
0% {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInBottomToTop_1t4sa2o_1 {
0% {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInLeftToRight_1t4sa2o_1 {
0% {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInRightToLeft_1t4sa2o_1 {
0% {
opacity: 0;
transform: translateX(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInTopToBottom_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInBottomToTop_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInLeftToRight_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInRightToLeft_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes _fadeInTopToBottom_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInBottomToTop_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInLeftToRight_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInRightToLeft_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
.section {
color: #696969;
font-size: 16px;
padding-bottom: 150px;
padding-top: 70px;
}
.section p {
line-height: 25px;
}
@media screen and (max-width: 640px) {
.section {
font-size: 14px;
padding-bottom: 50px;
padding-top: 50px;
}
}
:root {
--wt-overlay-z-index: 900;
--wt-overlay-for-primary-menu: calc(var(--wt-overlay-z-index) + 9);
}
:root {
--wt-site-heder-logo-size: 25px;
}
:root {
--site-header-zindex: 1020;
--site-header-height: 72px;
--mobile-site-header-height: 48px;
--site-header-bg: var(--rs-color-black, #19191c);
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
@keyframes _fadeInTopToBottom_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInBottomToTop_rbv9f4_1 {
0% {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInLeftToRight_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInRightToLeft_rbv9f4_1 {
0% {
opacity: 0;
transform: translateX(10px);
}
to {
opacity: 1;
transform: none;
}
}
:root {
--_wtui-search-padding-top: 120px;
--_wtui-gap-m: 22px;
--_wtui-max-width-l: 706px;
--_wtui-flow-unit: 24px;
--_wtui-spacer: 32px;
--_wtui-flow-unit-xs: 6px;
--_wtui-transition-xfast: 100ms;
--_wtui-flow-unit-sm: 16px;
--_wtui-gap-lg: 32px;
}
@keyframes rs-icon-rotate {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
html {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body,
html {
font-size: 14px;
height: 100%;
}
body {
background-color: #fff;
color: #343434;
font-family: JetBrains Sans, Helvetica, Arial, sans-serif;
line-height: 1.667;
min-width: 320px;
}
body {
min-width: 1000px !important;
}
body.body-adaptive {
min-width: 320px !important;
}
.wt-container {
position: relative;
}
a,
body,
div,
h3,
html,
p,
ruby,
section,
span {
border: 0;
font-size: 100%;
margin: 0;
padding: 0;
vertical-align: baseline;
}
section {
display: block;
}
body {
line-height: 1;
}
.link {
color: #18a3fa;
cursor: pointer;
text-decoration: none;
}
.link:hover {
color: #0887d7;
}
.link:active,
.link:focus {
color: #0573b8;
}
.link:hover {
text-decoration: underline;
}
body {
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
:root {
--jb-transition-xfast: 100ms;
--jb-transition-fast: 300ms;
--jb-transition-medium: 500ms;
--jb-z-index-base: 0;
--jb-z-index-wt-ui-step: 500;
--jb-z-index-tooltip: calc(
var(--jb-z-index-base) + var(--jb-z-index-wt-ui-step)
);
--jb-z-index-dropdown: calc(
var(--jb-z-index-base) + var(--jb-z-index-wt-ui-step) * 2
);
--jb-z-index-popup: calc(
var(--jb-z-index-base) + var(--jb-z-index-wt-ui-step) * 3
);
--jb-z-index-sidebar: calc(var(--jb-z-index-base) + 100);
--jb-z-index-secondary-menu: calc(var(--jb-z-index-sidebar) + 10);
--jb-z-index-main-menu: calc(var(--jb-z-index-secondary-menu) + 10);
--jb-z-index-sidebar-active: calc(
var(--jb-z-index-sidebar) + var(--jb-z-index-popup) - var(--jb-z-index-base)
);
--jb-z-index-overlay: calc(var(--jb-z-index-sidebar-active) + 10);
--jb-z-index-secondary-menu-active: calc(var(--jb-z-index-overlay) + 10);
--jb-z-index-main-menu-active: calc(
var(--jb-z-index-secondary-menu-active) + 10
);
--jb-z-index-anchors-toc: calc(var(--jb-z-index-main-menu-active) + 20);
}
/* !!!Don't use #7B61FF as a primary color - use default-purple instead */
.page-color-lilac-purple {
--rs-color-primary-light-theme: #671fff;
--rs-color-primary-t-dim-light-theme: rgba(103, 31, 255, 0.8);
--rs-color-primary-t-fog-light-theme: rgba(103, 31, 255, 0.2);
--rs-color-primary-dark-theme: #671fff;
--rs-color-primary-t-dim-dark-theme: rgba(103, 31, 255, 0.8);
--rs-color-primary-t-fog-dark-theme: rgba(103, 31, 255, 0.2);
--rs-color-primary-dim-light-theme: #854cff;
--rs-color-primary-fog-light-theme: #e1d2ff;
--rs-color-primary-dim-dark-theme: #5219cc;
--rs-color-primary-fog-dark-theme: #150633;
}
.wt-primary-map {
--wt-color-primary-light-theme: var(--rs-color-primary-light-theme);
--wt-color-primary-light-theme-80: var(--rs-color-primary-t-dim-light-theme);
--wt-color-primary-light-theme-20: var(--rs-color-primary-t-fog-light-theme);
--wt-color-primary-dark-theme: var(--rs-color-primary-dark-theme);
--wt-color-primary-dark-theme-80: var(--rs-color-primary-t-dim-dark-theme);
--wt-color-primary-dark-theme-20: var(--rs-color-primary-t-fog-dark-theme);
}
.jb-offset-top-16 {
margin-top: 16px;
}
@media screen and (max-width: 640px) {
.jb-offset-top-sm-48 {
margin-top: 48px;
}
}
@supports (scrollbar-gutter: stable) {
html {
scrollbar-gutter: stable;
}
}
:root {
--jb-page-sidebar-zindex: 5;
--jb-content-container-width-lg: 996px;
--jb-page-sidebar-vertical-unit: 32px;
--jb-page-sidebar-width: 244px;
--jb-page-sidebar-negative-width: -244px;
--jb-page-sidebar-visible-panel-width: 40px;
--jb-page-sidebar-padding-horisontal: 32px;
--jb-page-sidebar-padding-vertical: 32px;
--jb-page-toggle-button-top: 16px;
}
body:has(.popup-dialog[open]) {
overflow: hidden;
}
@keyframes loading {
0% {
width: 0;
}
25% {
width: 0;
}
50% {
width: 4px;
}
75% {
width: 8px;
}
to {
width: 12px;
}
}
@keyframes backdrop-fade-out {
0% {
box-shadow: 0 0 0 100vmax var(--jb-dialog-backdrop-background);
}
to {
box-shadow: 0 0 0 100vmax transparent;
}
}
@keyframes backdrop-fade-in {
0% {
box-shadow: 0 0 0 100vmax transparent;
}
to {
box-shadow: 0 0 0 100vmax var(--jb-dialog-backdrop-background);
}
}
:root {
--jb-overlay-z-index: 900;
--jb-overlay-for-primary-menu: calc(var(--jb-overlay-z-index) + 9);
}
@keyframes _fadeInTopToBottom_n4jp5s_1 {
0% {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInBottomToTop_n4jp5s_1 {
0% {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInLeftToRight_n4jp5s_1 {
0% {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _fadeInRightToLeft_n4jp5s_1 {
0% {
opacity: 0;
transform: translateX(10px);
}
to {
opacity: 1;
transform: none;
}
}
:root {
--jb-menu-second-z-index: calc(var(--jb-overlay-z-index) + 5);
--jb-menu-second-mobile-z-index: calc(var(--jb-overlay-z-index) + 4);
--jb-menu-second-popup-z-index: calc(var(--jb-overlay-z-index) + 3);
--jb-menu-main-mobile-height: 47px;
}

9
static/icons/AI_icon.svg Normal file
View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="none" viewBox="0 0 48 48">
<defs>
<linearGradient id="a" x1="4.74626" x2="70.6068" y1="8.63622" y2="59.748" gradientUnits="userSpaceOnUse">
<stop stop-color="#955AE0"/>
<stop offset="1" stop-color="#4D67F0"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M3.72 8.16C8.04 5.7 13.98 4.5 19.08 4.5c14.94 0 24.42 6.96 24.42 16.38 0 7.5-6.54 12.12-15.24 12.12-7.02 0-12.24-2.58-12.24-6 0-3.24 3.3-4.8 7.98-3l1.2-3.66C17.94 18 11.94 21.3 11.94 27s7.08 9.78 16.56 9.78c11.28 0 19.5-6.24 19.5-15.9C48 8.82 36.6 0 19.08 0c-5.64 0-12 1.44-17.22 4.26l1.86 3.9Zm40.56 31.68c-4.32 2.46-10.26 3.66-15.36 3.66-14.94 0-24.42-6.96-24.42-16.38C4.5 19.62 11.04 15 19.74 15c7.02 0 12.24 2.58 12.24 6 0 3.24-3.3 4.8-7.98 3l-1.2 3.66C30.06 30 36.06 26.7 36.06 21s-7.08-9.78-16.56-9.78C8.22 11.22 0 17.46 0 27.12 0 39.18 11.4 48 28.92 48c5.64 0 12-1.44 17.22-4.26l-1.86-3.9Z"/>
</svg>

After

Width:  |  Height:  |  Size: 961 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64"><defs><linearGradient id="aqua_svg__a" x1="59.932" x2="1.336" y1="59.676" y2="1.079" gradientUnits="userSpaceOnUse"><stop offset=".25" stop-color="#7256FF"/><stop offset=".73" stop-color="#007DFE"/></linearGradient><linearGradient id="aqua_svg__b" x1="7.671" x2="61.125" y1="64.392" y2="39.609" gradientUnits="userSpaceOnUse"><stop offset=".3" stop-color="#00D886"/><stop offset=".54" stop-color="#7256FF"/></linearGradient></defs><path fill="url(#aqua_svg__a)" d="M0 4.125v34.127c0 1.659.993 3.155 2.52 3.8L39.943 57.85c.518.219 1.075.33 1.638.324l18.329-.15A4.125 4.125 0 0 0 64 53.9V36.234c0-.806-.236-1.593-.678-2.267L42.213 1.86A4.125 4.125 0 0 0 38.766 0H4.125A4.125 4.125 0 0 0 0 4.125Z"/><path fill="url(#aqua_svg__b)" d="M6 49.015v10.862a4.125 4.125 0 0 0 4.125 4.125h12.566c.2 0 .4-.014.598-.044l37.185-5.448A4.125 4.125 0 0 0 64 54.429V39.03a4.125 4.125 0 0 0-4.127-4.125l-18.504.005c-.426 0-.849.066-1.254.195L8.871 45.085A4.126 4.126 0 0 0 6 49.015H6Z"/><path fill="#00D886" d="M6 47.55v12.259a4.125 4.125 0 0 0 4.19 4.124L21 64c1.181-.019 2.531-.786 3.3-1.683l32.707-38.158c.64-.748.993-1.7.993-2.685V10.125A4.125 4.125 0 0 0 53.875 6H42.872c-1.19 0-2.321.514-3.105 1.409L7.021 44.834A4.123 4.123 0 0 0 6 47.55Z"/><path fill="#000" d="M52 12H12v40h40V12Z"/><path fill="#fff" d="M33 44H17v3h16v-3ZM20.746 31.242a7.32 7.32 0 0 1-2.755-2.786c-.668-1.183-1.003-2.503-1.003-3.961s.334-2.778 1.003-3.96a7.314 7.314 0 0 1 2.755-2.787c1.168-.675 2.474-1.014 3.917-1.014 1.443 0 2.739.338 3.907 1.013a7.278 7.278 0 0 1 2.75 2.787c.664 1.183.996 2.503.996 3.961s-.332 2.778-.997 3.96a7.278 7.278 0 0 1-2.749 2.788c-1.168.675-2.47 1.013-3.907 1.013-1.436 0-2.75-.338-3.917-1.013Zm6.308-2.229c.707-.446 1.261-1.065 1.661-1.854.4-.79.6-1.678.6-2.664 0-.986-.2-1.874-.6-2.664a4.6 4.6 0 0 0-1.661-1.854c-.708-.446-1.504-.67-2.39-.67-.886 0-1.685.223-2.396.67a4.62 4.62 0 0 0-1.672 1.854c-.403.79-.605 1.678-.605 2.664 0 .986.202 1.874.605 2.664.404.79.962 1.408 1.672 1.854.711.447 1.51.67 2.396.67.886 0 1.683-.223 2.39-.67Zm-2.16 6.034a2.666 2.666 0 0 1-1.126-1.077c-.261-.464-.391-1.011-.391-1.64l-.01-1.94h2.743v1.811c0 .221.043.413.129.573.085.161.209.283.37.365.16.082.352.123.574.123h1.833v2.165h-2.412c-.65 0-1.22-.127-1.71-.38ZM38.233 16.992h3.173l5.563 15.006h-2.947l-1.212-3.483h-5.842l-1.136 3.483H32.82l5.413-15.006Zm3.805 9.261-2.025-5.723-.225-.954-.215.954-1.908 5.723h4.373Z"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg height="60" viewBox="0 0 60 60" width="60" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<linearGradient id="a" gradientTransform="matrix(1 0 0 -1 0 72)" gradientUnits="userSpaceOnUse" x1="17.65714"
x2="60" y1="22.5" y2="22.5">
<stop offset=".194" stop-color="#00daf0"/>
<stop offset=".903" stop-color="#247ce6"/>
</linearGradient>
<linearGradient id="b" x1="1.11429" x2="32.91428" xlink:href="#a" y1="57.08572" y2="57.08572"/>
<linearGradient id="c" gradientTransform="matrix(1 0 0 -1 0 72)" gradientUnits="userSpaceOnUse" x1="39.31943"
x2="9.59458" y1="10.09339" y2="51.57739">
<stop offset=".091" stop-color="#1ddf93"/>
<stop offset=".484" stop-color="#00daf0"/>
<stop offset=".903" stop-color="#247ce6"/>
</linearGradient>
<path d="m50.74285 47.14285 9.25715-24.59999-28.02857-6.25715-3.68572 10.45715z" fill="#247ce6"/>
<path d="m60 48.08571-14.14286 11.91429-28.2-7.28572 7.54286-13.71428z" fill="url(#a)"/>
<path d="m8.31428 29.82857-7.2-20.57143 31.8-9.25714-2.57143 26.57143z" fill="url(#b)"/>
<path d="m52.37142 34.71428-8.91428-15.25714.17143-.08571-10.71429-19.37143-32.91428 35.57143v24.42857l59.82857-11.91429z"
fill="url(#c)"/>
<path d="m11.48571 11.48571h37.02857v37.02857h-37.02857z"/>
<g fill="#fff">
<path d="m14.91428 41.57143h13.88572v2.31428h-13.88572z"/>
<path d="m21 16.28571h3.08571l6.51429 15.34286h-3.51429l-1.37143-3.42857h-6.42857l-1.37143 3.42857h-3.42857zm3.51428 8.91429-2.05714-4.97143-2.05714 4.97143z"/>
<path d="m29.74286 24.08571a7.88873 7.88873 0 0 1 8.05714-8.05714 7.84089 7.84089 0 0 1 6.08571 2.4l-2.14286 2.48571a5.533 5.533 0 0 0 -3.94285-1.71428 4.56434 4.56434 0 0 0 -4.45715 4.8 4.58653 4.58653 0 0 0 4.45715 4.88571 5.37746 5.37746 0 0 0 4.02857-1.8l2.14285 2.14286a7.88691 7.88691 0 0 1 -6.34285 2.74286 7.75845 7.75845 0 0 1 -7.88572-7.88572"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="60.0186" x2="1.31316" y1="59.7777" y2="1.07287" gradientUnits="userSpaceOnUse">
<stop offset=".25" stop-color="#7256FF"/>
<stop offset=".73" stop-color="#007DFE"/>
</linearGradient>
<linearGradient id="b" x1="7.62199" x2="62.0615" y1="64.7192" y2="39.4788" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#00D886"/>
<stop offset=".54" stop-color="#7256FF"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M0 4.07273V38.041c0 1.6291.971054 3.1017 2.46807 3.7434L39.9587 57.8525c.5067.217 1.0531.3293 1.6046.3293h18.364c2.2493 0 4.0727-1.8234 4.0727-4.0727v-17.966c0-.8046-.2386-1.5913-.6854-2.2609L41.9118 1.81353C41.1561.681309 39.8854.001745 38.5245.001745L4.07273 0C1.82342 0 0 1.82342 0 4.07273Z"/>
<path fill="url(#b)" d="M5.81836 49.4825v10.4466c0 2.2493 1.82342 4.0727 4.07273 4.0727H22.9837c.1926 0 .3852-.014.576-.0407l36.9437-5.2771c2.0067-.2868 3.4968-2.005 3.4968-4.032V38.979c0-2.2499-1.824-4.0733-4.0739-4.0727l-18.5385.0046c-.4375 0-.8721.0704-1.287.2089L8.60294 45.6193c-1.66284.5544-2.78458 2.1108-2.78458 3.8638v-.0006Z"/>
<path fill="#00D886" d="m5.81836 48.0512.00174 11.8755c0 2.2493 1.82342 4.0721 4.07273 4.0721H21.3994c1.1887 0 2.3186-.5196 3.0924-1.422l32.7098-38.1614c.6325-.7383.9804-1.6786.9804-2.6508V9.88913c0-2.24931-1.8234-4.07272-4.0727-4.07272H42.6009c-1.1887 0-2.3185.51956-3.0924 1.42196L6.7993 45.3998c-.63301.7383-.98036 1.6786-.98036 2.6514h-.00058Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M20.0825 31.2119c.8131.4642 1.694.7569 2.634.8992l.0011.1854c0 .6295.1286 1.1787.3857 1.6338.264.4688.6393.8304 1.1247 1.0714.493.2542 1.064.3885 1.7142.3885h2.4102V33.221h-1.8318c-.2284 0-.4212-.0396-.5784-.1205-.1573-.0804-.2783-.2009-.3644-.3616-.0855-.1606-.1286-.3483-.1286-.5755v-.085c.8746-.1521 1.6964-.4309 2.4533-.8659 1.1712-.6829 2.0889-1.6069 2.7528-2.785.664-1.1919.9962-2.5043.9962-3.9637 0-1.4593-.3322-2.7717-.9962-3.9504-.6639-1.1914-1.5821-2.1153-2.7528-2.785-1.1644-.6829-2.4676-1.0175-3.9097-1.0175-1.4422 0-2.7385.3346-3.9098 1.0175-1.1638.6697-2.0814 1.5936-2.7528 2.785-.6639 1.1787-.9962 2.4905-.9962 3.9504 0 1.4599.3323 2.7718.9962 3.9637.6714 1.1781 1.5885 2.1015 2.7523 2.7844Zm-.1498-9.3999c.4069-.8034.9641-1.4192 1.6711-1.8616.7139-.4419 1.5138-.6697 2.3993-.6697.8855 0 1.682.2272 2.389.6697.707.4419 1.2602 1.0576 1.6602 1.8616.4.7764.5997 1.6602.5997 2.6513 0 .991-.2003 1.8742-.5997 2.6644-.4.7896-.9532 1.406-1.6602 1.861-.707.4419-1.5035.656-2.389.656-.8855 0-1.6854-.2141-2.3993-.656-.707-.4556-1.2642-1.0714-1.6711-1.861-.4-.7902-.5997-1.674-.5997-2.6644 0-.9905.1997-1.8749.5997-2.6513Z" clip-rule="evenodd"/>
<path fill="#fff" fill-rule="evenodd" d="M40.5126 16.9646h-3.17l-5.4098 14.9967h3.0099l1.1357-3.481h5.8379l1.2103 3.481h2.9456l-5.5596-14.9967Zm-3.7381 9.253 1.9069-5.7174.2141-.9509.225.9509 2.0245 5.7174h-4.3705Z" clip-rule="evenodd"/>
<path fill="#fff" d="M16.9941 44.001h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="3.98138" x2="62.6868" y1="4.22048" y2="62.9254" gradientUnits="userSpaceOnUse">
<stop offset=".29" stop-color="#009AE5"/>
<stop offset=".7" stop-color="#00D980"/>
</linearGradient>
<linearGradient id="b" x1="56.3788" x2="2.75258" y1="-.71738" y2="24.1455" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#FF318C"/>
<stop offset=".54" stop-color="#009AE5"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M64 59.9255V25.9572c0-1.6291-.9711-3.1017-2.4681-3.7434L24.0413 6.14572c-.5068-.21702-1.0531-.32931-1.6046-.32931H4.07273C1.82342 5.81641 0 7.63982 0 9.88913V27.8551c0 .8047.238545 1.5913.685382 2.2609L22.0887 62.1847c.7552 1.1322 2.0265 1.8118 3.3874 1.8118l34.4512.0017c2.2493 0 4.0727-1.8234 4.0727-4.0727Z"/>
<path fill="url(#b)" d="M58.1818 14.5193V4.07273C58.1818 1.82342 56.3584 0 54.1091 0H41.0164c-.1925 0-.3851.013964-.576.040727L3.49673 5.3184C1.49004 5.60465 0 7.32334 0 9.34982V25.0228c0 2.2499 1.824 4.0733 4.07389 4.0728l18.53851-.0047c.4375 0 .8721-.0704 1.2869-.2089l31.4979-10.4995c1.6629-.5544 2.7846-2.1108 2.7846-3.8638v.0006Z"/>
<path fill="#FF318C" d="m58.1814 15.9476-.0017-11.87545C58.1797 1.82342 56.3562 0 54.1069 0H42.6003c-1.1886 0-2.3185.519564-3.0923 1.42196L6.79872 39.5834c-.63243.7383-.98036 1.6786-.98036 2.6508v11.8755c0 2.2493 1.82342 4.0727 4.07273 4.0727H21.3994c1.1887 0 2.3186-.5196 3.0924-1.422L57.201 18.599c.6331-.7383.9804-1.6786.9804-2.6514Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" d="M20.0471 31.161c1.1594.668 2.4537 1.0029 3.8828 1.0029v-.0011c1.2086 0 2.3183-.2241 3.328-.6721 1.0097-.448 1.8486-1.0731 2.5172-1.8771.6754-.8108 1.1274-1.7388 1.3548-2.784h-3.0508c-.1995.54-.4977 1.0172-.896 1.4292-.3915.4057-.864.7188-1.4189.9388-.5543.22-1.1588.3309-1.8131.3309-.8817 0-1.6783-.22-2.3892-.6612-.7114-.4411-1.2697-1.0451-1.6748-1.8131-.3983-.7743-.5972-1.6463-.5972-2.6132 0-.9668.1989-1.8348.5972-2.6028.4057-.7749.964-1.3829 1.6748-1.824.7109-.4412 1.5075-.6612 2.3892-.6612.6537 0 1.2583.1109 1.8131.3309.5549.22 1.0274.5371 1.4189.9491.3983.4057.6965.8789.896 1.4189h3.0508c-.228-1.0451-.6794-1.9691-1.3548-2.7731-.6686-.8109-1.5075-1.44-2.5172-1.888-1.0097-.448-2.1194-.672-3.328-.672-1.4297 0-2.724.3371-3.8828 1.0131-1.1595.668-2.0697 1.5931-2.7309 2.7731-.6611 1.1732-.992 2.4852-.992 3.936 0 1.4509.3309 2.7669.992 3.9469.6617 1.1731 1.572 2.0971 2.7309 2.7731Z"/>
<path fill="#fff" d="M36.1248 29.2833V16.9742h-2.9012v14.9331h9.984v-2.624h-7.0828Z"/>
<path fill="#fff" d="M16.9941 43.9988h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="none" viewBox="0 0 48 48">
<defs>
<linearGradient id="a" x1="3.67884" x2="44.5028" y1="5.32" y2="42.84" gradientUnits="userSpaceOnUse">
<stop stop-color="#3BEA62"/>
<stop offset="1" stop-color="#6B57FF"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M.006836 0v36H18.0068l9-36H.006836ZM15.0068 30H6.00684v-6H16.2068l-1.2 6Zm15-18-9 36h27V12h-18Zm12 30h-13.8l1.8-6h12v6Z"/>
</svg>

After

Width:  |  Height:  |  Size: 480 B

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="59.7777" x2="1.07287" y1="3.98196" y2="62.6868" gradientUnits="userSpaceOnUse">
<stop offset=".28" stop-color="#7256FF"/>
<stop offset=".66" stop-color="#00D980"/>
</linearGradient>
<linearGradient id="b" x1="64.7178" x2="39.4774" y1="56.3788" y2="1.93862" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#FF43F2"/>
<stop offset=".54" stop-color="#7256FF"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M4.07273 64H38.041c1.6291 0 3.1017-.9711 3.7434-2.4681l16.0681-37.4906c.217-.5068.3293-1.0531.3293-1.6046V4.07273C58.1818 1.82342 56.3584 0 54.1091 0h-17.966c-.8046 0-1.5912.238545-2.2609.685382L1.81353 22.0881C.681309 22.8439.001745 24.1146.001745 25.4755L0 59.9273C0 62.1766 1.82342 64 4.07273 64Z"/>
<path fill="url(#b)" d="M49.4812 58.1818h10.4465c2.2493 0 4.0727-1.8234 4.0727-4.0727V41.0164c0-.1925-.0139-.3851-.0407-.576L58.682 3.49673C58.3952 1.49004 56.6771 0 54.65 0H38.977c-2.2499 0-4.0733 1.824-4.0727 4.07389l.0047 18.53851c0 .4375.0704.8721.2088 1.2869l10.4995 31.4979c.5545 1.6629 2.1109 2.7846 3.8639 2.7846Z"/>
<path fill="#FF43F2" d="m48.0521 58.18 11.8755-.0017c2.2493 0 4.0722-1.8234 4.0722-4.0727V42.599c0-1.1887-.5196-2.3186-1.422-3.0924L24.4164 6.79677c-.7384-.63244-1.6786-.98036-2.6508-.98036H9.89011c-2.24931 0-4.07273 1.82341-4.07273 4.07272V21.3975c0 1.1887.51957 2.3185 1.42197 3.0924L45.4002 57.1991c.7383.633 1.6786.9804 2.6514.9804l.0005.0005Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M22.751 17.3641h-5.7569v15.1222h5.7569c1.4327 0 2.7144-.3241 3.8451-.9721 1.1376-.6481 2.027-1.5444 2.6681-2.6896.6405-1.152.9611-2.4522.9611-3.8994s-.3206-2.7433-.9611-3.8885c-.6411-1.152-1.5305-2.0524-2.6681-2.7005-1.1307-.648-2.4124-.9721-3.8451-.9721Zm2.3331 11.968c-.677.4033-1.4651.6047-2.3655.6047l-2.7757.0006V19.9136h2.7757c.8998 0 1.6885.2008 2.3655.6047.677.4033 1.1989.9825 1.5664 1.7388.3674.7493.5508 1.6381.5508 2.6681s-.1834 1.9222-.5508 2.6785c-.3675.7494-.8894 1.3245-1.5664 1.7284Z" clip-rule="evenodd"/>
<path fill="#fff" d="M35.3272 31.73c1.174.6764 2.4846 1.0155 3.9318 1.0155 1.3899 0 2.6427-.3096 3.7589-.9293 1.1231-.6197 2.0055-1.4651 2.6461-2.5385.6481-1.0797.9721-2.2856.9721-3.6182v-1.188h-6.405v2.3221h3.5161c-.0722.5605-.2757 1.0719-.6107 1.534-.3958.5468-.9322.9762-1.6092 1.2852-.6701.3095-1.4188.4646-2.2469.4646-.8928 0-1.6989-.2228-2.4193-.6695-.7204-.4467-1.2857-1.0583-1.696-1.836-.4027-.7841-.6046-1.6671-.6046-2.6461 0-.9791.2013-1.858.6046-2.6357.4109-.7847.9762-1.4003 1.696-1.847.7199-.4467 1.5265-.6695 2.4193-.6695.6053 0 1.1706.0972 1.696.2916.526.1875.9831.4577 1.372.8101.3963.3455.7094.7563.9397 1.2313h3.1541c-.2736-.9865-.7528-1.8574-1.4367-2.6137-.677-.7562-1.5126-1.3436-2.5061-1.7608-.9866-.4172-2.0663-.6266-3.2404-.6266-1.4477 0-2.7578.3414-3.9318 1.0259-1.1741.6764-2.0959 1.6132-2.7653 2.8081-.6695 1.188-1.0046 2.5165-1.0046 3.9857 0 1.4692.3351 2.8018 1.0046 3.9967.67 1.1879 1.5918 2.1236 2.7653 2.8081Z"/>
<path fill="#fff" d="M16.9941 43.9998h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="3.98196" x2="62.6868" y1="4.22048" y2="62.9254" gradientUnits="userSpaceOnUse">
<stop offset=".28" stop-color="#007DFE"/>
<stop offset=".73" stop-color="#00D980"/>
</linearGradient>
<linearGradient id="b" x1="56.3788" x2="1.93862" y1="-.717381" y2="24.5231" gradientUnits="userSpaceOnUse">
<stop offset=".32" stop-color="#F0EB18"/>
<stop offset=".55" stop-color="#007DFE"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M64 59.9255V25.9572c0-1.6291-.9711-3.1017-2.4681-3.7434L24.0413 6.14572c-.5068-.21702-1.0531-.32931-1.6046-.32931H4.07273C1.82342 5.81641 0 7.63982 0 9.88913V27.8551c0 .8047.238545 1.5913.685382 2.2609L22.0887 62.1847c.7552 1.1322 2.0265 1.8118 3.3874 1.8118l34.4512.0017c2.2493 0 4.0727-1.8234 4.0727-4.0727Z"/>
<path fill="url(#b)" d="M58.1818 14.5193V4.07273C58.1818 1.82342 56.3584 0 54.1091 0H41.0164c-.1925 0-.3851.013964-.576.040727L3.49673 5.3184C1.49062 5.60465 0 7.32334 0 9.34982V25.0228c0 2.2499 1.824 4.0733 4.07389 4.0728l18.53851-.0047c.4375 0 .8721-.0704 1.2869-.2089l31.4979-10.4995c1.6629-.5544 2.7846-2.1108 2.7846-3.8638v.0006Z"/>
<path fill="#F0EB18" d="m58.182 15.9476-.0018-11.87545C58.1797 1.82342 56.3562 0 54.1075 0H42.6009c-1.1886 0-2.3185.519564-3.0924 1.42196L6.79872 39.5834c-.63243.7383-.98036 1.6786-.98036 2.6508v11.8755c0 2.2493 1.82342 4.0727 4.07273 4.0727H21.3994c1.1887 0 2.3186-.5196 3.0924-1.422L57.2016 18.599c.6331-.7383.9804-1.6786.9804-2.6514Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M22.8086 16.966h-5.7144v15.0099h5.7144c1.4222 0 2.6944-.3216 3.8167-.9649 1.1292-.6433 2.012-1.5278 2.6484-2.6668.6358-1.1522.954-2.4388.954-3.873 0-1.4342-.3182-2.7208-.954-3.8597-.6364-1.1396-1.5192-2.0373-2.6484-2.6806-1.1223-.6433-2.3945-.9649-3.8167-.9649Zm2.3159 11.8744c-.672.4021-1.4543.6031-2.348.6031l-2.7553-.0005v-9.9441h2.7553c.8931 0 1.676.201 2.348.6031.672.3889 1.1901.9649 1.5548 1.7156s.5468 1.6353.5468 2.6536c0 1.0184-.1821 1.9029-.5468 2.6536-.3647.7507-.8828 1.3268-1.5548 1.7156Z" clip-rule="evenodd"/>
<path fill="#fff" d="M34.3597 31.6411c.8438.402 1.8087.5898 2.8949.5898 1.0867 0 2.0522-.2016 2.8954-.6036.8437-.3889 1.4973-.9517 1.962-1.6485.4715-.7099.7076-1.5008.7076-2.3853 0-.7237-.1608-1.394-.4825-1.9971-.3216-.6163-.7719-1.1257-1.3509-1.541-.5715-.4285-1.2257-.7099-1.962-.8575l-2.5519-.5629c-.4647-.1069-.8329-.3079-1.1045-.5761-.2648-.2683-.3969-.6169-.3969-1.0322 0-.3618.0965-.6835.2895-.9517.1929-.2814.4612-.4957.8041-.6433.3503-.1608.7541-.2412 1.2113-.2412.4572 0 .861.0936 1.2114.2544.3572.1609.6323.3757.8253.6703.193.2947.2895.6163.2895.9782h2.927c-.0075-.8581-.2361-1.6221-.6864-2.2786-.4428-.657-1.0649-1.1797-1.8655-1.5548-.8007-.3618-1.726-.5491-2.734-.5491s-1.9087.1873-2.7019.5761c-.7932.3757-1.4112.9116-1.8546 1.595-.4428.683-.6645 1.4475-.6645 2.305 0 .7105.1464 1.3406.4394 1.9167.2935.5628.7041 1.0315 1.2331 1.4204.529.375 1.1511.6433 1.8656.8041l2.6484.5899c.5077.1206.904.3348 1.1901.6565.2929.3084.4394.7105.4394 1.1929 0 .3751-.1074.7237-.3217 1.0184-.2067.3084-.5037.5364-.8897.7105-.3791.1608-.8012.2544-1.3296.2544-.5285 0-.9971-.0936-1.4044-.2814-.4072-.1873-.7254-.4423-.954-.7771-.2286-.3217-.3429-.71-.3429-1.139h-2.9379c.0144.9115.2573 1.7288.7289 2.4393.479.7105 1.1367 1.2602 1.9729 1.6485Z"/>
<path fill="#fff" d="M16.9941 44.0009h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="56.3293" x2="2.87497" y1="-.39187" y2="24.3916" gradientUnits="userSpaceOnUse">
<stop offset=".1" stop-color="#3BEA62"/>
<stop offset=".59" stop-color="#F0EB18"/>
</linearGradient>
<linearGradient id="b" x1="4.06843" x2="62.664" y1="4.32252" y2="62.9181" gradientUnits="userSpaceOnUse">
<stop offset=".26" stop-color="#F0EB18"/>
<stop offset=".65" stop-color="#087CFA"/>
</linearGradient>
</defs>
<path fill="#3BEA62" d="M57.9994 16.4499V4.19128c0-2.30372-1.8869-4.161209-4.1906-4.124334L42.7659.243198c-1.1813.01875-2.2975.543121-3.0663 1.439982L6.99315 39.8415C6.35253 40.589 6 41.5415 6 42.5258V53.875C6 56.1531 7.84685 58 10.125 58h11.003c1.1894 0 2.3212-.5137 3.1043-1.4087l32.7465-37.4246c.6581-.7518 1.0206-1.7168 1.0206-2.7162v-.0006Z"/>
<path fill="url(#a)" d="M57.9999 14.9867V4.12495C57.9999 1.84685 56.1531 0 53.875 0H41.3095c-.2 0-.4.014372-.5981.043746L3.52681 5.49181C1.50121 5.78868 0 7.52616 0 9.57301V24.9703c0 2.2787 1.84751 4.1256 4.12623 4.125l18.50417-.0044c.4256 0 .8487-.0663 1.2537-.1956l31.2453-9.9786c1.7093-.5463 2.8699-2.135 2.8699-3.9294l.0006-.0006Z"/>
<path fill="url(#b)" d="M64.0002 59.8731V25.746c0-1.6581-.9931-3.1549-2.5206-3.7999L24.0588 6.14876c-.5181-.21875-1.0756-.32938-1.6381-.32438l-18.32855.15C1.82717 5.99313.000977 7.83436.000977 10.0993v17.6654c0 .8057.235597 1.5931.678092 2.2663L21.7876 62.14c.7624 1.1606 2.0581 1.8587 3.4468 1.8587h34.6408c2.2781 0 4.125-1.8469 4.125-4.125v-.0006Z"/>
<path fill="#000" d="M51.9995 12H12v39.9995h39.9995V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M16.9971 16.9922h5.713c1.4219 0 2.6956.3212 3.8212.9643 1.1256.6432 2.0063 1.5344 2.6419 2.6744.6356 1.14.9537 2.4275.9537 3.8643 0 1.4369-.3181 2.7244-.9537 3.8643-.6362 1.14-1.5169 2.0313-2.6419 2.6744-1.1256.6431-2.3993.9644-3.8212.9644h-5.713V16.9922Zm8.028 11.8761c.6719-.4 1.19-.9737 1.5544-1.7206.3643-.7469.5468-1.6306.5468-2.6531 0-1.0225-.1825-1.9062-.5468-2.6531-.3644-.7469-.8825-1.32-1.5544-1.7206-.6719-.4-1.4544-.6-2.3475-.6h-2.7549v9.9468h2.7549c.8931 0 1.6756-.1994 2.3475-.5994Z" clip-rule="evenodd"/>
<path fill="#fff" d="M32.9998 43.998H17v3h15.9998v-3Z"/>
<path fill="#fff" d="M35.6044 29.3614V16.9922h-2.9149v15.0061h10.0324v-2.6369h-7.1175Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,60 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<radialGradient id="a" cx="0" cy="0" r="1" gradientTransform="rotate(49.385 -18.029987 36.649084) scale(49.4299)" gradientUnits="userSpaceOnUse">
<stop offset=".026042" stop-color="#8DFDFD"/>
<stop offset=".270833" stop-color="#87FBFB"/>
<stop offset=".484416" stop-color="#74D6F4"/>
<stop offset=".931964" stop-color="#0038FF"/>
</radialGradient>
<radialGradient id="b" cx="0" cy="0" r="1" gradientTransform="rotate(132.274 3.919184 20.864728) scale(23.7857)" gradientUnits="userSpaceOnUse">
<stop stop-color="#0500FF" stop-opacity="0"/>
<stop offset="1" stop-color="#0100FF" stop-opacity=".15"/>
</radialGradient>
<radialGradient id="c" cx="0" cy="0" r="1" gradientTransform="rotate(42.678 -19.143042 44.644478) scale(41.8951)" gradientUnits="userSpaceOnUse">
<stop offset=".520394" stop-color="#FF00E5" stop-opacity="0"/>
<stop offset="1" stop-color="#FF00E5" stop-opacity=".65"/>
</radialGradient>
<radialGradient id="e" cx="0" cy="0" r="1" gradientTransform="matrix(30.00005 -22.00001 19.46596 26.54453 32.3943 42.4)" gradientUnits="userSpaceOnUse">
<stop offset=".777466" stop-color="#001AFF"/>
<stop offset="1" stop-color="#8ACEFF"/>
</radialGradient>
<radialGradient id="f" cx="0" cy="0" r="1" gradientTransform="matrix(14.91531 -8.80077 11.61873 19.69112 44.057 27.7156)" gradientUnits="userSpaceOnUse">
<stop offset=".71875" stop-color="#FA00FF" stop-opacity="0"/>
<stop offset="1" stop-color="#FF00D6" stop-opacity=".44"/>
</radialGradient>
<radialGradient id="h" cx="0" cy="0" r="1" gradientTransform="rotate(63.435 -9.856848 34.706598) scale(30.4105 69.8305)" gradientUnits="userSpaceOnUse">
<stop stop-color="#0D67A9"/>
<stop offset="1" stop-color="#AEDDFF"/>
</radialGradient>
<radialGradient id="j" cx="0" cy="0" r="1" gradientTransform="rotate(73.835 -3.838438 33.695644) scale(28.736 56.1739)" gradientUnits="userSpaceOnUse">
<stop stop-color="#0068C9"/>
<stop offset="1" stop-color="#fff"/>
</radialGradient>
<filter id="g" width="48.3057" height="34.5039" x="8.25781" y="24.2656" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur result="effect1_foregroundBlur_6490_3223" stdDeviation="1"/>
</filter>
<filter id="i" width="45.7057" height="31.9039" x="9.55781" y="25.5656" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur result="effect1_foregroundBlur_6490_3223" stdDeviation=".35"/>
</filter>
<linearGradient id="d" x1="63.9941" x2="37.1941" y1="33.6" y2="34.4" gradientUnits="userSpaceOnUse">
<stop stop-color="#FD3AF5"/>
<stop offset="1" stop-color="#FD3AF5" stop-opacity="0"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M63.9941 32c0 17.6731-14.3268 32-32 32C14.3211 64-.00586 49.6731-.00586 32c0-17.6731 14.32696-32 31.99996-32 8.306 3.75956 16.9952 17.7487 20.6338 22.1202 3.6389 4.3715 13.0573 9.8798 8.4414-1.6751 1.9681 3.1232 2.9248 8.3051 2.9248 11.5549Z"/>
<path fill="url(#b)" d="M63.9941 32c0 17.6731-14.3268 32-32 32C14.3211 64-.00586 49.6731-.00586 32c0-17.6731 14.32696-32 31.99996-32 8.306 3.75956 16.9952 17.7487 20.6338 22.1202 3.6389 4.3715 13.0573 9.8798 8.4414-1.6751 1.9681 3.1232 2.9248 8.3051 2.9248 11.5549Z"/>
<path fill="url(#c)" d="M63.9941 32c0 17.6731-14.3268 32-32 32C14.3211 64-.00586 49.6731-.00586 32c0-17.6731 14.32696-32 31.99996-32 8.306 3.75956 16.9952 17.7487 20.6338 22.1202 3.6389 4.3715 13.0573 9.8798 8.4414-1.6751 1.9681 3.1232 2.9248 8.3051 2.9248 11.5549Z"/>
<path fill="url(#d)" fill-opacity=".3" d="M63.9941 32c0 17.6731-14.3268 32-32 32C14.3211 64-.00586 49.6731-.00586 32c0-17.6731 14.32696-32 31.99996-32 8.306 3.75956 16.9952 17.7487 20.6338 22.1202 3.6389 4.3715 13.0573 9.8798 8.4414-1.6751 1.9681 3.1232 2.9248 8.3051 2.9248 11.5549Z"/>
<path fill="url(#e)" d="M61.0886 20.4758c-3.1529-5.3391-9.686-9.2821-17.5378-10.2688 2.2608 2.7375 4.3175 5.5453 6.0172 7.8664 1.2242 1.6711 2.2633 3.0899 3.0601 4.0469 3.6389 4.3711 13.0573 9.8797 8.4414-1.675.0063.0102.0127.0203.0191.0305Z"/>
<path fill="url(#f)" d="M61.0886 20.4758c-3.1529-5.3391-9.686-9.2821-17.5378-10.2688 2.2608 2.7375 4.3175 5.5453 6.0172 7.8664 1.2242 1.6711 2.2633 3.0899 3.0601 4.0469 3.6389 4.3711 13.0573 9.8797 8.4414-1.675.0063.0102.0127.0203.0191.0305Z"/>
<g filter="url(#g)">
<path fill="url(#h)" d="M29.3127 27.0066c12.113-2.5862 23.3196 1.8139 25.0306 9.8279 1.711 8.014-6.7214 16.6071-18.8343 19.1933C23.396 58.614 12.1894 54.214 10.4783 46.2c-1.711-8.014 6.7215-16.6072 18.8344-19.1934Z"/>
</g>
<g filter="url(#i)">
<path fill="url(#j)" fill-opacity=".2" fill-rule="evenodd" d="M48.9867 47.3643c3.1734-3.2337 4.5278-6.8744 3.8174-10.2012-.7102-3.3268-3.4332-6.0967-7.6507-7.7527-4.2039-1.6506-9.7148-2.1025-15.5122-.8645-5.7973 1.2377-10.6433 3.9007-13.8065 7.1243-3.1734 3.2339-4.5276 6.8744-3.8173 10.2012.7103 3.3267 3.4332 6.0968 7.6506 7.7527 4.2039 1.6506 9.7148 2.1024 15.5122.8647 5.7974-1.2377 10.6433-3.9009 13.8065-7.1245Zm-13.4778 8.6636c12.1128-2.5862 20.5452-11.1793 18.8343-19.1933-1.7112-8.0141-12.9177-12.4142-25.0305-9.828-12.1131 2.5862-20.54545 11.1795-18.8344 19.1935 1.711 8.0138 12.9176 12.414 25.0306 9.8278Z" clip-rule="evenodd"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="63.6351" x2="39.318" y1="54.0451" y2="1.59593" gradientUnits="userSpaceOnUse">
<stop offset=".24" stop-color="#00D886"/>
<stop offset=".51" stop-color="#007DFE"/>
</linearGradient>
<linearGradient id="b" x1="59.3792" x2=".674325" y1="4.38051" y2="63.0854" gradientUnits="userSpaceOnUse">
<stop offset=".27" stop-color="#007DFE"/>
<stop offset=".7" stop-color="#D249FC"/>
</linearGradient>
</defs>
<path fill="#00D886" d="m48.0521 58.18 11.8755-.0017c2.2493 0 4.0722-1.8234 4.0722-4.0727V42.599c0-1.1887-.5196-2.3186-1.422-3.0924L24.4164 6.79677c-.7384-.63244-1.6786-.98036-2.6508-.98036H9.89011c-2.24931 0-4.07273 1.82341-4.07273 4.07272V21.3975c0 1.1887.51957 2.3185 1.42197 3.0924L45.4002 57.1991c.7383.633 1.6786.9804 2.6514.9804l.0005.0005Z"/>
<path fill="url(#a)" d="M49.4806 58.1818h10.4465c2.2493 0 4.0728-1.8234 4.0728-4.0727V41.0164c0-.1925-.014-.3851-.0408-.576L58.6815 3.49673C58.3952 1.49062 56.6765 0 54.65 0H38.977c-2.2499 0-4.0733 1.824-4.0727 4.07389l.0047 18.53851c0 .4375.0704.8721.2088 1.2869l10.4995 31.4979c.5545 1.6629 2.1109 2.7846 3.8639 2.7846h-.0006Z"/>
<path fill="url(#b)" d="M4.07273 64H38.041c1.6291 0 3.1017-.9711 3.7434-2.4681l16.0681-37.4906c.217-.5068.3293-1.0531.3293-1.6046V4.07273C58.1818 1.82342 56.3584 0 54.1091 0h-17.966c-.8046 0-1.5912.238545-2.2609.685382L1.81353 22.0881C.681309 22.8439.001745 24.1146.001745 25.4755L0 59.9273C0 62.1766 1.82342 64 4.07273 64Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" d="M19.764 31.6245c1.174.6765 2.4847 1.0155 3.9318 1.0155 1.3899 0 2.6427-.3095 3.7589-.9293 1.1231-.6197 2.005-1.4651 2.6461-2.5384.6481-1.0798.9721-2.2857.9721-3.6183v-1.1879h-6.405v2.3221h3.516c-.0722.5605-.2761 1.0718-.6106 1.5339-.3958.5468-.9322.9762-1.6092 1.2852-.6701.3096-1.4188.4646-2.2469.4646-.8928 0-1.6988-.2227-2.4193-.6695-.7204-.4467-1.2857-1.0583-1.6959-1.836-.4034-.784-.6047-1.667-.6047-2.6461 0-.979.2013-1.858.6047-2.6357.4108-.7846.9761-1.4003 1.6959-1.847.7199-.4467 1.5265-.6695 2.4193-.6695.6053 0 1.1706.0972 1.696.2916.526.1875.9831.4577 1.372.8101.3958.3455.7094.7563.9397 1.2314h3.1542c-.2737-.9866-.7529-1.8575-1.4368-2.6137-.677-.7563-1.5126-1.3436-2.5061-1.7608-.9866-.4172-2.0669-.6267-3.2404-.6267-1.4477 0-2.7583.3414-3.9318 1.0259-1.1741.6765-2.0959 1.6133-2.7653 2.8082-.6695 1.1879-1.0046 2.5165-1.0046 3.9856 0 1.4692.3351 2.8018 1.0046 3.9967.67 1.1879 1.5918 2.1236 2.7653 2.8081Z"/>
<path fill="#fff" fill-rule="evenodd" d="M36.1829 31.6245c1.181.6765 2.4951 1.0155 3.9422 1.0155 1.4541 0 2.7688-.339 3.9423-1.0155 1.181-.6845 2.1062-1.6202 2.7757-2.8081.6695-1.1949 1.0045-2.5275 1.0045-3.9967 0-1.4691-.335-2.7977-1.0045-3.9856-.6695-1.1949-1.5947-2.1317-2.7757-2.8082C42.8939 17.3414 41.5723 17 40.1251 17c-1.4471 0-2.7612.3414-3.9422 1.0259-1.1735.6765-2.0988 1.6133-2.7758 2.8082-.6695 1.1879-1.0045 2.5165-1.0045 3.9856 0 1.4692.335 2.8018 1.0045 3.9967.6765 1.1879 1.6023 2.1236 2.7758 2.8081Zm6.3621-2.2463c-.7129.4468-1.516.6695-2.4089.6695-.8928 0-1.6994-.2227-2.4193-.6695-.7128-.4536-1.2747-1.0756-1.685-1.8684-.4033-.7991-.6046-1.696-.6046-2.6895 0-.9935.2013-1.8858.6046-2.6785.4103-.7991.9722-1.4217 1.685-1.8684.7199-.4537 1.5265-.6805 2.4193-.6805.8929 0 1.696.2268 2.4089.6805.7129.4467 1.2707 1.0693 1.674 1.8684.4033.7921.6047 1.685.6047 2.6785s-.2014 1.8904-.6047 2.6895c-.4033.7922-.9611 1.4148-1.674 1.8684Z" clip-rule="evenodd"/>
<path fill="#fff" d="M16.9941 44h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

19
static/icons/Hub_icon.svg Normal file
View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="59.6763" x2="1.08" y1="4.0675" y2="62.6638" gradientUnits="userSpaceOnUse">
<stop offset=".25" stop-color="#7256FF"/>
<stop offset=".73" stop-color="#00C4F4"/>
</linearGradient>
<linearGradient id="b" x1="64.3912" x2="39.6074" y1="56.3294" y2="2.87437" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#F0EB18"/>
<stop offset=".58" stop-color="#7256FF"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M4.125 64h34.1275c1.6581 0 3.155-.9931 3.8-2.5206L57.85 24.0581c.2187-.5181.3294-1.0756.3244-1.6381l-.15-18.32875C58.0063 1.82625 56.165 0 53.9 0H36.2344c-.8057 0-1.5932.235625-2.2663.678125L1.85938 21.7869C.69875 22.55 0 23.845 0 25.2337V59.875C0 62.1531 1.84687 64 4.125 64Z"/>
<path fill="url(#b)" d="M49.0131 58h10.8618c2.2781 0 4.125-1.8469 4.125-4.125V41.3094c0-.2-.0144-.4-.0437-.5981L58.508 3.52688C58.2118 1.50125 56.4743 0 54.4268 0H39.0293c-2.2788 0-4.1256 1.8475-4.125 4.12625l.0044 18.50435c0 .4256.0662.8488.1956 1.2538L45.083 55.13c.5463 1.7094 2.135 2.87 3.9294 2.87h.0007Z"/>
<path fill="#F0EB18" d="M47.55 58h12.2588c2.3037 0 4.1612-1.8869 4.1243-4.1906L64 43c-.0188-1.1812-.7862-2.5312-1.6831-3.3L24.1588 6.99312C23.4113 6.3525 22.4587 6 21.4744 6H10.125C7.84687 6 6 7.84687 6 10.125v11.0031c0 1.1894.51375 2.3213 1.40875 3.1044L44.8338 56.9794C45.5856 57.6375 46.5506 58 47.55 58Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M43.3874 18.9009c-.4069-.6006-.9769-1.0681-1.7094-1.4043-.7331-.3357-1.5668-.5044-2.5031-.5044h-6.5168v15.0062h6.6456c.9862 0 1.865-.1768 2.6368-.5306.7719-.3537 1.3719-.845 1.8007-1.4737.4287-.6288.6431-1.3469.6431-2.1544 0-.7431-.1713-1.4075-.5144-1.9938-.3431-.5862-.8219-1.0418-1.4362-1.3668-.2558-.1353-.5264-.2425-.812-.3215.2163-.0644.4228-.1464.6195-.246.5575-.2819.9893-.6807 1.2968-1.195.3069-.5144.4607-1.1075.4607-1.7794 0-.7569-.2038-1.4363-.6113-2.0363Zm-2.6256 3.4188c-.1863.3075-.4488.5431-.7881.7075-.3394.165-.7307.2469-1.1738.2469h-3.2906v-3.9982h3.2906c.4431 0 .8344.0819 1.1738.2463.3393.1644.6025.395.7881.6912.1856.2963.2788.6444.2788 1.045 0 .4007-.0932.7538-.2788 1.0613Zm-1.8331 7.3962h-3.4194v-4.2243h3.4194c.4856 0 .9143.0893 1.2862.2681.3719.1787.6594.4325.8631.7612.2038.3288.3057.6932.3057 1.115 0 .4219-.1019.7882-.3057 1.0988-.2037.3112-.4918.5525-.8631.7237-.3719.1719-.8006.2575-1.2862.2575Z" clip-rule="evenodd"/>
<path fill="#fff" d="M16.998 16.9928h2.9263v6.0344h6.4419v-6.0344h2.9262v15.0063h-2.9262v-6.335h-6.4419v6.335H16.998V16.9928Z"/>
<path fill="#fff" d="M33.0005 43.9991h-16v3h16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="-.717383" x2="24.1455" y1="7.61946" y2="61.2456" gradientUnits="userSpaceOnUse">
<stop offset=".1" stop-color="#FC801D"/>
<stop offset=".59" stop-color="#FE2857"/>
</linearGradient>
<linearGradient id="b" x1="4.22243" x2="62.9273" y1="60.0186" y2="1.31316" gradientUnits="userSpaceOnUse">
<stop offset=".21" stop-color="#FE2857"/>
<stop offset=".7" stop-color="#007EFF"/>
</linearGradient>
</defs>
<path fill="#FF8100" d="m15.9476 5.81641-11.87545.00174C1.82284 5.81815 0 7.64157 0 9.89088V21.3975c0 1.1887.519564 2.3185 1.42196 3.0924L39.5828 57.1997c.7384.6324 1.6786.9803 2.6508.9803h11.8755c2.2493 0 4.0727-1.8234 4.0727-4.0727V42.599c0-1.1887-.5195-2.3186-1.4219-3.0924L18.599 6.79735c-.7383-.63302-1.6786-.98036-2.6514-.98036v-.00058Z"/>
<path fill="url(#a)" d="M14.5193 5.81641H4.07273C1.82342 5.81641 0 7.63982 0 9.88913V22.9818c0 .1926.013964.3852.040727.576L5.31782 60.5015c.28683 2.0067 2.00494 3.4967 4.032 3.4967H25.0228c2.2499 0 4.0733-1.824 4.0728-4.0739l-.0047-18.5384c0-.4376-.0704-.8722-.2089-1.287L18.3825 8.60099c-.5544-1.66284-2.1108-2.78458-3.8638-2.78458h.0006Z"/>
<path fill="url(#b)" d="M59.9275 0H25.9592c-1.6291 0-3.1017.971054-3.7435 2.46807L6.14767 39.9587c-.21702.5068-.32931 1.0531-.32931 1.6046v18.364C5.81836 62.1766 7.64178 64 9.89109 64H27.8571c.8046 0 1.5912-.2385 2.2609-.6854l32.0687-21.4033c1.1322-.7552 1.8117-2.0265 1.8117-3.3874l.0018-34.45117C64.0002 1.82342 62.1768 0 59.9275 0Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" d="M17 29.3856h2.9788v-9.7712H17V17h8.839v2.6144h-2.9788v9.7712h2.9788V32H17v-2.6144Z"/>
<path fill="#fff" d="M27.3389 29.3002h2.1538c.4354 0 .8233-.0928 1.1625-.2784.3392-.1857.6016-.4481.7872-.7873.1857-.3392.2785-.7265.2785-1.1625V17h2.9249v10.2748c0 .9001-.2074 1.7092-.6216 2.4271-.4143.7179-.9855 1.2805-1.7143 1.6873-.7288.4074-1.5464.6108-2.4534.6108h-2.5176v-2.6998Z"/>
<path fill="#fff" d="M17 44h16v3H17v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,22 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="none" viewBox="0 0 48 48">
<defs>
<linearGradient id="a" x1="-1.26516" x2="47.3428" y1=".984" y2="17.184" gradientUnits="userSpaceOnUse">
<stop stop-color="#6B57FF"/>
<stop offset="1" stop-color="#0094FF"/>
</linearGradient>
<linearGradient id="b" x1="40.8868" x2="12.6468" y1="28.88" y2=".64" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF45ED"/>
<stop offset="1" stop-color="#6B57FF"/>
</linearGradient>
<linearGradient id="c" x1="12.3185" x2="46.8644" y1="12.3185" y2="46.8644" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF45ED"/>
<stop offset=".644276" stop-color="#6B57FF"/>
<stop offset="1" stop-color="#087CFA"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M47.9828 0H.006836v18.808H47.9828V0Z"/>
<path fill="url(#b)" d="M.006836 23 24.0068 48l23.976-25V0l-23.976 27.088L.006836 0v23Z"/>
<path fill="url(#c)" d="M0 48h48V0H0v48Z"/>
<path fill="#000" d="M0 48V0l24 18v30H0Z"/>
<path fill="#fff" d="M5 43h14v-3H5v3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="none" viewBox="0 0 48 48">
<defs>
<radialGradient id="a" cx="0" cy="0" r="1" gradientTransform="matrix(-48 0 0 -48 48 0)" gradientUnits="userSpaceOnUse">
<stop stop-color="#E44857"/>
<stop offset=".504494" stop-color="#C711E1"/>
<stop offset="1" stop-color="#7F52FF"/>
</radialGradient>
</defs>
<path fill="url(#a)" d="M48 48H0V0h48L23.505 23.6475 48 48Z"/>
</svg>

After

Width:  |  Height:  |  Size: 466 B

View File

@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="none" viewBox="0 0 48 48">
<defs>
<linearGradient id="a" x1="1" x2="31" y1="17" y2="47" gradientUnits="userSpaceOnUse">
<stop stop-color="#6B57FF"/>
<stop offset=".498854" stop-color="#FF45ED"/>
<stop offset="1" stop-color="#DD1265"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="m47.9995 31.9981-16.002 16.002L0 15.996 16.002 0l31.9975 31.9981Z"/>
<path fill="#000" d="M32.0098 15.9961h-16.002v16.002h16.002v-16.002Z"/>
</svg>

After

Width:  |  Height:  |  Size: 536 B

26
static/icons/MPS_icon.svg Normal file
View File

@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="none" viewBox="0 0 48 48">
<defs>
<linearGradient id="a" x1="36.336" x2="-9.336" y1="63.8" y2="5.296" gradientUnits="userSpaceOnUse">
<stop offset=".06" stop-color="#087CFA"/>
<stop offset=".87" stop-color="#21D789"/>
</linearGradient>
<linearGradient id="b" x1="61.2405" x2="15.5605" y1="44.36" y2="-14.144" gradientUnits="userSpaceOnUse">
<stop offset=".05" stop-color="#087CFA"/>
<stop offset=".18" stop-color="#0A83F0"/>
<stop offset=".39" stop-color="#0F98D6"/>
<stop offset=".67" stop-color="#19BAAC"/>
<stop offset=".87" stop-color="#21D789"/>
</linearGradient>
<linearGradient id="c" x1="27.2805" x2="43.9045" y1="37.016" y2="-7.688" gradientUnits="userSpaceOnUse">
<stop offset=".12" stop-color="#21D789"/>
<stop offset=".36" stop-color="#6AE273"/>
<stop offset=".58" stop-color="#A8EB61"/>
<stop offset=".77" stop-color="#D5F254"/>
<stop offset=".92" stop-color="#F1F64C"/>
<stop offset="1" stop-color="#FCF84A"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M0 48h48L23.896 23.936 0 0v48Z"/>
<path fill="url(#b)" d="m48.0005 48-24.104-24.064L48.0005 0v48Z"/>
<path fill="url(#c)" d="m35.9285 35.928-12.032-11.992L48.0005 0l-12.072 35.928Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="56.3788" x2="2.75258" y1="-.717381" y2="24.146" gradientUnits="userSpaceOnUse">
<stop offset=".16" stop-color="#D249FC"/>
<stop offset=".55" stop-color="#FF2D90"/>
</linearGradient>
<linearGradient id="b" x1="3.98196" x2="62.6868" y1="4.22048" y2="62.9259" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#FF2D90"/>
<stop offset=".7" stop-color="#7256FF"/>
</linearGradient>
</defs>
<path fill="#D249FC" d="m58.182 15.9476-.0018-11.87545C58.1797 1.82342 56.3562 0 54.1075 0H42.6009c-1.1886 0-2.3185.519564-3.0924 1.42196L6.79872 39.5834c-.63243.7383-.98036 1.6786-.98036 2.6508v11.8755c0 2.2493 1.82342 4.0727 4.07273 4.0727H21.3994c1.1887 0 2.3186-.5196 3.0924-1.422L57.2011 18.599c.633-.7383.9803-1.6786.9803-2.6514h.0006Z"/>
<path fill="url(#a)" d="M58.1818 14.5193V4.07273C58.1818 1.82342 56.3584 0 54.1091 0H41.0164c-.1925 0-.3851.013964-.576.040727L3.49673 5.3184C1.49062 5.60465 0 7.32334 0 9.34982V25.0228c0 2.2499 1.824 4.0733 4.07389 4.0728l18.53851-.0047c.4375 0 .8721-.0704 1.2869-.2089l31.4979-10.4995c1.6629-.5544 2.7846-2.1108 2.7846-3.8638v.0006Z"/>
<path fill="url(#b)" d="M64 59.9255V25.9572c0-1.6291-.9711-3.1017-2.4681-3.7434L24.0413 6.14572c-.5068-.21702-1.0531-.32931-1.6046-.32931H4.07273C1.82342 5.81641 0 7.63982 0 9.88913V27.8551c0 .8047.238545 1.5913.685382 2.2609L22.0887 62.1847c.7552 1.1322 2.0265 1.8118 3.3874 1.8118l34.4512.0017c2.2493 0 4.0727-1.8234 4.0727-4.0727Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M23.2922 17.3302h-6.2969v14.6705h2.8607v-5.5436h3.3532c1.0475 0 1.9665-.1887 2.7558-.5659.7966-.384 1.4079-.9223 1.834-1.614.4328-.6916.6495-1.5089.6495-2.41 0-.901-.2133-1.6936-.6394-2.3785-.4194-.6849-1.02-1.2154-1.8026-1.5926-.7826-.3773-1.6875-.5659-2.7143-.5659Zm1.0683 6.4867c-.3564.1746-.7752.2622-1.2574.2622h-3.2487v-4.3698h3.2487c.4822 0 .901.0904 1.2574.2723.3633.174.6423.4255.8382.7545.1959.3205.2936.7124.2936 1.1525 0 .4401-.0983.828-.2936 1.1632-.1954.3289-.4749.5832-.8382.7651Z" clip-rule="evenodd"/>
<path fill="#fff" d="M32.1424 31.6762c.8594.384 1.8267.5765 2.9029.5765 1.0823 0 2.0529-.192 2.9124-.5759.8595-.384 1.5297-.9184 2.012-1.6033.4822-.6916.723-1.4776.723-2.3578 0-.7124-.1538-1.3687-.4609-1.9699-.307-.608-.7438-1.1149-1.3097-1.5196-.5585-.4048-1.2047-.6743-1.9384-.8067l-2.913-.5451c-.4614-.0904-.8213-.2729-1.0795-.5451-.2588-.279-.3879-.6221-.3879-1.0268 0-.3497.1049-.6563.3143-.9223.2094-.2729.503-.4862.8803-.6395.3772-.1532.7932-.2307 1.2681-.2307.475 0 .901.0797 1.2783.2408.3772.1533.6708.3706.8802.6496.2167.279.3251.6012.3251.9638h2.8607c-.0067-.8381-.2442-1.578-.7123-2.2213-.4609-.6501-1.1003-1.157-1.9177-1.5197-.8106-.3632-1.7324-.5451-2.7457-.5451-1.0133 0-1.925.1847-2.735.5552-.8039.3711-1.436.887-1.8969 1.5511-.4542.6641-.681 1.4214-.681 2.2742 0 .6916.1398 1.3203.4194 1.8862.2795.5591.6775 1.0268 1.1946 1.404.5237.3705 1.1384.622 1.8441.7545l3.0073.5765c.4957.0983.8836.3077 1.1632.6288.2863.3143.4294.7062.4294 1.1738 0 .3773-.1151.7124-.3458 1.006-.2301.2936-.5518.5238-.9639.6916-.4053.1611-.8662.2408-1.3832.2408-.5445 0-1.0341-.0903-1.4669-.2722-.4266-.1819-.7651-.4334-1.0166-.7545-.2442-.3284-.3666-.7017-.3666-1.1211h-2.8715c.0141.8949.2656 1.6909.7545 2.3892.489.6917 1.1632 1.23 2.0227 1.614Z"/>
<path fill="#fff" d="M16.9941 44.0015h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="none" viewBox="0 0 48 48"><defs><linearGradient id="code-with-me_svg__a" x1="3.679" x2="44.503" y1="5.32" y2="42.84" gradientUnits="userSpaceOnUse"><stop stop-color="#3BEA62"/><stop offset="1" stop-color="#6B57FF"/></linearGradient></defs><path fill="url(#code-with-me_svg__a)" d="M.007 0v36h18l9-36h-27Zm15 30h-9v-6h10.2l-1.2 6Zm15-18-9 36h27V12h-18Zm12 30h-13.8l1.8-6h12v6Z"/></svg>

After

Width:  |  Height:  |  Size: 453 B

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="7.62141" x2="61.2476" y1="64.7192" y2="39.8558" gradientUnits="userSpaceOnUse">
<stop offset=".1" stop-color="#00D886"/>
<stop offset=".59" stop-color="#F0EB18"/>
</linearGradient>
<linearGradient id="b" x1="60.0186" x2="1.31317" y1="59.7778" y2="1.07229" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#F0EB18"/>
<stop offset=".7" stop-color="#00C4F4"/>
</linearGradient>
</defs>
<path fill="#00D886" d="m5.81934 48.0512.00174 11.8755c0 2.2493 1.82342 4.0721 4.07273 4.0721H21.4004c1.1887 0 2.3186-.5196 3.0924-1.422L57.202 24.4154c.6325-.7383.9804-1.6786.9804-2.6508V9.88913c0-2.24931-1.8234-4.07272-4.0727-4.07272H42.6013c-1.1887 0-2.3185.51956-3.0924 1.42196L6.7997 45.3998c-.63302.7384-.98036 1.6786-.98036 2.6514Z"/>
<path fill="url(#a)" d="M5.81836 49.4825v10.4466c0 2.2493 1.82342 4.0727 4.07273 4.0727H22.9837c.1926 0 .3852-.0139.576-.0407l36.9438-5.2771c2.0066-.2868 3.4967-2.0049 3.4967-4.032V38.979c0-2.2499-1.824-4.0733-4.0739-4.0727l-18.5385.0046c-.4375 0-.8721.0704-1.287.2089L8.60294 45.6193c-1.66284.5544-2.78458 2.1108-2.78458 3.8638v-.0006Z"/>
<path fill="url(#b)" d="M0 4.07273V38.041c0 1.6291.971054 3.1017 2.46807 3.7434L39.9587 57.8525c.5068.217 1.0531.3293 1.6046.3293h18.364c2.2493 0 4.0727-1.8234 4.0727-4.0727v-17.966c0-.8046-.2385-1.5912-.6854-2.2609L41.9119 1.81353C41.1561.681309 39.8854.001745 38.5245.001745L4.07273 0C1.82342 0 0 1.82342 0 4.07273Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M23.5363 16.9676h-6.4407v15.0055h2.9261v-5.6702h3.4296c1.0715 0 2.0115-.1929 2.8188-.5788.8148-.3927 1.4401-.9434 1.8759-1.6508.4427-.7074.6643-1.5434.6643-2.465 0-.9216-.2182-1.7324-.654-2.4329-.4289-.7005-1.0433-1.2431-1.8437-1.629-.8005-.3859-1.7261-.5788-2.7763-.5788Zm1.0927 6.6349c-.3646.1785-.7929.2681-1.2862.2681h-3.3229v-4.4695h3.3229c.4933 0 .9216.0924 1.2862.2784.3715.178.6569.4353.8573.7718.2004.3278.3003.7286.3003 1.1788 0 .4502-.1005.8469-.3003 1.1897-.1998.3365-.4858.5966-.8573.7827Z" clip-rule="evenodd"/>
<path fill="#fff" d="M33.3821 31.2232c1.1651.6713 2.4656 1.0077 3.9017 1.0077v-.0011c1.2144 0 2.3295-.2251 3.3441-.6753 1.0146-.4501 1.8575-1.0783 2.5294-1.8862.6787-.8148 1.1328-1.7473 1.3614-2.7975H41.453c-.2004.5426-.5001 1.0221-.9003 1.4361-.3933.4076-.8688.7223-1.4257.9434-.557.221-1.1645.3324-1.822.3324-.886 0-1.6864-.221-2.4007-.6643-.7149-.4433-1.2759-1.0502-1.683-1.8219-.4002-.7781-.6-1.6543-.6-2.6259 0-.9715.1998-1.8437.6-2.6154.4077-.7786.9681-1.3896 1.683-1.8329.7143-.4432 1.5147-.6643 2.4007-.6643.6569 0 1.2644.1114 1.822.3325.5575.221 1.0324.5397 1.4257.9537.4002.4077.6999.8831.9003 1.4257h3.0657c-.2291-1.0502-.6827-1.9787-1.3614-2.7866-.6719-.8147-1.5148-1.4469-2.5294-1.8971-1.0146-.4502-2.1297-.6753-3.3441-.6753-1.4367 0-2.7372.3388-3.9017 1.0181-1.165.6712-2.0797 1.6009-2.7441 2.7866-.6643 1.1788-.9968 2.4972-.9968 3.955 0 1.4579.3325 2.7803.9968 3.966.6649 1.1789 1.5791 2.1073 2.7441 2.7866Z"/>
<path fill="#fff" d="M16.9941 44.001h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="64.3912" x2="39.6074" y1="56.3294" y2="2.875" gradientUnits="userSpaceOnUse">
<stop offset=".1" stop-color="#7256FF"/>
<stop offset=".59" stop-color="#FF2D90"/>
</linearGradient>
<linearGradient id="b" x1="59.6763" x2="1.08" y1="4.0675" y2="62.6638" gradientUnits="userSpaceOnUse">
<stop offset=".21" stop-color="#FF2D90"/>
<stop offset=".7" stop-color="#FF8200"/>
</linearGradient>
</defs>
<path fill="#7256FF" d="M47.55 58h12.2588c2.3037 0 4.1612-1.8869 4.1243-4.1906l-.1762-11.0431c-.0188-1.1813-.5431-2.2975-1.44-3.0663L24.1588 6.99312C23.4113 6.3525 22.4587 6 21.4744 6H10.125C7.84687 6 6 7.84687 6 10.125v11.0031c0 1.1894.51375 2.3213 1.40875 3.1044L44.8338 56.9794C45.5856 57.6375 46.5506 58 47.55 58Z"/>
<path fill="url(#a)" d="M49.0131 58h10.8618c2.2781 0 4.125-1.8469 4.125-4.125V41.3094c0-.2-.0144-.4-.0437-.5981L58.508 3.52688C58.2112 1.50125 56.4737 0 54.4268 0H39.0293c-2.2788 0-4.1256 1.8475-4.125 4.12625l.0044 18.50435c0 .4256.0662.8488.1956 1.2538L45.083 55.13c.5463 1.7094 2.135 2.87 3.9294 2.87h.0007Z"/>
<path fill="url(#b)" d="M4.125 64h34.1275c1.6581 0 3.155-.9931 3.8-2.5206L57.85 24.0581c.2187-.5181.3294-1.0756.3244-1.6381l-.15-18.32875C58.0056 1.82625 56.1644 0 53.8994 0H36.2337c-.8056 0-1.5931.235625-2.2662.678125L1.85938 21.7869C.69875 22.55 0 23.845 0 25.2337V59.875C0 62.1531 1.84687 64 4.125 64Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M19.943 31.2425c-1.1681-.675-2.0868-1.6044-2.755-2.7869-.6681-1.1825-1.0025-2.5025-1.0025-3.9606s.3338-2.7781 1.0025-3.9606c.6682-1.1825 1.5863-2.1119 2.755-2.7869 1.1682-.675 2.4744-1.0131 3.9175-1.0131 1.4432 0 2.7388.3375 3.9069 1.0131 1.1681.675 2.085 1.6044 2.7494 2.7869.6644 1.1825.9969 2.5025.9969 3.9606s-.3325 2.7781-.9969 3.9606-1.5813 2.1119-2.7494 2.7869c-.7626.4407-1.5824.7377-2.4594.8909v.0678c0 .2213.0432.4126.1288.5732.0856.1606.2087.2825.37.3643.1606.0819.3519.1232.5737.1232h1.8332v2.165h-2.4119c-.6506 0-1.22-.1269-1.7094-.3807l-.0006.0013c-.4894-.2538-.865-.6131-1.1256-1.0775-.2613-.4644-.3913-1.0112-.3913-1.64l-.0009-.1697c-.9418-.1436-1.8212-.4495-2.631-.9178Zm6.3082-2.2294c.7075-.4462 1.2612-1.065 1.6612-1.8543.4-.7894.6-1.6775.6-2.6638 0-.9862-.2-1.8737-.6-2.6638-.4-.7893-.9537-1.4075-1.6612-1.8543-.7075-.4463-1.5044-.67-2.39-.67-.8857 0-1.6844.2231-2.3957.67-.7112.4468-1.2687 1.065-1.6718 1.8543-.4038.7894-.6057 1.6776-.6057 2.6638 0 .9863.2019 1.8744.6057 2.6638.4037.7893.9612 1.4081 1.6718 1.8543.7113.4469 1.5094.67 2.3957.67.8862 0 1.6831-.2231 2.39-.67Z" clip-rule="evenodd"/>
<path fill="#fff" d="M32.9937 43.9981h-16v3h16v-3Z"/>
<path fill="#fff" fill-rule="evenodd" d="M39.7887 16.9919h-5.7132v15.0062h5.7132c1.4218 0 2.6956-.3212 3.8212-.9643 1.125-.6432 2.0056-1.5344 2.6419-2.6744.6356-1.14.9537-2.4275.9537-3.8644 0-1.4369-.3181-2.7244-.9537-3.8644-.6356-1.14-1.5163-2.0312-2.6419-2.6744-1.1256-.6431-2.3994-.9643-3.8212-.9643Zm3.87 10.1556c-.3644.7469-.8825 1.3206-1.5544 1.7206-.6719.4-1.4544.5994-2.3475.5994h-2.755v-9.9469h2.755c.8931 0 1.6756.2 2.3475.6.6719.4006 1.19.9738 1.5544 1.7206.3643.7469.5468 1.6307.5468 2.6532s-.1825 1.9062-.5468 2.6531Z" clip-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="-.390625" x2="24.3925" y1="7.67063" y2="61.1256" gradientUnits="userSpaceOnUse">
<stop offset=".19" stop-color="#FF45ED"/>
<stop offset=".54" stop-color="#FF0A67"/>
</linearGradient>
<linearGradient id="b" x1="4.32509" x2="62.9207" y1="59.9325" y2="1.33625" gradientUnits="userSpaceOnUse">
<stop offset=".26" stop-color="#FF0A67"/>
<stop offset=".65" stop-color="#FDB60D"/>
</linearGradient>
</defs>
<path fill="#FF45ED" d="M16.4501 6H4.19132C1.88757 6 .03007 7.88688.066946 10.1906l.17625 11.0431C.261946 22.415.786321 23.5312 1.6832 24.3l38.1587 32.7069c.7475.6406 1.7.9931 2.6844.9931h11.3494c2.2781 0 4.125-1.8469 4.125-4.125V42.8719c0-1.1894-.5138-2.3213-1.4088-3.1044L19.1663 7.02063C18.4144 6.3625 17.4494 6 16.4501 6Z"/>
<path fill="url(#a)" d="M14.9875 6H4.125C1.84687 6 0 7.84687 0 10.125v12.5656c0 .2.014375.4.04375.5981l5.44813 37.1851c.29687 2.0256 2.03437 3.5268 4.08124 3.5268H24.9706c2.2788 0 4.1256-1.8475 4.125-4.1262L29.0912 41.37c0-.4256-.0662-.8488-.1956-1.2538L18.9169 8.87062c-.5463-1.70937-2.135-2.86999-3.9294-2.86999V6Z"/>
<path fill="url(#b)" d="M59.8757 0H25.7482c-1.6581 0-3.155.993125-3.8 2.52063L6.15071 39.9419c-.21875.5181-.32938 1.0756-.32438 1.6381l.15 18.3287C5.99508 62.1737 7.83633 64 10.1013 64H27.767c.8056 0 1.5931-.2356 2.2662-.6781l32.1094-21.1088c1.1606-.7625 1.8587-2.0581 1.8587-3.4468V4.125c0-2.27813-1.8468-4.125-4.125-4.125h-.0006Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" d="M44.4186 15.9883v3.6244h3.5819v2.1806h-3.5819v3.6381h-2.2644V21.807h-3.5819v-2.1806h3.5819v-3.6381h2.2644Z"/>
<path fill="#fff" d="M34.1986 22.5564h2.2643v3.6244h3.5819v2.1806h-3.5819v3.6381h-2.2643v-3.6243h-3.5819v-2.1807h3.5819v-3.6381Z"/>
<path fill="#fff" fill-rule="evenodd" d="M17.0039 16.9939h6.4419c1.0506 0 1.9756.1931 2.7762.5787.8.3857 1.4169.9288 1.8488 1.6294.4325.7006.6487 1.5113.6487 2.4331 0 .9219-.22 1.7488-.6593 2.46-.4394.7113-1.065 1.2613-1.8757 1.6507-.2232.1071-.4563.1995-.6992.2772l3.5555 5.9778h-3.355l-3.2351-5.6707h-2.5205v5.67h-2.9263V16.9939Zm7.5406 6.63c.3682-.1825.6519-.4431.8519-.7825.2-.3394.3-.7344.3-1.1844 0-.45-.1-.8519-.3-1.1844-.2-.3325-.4844-.5893-.8519-.7718-.3681-.1825-.7987-.2732-1.2918-.2732h-3.3232v4.47h3.3232c.4931 0 .9237-.0918 1.2918-.2737Z" clip-rule="evenodd"/>
<path fill="#fff" d="M33.0068 44.0002h-16v3h16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="4.32412" x2="62.9198" y1="59.9325" y2="1.33686" gradientUnits="userSpaceOnUse">
<stop offset=".29" stop-color="#FF45ED"/>
<stop offset=".7" stop-color="#FF0A67"/>
</linearGradient>
<linearGradient id="b" x1="-.390622" x2="24.3929" y1="7.67061" y2="61.1251" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#FDB60D"/>
<stop offset=".54" stop-color="#FF45ED"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M59.8748 0H25.7477c-1.6581 0-3.155.993115-3.8 2.5206L6.14973 39.9415c-.21875.5181-.32937 1.0756-.32437 1.6381l.15 18.3286c.01875 2.2649 1.85998 4.0912 4.12494 4.0912h17.6655c.8056 0 1.5931-.2356 2.2662-.6781l32.1091-21.1086c1.1606-.7625 1.8587-2.0581 1.8587-3.4468V4.12496C63.9998 1.84686 62.1529 0 59.8748 0Z"/>
<path fill="url(#b)" d="M14.9874 6H4.12496C1.84686 6 0 7.84686 0 10.125v12.5655c0 .2.014375.4.04375.5981l5.44807 37.1846c.29687 2.0256 2.03436 3.5269 4.08121 3.5269H24.9704c2.2787 0 4.1256-1.8475 4.1249-4.1263l-.0043-18.5041c0-.4257-.0663-.8488-.1957-1.2538L18.9167 8.8706c-.5463-1.70936-2.135-2.86997-3.9293-2.86997V6Z"/>
<path fill="#FDB60D" d="M16.4498 6H4.19121C1.88748 6 .03 7.88686.066874 10.1906L0 20.9999c.01875 1.1812.786242 2.5306 1.68311 3.2993L39.8415 57.0057c.7475.6407 1.7.9932 2.6843.9932h11.3493c2.2781 0 4.125-1.8469 4.125-4.125v-11.003c0-1.1894-.5138-2.3212-1.4088-3.1044L19.1661 7.02062C18.4142 6.3625 17.4492 6 16.4498 6Z"/>
<path fill="#000" d="M52.0002 12H12v39.9996h39.9996V12h.0006Z"/>
<path fill="#fff" fill-rule="evenodd" d="M17.0181 16.9941h6.4418c1.0506 0 1.9756.1932 2.7762.5788.8.3856 1.4162.9287 1.8487 1.6293.4325.7007.6488 1.5113.6488 2.4331 0 .9219-.22 1.7488-.6594 2.46-.4394.7113-1.065 1.2613-1.8756 1.6506-.2231.1071-.4559.1995-.6987.2771l3.5555 5.9779h-3.3549l-3.2351-5.6706h-2.5211v5.6699h-2.9262V16.9941Zm7.5405 6.63c.3681-.1825.6519-.4431.8519-.7825.2-.3394.3-.7344.3-1.1844 0-.45-.1-.8518-.3-1.1843-.2-.3325-.4844-.5894-.8519-.7719-.3681-.1825-.7987-.2731-1.2918-.2731h-3.3231v4.4699h3.3231c.4931 0 .9237-.0918 1.2918-.2737Z" clip-rule="evenodd"/>
<path fill="#fff" d="M33.0057 44H17.0059v3h15.9998v-3Z"/>
<path fill="#fff" fill-rule="evenodd" d="M42.8178 28.174v-1.9081l-2.2126.0039.7579-3.5369 2.5266-.0044v-1.9294l-2.113.0037.8161-3.8087h-2.1331l-.8169 3.8124-3.1949.0056.8181-3.818h-2.1331l-.8189 3.8217-2.6223.0046v1.9293l2.2087-.0038-.7579 3.5369-2.5227.0044v1.9081l2.1136-.0037-.8161 3.8086h2.1331l.8169-3.8123 3.1949-.0056-.8181 3.8179h2.1331l.8189-3.8216 2.6217-.0046Zm-7.5414-1.8949 3.1949-.0056.7579-3.5369-3.1949.0055-.7579 3.537Z" clip-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="4.0675" x2="62.6637" y1="4.32313" y2="62.9194" gradientUnits="userSpaceOnUse">
<stop offset=".25" stop-color="#007EFF"/>
<stop offset=".73" stop-color="#FF0A67"/>
</linearGradient>
<linearGradient id="b" x1="56.3294" x2="2.87438" y1="-.390623" y2="24.3925" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#FFB700"/>
<stop offset=".58" stop-color="#007EFF"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M64 59.8737V25.7463c0-1.6582-.9931-3.155-2.5206-3.8L24.0581 6.14876c-.5181-.21875-1.0756-.32938-1.6381-.32438l-18.32875.15C1.82625 5.99251 0 7.83376 0 10.0988v17.6656c0 .8056.235625 1.5931.678125 2.2662L21.7869 62.14c.7625 1.1606 2.0581 1.8587 3.4468 1.8587H59.875c2.2781 0 4.125-1.8468 4.125-4.125Z"/>
<path fill="url(#b)" d="M58 14.9875V4.125C58 1.84687 56.1531 0 53.875 0H41.3094c-.2 0-.4.014375-.5981.04375L3.52688 5.49187C1.50125 5.78875 0 7.52625 0 9.57312V24.9706c0 2.2788 1.8475 4.1256 4.12625 4.125l18.50435-.0044c.4256 0 .8488-.0662 1.2538-.1956L55.13 18.9169c1.7094-.5463 2.87-2.135 2.87-3.9294Z"/>
<path fill="#FFB700" d="M58 16.45V4.19125C58 1.8875 56.1131.03 53.8094.066875L43 0c-1.1812.01875-2.5312.78625-3.3 1.68312L6.99312 39.8412C6.3525 40.5887 6 41.5412 6 42.5256V53.875C6 56.1531 7.84687 58 10.125 58h11.0031c1.1894 0 2.3213-.5138 3.1044-1.4088l32.7469-37.425C57.6375 18.4144 58 17.4494 58 16.45Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M16.9971 16.9922h6.4418c1.0507 0 1.9757.1931 2.7763.5787.8.3857 1.4162.9288 1.8487 1.6294.4325.7006.6488 1.5113.6488 2.4331 0 .9219-.22 1.7488-.6594 2.46-.4394.7113-1.065 1.2613-1.8756 1.6507-.2231.107-.456.1994-.6987.2771l3.5556 5.9779h-3.355l-3.2351-5.6707h-2.5212v5.67h-2.9262V16.9922Zm7.5406 6.6294c.3681-.1825.6519-.4432.8519-.7825.2-.3394.3-.7344.3-1.1844 0-.45-.1-.8519-.3-1.1844-.2-.3325-.4844-.5894-.8519-.7719-.3681-.1825-.7988-.2731-1.2919-.2731h-3.3231v4.47h3.3231c.4931 0 .9238-.0919 1.2919-.2737Z" clip-rule="evenodd"/>
<path fill="#fff" d="M33 43.9985H17v3h16v-3Z"/>
<path fill="#fff" d="M41.7569 16.9922h-10.14v15.0062h2.9262v-5.8631h6.785v-2.6475h-6.785v-3.8481h7.2138v-2.6475Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="64.7178" x2="39.855" y1="56.3782" y2="2.75258" gradientUnits="userSpaceOnUse">
<stop offset=".21" stop-color="#007DFE"/>
<stop offset=".55" stop-color="#FFB700"/>
</linearGradient>
<linearGradient id="b" x1="59.7777" x2="1.07287" y1="3.98138" y2="62.6868" gradientUnits="userSpaceOnUse">
<stop offset=".23" stop-color="#FFB700"/>
<stop offset=".73" stop-color="#FF0A67"/>
</linearGradient>
</defs>
<path fill="#007DFE" d="m48.0521 58.18 11.8755-.0017c2.2493 0 4.0722-1.8234 4.0722-4.0727V42.599c0-1.1887-.5196-2.3186-1.422-3.0924L24.4164 6.79677c-.7384-.63244-1.6786-.98036-2.6508-.98036H9.89011c-2.24931 0-4.07273 1.82341-4.07273 4.07272V21.3975c0 1.1887.51957 2.3185 1.42197 3.0924L45.4002 57.1991c.7383.633 1.6786.9804 2.6514.9804l.0005.0005Z"/>
<path fill="url(#a)" d="M49.4812 58.1818h10.4465c2.2493 0 4.0727-1.8234 4.0727-4.0727V41.0164c0-.1925-.0139-.3851-.0407-.576L58.682 3.49673C58.3952 1.49004 56.6771 0 54.65 0H38.977c-2.2499 0-4.0733 1.824-4.0727 4.07389l.0047 18.53851c0 .4375.0704.8721.2088 1.2869l10.4995 31.4979c.5545 1.6629 2.1109 2.7846 3.8639 2.7846Z"/>
<path fill="url(#b)" d="M4.07273 64H38.041c1.6291 0 3.1017-.9711 3.7434-2.4681l16.0681-37.4906c.217-.5068.3293-1.0531.3293-1.6046V4.07273C58.1818 1.82342 56.3584 0 54.1091 0h-17.966c-.8046 0-1.5912.238545-2.2609.685382L1.81353 22.0881C.681309 22.8439.001745 24.1146.001745 25.4755L0 59.9273C0 62.1766 1.82342 64 4.07273 64Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M43.4485 20.643c-.636-1.1382-1.5182-2.0359-2.6466-2.6787-1.1215-.6429-2.3928-.9643-3.814-.9643h-5.7104v14.9994h5.7104c1.4212 0 2.6925-.3214 3.814-.9642 1.1284-.6429 2.0106-1.5268 2.6466-2.665.6353-1.1519.9533-2.4376.9533-3.8702 0-1.4326-.318-2.7189-.9533-3.857Zm-2.5926 6.5087c-.3645.7502-.8822 1.3253-1.5538 1.7139-.6715.4023-1.4538.6026-2.3463.6026h-2.7533v-9.937h2.7533c.8925 0 1.6748.2009 2.3463.6021.6716.3885 1.1893.9648 1.5538 1.7144.3644.7502.5464 1.6335.5464 2.6517s-.182 1.9021-.5464 2.6523Z" clip-rule="evenodd"/>
<path fill="#fff" fill-rule="evenodd" d="M20.0197 26.335h2.5243L25.7732 32h3.3536l-3.5712-6.0083c.0732-.0233.1479-.0446.2225-.0659.1681-.0481.3362-.0962.4881-.1665.8144-.4018 1.4395-.9511 1.8751-1.6605.4426-.71.6641-1.5267.6641-2.4646s-.2181-1.7276-.6537-2.4239c-.4288-.6962-1.0429-1.2455-1.843-1.6335-.8001-.3885-1.7254-.5762-2.7752-.5762h-6.4393V32h2.925l.0005-5.665Zm0-6.8974h3.3216c.493 0 .9212.0942 1.2856.2681.3714.1877.6572.4419.857.7771.1997.3346.3002.7232.3002 1.1784 0 .4551-.0999.8437-.3002 1.1921-.2003.3346-.4856.5895-.857.7766-.3644.1871-.7926.268-1.2856.268h-3.3216v-4.4603Z" clip-rule="evenodd"/>
<path fill="#fff" d="M16.9941 44h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="4.22243" x2="62.9273" y1="60.0186" y2="1.31316" gradientUnits="userSpaceOnUse">
<stop offset=".29" stop-color="#FF2358"/>
<stop offset=".75" stop-color="#7256FF"/>
</linearGradient>
<linearGradient id="b" x1="-.717382" x2="24.1455" y1="7.62004" y2="61.2456" gradientUnits="userSpaceOnUse">
<stop offset=".29" stop-color="#FF8100"/>
<stop offset=".56" stop-color="#FF2358"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M59.9275 0H25.9592c-1.6291 0-3.1017.971054-3.7435 2.46807L6.14767 39.9587c-.21702.5068-.32931 1.0531-.32931 1.6046v18.364C5.81836 62.1766 7.64178 64 9.89109 64H27.8571c.8046 0 1.5912-.2385 2.2609-.6854l32.0686-21.4033c1.1323-.7552 1.8118-2.0265 1.8118-3.3874l.0018-34.45117C64.0002 1.82342 62.1768 0 59.9275 0Z"/>
<path fill="url(#b)" d="M14.5193 5.81641H4.07273C1.82342 5.81641 0 7.63982 0 9.88913V22.9818c0 .1926.013964.3852.040727.576L5.31782 60.5015c.28683 2.0067 2.00494 3.4967 4.032 3.4967H25.0228c2.2499 0 4.0733-1.824 4.0728-4.0739l-.0047-18.5384c0-.4376-.0704-.8722-.2089-1.287L18.3831 8.60099c-.5544-1.66284-2.1108-2.78458-3.8638-2.78458Z"/>
<path fill="#FF8100" d="m15.9476 5.81641-11.87545.00174C1.82342 5.81873 0 7.64215 0 9.89088V21.3975c0 1.1887.519564 2.3185 1.42196 3.0924L39.5828 57.1997c.7384.6324 1.6786.9803 2.6508.9803h11.8755c2.2493 0 4.0727-1.8234 4.0727-4.0727V42.599c0-1.1887-.5195-2.3186-1.4219-3.0924L18.599 6.79735c-.7383-.63302-1.6786-.98036-2.6514-.98036v-.00058Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="m41.8953 17-2.9783 9.8464-.225 1.2857-.2572-1.2857L35.3492 17h-4.0711v15h2.8818V21.2967l-.043-.7071L37.567 32h2.1214l3.4925-11.4856-.0424.7823V32h2.8928V17h-4.136Zm-15.6291 8.7536c.8145-.3925 1.4389-.943 1.8751-1.6501.4426-.714.6641-1.5359.6641-2.4646 0-.9287-.2181-1.7317-.6537-2.4319-.4288-.7002-1.0429-1.2426-1.843-1.6283-.8001-.3857-1.7248-.5786-2.7751-.5786h-6.4394v14.9994h2.925v-5.6679h2.5202l3.2338 5.6679h3.3536l-3.5746-6.0094c.0714-.0227.144-.0435.2167-.0644.1715-.0491.3429-.0983.4973-.1721Zm-6.2459-6.3216h3.3215c.4931 0 .9213.0924 1.2857.2784.3714.1779.6572.4356.857.7714.1997.3277.3001.7215.3001 1.1783 0 .4569-.0998.8466-.3001 1.1893-.1998.3363-.4856.5958-.857.7823-.3644.1779-.7926.268-1.2857.268h-3.3215V19.432Zm-3.0262 24.5681h16v3h-16v-3Z" clip-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="7.62141" x2="61.2476" y1="64.7192" y2="39.8564" gradientUnits="userSpaceOnUse">
<stop offset=".08" stop-color="#00D886"/>
<stop offset=".46" stop-color="#FFAB00"/>
</linearGradient>
<linearGradient id="b" x1="60.0186" x2="1.31316" y1="59.7777" y2="1.07287" gradientUnits="userSpaceOnUse">
<stop offset=".19" stop-color="#FFAB00"/>
<stop offset=".83" stop-color="#FF004C"/>
</linearGradient>
</defs>
<path fill="#00D886" d="m5.81836 48.0512.00174 11.8755c0 2.2493 1.82342 4.0721 4.07273 4.0721H21.3994c1.1887 0 2.3186-.5196 3.0924-1.422l32.7098-38.1614c.6325-.7383.9804-1.6786.9804-2.6508V9.88913c0-2.24931-1.8234-4.07272-4.0727-4.07272H42.6009c-1.1887 0-2.3185.51956-3.0924 1.42196L6.79872 45.3998c-.63302.7383-.98036 1.6786-.98036 2.6514Z"/>
<path fill="url(#a)" d="M5.81836 49.4825v10.4466c0 2.2493 1.82342 4.0727 4.07273 4.0727H22.9837c.1926 0 .3852-.014.576-.0407l36.9437-5.2771c2.0067-.2868 3.4968-2.005 3.4968-4.032V38.979c0-2.2499-1.824-4.0733-4.0739-4.0727l-18.5385.0046c-.4375 0-.8721.0704-1.287.2089L8.60294 45.6193c-1.66284.5544-2.78458 2.1108-2.78458 3.8638v-.0006Z"/>
<path fill="url(#b)" d="M0 4.07273V38.041c0 1.6291.971054 3.1017 2.46807 3.7434L39.9587 57.8525c.5067.217 1.0531.3293 1.6046.3293h18.364c2.2493 0 4.0727-1.8234 4.0727-4.0727v-17.966c0-.8046-.2386-1.5913-.6854-2.2609L41.9113 1.81353C41.1561.681309 39.8854.001745 38.5239.001745L4.07273 0C1.82342 0 0 1.82342 0 4.07273Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M20.0198 26.3347h2.5244L25.7735 32h3.3538l-3.5713-6.0085c.0732-.0233.1478-.0446.2224-.0659.1681-.0481.3363-.0962.4881-.1666.8145-.4017 1.439-.9511 1.8753-1.6605.4425-.71.6641-1.5268.6641-2.4647 0-.9379-.2181-1.7277-.6538-2.4239-.4288-.6963-1.0429-1.2456-1.8431-1.6342-.8001-.3886-1.7248-.5757-2.7752-.5757h-6.4396v15h2.9251l.0005-5.6653Zm0-6.897h3.3217c.4931 0 .9213.0936 1.2857.2681.3714.1871.6573.4419.8576.7772.1997.3346.3002.7232.3002 1.1784 0 .4551-.0999.8437-.3002 1.1921-.2003.3347-.4856.5895-.8576.7766-.3644.1877-.7926.2681-1.2857.2681h-3.3217v-4.4605Z" clip-rule="evenodd"/>
<path fill="#fff" fill-rule="evenodd" d="m43.5671 32-3.5714-6.0085c.0733-.0233.1479-.0446.2225-.0659.1681-.0481.3363-.0962.4881-.1666.8145-.4017 1.4396-.9511 1.8753-1.6605.4425-.71.6641-1.5268.6641-2.4647 0-.9379-.2182-1.7277-.6538-2.4239-.4288-.6963-1.043-1.2456-1.8431-1.6342C39.9487 17.1871 39.024 17 37.9736 17H31.534v15h2.9251v-5.6653h2.5244L40.2127 32h3.3544Zm-9.1069-12.5623h3.3217c.493 0 .9212.0936 1.2857.2681.3714.1871.6572.4419.857.7772.1997.3346.3002.7232.3002 1.1784 0 .4551-.0999.8437-.3002 1.1921-.2004.3347-.4856.5895-.857.7766-.3645.1877-.7927.2681-1.2857.2681h-3.3217v-4.4605Z" clip-rule="evenodd"/>
<path fill="#fff" d="M16.9941 44h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="29.4945" x2="35.8682" y1="1.16526" y2="61.531" gradientUnits="userSpaceOnUse">
<stop stop-color="#FCF84A"/>
<stop offset=".32" stop-color="#AAE681"/>
<stop offset=".79" stop-color="#35CDD1"/>
<stop offset="1" stop-color="#07C3F2"/>
</linearGradient>
<linearGradient id="b" x1="6.14864" x2="63.2512" y1="2.08829" y2="29.1794" gradientUnits="userSpaceOnUse">
<stop stop-color="#3BEA62"/>
<stop offset="1" stop-color="#087CFA"/>
</linearGradient>
<linearGradient id="c" x1="11.3655" x2="68.8634" y1="61.0737" y2="20.8287" gradientUnits="userSpaceOnUse">
<stop stop-color="#009AE5"/>
<stop offset=".18" stop-color="#048FDC"/>
<stop offset=".49" stop-color="#1073C5"/>
<stop offset=".89" stop-color="#2346A1"/>
<stop offset="1" stop-color="#293896"/>
</linearGradient>
</defs>
<path fill="url(#a)" fill-rule="evenodd" d="M13.0002 63c21.7084-1.9022 40.7949-15.25 49.9919-35.0108C51.5079 11.5995 32.8251 2 13.0428 2c-1.7736 0-3.5552.08025-5.33681.23275C-1.49098 21.9935.488842 45.1334 13.0002 63Z" clip-rule="evenodd"/>
<path fill="url(#b)" fill-rule="evenodd" d="M7.76172 2.23275S27.2478 9.06592 40 28h23C51.564 11.6103 32.8808 2 13.1066 2c-1.7736 0-3.55524.08025-5.33686.23275h-.00802Z" clip-rule="evenodd"/>
<path fill="url(#c)" fill-rule="evenodd" d="M40 28c-2.7848 18.4445-27 35-27 35 21.8448-2.0708 41.0598-15.1509 50-35H40Z" clip-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="7.67061" x2="61.125" y1="64.3921" y2="39.6093" gradientUnits="userSpaceOnUse">
<stop offset=".1" stop-color="#3BEA62"/>
<stop offset=".59" stop-color="#6B57FF"/>
</linearGradient>
<linearGradient id="b" x1="59.9324" x2="1.33688" y1="59.6755" y2="1.07996" gradientUnits="userSpaceOnUse">
<stop offset=".26" stop-color="#6B57FF"/>
<stop offset=".65" stop-color="#07C3F2"/>
</linearGradient>
</defs>
<path fill="#3BEA62" d="M6 47.5501v12.2586c0 2.3038 1.8869 4.1612 4.1906 4.1244l11.043-.1763c1.1812-.0187 2.2975-.5431 3.0662-1.44l32.7065-38.1583c.6406-.7475.9931-1.7.9931-2.6843V10.125c0-2.27815-1.8469-4.125-4.125-4.125H42.8715c-1.1894 0-2.3213.51375-3.1044 1.40874L7.02062 44.8333C6.3625 45.5851 6 46.5501 6 47.5495v.0006Z"/>
<path fill="url(#a)" d="M6 49.0148v10.8618c0 2.2781 1.84685 4.1249 4.125 4.1249h12.5655c.2 0 .3999-.0144.5981-.0437l37.1845-5.4481C62.4987 58.2128 64 56.4754 64 54.4285V39.0312c0-2.2787-1.8475-4.1256-4.1262-4.1249l-18.5042.0043c-.4256 0-.8487.0663-1.2537.1956L8.87063 45.0849c-1.70935.5462-2.86996 2.135-2.86996 3.9293L6 49.0148Z"/>
<path fill="url(#b)" d="M0 4.12558V38.2527c0 1.6581.993118 3.1549 2.5206 3.7999l37.4208 15.7973c.5181.2188 1.0756.3294 1.6381.3244l18.3286-.15c2.2649-.0187 4.0912-1.86 4.0912-4.1249V36.2339c0-.8056-.2356-1.5931-.6781-2.2662L42.2126 1.85873C41.4502.698116 40.1546 0 38.7658 0H4.12495C1.84685 0 0 1.84685 0 4.12495v.00063Z"/>
<path fill="#000" d="M51.9995 12H12v39.9995h39.9995V12Z"/>
<path fill="#fff" d="M30.0439 28.4594c.6644 1.1825 1.5788 2.1118 2.7438 2.7868v-.0025c1.165.6756 2.4656 1.0131 3.9018 1.0131 1.215 0 2.3294-.225 3.3444-.675 1.0143-.4499 1.8599-1.0806 2.5349-1.8918.675-.8112 1.1269-1.7419 1.3557-2.7925h-3.0657c-.2.5431-.4981 1.0207-.8949 1.4313-.3963.4112-.8732.7275-1.4307.9487-.5575.2219-1.165.3325-1.8225.3325-.8862 0-1.6868-.2212-2.4012-.6644-.7143-.4431-1.2737-1.0518-1.6775-1.8274-.4037-.775-.6055-1.6488-.6055-2.6206 0-.9719.2018-1.845.6055-2.6206.4038-.775.9632-1.3844 1.6775-1.8275.715-.4431 1.515-.6644 2.4012-.6644.6575 0 1.265.1113 1.8225.3325.5569.2219 1.0344.5381 1.4307.9488.3968.4112.6949.8881.8949 1.4312h3.0657c-.2288-1.0506-.6807-1.9812-1.3557-2.7925-.6756-.8112-1.5206-1.4418-2.5349-1.8918-1.015-.45-2.1294-.675-3.3444-.675-1.4369 0-2.7375.3381-3.9018 1.0131-1.1644.675-2.0794 1.6043-2.7438 2.7868-.6643 1.1825-.9968 2.5025-.9968 3.9606s.3325 2.7781.9968 3.9606Z"/>
<path fill="#fff" d="M16.0016 16.9951h12.0367v2.6369h-4.5449v12.3692h-2.9263V19.632H16.001l.0006-2.6369Z"/>
<path fill="#fff" d="M32.9998 44.001H17v2.9999h15.9998V44.001Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1 @@
<svg height="104" viewBox="0 0 90 104" width="90" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1=".47" x2="90.25" y1="75.13" y2="28.5"><stop offset=".04" stop-color="#fc801d"/><stop offset=".38" stop-color="#fe2857"/><stop offset=".99" stop-color="#af1df5"/></linearGradient><path d="m45 104 45-26.03v-52.03l-45 26.03z"/><path d="m73.37 78.04-19.61 11.28v-7.19l19.61-11.28z" fill="#fff"/><path d="m45 0-45 25.94v52.03l45 26.03v-52.03l45-26.03z" fill="url(#a)"/></svg>

After

Width:  |  Height:  |  Size: 555 B

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="7.62141" x2="61.2476" y1="64.7192" y2="39.8564" gradientUnits="userSpaceOnUse">
<stop offset=".22" stop-color="#F0EB18"/>
<stop offset=".59" stop-color="#00C4F4"/>
</linearGradient>
<linearGradient id="b" x1="60.0186" x2="1.31316" y1="59.7777" y2="1.07287" gradientUnits="userSpaceOnUse">
<stop offset=".19" stop-color="#00C4F4"/>
<stop offset=".83" stop-color="#007DFE"/>
</linearGradient>
</defs>
<path fill="#F0EB18" d="m5.81836 48.0512.00174 11.8755c0 2.2493 1.82342 4.0721 4.07273 4.0721H21.3994c1.1887 0 2.3186-.5196 3.0924-1.422l32.7098-38.1614c.6325-.7383.9804-1.6786.9804-2.6508V9.88913c0-2.24931-1.8234-4.07272-4.0727-4.07272H42.6009c-1.1887 0-2.3185.51956-3.0924 1.42196L6.79872 45.3998c-.63302.7383-.98036 1.6786-.98036 2.6514Z"/>
<path fill="url(#a)" d="M5.81836 49.4825v10.4466c0 2.2493 1.82342 4.0727 4.07273 4.0727H22.9837c.1926 0 .3852-.014.576-.0407l36.9437-5.2771c2.0067-.2868 3.4968-2.005 3.4968-4.032V38.979c0-2.2499-1.824-4.0733-4.0739-4.0727l-18.5385.0046c-.4375 0-.8721.0704-1.287.2089L8.60294 45.6193c-1.66284.5544-2.78458 2.1108-2.78458 3.8638v-.0006Z"/>
<path fill="url(#b)" d="M0 4.07273V38.041c0 1.6291.971054 3.1017 2.46807 3.7434L39.9587 57.8525c.5067.217 1.0531.3293 1.6046.3293h18.364c2.2493 0 4.0727-1.8234 4.0727-4.0727v-17.966c0-.8046-.2386-1.5913-.6854-2.2609L41.9113 1.81353C41.1561.681309 39.8854.001745 38.5239.001745L4.07273 0C1.82342 0 0 1.82342 0 4.07273Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" d="m21.2377 27.961-2.4224-10.9532h-3.0321l3.6224 15.0044h3.3226l2.5613-10.8998 2.5292 10.8998h3.333l3.6441-15.0044h-2.9689L29.4797 27.961l-2.7008-10.9532h-2.9581L21.2377 27.961Z"/>
<path fill="#fff" d="M38.2224 31.6804c.8429.3927 1.8074.5896 2.8937.5896s2.0515-.1998 2.8944-.6005c.8428-.4008 1.4968-.9503 1.9613-1.6507.4714-.7074.7073-1.5049.7073-2.3903 0-.7222-.1607-1.3865-.4822-1.9934-.3216-.6149-.7717-1.1294-1.3505-1.5434-.5718-.422-1.2252-.7073-1.9613-.8572l-2.551-.5575c-.4644-.1137-.8325-.3066-1.1041-.5787-.2646-.2722-.3967-.615-.3967-1.0289 0-.364.0965-.6815.2894-.9537.1929-.2785.461-.4932.8038-.643.3497-.1568.7539-.236 1.2109-.236.457 0 .8607.0815 1.2109.2463.3571.1567.6321.3818.8251.6752.1929.2854.2893.6109.2893.9755h2.9259c-.0074-.8572-.236-1.614-.6861-2.272-.4432-.6648-1.0645-1.1833-1.8649-1.5542-.8003-.3715-1.7253-.5575-2.7329-.5575-1.0077 0-1.908.1929-2.7009.5788-.7929.3789-1.4107.9106-1.8539 1.5967-.4427.6792-.6643 1.4469-.6643 2.3041 0 .7073.1464 1.3441.4392 1.9079.2934.5644.7039 1.0398 1.2327 1.4256.5288.379 1.1506.6471 1.8649.8038l2.6474.5897c.5076.1223.9037.3393 1.1897.654.2928.3146.4392.7113.4392 1.1896 0 .3859-.1074.7286-.3215 1.0289-.2073.3003-.5036.5357-.8894.7074-.3789.1648-.8004.2463-1.3292.2463-.5288 0-.9967-.0925-1.4038-.2785-.4071-.186-.7251-.4432-.9537-.7716-.2285-.3279-.3427-.7114-.3427-1.1466h-2.9368c.0143.9215.2572 1.7362.7286 2.4436.4788.7073 1.1362 1.2579 1.9722 1.6507Z"/>
<path fill="#fff" d="M16.9932 44h16v3h-16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="-.102411" x2="64.0532" y1="32.0002" y2="32.0002" gradientUnits="userSpaceOnUse">
<stop stop-color="#FB43FF"/>
<stop offset=".97" stop-color="#FB406D"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M1.30634 51.2446c-.09688-.0713-.12875-.2019-.07625-.31L8.86571 35.209.058214 24.6908c-.08875-.1056-.074375-.2637.031875-.3518L25.7788 2.93209C30.3495-.877908 36.967-.985408 41.6626 2.67147c4.6937 3.65687 6.1937 10.08813 3.5969 15.43623l-2.7994 5.7669c1.0919-.3663 2.1725-.6994 3.2412-.9988l12.6738-3.6406c.1381-.04.2819.045.3131.1856l5.3056 23.585c.0325.1457-.0662.2882-.215.3069-1.6818.2119-10.8575 1.53-22.2812 6.3294-12.9431 5.4362-21.4844 13.1625-22.6944 14.2925-.0894.0837-.2206.0869-.3187.0144L1.30634 51.2446Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" d="m21.4666 26.3709-5.4881-9.3787h3.1513l3.3981 5.9919.3969.8575.3968-.8682 3.3119-5.9812h3.0975l-5.4025 9.3575v5.6487h-2.8619v-5.6275Z"/>
<path fill="#fff" d="M33 43.9984H17v3h16v-3Z"/>
<path fill="#fff" d="M42.3248 16.9922H30.2879l-.0006 2.6369h4.5662v12.3693h2.9263V19.6291h4.545v-2.6369Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="56.3294" x2="2.87438" y1="-.391251" y2="24.3925" gradientUnits="userSpaceOnUse">
<stop offset=".18" stop-color="#6B57FF"/>
<stop offset=".54" stop-color="#FF45ED"/>
</linearGradient>
<linearGradient id="b" x1="4.0675" x2="62.6638" y1="4.32348" y2="62.9197" gradientUnits="userSpaceOnUse">
<stop offset=".12" stop-color="#FF45ED"/>
<stop offset=".92" stop-color="#FC801D"/>
</linearGradient>
</defs>
<path fill="#6B57FF" d="M58 16.4501V4.19132C58 1.88757 56.1131.03007 53.8094.066946l-11.0431.17625C41.585.261946 40.4688.786321 39.7 1.6832L6.99312 39.8413C6.3525 40.5888 6 41.5413 6 42.5257v11.3494c0 2.2781 1.84687 4.125 4.125 4.125h11.0031c1.1894 0 2.3213-.5138 3.1044-1.4088l32.7469-37.425C57.6375 18.4144 58 17.4494 58 16.4501Z"/>
<path fill="url(#a)" d="M58 14.9875V4.125C58 1.84687 56.1531 0 53.875 0H41.3094c-.2 0-.4.014375-.5981.04375L3.52688 5.49188C1.50125 5.78875 0 7.52625 0 9.57312V24.9706c0 2.2788 1.8475 4.1256 4.12625 4.125l18.50435-.0044c.4256 0 .8488-.0662 1.2538-.1956L55.13 18.9169c1.7094-.5463 2.87-2.135 2.87-3.9294Z"/>
<path fill="url(#b)" d="M64 59.8747V25.7472c0-1.6581-.9931-3.155-2.5206-3.8L24.0581 6.14973c-.5181-.21875-1.0756-.32937-1.6381-.32437l-18.32875.15C1.82625 5.99348 0 7.83473 0 10.0997v17.6657c0 .8056.235625 1.5931.678125 2.2662L21.7869 62.141c.7625 1.1606 2.0581 1.8587 3.4468 1.8587H59.875c2.2781 0 4.125-1.8468 4.125-4.125Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" d="M32.6677 28.4576c.6644 1.1825 1.5787 2.1119 2.7437 2.7869v-.0025c1.165.6756 2.4657 1.0131 3.9019 1.0131 1.215 0 2.3294-.225 3.3444-.675 1.0144-.45 1.86-1.0806 2.535-1.8919.6756-.8112 1.1275-1.7419 1.3563-2.7925h-3.0657c-.2.5431-.4981 1.0206-.895 1.4313-.3969.4112-.8737.7275-1.4312.9487-.5575.2219-1.165.3325-1.8225.3325-.8863 0-1.6869-.2212-2.4013-.6644-.7144-.4431-1.2737-1.0518-1.6775-1.8275-.4037-.775-.6056-1.6487-.6056-2.6206s.2019-1.845.6056-2.6206c.4038-.775.9631-1.3844 1.6775-1.8275.715-.4431 1.515-.6644 2.4013-.6644.6575 0 1.265.1113 1.8225.3325.5575.2219 1.0343.5381 1.4312.9488.3969.4112.695.8881.895 1.4312h3.0657c-.2288-1.0506-.6813-1.9812-1.3563-2.7925-.6756-.8112-1.5206-1.4419-2.535-1.8919-1.015-.45-2.1294-.675-3.3444-.675-1.4369 0-2.7375.3382-3.9019 1.0132-1.1643.675-2.0793 1.6043-2.7437 2.7868-.6644 1.1825-.9969 2.5025-.9969 3.9607 0 1.4581.3325 2.7781.9969 3.9606Z"/>
<path fill="#fff" fill-rule="evenodd" d="M16.9971 16.9938h5.7131c1.4219 0 2.6956.3213 3.8212.9644 1.1257.6431 2.0063 1.5344 2.6425 2.6744.6357 1.14.9538 2.4275.9538 3.8644 0 1.4368-.3181 2.7243-.9538 3.8643-.6362 1.14-1.5168 2.0313-2.6425 2.6744-1.1256.6431-2.3993.9644-3.8212.9644h-5.7131V16.9938Zm8.0281 11.8763c.6719-.4 1.19-.9738 1.5544-1.7206.3643-.7469.5468-1.6307.5468-2.6532s-.1825-1.9062-.5468-2.6531c-.3644-.7469-.8825-1.32-1.5544-1.7206-.6719-.4-1.4544-.6-2.3475-.6h-2.755v9.9469h2.755c.8931 0 1.6756-.1994 2.3475-.5994Z" clip-rule="evenodd"/>
<path fill="#fff" d="M33 44.0001H17v3h16v-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="59.6763" x2="1.08" y1="4.0675" y2="62.6638" gradientUnits="userSpaceOnUse">
<stop offset=".31" stop-color="#FF45ED"/>
<stop offset=".83" stop-color="#6B57FF"/>
</linearGradient>
<linearGradient id="b" x1="64.3912" x2="39.6074" y1="56.3294" y2="2.875" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#FDB60D"/>
<stop offset=".7" stop-color="#FF45ED"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M4.125 64h34.1275c1.6581 0 3.155-.9931 3.8-2.5206L57.85 24.0581c.2187-.5181.3294-1.0756.3244-1.6381l-.15-18.32875C58.0056 1.82625 56.1644 0 53.8994 0H36.2337c-.8056 0-1.5931.235625-2.2662.678125L1.85938 21.7869C.69875 22.55 0 23.845 0 25.2337V59.875C0 62.1531 1.84687 64 4.125 64Z"/>
<path fill="url(#b)" d="M49.0131 58h10.8618c2.2781 0 4.125-1.8469 4.125-4.125V41.3094c0-.2-.0144-.4-.0437-.5981L58.508 3.52688C58.2112 1.50125 56.4737 0 54.4268 0H39.0293c-2.2788 0-4.1256 1.8475-4.125 4.12625l.0044 18.50435c0 .4256.0662.8488.1956 1.2538L45.083 55.13c.5463 1.7094 2.135 2.87 3.9294 2.87h.0007Z"/>
<path fill="#FDB60D" d="M47.55 58h12.2588c2.3037 0 4.1612-1.8869 4.1243-4.1906L63.9994 43c-.0188-1.1812-.785-2.5312-1.6819-3.3L24.1588 6.99312C23.4113 6.3525 22.4587 6 21.4744 6H10.125C7.84687 6 6 7.84687 6 10.125v11.0031c0 1.1894.51375 2.3213 1.40875 3.1044L44.8338 56.9794C45.5856 57.6375 46.5506 58 47.55 58Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M17.0127 16.9941h5.7131c1.4219 0 2.6956.3213 3.8213.9644 1.1256.6431 2.0062 1.5344 2.6425 2.6744.6356 1.14.9537 2.4275.9537 3.8644 0 1.4368-.3181 2.7243-.9537 3.8643-.6363 1.14-1.5169 2.0313-2.6425 2.6744-1.1257.6431-2.3994.9644-3.8213.9644h-5.7131V16.9941Zm8.0281 11.8763c.6719-.4 1.19-.9738 1.5544-1.7206.3644-.7469.5469-1.6307.5469-2.6532s-.1825-1.9062-.5469-2.6531c-.3644-.7469-.8825-1.32-1.5544-1.7206-.6719-.4-1.4544-.6-2.3475-.6h-2.755v9.9469h2.755c.8931 0 1.6756-.1994 2.3475-.5994Z" clip-rule="evenodd"/>
<path fill="#fff" d="M33 44.0004H17v3h16v-3Z"/>
<path fill="#fff" d="M36.3058 16.9941h-4.0719v15.0063h2.8832V21.2923l-.0432-.7075 3.4513 11.4156h2.1225l3.4944-11.4906-.0432.7825v10.7081h2.8938V16.9941h-4.1375l-2.98 9.8507-.225 1.2862-.2575-1.2862-3.0869-9.8507Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="59.9325" x2="1.33687" y1="59.6756" y2="1.07937" gradientUnits="userSpaceOnUse">
<stop offset=".29" stop-color="#6B57FF"/>
<stop offset=".89" stop-color="#07C3F2"/>
</linearGradient>
<linearGradient id="b" x1="7.67063" x2="61.1256" y1="64.3905" y2="39.6074" gradientUnits="userSpaceOnUse">
<stop offset=".3" stop-color="#FF45ED"/>
<stop offset=".84" stop-color="#6B57FF"/>
</linearGradient>
</defs>
<path fill="url(#a)" d="M0 4.125v34.1275c0 1.6581.993125 3.155 2.52063 3.8L39.9419 57.85c.5181.2187 1.0756.3294 1.6381.3244l18.3287-.15c2.265-.0188 4.0913-1.86 4.0913-4.125V36.2337c0-.8056-.2356-1.5931-.6781-2.2662L42.2131 1.85938C41.45.69875 40.155 0 38.7663 0H4.125C1.84687 0 0 1.84687 0 4.125Z"/>
<path fill="url(#b)" d="M6 49.0131v10.8618c0 2.2781 1.84687 4.125 4.125 4.125h12.5656c.2 0 .4-.0144.5981-.0437l37.1851-5.4482c2.0256-.2968 3.5268-2.0343 3.5268-4.0812V39.0293c0-2.2788-1.8475-4.1256-4.1262-4.125l-18.5044.0044c-.4256 0-.8488.0662-1.2538.1956L8.87062 45.083c-1.70937.5463-2.86999 2.135-2.86999 3.9294L6 49.0131Z"/>
<path fill="#FF45ED" d="M6 47.55v12.2588c0 2.3037 1.88688 4.1612 4.1906 4.1243L20.9994 64c1.1812-.0188 2.5318-.7862 3.3006-1.6831l32.7069-38.1581c.6406-.7475.9931-1.7001.9931-2.6844V10.125C58 7.84687 56.1531 6 53.875 6H42.8719c-1.1894 0-2.3213.51375-3.1044 1.40875L7.02063 44.8338C6.3625 45.5856 6 46.5506 6 47.55Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M17.0127 16.9941h5.7131c1.4219 0 2.6956.3213 3.8213.9644 1.1256.6431 2.0062 1.5344 2.6418 2.6744.6363 1.14.9538 2.4275.9538 3.8644 0 1.4368-.3181 2.7243-.9538 3.8643-.6362 1.14-1.5168 2.0313-2.6418 2.6744-1.1257.6431-2.3994.9644-3.8213.9644h-5.7131V16.9941Zm8.0281 11.8763c.6719-.4 1.19-.9738 1.5544-1.7206.3644-.7469.5469-1.6307.5469-2.6532s-.1825-1.9062-.5469-2.6531c-.3644-.7469-.8825-1.32-1.5544-1.7206-.6719-.4-1.4544-.6-2.3475-.6h-2.755v9.9469h2.755c.8931 0 1.6756-.1994 2.3475-.5994Z" clip-rule="evenodd"/>
<path fill="#fff" d="M33 44.0004H17v3h16v-3Z"/>
<path fill="#fff" fill-rule="evenodd" d="M39.1464 16.9941h-6.4418l-.0007 15.0069h2.9263v-5.67h3.43c1.0794 0 2.0225-.195 2.83-.5844.8075-.39 1.4312-.9381 1.8706-1.6456.4394-.7075.6594-1.5437.6594-2.4656 0-.9219-.2163-1.7325-.6488-2.4331-.4325-.7007-1.0468-1.2438-1.8437-1.6294-.7969-.3856-1.7238-.5788-2.7813-.5788Zm1.9507 5.8475c-.2.3394-.4838.6-.8519.7825-.3681.1819-.7988.2738-1.2919.2738h-3.3231v-4.47h3.3231c.4931 0 .9238.0906 1.2919.2731.3675.1825.6519.4394.8519.7719.2.3325.3.7162.3 1.1737s-.1.8557-.3 1.195Z" clip-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none" viewBox="0 0 64 64">
<defs>
<linearGradient id="a" x1="-.390625" x2="24.3925" y1="7.67063" y2="61.1256" gradientUnits="userSpaceOnUse">
<stop offset=".18" stop-color="#6B57FF"/>
<stop offset=".54" stop-color="#FF2358"/>
</linearGradient>
<linearGradient id="b" x1="4.32509" x2="62.9207" y1="59.9325" y2="1.33625" gradientUnits="userSpaceOnUse">
<stop offset=".12" stop-color="#FF2358"/>
<stop offset=".92" stop-color="#FF45ED"/>
</linearGradient>
</defs>
<path fill="#6B57FF" d="M16.4501 6H4.19132C1.88757 6 .03007 7.88688.066946 10.1906l.17625 11.0431C.261946 22.415.786321 23.5312 1.6832 24.3l38.1587 32.7069c.7475.6406 1.7.9931 2.6844.9931h11.3494c2.2781 0 4.125-1.8469 4.125-4.125V42.8719c0-1.1894-.5138-2.3213-1.4088-3.1044L19.1663 7.02063C18.4144 6.3625 17.4494 6 16.4501 6Z"/>
<path fill="url(#a)" d="M14.9875 6H4.125C1.84687 6 0 7.84687 0 10.125v12.5656c0 .2.014375.4.04375.5981l5.44813 37.1851c.29687 2.0256 2.03437 3.5268 4.08124 3.5268H24.9706c2.2788 0 4.1256-1.8475 4.125-4.1262L29.0912 41.37c0-.4256-.0662-.8488-.1956-1.2538L18.9169 8.87062c-.5463-1.70937-2.135-2.86999-3.9294-2.86999V6Z"/>
<path fill="url(#b)" d="M59.8757 0H25.7482c-1.6581 0-3.155.993125-3.8 2.52063L6.15071 39.9419c-.21875.5181-.32938 1.0756-.32438 1.6381l.15 18.3287C5.99508 62.1737 7.83633 64 10.1013 64H27.767c.8056 0 1.5931-.2356 2.2662-.6781l32.1094-21.1088c1.1606-.7625 1.8587-2.0581 1.8587-3.4468V4.125C64.0007 1.84687 62.1538 0 59.8757 0Z"/>
<path fill="#000" d="M52 12H12v40h40V12Z"/>
<path fill="#fff" fill-rule="evenodd" d="M16.9971 16.9941h5.7131c1.4219 0 2.6956.3213 3.8212.9644 1.1257.6431 2.0063 1.5344 2.6425 2.6744.6357 1.14.9538 2.4275.9538 3.8644 0 1.4368-.3181 2.7243-.9538 3.8643-.6362 1.14-1.5168 2.0313-2.6425 2.6744-1.1256.6431-2.3993.9644-3.8212.9644h-5.7131V16.9941Zm8.0281 11.8763c.6719-.4 1.19-.9738 1.5544-1.7206.3643-.7469.5468-1.6307.5468-2.6532s-.1825-1.9062-.5468-2.6531c-.3644-.7469-.8825-1.32-1.5544-1.7206-.6719-.4-1.4544-.6-2.3475-.6h-2.755v9.9469h2.755c.8931 0 1.6756-.1994 2.3475-.5994Z" clip-rule="evenodd"/>
<path fill="#fff" d="M33 44.0004H17v3h16v-3Z"/>
<path fill="#fff" d="M43.1714 16.9941H31.1346l-.0007 2.6369h4.5663v12.3694h2.9262V19.631h4.545v-2.6369Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,3 @@
[DNS]
EQUAL,jetbrains.com
EQUAL,plugin.obroom.com

View File

@@ -0,0 +1,2 @@
; wrap specified classes
[Class]

View File

@@ -0,0 +1,8 @@
[Result]
; server https://jetbra.in
EQUAL,120506319308405029943033101198259523557651500267734599270782782071425072541184605728867830395125412768750966448411447392137801711908001958831204692561738046570955709184538088569271703484602917023462976408329100293802371486063140115775311907530943821345005598057265747678100463689973450156515895355214983079672467769169324175533323801179755544364921063654340185317077965735659865485150734884110709760680757502730007505995422237875348017761382234951127263548660889969621730944377739766734765769747684457663965611896398862841334032542726392699785677440644859509166466497325071885386505404431787167239320957696896447925472784312642576835792921100239616617639216190447230487878404191838684279341834945197861631446454083984351911070798505031973496634229907567362853550735007045265430703581336189733180744888091740381912913980707537008943084904260746266383019688346709856215660232636334604552145129775009725685598798774376749830567219982166661918408832945395290223853748014160473876195098438959881711585152480525870219408398012002829112863175041709512032251930709608035158747101960447898838942705485214217426612863919268749874079707310181890737049603255938886865558759802593500502795018952114650332765839003032013708006750600413455628536259,65537,860106576952879101192782278876319243486072481962999610484027161162448933268423045647258145695082284265933019120714643752088997312766689988016808929265129401027490891810902278465065056686129972085119605237470899952751915070244375173428976413406363879128531449407795115913715863867259163957682164040613505040314747660800424242248055421184038777878268502955477482203711835548014501087778959157112423823275878824729132393281517778742463067583320091009916141454657614089600126948087954465055321987012989937065785013284988096504657892738536613208311013047138019418152103262155848541574327484510025594166239784429845180875774012229784878903603491426732347994359380330103328705981064044872334790365894924494923595382470094461546336020961505275530597716457288511366082299255537762891238136381924520749228412559219346777184174219999640906007205260040707839706131662149325151230558316068068139406816080119906833578907759960298749494098180107991752250725928647349597506532778539709852254478061194098069801549845163358315116260915270480057699929968468068015735162890213859113563672040630687357054902747438421559817252127187138838514773245413540030800888215961904267348727206110582505606182944023582459006406137831940959195566364811905585377246353->31872219281407242025505148642475109331663948030010491344733687844358944945421064967310388547820970408352359213697487269225694990179009814674781374751323403257628081559561462351695605167675284372388551941279783515209238245831229026662363729380633136520288327292047232179909791526492877475417113579821717193807584807644097527647305469671333646868883650312280989663788656507661713409911267085806708237966730821529702498972114194166091819277582149433578383639532136271637219758962252614390071122773223025154710411681628917523557526099053858210363406122853294409830276270946292893988830514538950951686480580886602618927728470029090747400687617046511462665469446846624685614084264191213318074804549715573780408305977947238915527798680393538207482620648181504876534152430149355791756374642327623133843473947861771150672096834149014464956451480803326284417202116346454345929350148770746553056995922154382822307758515805142704373984019252210715650875853634697920708113806880196144197384637328982263167395073688501517286678083973976140696077590122053014085412828620051470085033364773099146103525313018873319293728800442101520384088109603555959893639842091339193857485407672132882577840295039058621747654642202620767068924079813640067442975
EQUAL,8028659553836119901593655311677865290672387540027895708985570867455842278776015838142490556122515317003830575671206217290165955723210315889275621408086645995280770696135307020454887097794294273869941097888549275028604248332746117479367032100139091095818169444690976206636597409322539276252570779516636180497560345090851316373570301807158645002654208816162902430571101092599540795501152368695431168224953320283502815852695423193526255836776240019085157444254721864134058745605280085897450952937893645487302683006269553010996013513395044612932182772364336368242146044741660443063207438830622376694839772096688572619877,65537,21052260334349247097390263197515551021430500095747078612475171670547647379514624742422155617118382403386162585789957995106937640909858927441120214136124618650916253946431099279059999234690271861285094667690686174087562943995337813383652323725628494261414287817117703355799303086256914782640807165021059760198249458510362432176960683009890989990086614909076853502936665842869163947730574085863127445475967466399017447434906719734480523659879746056728772390182338236187070557277461449143752467418310063647027554915213099799725713708651142505590086828211040619445941301844994775362846837122335522584661592447560060751169->986236757547332986472011617696226561292849812918563355472727826767720188564083584387121625107510786855734801053524719833194566624465665316622563244215340671405971599343902468620306327831715457360719532421388780770165778156818229863337344187575566725786793391480600129482653072861971002459947277805295727097226389568776499707662505334062639449916265137796823793276300221537201727072401742985542559596685092673521228140822200236743113743661549252453726123450722876929538747702356573783116197523966334991563351853851212597377279504828784687920949198341066450537230593608440475006386024448307924665012521692416658191
; jetbra-free-start
; jetbra-free-end
[Args]
EQUAL,65537,24773058818499217187577663886010908531303294206336895556072197892590450942803807164562754911175164262596715237551312004078542654996496301487027034803410086499747369353221485073240039340641397198525027728751956658900801359887190562885573922317930300068615009483578963467556425525328780085523172495307229112069939166202511721671904748968934606589702999279663332403655662225374084460291376706916679151764149324177444374590606643838366605181996272409014933080082205048098737253668016260658830645459388519595314928290853199112791333551144805347785109465401055719331231478162870216035573012645710763533896540021550083104281->3,24773058818499217187577663886010908531303294206336895556072197892590450942803807164562754911175164262596715237551312004078542654996496301487027034803410086499747369353221485073240039340641397198525027728751956658900801359887190562885573922317930300068615009483578963467556425525328780085523172495307229112069939166202511721671904748968934606589702999279663332403655662225374084460291376706916679151764149324177444374590606643838366605181996272409014933080082205048098737253668016260658830645459388519595314928290853199112791333551144805347785109465401055719331231478162870216035573012645710763533896540021550083104281

View File

@@ -0,0 +1,5 @@
[URL]
PREFIX,https://account.jetbrains.com/lservice/rpc/validateKey.action
PREFIX,https://account.jetbrains.com.cn/lservice/rpc/validateKey.action
PREFIX,https://account.jetbrains.com.cn/lservice/rpc/validateLicense.action
PREFIX,https://check-license.squaretest.com

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,11 @@
2a723c2ef30be4a5c167c6639bf9ec0b9c7e7ca2 ./ja-netfilter.jar
4e8693b5a7a3837cf7f6db0c4f1316f376d34721 ./plugins-jetbrains/dns.jar
729d00e4fa04ca49c00b5b6aa60706dfadd5644e ./plugins-jetbrains/hideme.jar
26ee7577969265ff77a7fd786bcb707fe21a3d6b ./plugins-jetbrains/power.jar
b1bebbee8d98218db5794f596001b8b7427ae0c7 ./plugins-jetbrains/url.jar
229dd5a5de89bd6fe5fbf5f0c2768895802d7127 ./plugins-jetbrains/native.jar
2296094cc5611a7707d5aad9e152f0388822b19f ./config-jetbrains/dns.conf
77af4f5d6267e6cc0dcf46763783c31eb9e3d99a ./config-jetbrains/url.conf
0f73b337faafeddc46cb0682075e47a6e725ca5e ./config-jetbrains/power.conf
7d85e04e8c671c86a163dc1a47a24961d12be76a ./config-jetbrains/native.conf

292
static/js/handler.js Normal file
View File

@@ -0,0 +1,292 @@
function copyToClipboard(button) {
const code = button.parentElement;
const clone = code.cloneNode(true);
const btn = clone.querySelector("button");
if (btn) btn.remove();
const text = clone.textContent.trim();
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard
.writeText(text)
.then(() => {
button.textContent = "Copyed";
setTimeout(() => (button.textContent = "Copy"), 2000);
})
.catch(() => {
const textarea = document.createElement("textarea");
textarea.value = text;
textarea.style.position = "fixed";
textarea.style.opacity = "0";
document.body.appendChild(textarea);
textarea.focus();
textarea.select();
try {
const success = document.execCommand("copy");
button.textContent = success ? "Copyed" : "Copy failed";
} catch (e) {
button.textContent = "Copy failed";
}
setTimeout(() => (button.textContent = "Copy"), 2000);
document.body.removeChild(textarea);
});
} else {
const textarea = document.createElement("textarea");
textarea.value = text;
textarea.style.position = "fixed";
textarea.style.opacity = "0";
document.body.appendChild(textarea);
textarea.focus();
textarea.select();
try {
const success = document.execCommand("copy");
button.textContent = success ? "Copyed" : "Copy failed";
} catch (e) {
button.textContent = "Copy failed";
}
setTimeout(() => (button.textContent = "Copy"), 2000);
document.body.removeChild(textarea);
}
}
function filterCards() {
const keyword = document
.getElementById("search-box")
.value.toLowerCase();
const cards = document.querySelectorAll(".ides-languages-product-card");
cards.forEach((card) => {
const textContent = card.textContent.toLowerCase();
if (textContent.includes(keyword)) {
card.style.display = "";
} else {
card.style.display = "none";
}
});
}
window.addEventListener("DOMContentLoaded", () => {
if (localStorage.getItem("licenseInfo") === null) {
document.getElementById("mask").style.display = "block";
document.getElementById("form").style.display = "block";
}
});
window.submitLicenseInfo = function () {
let licenseeName = document.getElementById("licenseeName").value;
let assigneeName = document.getElementById("assigneeName").value;
let expiryDate = document.getElementById("expiryDate").value;
let licenseInfo = {
licenseeName: licenseeName,
assigneeName: assigneeName,
expiryDate: expiryDate,
};
localStorage.setItem("licenseInfo", JSON.stringify(licenseInfo));
document.getElementById("mask").style.display = "none";
document.getElementById("form").style.display = "none";
};
window.showLicenseForm = function () {
let licenseInfo = localStorage.getItem("licenseInfo");
if (licenseInfo !== null) {
licenseInfo = JSON.parse(licenseInfo);
document.getElementById("licenseeName").value =
licenseInfo.licenseeName;
document.getElementById("assigneeName").value =
licenseInfo.assigneeName;
document.getElementById("expiryDate").value = licenseInfo.expiryDate;
} else {
document.getElementById("licenseeName").value = "{{.licenseeName}}";
document.getElementById("assigneeName").value = "{{.assigneeName}}";
document.getElementById("expiryDate").value = "{{.expiryDate}}";
}
document.getElementById("mask").style.display = "block";
document.getElementById("form").style.display = "block";
};
function showInfo() {
document.getElementById("mask-info").style.display = "block";
document.getElementById("form-info").style.display = "block";
}
function closeInfo() {
document.getElementById("mask-info").style.display = "none";
document.getElementById("form-info").style.display = "none";
}
function fallbackCopyText(text, target) {
const textarea = document.createElement("textarea");
textarea.value = text;
textarea.style.position = "fixed";
textarea.style.opacity = "0";
document.body.appendChild(textarea);
textarea.focus();
textarea.select();
try {
const successful = document.execCommand("copy");
if (successful) {
showTooltip(target, translations[currentLang].licenseCopied);
} else {
showTooltip(target, translations[currentLang].copyFailed);
}
} catch (err) {
showTooltip(target, translations[currentLang].copyFailed + ": " + err);
}
document.body.removeChild(textarea);
}
function showTooltip(target, message) {
const tooltip = document.createElement("div");
tooltip.textContent = message;
tooltip.style.position = "absolute";
tooltip.style.backgroundColor = "#333";
tooltip.style.color = "#fff";
tooltip.style.padding = "4px 8px";
tooltip.style.borderRadius = "4px";
tooltip.style.fontSize = "12px";
tooltip.style.zIndex = "1000";
tooltip.style.whiteSpace = "nowrap";
tooltip.style.opacity = "0";
tooltip.style.transition = "opacity 0.3s ease";
document.body.appendChild(tooltip);
const rect = target.getBoundingClientRect();
const targetId = target.dataset.id || Math.random().toString(36).substr(2, 9);
target.dataset.id = targetId;
const existingTooltips = document.querySelectorAll(`.tooltip[data-target-id="${targetId}"]`);
const offset = existingTooltips.length * 30;
tooltip.style.left = `${rect.left + rect.width / 2}px`;
tooltip.style.top = `${rect.top + window.scrollY - 30 - offset}px`;
tooltip.classList.add("tooltip");
tooltip.setAttribute("data-target-id", targetId);
tooltip.style.opacity = "1";
setTimeout(() => {
tooltip.style.opacity = "0";
setTimeout(() => tooltip.remove(), 300);
}, 1500);
}
window.clickCard = async function (e) {
while (localStorage.getItem("licenseInfo") === null) {
document.getElementById("mask").style.display = "block";
document.getElementById("form").style.display = "block";
await new Promise((r) => setTimeout(r, 1000));
}
const licenseInfo = JSON.parse(localStorage.getItem("licenseInfo"));
const card = e.closest(".card");
const type = card.dataset.type;
const app = card.dataset.product;
const codes = card.dataset.productCodes.split(",");
const products = codes.map((code) => ({
code,
fallbackDate: licenseInfo.expiryDate,
paidUpTo: licenseInfo.expiryDate,
}));
const requestData = {
app: app,
status: "Cracked",
license: {
licenseeName: licenseInfo.licenseeName,
assigneeName: licenseInfo.assigneeName,
assigneeEmail: "",
licenseRestriction: "",
checkConcurrentUse: false,
products: products,
metadata: "0120230102PPAA013009",
hash: "41472961/0:1563609451",
gracePeriodDays: 7,
autoProlongated: true,
isAutoProlongated: true,
}
};
let resp = await fetch("/generateLicense", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(requestData.license),
}).then((response) => response.json());
if (resp.license) {
const card = e.closest(".card");
const licenseElement = card.querySelector(".license-key");
licenseElement.textContent = resp.license;
const licenseKey = resp.license.trim();
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard
.writeText(licenseKey)
.then(() => {
showTooltip(card, translations[currentLang].licenseCopied);
})
.catch(() => {
fallbackCopyText(licenseKey, card);
});
} else {
fallbackCopyText(licenseKey, card);
}
} else {
console.error("No license found in response", resp);
}
if (type == 'plugins') {
return;
}
fetch("/crack", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(requestData),
})
.then(response => response.json())
.then(data => {
if (data.msg === "CrackedWithoutBackup") {
const ribbon = card.querySelector(".ribbon-wrapper");
if (ribbon) ribbon.classList.remove("hidden");
} else if (data.msg === "Cracked") {
const ribbon = card.querySelector(".ribbon-wrapper");
if (ribbon) ribbon.classList.remove("hidden");
showTooltip(card, translations[currentLang].crackedMsg);
} else {
showTooltip(card, translations[currentLang].crackedFailed + ": " + data.msg);
}
})
.catch(err => {
showTooltip(card, translations[currentLang].requestFailed + ": " + err);
});
};
function uncrackAgent(e, el) {
e.stopPropagation();
const card = el.closest(".card");
const app = card.dataset.product;
const requestData = {
app: app,
status: "UnCracked",
};
const ribbon = card.querySelector(".ribbon-wrapper");
fetch("/crack", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(requestData)
})
.then(response => response.json())
.then(data => {
if (data.msg === "UnCracked") {
if (ribbon) ribbon.classList.add("hidden");
showTooltip(card, translations[currentLang].recoverMsg);
} else {
showTooltip(card, translations[currentLang].recoverFailed + ": " + data.msg);
}
})
.catch(err => {
showTooltip(card, translations[currentLang].requestFailed + ": " + err);
});
}

92
static/js/languages.js Normal file
View File

@@ -0,0 +1,92 @@
const translations = {
en: {
searchPlaceholder: "Search for IDE or plugin...",
instructions: "Instructions for use",
chooseIde: "Choose the IDE",
choosePlugins: "Choose the Plugins",
licenseeInfo: "Licensee Information",
enterLicenseeInfo: "Please enter licensee information",
submit: "Submit",
close: "Close",
clickToGenerate: "Click to crack and generate a license",
freeTag: "Free for non-commercial use",
clickCard: "Click to generate a license",
cracked: "Cracked",
recover: "Recover",
licenseCopied: "License copied! ✅",
crackedMsg: "Cracked successfully, ja-netfilter injected ✅",
crackedFailed: "Crack failed",
recoverMsg: "Recovered successfully, crack removed",
recoverFailed: "Recovery failed",
requestFailed: "Request failed",
},
zh: {
searchPlaceholder: "搜索 IDE 或插件...",
instructions: "使用说明",
chooseIde: "选择 IDE",
choosePlugins: "选择插件",
licenseeInfo: "授权信息",
enterLicenseeInfo: "请输入授权信息",
submit: "提交",
close: "关闭",
clickToGenerate: "点击生成授权码",
freeTag: "免费用于非商业用途",
clickCard: "点击生成授权码",
cracked: "已破解",
recover: "还原",
licenseCopied: "授权码已复制!✅",
crackedMsg: "破解成功,已注入 ja-netfilter ✅",
crackedFailed: "破解失败",
recoverMsg: "已还原,破解内容已移除",
recoverFailed: "还原失败",
requestFailed: "请求出错",
}
};
let currentLang = 'en';
function toggleLanguage() {
currentLang = currentLang === 'zh' ? 'en' : 'zh';
updatePageLanguage();
}
function updatePageLanguage() {
const t = translations[currentLang];
document.getElementById('search-box').placeholder = t.searchPlaceholder;
document.querySelector('h2').textContent = t.chooseIde;
document.querySelectorAll('h2')[1].textContent = t.choosePlugins;
document.querySelector('#form .title').textContent = t.licenseeInfo;
document.querySelector('#form .subtitle').textContent = t.enterLicenseeInfo;
document.querySelector('#form .submit').textContent = t.submit;
document.querySelector('#form-info .title').textContent = t.instructions;
document.querySelector('#form-info .submit').textContent = t.close;
document.querySelectorAll('.license-key').forEach(el => {
el.textContent = t.clickToGenerate;
});
document.querySelectorAll('[data-test="tag"]').forEach(el => {
el.textContent = t.freeTag;
});
document.querySelectorAll('.license-key').forEach(el => {
el.textContent = t.clickCard;
});
document.querySelectorAll('.ribbon').forEach(el => {
if (el.classList.contains('recover')) {
el.textContent = t.recover;
el.setAttribute('data-hover-text', t.cracked);
} else {
el.textContent = t.cracked;
el.setAttribute('data-hover-text', t.recover);
}
});
}
document.addEventListener('DOMContentLoaded', () => {
updatePageLanguage();
});

View File

@@ -0,0 +1,30 @@
-----BEGIN CERTIFICATE-----
MIIFOzCCAyOgAwIBAgIJANJssYOyg3nhMA0GCSqGSIb3DQEBCwUAMBgxFjAUBgNV
BAMMDUpldFByb2ZpbGUgQ0EwHhcNMTUxMDAyMTEwMDU2WhcNNDUxMDI0MTEwMDU2
WjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMIICIjANBgkqhkiG9w0BAQEFAAOC
Ag8AMIICCgKCAgEA0tQuEA8784NabB1+T2XBhpB+2P1qjewHiSajAV8dfIeWJOYG
y+ShXiuedj8rL8VCdU+yH7Ux/6IvTcT3nwM/E/3rjJIgLnbZNerFm15Eez+XpWBl
m5fDBJhEGhPc89Y31GpTzW0vCLmhJ44XwvYPntWxYISUrqeR3zoUQrCEp1C6mXNX
EpqIGIVbJ6JVa/YI+pwbfuP51o0ZtF2rzvgfPzKtkpYQ7m7KgA8g8ktRXyNrz8bo
iwg7RRPeqs4uL/RK8d2KLpgLqcAB9WDpcEQzPWegbDrFO1F3z4UVNH6hrMfOLGVA
xoiQhNFhZj6RumBXlPS0rmCOCkUkWrDr3l6Z3spUVgoeea+QdX682j6t7JnakaOw
jzwY777SrZoi9mFFpLVhfb4haq4IWyKSHR3/0BlWXgcgI6w6LXm+V+ZgLVDON52F
LcxnfftaBJz2yclEwBohq38rYEpb+28+JBvHJYqcZRaldHYLjjmb8XXvf2MyFeXr
SopYkdzCvzmiEJAewrEbPUaTllogUQmnv7Rv9sZ9jfdJ/cEn8e7GSGjHIbnjV2ZM
Q9vTpWjvsT/cqatbxzdBo/iEg5i9yohOC9aBfpIHPXFw+fEj7VLvktxZY6qThYXR
Rus1WErPgxDzVpNp+4gXovAYOxsZak5oTV74ynv1aQ93HSndGkKUE/qA/JECAwEA
AaOBhzCBhDAdBgNVHQ4EFgQUo562SGdCEjZBvW3gubSgUouX8bMwSAYDVR0jBEEw
P4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2Zp
bGUgQ0GCCQDSbLGDsoN54TAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkq
hkiG9w0BAQsFAAOCAgEAjrPAZ4xC7sNiSSqh69s3KJD3Ti4etaxcrSnD7r9rJYpK
BMviCKZRKFbLv+iaF5JK5QWuWdlgA37ol7mLeoF7aIA9b60Ag2OpgRICRG79QY7o
uLviF/yRMqm6yno7NYkGLd61e5Huu+BfT459MWG9RVkG/DY0sGfkyTHJS5xrjBV6
hjLG0lf3orwqOlqSNRmhvn9sMzwAP3ILLM5VJC5jNF1zAk0jrqKz64vuA8PLJZlL
S9TZJIYwdesCGfnN2AETvzf3qxLcGTF038zKOHUMnjZuFW1ba/12fDK5GJ4i5y+n
fDWVZVUDYOPUixEZ1cwzmf9Tx3hR8tRjMWQmHixcNC8XEkVfztID5XeHtDeQ+uPk
X+jTDXbRb+77BP6n41briXhm57AwUI3TqqJFvoiFyx5JvVWG3ZqlVaeU/U9e0gxn
8qyR+ZA3BGbtUSDDs8LDnE67URzK+L+q0F2BC758lSPNB2qsJeQ63bYyzf0du3wB
/gb2+xJijAvscU3KgNpkxfGklvJD/oDUIqZQAnNcHe7QEf8iG2WqaMJIyXZlW3me
0rn+cgvxHPt6N4EBh5GgNZR4l0eaFEV+fxVsydOQYo1RIyFMXtafFBqQl6DDxujl
FeU3FZ+Bcp12t7dlM4E0/sS1XdL47CfGVj4Bp+/VbF862HmkAbd7shs7sDQkHbU=
-----END CERTIFICATE-----

318
templates/index.html Normal file
View File

@@ -0,0 +1,318 @@
{{define "/index.html"}}
<!DOCTYPE html>
<html lang="zh-Hans">
<head>
<meta charset="utf-8" />
<link href="static/css/common.css" rel="stylesheet" type="text/css" />
<link href="static/css/index.css" rel="stylesheet" type="text/css" />
<link href="static/css/custom.css" rel="stylesheet" type="text/css" />
<script src="static/js/handler.js"></script>
<script src="static/js/languages.js"></script>
<title>{{.title}}</title>
</head>
<body class="body-adaptive page-color-lilac-purple wt-primary-map">
<div id="ide-page">
<div id="mask"></div>
<div id="form">
<div class="form">
<div class="title">Licensee Information</div>
<div class="subtitle">Please enter licensee information</div>
<div class="input-container ic1">
<input
id="licenseeName"
class="input"
type="text"
placeholder=" "
value="{{.licenseeName}}"
/>
<div class="cut"></div>
<label for="licenseeName" class="placeholder">licenseeName</label>
</div>
<div class="input-container ic2">
<input
id="assigneeName"
class="input"
type="text"
placeholder=" "
value="{{.assigneeName}}"
/>
<div class="cut"></div>
<label for="assigneeName" class="placeholder">assigneeName</label>
</div>
<div class="input-container ic2">
<input
id="expiryDate"
class="input"
type="text"
placeholder=""
value="{{.expiryDate}}"
/>
<div class="cut cut-short"></div>
<label for="expiryDate" class="placeholder">expiryDate</label>
</div>
<button class="submit" onclick="submitLicenseInfo(this)">
submit
</button>
</div>
</div>
<div id="mask-info"></div>
<div id="form-info">
<div class="form-content">
<div class="title">Instructions for use</div>
<strong
>"Before activation, you need to modify the vmoptions parameter and
restart the software"</strong
>
<p>
Open the software and press <strong>"Ctrl+Shift+A"</strong>enter
<strong>"Edit Custom VM Options"</strong> And return
</p>
Or open the software and click <strong>"Settings"</strong> Click
<strong>"Edit Custom VM Options"</strong>
<p>Or manually open the ".vmoptions" file, such as:</p>
<pre
class="code-block"
><code>- windows: "%APPDATA%\JetBrains\GoLand2025.1\goland64.exe.vmoptions"
- macOS: "~/Library/Application Support/JetBrains/GoLand2025.1/goland.vmoptions"
- Linux: "~/.config/JetBrains/GoLand2025.1/goland64.vmoptions"
</code></pre>
<p>
".vmoptions" Add the following content to the file,<strong
>Save and restart the software</strong
>Then fill in the activation code:
</p>
<pre
class="code-block"
><code>--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
-javaagent:{{.jaNetfilter}}=jetbrains<button class="copy-button" onclick="copyToClipboard(this)">Copy</button>
</code></pre>
<button class="submit" onclick="closeInfo()">close</button>
</div>
</div>
<section class="wt-section find-ide-section background-black">
<header class="search-container" style="margin-bottom: 20px; gap: 10px">
<input
type="text"
id="search-box"
class="search-input"
placeholder="Search for IDE or plugin..."
oninput="filterCards()"
/>
<button
class="jetbra-button lang-icon"
onclick="toggleLanguage()"
></button>
<style>
.lang-icon {
position: relative;
background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12.87 15.07l-2.54-2.51.03-.03A17.52 17.52 0 0014.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
background-size: 24px;
}
</style>
<button
class="jetbra-button settings-icon"
onclick="showLicenseForm()"
></button>
<style>
.settings-icon {
position: relative;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z'%3E%3C/path%3E%3Ccircle cx='12' cy='12' r='3'%3E%3C/circle%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
background-size: 24px;
}
</style>
<button class="jetbra-button info-icon" onclick="showInfo()"></button>
<style>
.info-icon {
position: relative;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpath d='M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3'%3E%3C/path%3E%3Cline x1='12' y1='17' x2='12.01' y2='17'%3E%3C/line%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
background-size: 24px;
}
</style>
</header>
<div class="wt-container wt-offset-top-96">
<div class="wt-offset-top-48">
<h2
class="_rs-h2_19db458_1 _rs-typography_theme_dark_19db458_1 _rs-text_hardness_auto_19db458_1 wt-offset-top-96"
>
Choose the IDE
</h2>
<div
class="wt-row wt-row_size_m ide-products-section jb-offset-top-16 jb-offset-top-sm-48"
id="ide-products-section"
>
{{range .apps}}
<a
data-type="ides"
data-product="{{.Name}}"
data-product-codes="{{.Code}}"
onclick="clickCard(this)"
class="card wt-col-4 wt-col-md-6 wt-col-sm-12 wt-offset-top-32 ides-languages-product-card"
>
<div
class="wt-row wt-row_size_m ides-languages-product-card__wrap"
>
<div class="ribbon-wrapper {{ if eq .CrackStatus "Cracked" }}ribbon-wrapper{{ else }} hidden{{ end }}">
<div class="ribbon" onclick="uncrackAgent(event, this)">Cracked</div>
</div>
<div class="wt-col-inline">
<div class="wt-row wt-row_size_m wt-row_nowrap">
<div
class="wt-col-inline ides-languages-product-card__icon"
>
<div
class="icon"
role="img"
style="background-image: url('{{.Icon}}')"
></div>
</div>
<div class="wt-col-inline">
<div
class="wt-row wt-row_size_s wt-row_align-items_center"
>
<div class="wt-col-inline">
<h3
class="_rs-h3_19db458_1 _rs-typography_theme_dark_19db458_1 _rs-text_hardness_auto_19db458_1"
>
{{.Name}} {{if .IsFree}}
<span
data-test="tag"
class="_main_1i6xjbl_31 _sizeXs_1i6xjbl_18 _alignIconLeft_1i6xjbl_7 _main_imuztz_1 wt-col-inline wt-col_align-self_end main-developers-ide-card__tag"
style="
color: rgb(255, 255, 255);
background-color: rgb(107, 87, 255);
"
>Free for non-commercial use</span
>
{{end}}
</h3>
</div>
</div>
<p
class="_rs-text-2_19db458_1 _rs-typography_theme_dark_19db458_1 _rs-text_hardness_hard_19db458_1 wt-offset-top-8"
>
{{.Describe}}
</p>
<p class="license-key">Click to generate a license</p>
</div>
</div>
</div>
<div class="wt-col-12 wt-col_align-self_end">
<div
class="wt-row wt-row_size_xs ides-languages-product-card__language-tags wt-offset-top-16 wt-display-sm-none"
>
{{range .Tags}}
<div class="wt-col-inline">
<div
class="_rs-text-3_19db458_1 _rs-typography_theme_dark_19db458_1 _rs-text_hardness_hard_19db458_1 wt-offset-top-8"
>
{{.}}
</div>
</div>
{{end}}
</div>
</div>
</div></a
>
{{end}}
</div>
</div>
</div>
<div class="wt-container wt-offset-top-96">
<div class="wt-offset-top-48">
<h2
class="_rs-h2_19db458_1 _rs-typography_theme_dark_19db458_1 _rs-text_hardness_auto_19db458_1 wt-offset-top-96"
>
Choose the Plugins
</h2>
<div
class="wt-row wt-row_size_m ide-products-section jb-offset-top-16 jb-offset-top-sm-48"
id="plugins-products-section"
>
{{range .plugins}}
<a
data-type="plugins"
data-product="{{.Name}}"
data-product-codes="{{.Code}}"
onclick="clickCard(this)"
class="card wt-col-4 wt-col-md-6 wt-col-sm-12 wt-offset-top-32 ides-languages-product-card"
><div
class="wt-row wt-row_size_m ides-languages-product-card__wrap"
>
<div class="wt-col-inline">
<div class="wt-row wt-row_size_m wt-row_nowrap">
<div
class="wt-col-inline ides-languages-product-card__icon"
>
<div
class="icon"
role="img"
style="background-image: url('{{.Icon}}')"
></div>
</div>
<div class="wt-col-inline">
<div
class="wt-row wt-row_size_s wt-row_align-items_center"
>
<div class="wt-col-inline">
<h3
class="_rs-h3_19db458_1 _rs-typography_theme_dark_19db458_1 _rs-text_hardness_auto_19db458_1"
>
{{.Name}} {{if .IsFree}}
<span
data-test="tag"
class="_main_1i6xjbl_31 _sizeXs_1i6xjbl_18 _alignIconLeft_1i6xjbl_7 _main_imuztz_1 wt-col-inline wt-col_align-self_end main-developers-ide-card__tag"
style="
color: rgb(255, 255, 255);
background-color: rgb(107, 87, 255);
"
>Free for non-commercial use</span
>
{{end}}
</h3>
</div>
</div>
<p
class="_rs-text-2_19db458_1 _rs-typography_theme_dark_19db458_1 _rs-text_hardness_hard_19db458_1 wt-offset-top-8"
>
{{.Describe}}
</p>
<p class="license-key">Click to generate a license</p>
</div>
</div>
</div>
<div class="wt-col-12 wt-col_align-self_end">
<div
class="wt-row wt-row_size_xs ides-languages-product-card__language-tags wt-offset-top-16 wt-display-sm-none"
>
{{range .Tags}}
<div class="wt-col-inline">
<div
class="_rs-text-3_19db458_1 _rs-typography_theme_dark_19db458_1 _rs-text_hardness_hard_19db458_1 wt-offset-top-8"
>
{{.}}
</div>
</div>
{{end}}
</div>
</div>
</div></a
>
{{end}}
</div>
</div>
</div>
</section>
</div>
</body>
</html>
{{end}}