From 17dde05428b2dea885de829ae9fec7c01503cbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=97=8F=E6=9F=8F?= Date: Thu, 11 Apr 2024 15:46:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=B2~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 33 + lombok.config | 11 + pom.xml | 74 + src/main/.DS_Store | Bin 0 -> 6148 bytes .../help/JetbrainsHelpApplication.java | 39 + .../help/context/AgentContextHolder.java | 96 + .../context/CertificateContextHolder.java | 110 ++ .../help/context/LicenseContextHolder.java | 77 + .../help/context/PluginsContextHolder.java | 196 ++ .../help/context/ProductsContextHolder.java | 54 + .../help/controller/OpenApiController.java | 62 + .../properties/JetbrainsHelpProperties.java | 17 + .../jetbrains/help/route/IndexController.java | 51 + .../com/jetbrains/help/util/FileTools.java | 33 + src/main/resources/.DS_Store | Bin 0 -> 6148 bytes src/main/resources/application.yml | 11 + src/main/resources/certificate/root.key | 30 + src/main/resources/plugin.json | 1612 +++++++++++++++++ src/main/resources/product.json | 67 + src/main/resources/static/.DS_Store | Bin 0 -> 6148 bytes src/main/resources/static/agent/.DS_Store | Bin 0 -> 6148 bytes .../static/agent/ja-netfilter/.DS_Store | Bin 0 -> 6148 bytes .../static/agent/ja-netfilter/config/dns.conf | 3 + .../agent/ja-netfilter/config/power.conf | 1 + .../static/agent/ja-netfilter/config/url.conf | 3 + .../agent/ja-netfilter/ja-netfilter.jar | Bin 0 -> 48639 bytes .../static/agent/ja-netfilter/plugins/dns.jar | Bin 0 -> 4859 bytes .../agent/ja-netfilter/plugins/hideme.jar | Bin 0 -> 7209 bytes .../agent/ja-netfilter/plugins/power.jar | Bin 0 -> 9222 bytes .../static/agent/ja-netfilter/plugins/url.jar | Bin 0 -> 4529 bytes src/main/resources/static/css/index.css | 530 ++++++ src/main/resources/static/images/icons.svg | 713 ++++++++ src/main/resources/static/js/index.js | 83 + src/main/resources/static/js/jquery.js | 2 + src/main/resources/templates/index.html | 106 ++ 36 files changed, 4014 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 lombok.config create mode 100644 pom.xml create mode 100644 src/main/.DS_Store create mode 100644 src/main/java/com/jetbrains/help/JetbrainsHelpApplication.java create mode 100644 src/main/java/com/jetbrains/help/context/AgentContextHolder.java create mode 100644 src/main/java/com/jetbrains/help/context/CertificateContextHolder.java create mode 100644 src/main/java/com/jetbrains/help/context/LicenseContextHolder.java create mode 100644 src/main/java/com/jetbrains/help/context/PluginsContextHolder.java create mode 100644 src/main/java/com/jetbrains/help/context/ProductsContextHolder.java create mode 100644 src/main/java/com/jetbrains/help/controller/OpenApiController.java create mode 100644 src/main/java/com/jetbrains/help/properties/JetbrainsHelpProperties.java create mode 100644 src/main/java/com/jetbrains/help/route/IndexController.java create mode 100644 src/main/java/com/jetbrains/help/util/FileTools.java create mode 100644 src/main/resources/.DS_Store create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/certificate/root.key create mode 100644 src/main/resources/plugin.json create mode 100644 src/main/resources/product.json create mode 100644 src/main/resources/static/.DS_Store create mode 100644 src/main/resources/static/agent/.DS_Store create mode 100644 src/main/resources/static/agent/ja-netfilter/.DS_Store create mode 100644 src/main/resources/static/agent/ja-netfilter/config/dns.conf create mode 100644 src/main/resources/static/agent/ja-netfilter/config/power.conf create mode 100644 src/main/resources/static/agent/ja-netfilter/config/url.conf create mode 100644 src/main/resources/static/agent/ja-netfilter/ja-netfilter.jar create mode 100644 src/main/resources/static/agent/ja-netfilter/plugins/dns.jar create mode 100644 src/main/resources/static/agent/ja-netfilter/plugins/hideme.jar create mode 100644 src/main/resources/static/agent/ja-netfilter/plugins/power.jar create mode 100644 src/main/resources/static/agent/ja-netfilter/plugins/url.jar create mode 100644 src/main/resources/static/css/index.css create mode 100644 src/main/resources/static/images/icons.svg create mode 100644 src/main/resources/static/js/index.js create mode 100644 src/main/resources/static/js/jquery.js create mode 100644 src/main/resources/templates/index.html diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..735f5bdd3084333ac3c234798608f7cc78728fb0 GIT binary patch literal 6148 zcmeHK%}T>S5T0$TZ74zy3VK`cTC~;rhnG<63mDOZN=;~~!I&*=Y7V84yS|Vw;`2DO zyDe(<;6=pF!0b1fok^H4VJ8CsqB-i+0V)7cLM6;OxO^eBPdX<#>&YVux<`->`$41v zyndOBX2)M-fZkmJwx9mBu$!OU02Um1; zu2d9EZ9ljOyJ@?!dZOaQ5997YCxo3YhFo8UaYv<1HHte!o$Hwm$0<4O%EoxS*Ep=o z-Nyc;D#!KOLA@#)M>~^=Q(D{HK0a&TM-Q=jGAs)G;Iyn*oWe62vw|MIK^&>Lhdzp5 zh6H>VV6k0DKJ88O8JPiQfEic-2J8`9Dlb5-Tp}~T4E&4%Iv*q|p=&WSsE-a@^ay}h zK(`jOX_lZIY0G%lZBm7gnl~SU+QoW zu0dXz0cPMM12p@gRH*--en0=~AYPaOX5fD^APOz7)x_FtZ=I`>daXpgMJ1uQ%-}2q j4c&?{mRj*TsuuK1G7w#hnL+fR@Q;9|ffr`rR~dK%tzl3J literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/lombok.config b/lombok.config new file mode 100644 index 0000000..20d76ad --- /dev/null +++ b/lombok.config @@ -0,0 +1,11 @@ +## 以当前目录为根目录 +config.stopBubbling=true + +## 默认以链式生成Setter +lombok.accessors.chain=true + +## 默认ToString包含超类 +lombok.tostring.callsuper=call + +## 默认比较器包含超类 +lombok.equalsandhashcode.callsuper=call diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8aa7a53 --- /dev/null +++ b/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.4 + + + com.jetbrains.help + Jetbrains-Help + 0.0.1-SNAPSHOT + Jetbrains-Help + Jetbrains-Help + + 21 + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.projectlombok + lombok + true + + + + cn.hutool + hutool-all + 5.8.26 + + + + org.bouncycastle + bcpkix-jdk18on + 1.78 + + + org.bouncycastle + bcprov-jdk18on + 1.78 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..47dca67b8451056b19430657b55f0ae18478132f GIT binary patch literal 6148 zcmeHK-AcnS6i&8jSBB6FgTmW^2+ zO;@7H@D~}ty|ZE0V9%IjpY|`GM2U>R`x;G>I4@lHjo0dpjZMq4t(J8i+{`^JPDgU;%Q7A1DmTy$+iu!Jr#+kX z++IiY4!iS?nDx7EM;!FK^SRyJ+1)!j9X=$FseIOSa`^LjR(V&KON;Q1gx5j}&IMs;*RgV#s&HxN;vk8cS? zVbC*JX#@`l*QtOym76C9*XdvvCeAZhY1HYAtC`_DW@c_)C|u1BcA>%<_cT&V3=jj$ z4Ak||!TNvl{ri78iAKZ#G4QV#;Eh2r@L@@&wyrD=Ypnpi0Y$;MO5;ZgbW|yZSS-bD bP$gg&*a7qmRvN(qLKgu=12x3JuQKosS9(pP literal 0 HcmV?d00001 diff --git a/src/main/java/com/jetbrains/help/JetbrainsHelpApplication.java b/src/main/java/com/jetbrains/help/JetbrainsHelpApplication.java new file mode 100644 index 0000000..20310c3 --- /dev/null +++ b/src/main/java/com/jetbrains/help/JetbrainsHelpApplication.java @@ -0,0 +1,39 @@ +package com.jetbrains.help; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.jetbrains.help.context.*; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.annotation.Import; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.Collection; +import java.util.List; + +@EnableScheduling +@Import(SpringUtil.class) +@SpringBootApplication +public class JetbrainsHelpApplication { + + public static void main(String[] args) { + SpringApplication.run(JetbrainsHelpApplication.class, args); + } + + @EventListener(ApplicationReadyEvent.class) + public void ready() { + ProductsContextHolder.init(); + PluginsContextHolder.init(); + CertificateContextHolder.init(); + AgentContextHolder.init(); + } + + @Scheduled(cron = "0 0 12 * * ?") + public void refresh() { + PluginsContextHolder.refreshJsonFile(); + } + +} diff --git a/src/main/java/com/jetbrains/help/context/AgentContextHolder.java b/src/main/java/com/jetbrains/help/context/AgentContextHolder.java new file mode 100644 index 0000000..dea6515 --- /dev/null +++ b/src/main/java/com/jetbrains/help/context/AgentContextHolder.java @@ -0,0 +1,96 @@ +package com.jetbrains.help.context; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ZipUtil; +import cn.hutool.crypto.KeyUtil; +import cn.hutool.crypto.PemUtil; +import com.jetbrains.help.util.FileTools; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPublicKey; +import java.util.concurrent.CompletableFuture; + +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class AgentContextHolder { + + private static final String JA_NETFILTER_FILE_PATH = "static/agent/ja-netfilter"; +// private static final String JA_NETFILTER_FILE_PATH = "static/agent/ja"; + + private static final String POWER_CONF_FILE_NAME = JA_NETFILTER_FILE_PATH + "/config/power.conf"; + + private static File jaNetfilterFile; + + public static void init() { + log.info("Agent context init loading..."); + jaNetfilterFile = FileTools.getFileOrCreat(JA_NETFILTER_FILE_PATH); + if (!powerConfHasInit()) { + log.info("Agent config init loading..."); + loadPowerConf(); + zipJaNetfilter(); + log.info("Agent config init success !"); + } + log.info("Agent context init success !"); + } + + private static boolean powerConfHasInit() { + File powerConfFile = FileTools.getFileOrCreat(POWER_CONF_FILE_NAME); + String powerConfStr; + try { + powerConfStr = IoUtil.readUtf8(FileUtil.getInputStream(powerConfFile)); + } catch (IORuntimeException e) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} File read failed", POWER_CONF_FILE_NAME), e); + } + return CharSequenceUtil.containsAll(powerConfStr, "[Result]", "EQUAL,"); + } + + private static void loadPowerConf() { + CompletableFuture + .supplyAsync(AgentContextHolder::generatePowerConfigRule) + .thenApply(AgentContextHolder::generatePowerConfigStr) + .thenAccept(AgentContextHolder::overridePowerConfFileContent) + .exceptionally(throwable -> { + log.error("agent context init or refresh failed", throwable); + return null; + }).join(); + } + + @SneakyThrows + private static String generatePowerConfigRule() { + X509Certificate crt = (X509Certificate) KeyUtil.readX509Certificate(IoUtil.toStream(CertificateContextHolder.crtFile())); + RSAPublicKey publicKey = (RSAPublicKey) PemUtil.readPemPublicKey(IoUtil.toStream(CertificateContextHolder.publicKeyFile())); + RSAPublicKey rootPublicKey = (RSAPublicKey) PemUtil.readPemPublicKey(IoUtil.toStream(CertificateContextHolder.rootKeyFile())); + BigInteger x = new BigInteger(1, crt.getSignature()); + BigInteger y = BigInteger.valueOf(65537L); + BigInteger z = rootPublicKey.getModulus(); + BigInteger r = x.modPow(publicKey.getPublicExponent(), publicKey.getModulus()); + return CharSequenceUtil.format("EQUAL,{},{},{}->{}", x, y, z, r); + } + + private static String generatePowerConfigStr(String ruleValue) { + return CharSequenceUtil.builder("[Result]", "\n", ruleValue).toString(); + } + + private static void overridePowerConfFileContent(String configStr) { + File powerConfFile = FileTools.getFileOrCreat(POWER_CONF_FILE_NAME); + try { + FileUtil.writeString(configStr, powerConfFile, StandardCharsets.UTF_8); + } catch (IORuntimeException e) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} File write failed", POWER_CONF_FILE_NAME), e); + } + } + + private static void zipJaNetfilter() { + ZipUtil.zip(jaNetfilterFile); + } +} diff --git a/src/main/java/com/jetbrains/help/context/CertificateContextHolder.java b/src/main/java/com/jetbrains/help/context/CertificateContextHolder.java new file mode 100644 index 0000000..bb0c1c7 --- /dev/null +++ b/src/main/java/com/jetbrains/help/context/CertificateContextHolder.java @@ -0,0 +1,110 @@ +package com.jetbrains.help.context; + +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.crypto.PemUtil; +import cn.hutool.crypto.SecureUtil; +import com.jetbrains.help.util.FileTools; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; +import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; +import org.bouncycastle.operator.ContentSigner; +import org.bouncycastle.operator.OperatorCreationException; +import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; + +import java.io.File; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.KeyPair; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.cert.Certificate; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; + +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CertificateContextHolder { + + private static final String ROOT_KEY_FILE_NAME = "certificate/root.key"; + private static final String PRIVATE_KEY_FILE_NAME = "certificate/private.key"; + private static final String PUBLIC_KEY_FILE_NAME = "certificate/public.key"; + private static final String CET_FILE_NAME = "certificate/ca.crt"; + + private static File rootKeyFile; + + private static File privateKeyFile; + + private static File publicKeyFile; + + private static File crtFile; + + public static void init() { + log.info("certificate context init loading..."); + rootKeyFile = FileTools.getFileOrCreat(ROOT_KEY_FILE_NAME); + if (!FileTools.fileExists(PRIVATE_KEY_FILE_NAME) + || !FileTools.fileExists(PUBLIC_KEY_FILE_NAME) + || !FileTools.fileExists(CET_FILE_NAME)) { + log.info("certificate context generate loading..."); + generateCertificate(); + } else { + privateKeyFile = FileTools.getFileOrCreat(PRIVATE_KEY_FILE_NAME); + publicKeyFile = FileTools.getFileOrCreat(PUBLIC_KEY_FILE_NAME); + crtFile = FileTools.getFileOrCreat(CET_FILE_NAME); + } + log.info("certificate context init success !"); + } + + + public static File rootKeyFile() { + return CertificateContextHolder.rootKeyFile; + } + + public static File privateKeyFile() { + return CertificateContextHolder.privateKeyFile; + } + + public static File publicKeyFile() { + return CertificateContextHolder.publicKeyFile; + } + + public static File crtFile() { + return CertificateContextHolder.crtFile; + } + + private static void generateCertificate() { + KeyPair keyPair = SecureUtil.generateKeyPair("RSA", 4096); + PrivateKey privateKey = keyPair.getPrivate(); + PublicKey publicKey = keyPair.getPublic(); + privateKeyFile = FileTools.getFileOrCreat(PRIVATE_KEY_FILE_NAME); + PemUtil.writePemObject("PRIVATE KEY", privateKey.getEncoded(), FileUtil.getWriter(privateKeyFile, StandardCharsets.UTF_8, false)); + publicKeyFile = FileTools.getFileOrCreat(PUBLIC_KEY_FILE_NAME); + PemUtil.writePemObject("PUBLIC KEY", publicKey.getEncoded(), FileUtil.getWriter(publicKeyFile, StandardCharsets.UTF_8, false)); + JcaX509v3CertificateBuilder certificateBuilder = new JcaX509v3CertificateBuilder( + new X500Name("CN=JetProfile CA"), + BigInteger.valueOf(System.currentTimeMillis()), + DateUtil.yesterday(), + DateUtil.date().offset(DateField.YEAR, 100), + new X500Name("CN=Jetbrains-Help"), + SubjectPublicKeyInfo.getInstance(publicKey.getEncoded())); + try { + ContentSigner signer = new JcaContentSignerBuilder("SHA256withRSA").build(privateKey); + Certificate certificate = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certificateBuilder.build(signer)); + crtFile = FileTools.getFileOrCreat(CET_FILE_NAME); + PemUtil.writePemObject("CERTIFICATE", certificate.getEncoded(), FileUtil.getWriter(crtFile, StandardCharsets.UTF_8, false)); + } catch (OperatorCreationException e) { + throw new IllegalArgumentException("Certificate operator creation exception", e); + } catch (CertificateEncodingException e) { + throw new IllegalArgumentException("The certificate encoding exception", e); + } catch (CertificateException e) { + throw new IllegalArgumentException("The certificate read exception", e); + } + } + + +} diff --git a/src/main/java/com/jetbrains/help/context/LicenseContextHolder.java b/src/main/java/com/jetbrains/help/context/LicenseContextHolder.java new file mode 100644 index 0000000..c1c69e2 --- /dev/null +++ b/src/main/java/com/jetbrains/help/context/LicenseContextHolder.java @@ -0,0 +1,77 @@ +package com.jetbrains.help.context; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.crypto.PemUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.SignUtil; +import cn.hutool.crypto.asymmetric.Sign; +import cn.hutool.json.JSONUtil; +import lombok.AccessLevel; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.cert.Certificate; +import java.security.cert.CertificateEncodingException; +import java.util.List; +import java.util.Set; + +import static cn.hutool.crypto.asymmetric.SignAlgorithm.SHA1withRSA; + +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LicenseContextHolder { + + public static String generateLicense(String licensesName, String assigneeName, String expiryDate, Set productCodeSet) { + String licenseId = IdUtil.fastSimpleUUID(); + List products = productCodeSet.stream() + .map(productCode -> new Product() + .setCode(productCode) + .setFallbackDate(expiryDate) + .setPaidUpTo(expiryDate)) + .toList(); + LicensePart licensePart = new LicensePart() + .setLicenseId(licenseId) + .setLicenseeName(licensesName) + .setAssigneeName(assigneeName) + .setProducts(products); + String licensePartJson = JSONUtil.toJsonStr(licensePart); + String licensePartBase64 = Base64.encode(licensePartJson); + PrivateKey privateKey = PemUtil.readPemPrivateKey(IoUtil.toStream(CertificateContextHolder.privateKeyFile())); + PublicKey publicKey = PemUtil.readPemPublicKey(IoUtil.toStream(CertificateContextHolder.publicKeyFile())); + Certificate certificate = SecureUtil.readX509Certificate(IoUtil.toStream(CertificateContextHolder.crtFile())); + Sign sign = SignUtil.sign(SHA1withRSA, privateKey.getEncoded(), publicKey.getEncoded()); + String signatureBase64 = Base64.encode(sign.sign(licensePartJson)); + String certBase64; + try { + certBase64 = Base64.encode(certificate.getEncoded()); + } catch (CertificateEncodingException e) { + throw new IllegalArgumentException("Certificate extraction failed", e); + } + return CharSequenceUtil.format("{}-{}-{}-{}", licenseId, licensePartBase64, signatureBase64, certBase64); + } + + @Data + public static class LicensePart { + + private String licenseId; + private String licenseeName; + private String assigneeName; + private List products; + private String metadata = "0120230914PSAX000005"; + } + + @Data + public static class Product { + private String code; + private String fallbackDate; + private String paidUpTo; + } + +} diff --git a/src/main/java/com/jetbrains/help/context/PluginsContextHolder.java b/src/main/java/com/jetbrains/help/context/PluginsContextHolder.java new file mode 100644 index 0000000..ee4e9da --- /dev/null +++ b/src/main/java/com/jetbrains/help/context/PluginsContextHolder.java @@ -0,0 +1,196 @@ +package com.jetbrains.help.context; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.jetbrains.help.util.FileTools; +import lombok.AccessLevel; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class PluginsContextHolder { + + private static final String PLUGIN_BASIC_URL = "https://plugins.jetbrains.com"; + + private static final String PLUGIN_LIST_URL = PLUGIN_BASIC_URL + "/api/searchPlugins?max=10000&offset=0&orderBy=name"; + + private static final String PLUGIN_INFO_URL = PLUGIN_BASIC_URL + "/api/plugins/"; + + private static final String PLUGIN_JSON_FILE_NAME = "plugin.json"; + + private static List pluginCacheList; + + private static File pluginsJsonFile; + + public static void init() { + log.info("Plugin context init loading..."); + pluginsJsonFile = FileTools.getFileOrCreat(PLUGIN_JSON_FILE_NAME); + + String pluginJsonArray; + try { + pluginJsonArray = IoUtil.readUtf8(FileUtil.getInputStream(pluginsJsonFile)); + } catch (IORuntimeException e) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} File read failed", PLUGIN_JSON_FILE_NAME), e); + } + if (CharSequenceUtil.isBlank(pluginJsonArray) || !JSONUtil.isTypeJSON(pluginJsonArray)) { + refreshJsonFile(); + } else { + pluginCacheList = JSONUtil.toList(pluginJsonArray, PluginCache.class); + log.info("Plugin context init success !"); + } + } + + public static List pluginCacheList() { + return PluginsContextHolder.pluginCacheList; + } + + public static void refreshJsonFile() { + log.info("Init or Refresh plugin context from 'JetBrains.com' loading..."); + CompletableFuture + .supplyAsync(PluginsContextHolder::pluginList) + .thenApply(PluginsContextHolder::pluginListFilter) + .thenApply(PluginsContextHolder::pluginConversion) + .thenAccept(PluginsContextHolder::overrideJsonFile) + .exceptionally(throwable -> { + log.error("Plugin context init or refresh failed", throwable); + return null; + }); + log.info("Init or Refresh plugin context success !"); + } + + public static void overrideJsonFile(List pluginCaches) { + pluginCacheList.addAll(pluginCaches); + String jsonStr = JSONUtil.toJsonStr(pluginCacheList); + try { + FileUtil.writeString(jsonStr, pluginsJsonFile, StandardCharsets.UTF_8); + } catch (IORuntimeException e) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} File write failed", PLUGIN_JSON_FILE_NAME), e); + } + + } + + public static PluginList pluginList() { + return HttpUtil.createGet(PLUGIN_LIST_URL) + .thenFunction(response -> { + InputStream is = response.bodyStream(); + if (!response.isOk()) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} The request failed = {}", PLUGIN_LIST_URL, response)); + } + return IoUtil.readObj(is, PluginList.class); + }); + } + + public static List pluginListFilter(PluginList pluginList) { + return pluginList.getPlugins() + .stream() + .filter(plugin -> !PluginsContextHolder.pluginCacheList.contains(new PluginCache().setId(plugin.getId()))) + .filter(plugin -> !CharSequenceUtil.equals(plugin.getPricingModel(), "FREE")) + .toList(); + } + + public static List pluginConversion(List pluginList) { + return pluginList + .stream() + .map(plugin -> { + String productCode = pluginInfo(plugin.getId()).getPurchaseInfo().getProductCode(); + return new PluginCache() + .setId(plugin.getId()) + .setProductCode(productCode) + .setName(plugin.getName()) + .setPricingModel(plugin.getPricingModel()) + .setIcon(PLUGIN_BASIC_URL + plugin.getIcon()) + ; + }) + .toList(); + } + + public static PluginInfo pluginInfo(Long pluginId) { + return HttpUtil.createGet(PLUGIN_INFO_URL + pluginId) + .thenFunction(response -> { + InputStream is = response.bodyStream(); + if (!response.isOk()) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} The request failed = {}", PLUGIN_INFO_URL, response)); + } + return IoUtil.readObj(is, PluginInfo.class); + }); + } + + + @Data + public static class PluginCache { + + private Long id; + private String productCode; + private String name; + private String pricingModel; + private String icon; + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PluginCache that)) return false; + + return id.equals(that.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } + } + + @Data + public static class PluginInfo { + + private Long id; + + private PurchaseInfo purchaseInfo; + + @Data + public static class PurchaseInfo { + + private String productCode; + } + } + + @Data + public static class PluginList { + + private List plugins; + private Long total; + + + @Data + public static class Plugin { + + private Long id; + private String name; + private String preview; + private Integer downloads; + private String pricingModel; + private String organization; + private String icon; + private String previewImage; + private Double rating; + private VendorInfo vendorInfo; + } + + @Data + public static class VendorInfo { + private String name; + private Boolean isVerified; + } + } +} diff --git a/src/main/java/com/jetbrains/help/context/ProductsContextHolder.java b/src/main/java/com/jetbrains/help/context/ProductsContextHolder.java new file mode 100644 index 0000000..b7a8d55 --- /dev/null +++ b/src/main/java/com/jetbrains/help/context/ProductsContextHolder.java @@ -0,0 +1,54 @@ +package com.jetbrains.help.context; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONUtil; +import com.jetbrains.help.util.FileTools; +import lombok.AccessLevel; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.util.List; + +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ProductsContextHolder { + + private static final String PRODUCT_JSON_FILE_NAME = "product.json"; + + private static List productCacheList; + + public static void init() { + log.info("Product context init loading..."); + File productJsonFile = FileTools.getFileOrCreat(PRODUCT_JSON_FILE_NAME); + + String productJsonArray; + try { + productJsonArray = IoUtil.readUtf8(FileUtil.getInputStream(productJsonFile)); + } catch (IORuntimeException e) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} File read failed !", PRODUCT_JSON_FILE_NAME), e); + } + if (CharSequenceUtil.isBlank(productJsonArray) || !JSONUtil.isTypeJSON(productJsonArray)) { + log.error("Jetbrains Product data does not exist !"); + } else { + productCacheList = JSONUtil.toList(productJsonArray, ProductCache.class); + log.info("Product context init success !"); + } + } + + public static List productCacheList() { + return ProductsContextHolder.productCacheList; + } + + @Data + public static class ProductCache { + + private String name; + private String productCode; + private String iconClass; + } +} diff --git a/src/main/java/com/jetbrains/help/controller/OpenApiController.java b/src/main/java/com/jetbrains/help/controller/OpenApiController.java new file mode 100644 index 0000000..13b9e42 --- /dev/null +++ b/src/main/java/com/jetbrains/help/controller/OpenApiController.java @@ -0,0 +1,62 @@ +package com.jetbrains.help.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.StrUtil; +import com.jetbrains.help.context.LicenseContextHolder; +import com.jetbrains.help.context.PluginsContextHolder; +import com.jetbrains.help.context.ProductsContextHolder; +import lombok.Data; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@RestController +public class OpenApiController { + + @Data + public static class GenerateLicenseReqBody { + + private String licenseName; + + private String assigneeName; + + private String expiryDate; + + private String productCode; + } + + @PostMapping("generateLicense") + public String generateLicense(@RequestBody GenerateLicenseReqBody body) { + Set productCodeSet; + if (CharSequenceUtil.isBlank(body.getProductCode())) { + List productCodeList = ProductsContextHolder.productCacheList() + .stream() + .map(ProductsContextHolder.ProductCache::getProductCode) + .filter(StrUtil::isNotBlank) + .map(productCode -> CharSequenceUtil.splitTrim(productCode, ",")) + .flatMap(Collection::stream) + .toList(); + List pluginCodeList = PluginsContextHolder.pluginCacheList() + .stream() + .map(PluginsContextHolder.PluginCache::getProductCode) + .filter(StrUtil::isNotBlank) + .toList(); + productCodeSet = CollUtil.newHashSet(productCodeList); + productCodeSet.addAll(pluginCodeList); + }else { + productCodeSet = CollUtil.newHashSet(CharSequenceUtil.splitTrim(body.getProductCode(), ',')); + } + return LicenseContextHolder.generateLicense( + body.getLicenseName(), + body.getAssigneeName(), + body.getExpiryDate(), + productCodeSet + ); + } +} diff --git a/src/main/java/com/jetbrains/help/properties/JetbrainsHelpProperties.java b/src/main/java/com/jetbrains/help/properties/JetbrainsHelpProperties.java new file mode 100644 index 0000000..e60cc23 --- /dev/null +++ b/src/main/java/com/jetbrains/help/properties/JetbrainsHelpProperties.java @@ -0,0 +1,17 @@ +package com.jetbrains.help.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties("help") +public class JetbrainsHelpProperties { + + private String defaultLicenseName; + + private String defaultAssigneeName; + + private String defaultExpiryDate; +} diff --git a/src/main/java/com/jetbrains/help/route/IndexController.java b/src/main/java/com/jetbrains/help/route/IndexController.java new file mode 100644 index 0000000..5e3a0e8 --- /dev/null +++ b/src/main/java/com/jetbrains/help/route/IndexController.java @@ -0,0 +1,51 @@ +package com.jetbrains.help.route; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.StrUtil; +import com.jetbrains.help.JetbrainsHelpApplication; +import com.jetbrains.help.context.PluginsContextHolder; +import com.jetbrains.help.context.ProductsContextHolder; +import com.jetbrains.help.properties.JetbrainsHelpProperties; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class IndexController { + + private final JetbrainsHelpProperties jetbrainsHelpProperties; + + @GetMapping + public String index(Model model) { + List productCacheList = ProductsContextHolder.productCacheList(); + List pluginCacheList = PluginsContextHolder.pluginCacheList(); + model.addAttribute("products", productCacheList); + model.addAttribute("plugins", pluginCacheList); + model.addAttribute("defaults", jetbrainsHelpProperties); + return "index"; + } + + @GetMapping("search") + public String index(@RequestParam(required = false) String search, Model model) { + List productCacheList = ProductsContextHolder.productCacheList(); + List pluginCacheList = PluginsContextHolder.pluginCacheList(); + if (CharSequenceUtil.isNotBlank(search)) { + productCacheList = productCacheList.stream() + .filter(productCache -> CharSequenceUtil.containsIgnoreCase(productCache.getName(), search)) + .toList(); + pluginCacheList = pluginCacheList.stream() + .filter(pluginCache -> CharSequenceUtil.containsIgnoreCase(pluginCache.getName(), search)) + .toList(); + } + model.addAttribute("products", productCacheList); + model.addAttribute("plugins", pluginCacheList); + model.addAttribute("defaults", jetbrainsHelpProperties); + return "index::product-list"; + } +} diff --git a/src/main/java/com/jetbrains/help/util/FileTools.java b/src/main/java/com/jetbrains/help/util/FileTools.java new file mode 100644 index 0000000..0518368 --- /dev/null +++ b/src/main/java/com/jetbrains/help/util/FileTools.java @@ -0,0 +1,33 @@ +package com.jetbrains.help.util; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.text.CharSequenceUtil; +import org.springframework.core.io.ClassPathResource; + +import java.io.File; +import java.io.IOException; + +public interface FileTools { + + static boolean fileExists(String pathOrFile) { + return FileUtil.file(new ClassPathResource(pathOrFile).getPath()).exists(); + } + + static File getFileOrCreat(String pathOrFile) { + File file = FileUtil.file(new ClassPathResource(pathOrFile).getPath()); + if (!file.exists()) { + try { + File parentFile = file.getParentFile(); + if (!parentFile.exists() && !parentFile.mkdir()) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} File directory create Failed", pathOrFile)); + } + if (!file.createNewFile()) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} File create failed", pathOrFile)); + } + } catch (IOException e) { + throw new IllegalArgumentException(CharSequenceUtil.format("{} File create failed", pathOrFile), e); + } + } + return file; + } +} diff --git a/src/main/resources/.DS_Store b/src/main/resources/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..53aead678ce8049a563fb406f481701c19e0df90 GIT binary patch literal 6148 zcmeHK%}T>S5Z-NTlTd^l6nb3nTClbv6fYsx7cim+m73V1!I&*gY7eE5v%Zi|;`2DO zyEy~{-bCyS%zm@;vzz@O`@t?j}jTx z4D=UW`0Z_$v7CjV)$jj^=1H98{r)F!G+R4u%W|xabr(FzRgj1IGV{a54fZajOrp{b zqpNtfnz(ysGR?y{oh?*BJe@(x?RA_^<;s`KbegH!KnEPhb|!9jy&m?5Juy5PYvx8r#bjCf6)Di>4K$U@}?z(vXpTjRx z`^c}BP>&cO2L2fXyfqHSJ}k
2c1XRQFe2SvfW0u2zbE0+N1;6Bn-K^+%pL!M`_ W(1@d;UzG#WML-ck4KeTw4158VB1|Cw literal 0 HcmV?d00001 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..d2b4e74 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,11 @@ +spring: + application: + name: Jetbrains-Help + thymeleaf: + cache: false +server: + port: 10768 +help: + default-license-name: 光云 + default-assignee-name: 藏柏 + default-expiry-date: 2111-11-11 \ No newline at end of file diff --git a/src/main/resources/certificate/root.key b/src/main/resources/certificate/root.key new file mode 100644 index 0000000..fafaa78 --- /dev/null +++ b/src/main/resources/certificate/root.key @@ -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----- diff --git a/src/main/resources/plugin.json b/src/main/resources/plugin.json new file mode 100644 index 0000000..8060bda --- /dev/null +++ b/src/main/resources/plugin.json @@ -0,0 +1,1612 @@ +[ + { + "id": 9269, + "productCode": "PAEMIDE", + "name": "AEM IDE", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/9269/503057/icon/pluginIcon.svg" + }, + { + "id": 9863, + "productCode": "PAEM", + "name": "AEM Support", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/9863/509753/icon/pluginIcon.svg" + }, + { + "id": 21263, + "productCode": "PAICODING", + "name": "AI Coding", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/21263/513630/icon/pluginIcon.svg" + }, + { + "id": 21289, + "productCode": "PCAICOMMITAPP", + "name": "AICommit", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/21289/504423/icon/pluginIcon.svg" + }, + { + "id": 12408, + "productCode": "PBISAA", + "name": "Android Antidecompiler", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/12408/229970/icon/pluginIcon.svg" + }, + { + "id": 15456, + "productCode": "PAPH", + "name": "Android Package Helper", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15456/104869/icon/pluginIcon.svg" + }, + { + "id": 13156, + "productCode": "PWIFIADB", + "name": "Android WiFiADB", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13156/154275/icon/pluginIcon.svg" + }, + { + "id": 9707, + "productCode": "PANSIHIGHLIGHT", + "name": "ANSI Highlighter Premium", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/9707/518674/icon/pluginIcon.svg" + }, + { + "id": 18357, + "productCode": "PCDAPIRUNNER", + "name": "API Runner", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18357/269544/icon/pluginIcon.svg" + }, + { + "id": 16682, + "productCode": "PAPPLETRUNNER", + "name": "Applet Runner", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/16682/506565/icon/pluginIcon.svg" + }, + { + "id": 21566, + "productCode": "PARMADILLO", + "name": "Armadillo", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/21566/354792/icon/pluginIcon.svg" + }, + { + "id": 17699, + "productCode": "PASTOCK", + "name": "AStock", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/17699/468853/icon/pluginIcon.svg" + }, + { + "id": 13016, + "productCode": "PATOMONEDARK", + "name": "Atom One Dark By Mayke", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13016/122178/icon/pluginIcon.svg" + }, + { + "id": 14088, + "productCode": "PGOLANGCODESUGG", + "name": "Auto GOLang Code Suggestions", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14088/191484/icon/pluginIcon.svg" + }, + { + "id": 14070, + "productCode": "PJAVACODESUGG", + "name": "Auto Java Code Suggestions", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14070/191711/icon/pluginIcon.svg" + }, + { + "id": 14166, + "productCode": "PJSCODESUGG", + "name": "Auto Javascript Code Suggestions", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14166/191485/icon/pluginIcon.svg" + }, + { + "id": 14167, + "productCode": "PPHPCODESUGG", + "name": "Auto PHP Code Suggestions", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14167/191710/icon/pluginIcon.svg" + }, + { + "id": 14594, + "productCode": "PPYCODESUGG", + "name": "Auto Python Code Suggestions", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14594/190896/icon/pluginIcon.svg" + }, + { + "id": 14089, + "productCode": "PRUBYCODESUGG", + "name": "Auto Ruby Code Suggestions", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14089/191482/icon/pluginIcon.svg" + }, + { + "id": 10904, + "productCode": "PBRWJV", + "name": "AutoCode for Java", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 23577, + "productCode": "PAUTOLOG", + "name": "AutoLog", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23577/473858/icon/pluginIcon.svg" + }, + { + "id": 14742, + "productCode": "PAWSLAMBDADEPLR", + "name": "AWS Lambda Deployer", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 22319, + "productCode": "PAZD", + "name": "Azd", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22319/517134/icon/pluginIcon.svg" + }, + { + "id": 22194, + "productCode": "PAZURECODING", + "name": "Azure Coding", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22194/355932/icon/pluginIcon.svg" + }, + { + "id": 13841, + "productCode": "PBASHSUPPORTPRO", + "name": "BashSupport Pro", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13841/514417/icon/pluginIcon.svg" + }, + { + "id": 12895, + "productCode": "PBETTERHIGHLIGH", + "name": "Better Highlights", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/12895/514904/icon/pluginIcon.svg" + }, + { + "id": 13538, + "productCode": "PCREVIEW", + "name": "Bitbucket Pull Requests", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13538/516839/icon/pluginIcon.svg" + }, + { + "id": 16222, + "productCode": "PBITRISECI", + "name": "Bitrise Dashboard", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/16222/463944/icon/pluginIcon.svg" + }, + { + "id": 20061, + "productCode": "PBREWBUNDLE", + "name": "Brew Bundle", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20061/471756/icon/pluginIcon.svg" + }, + { + "id": 20985, + "productCode": "PBUILDMON", + "name": "Build Monitor", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/20985/452340/icon/pluginIcon.svg" + }, + { + "id": 17692, + "productCode": "PCAPELASTIC", + "name": "Cap-Elasticsearch", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/17692/256059/icon/pluginIcon.svg" + }, + { + "id": 17785, + "productCode": "PCAPREDIS", + "name": "Cap-Redis", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/17785/256060/icon/pluginIcon.svg" + }, + { + "id": 21314, + "productCode": "PCHATGPTCODING", + "name": "ChatGPT Coding", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/21314/346162/icon/pluginIcon.svg" + }, + { + "id": 19114, + "productCode": "PCIINTG", + "name": "CIclone", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19114/472822/icon/pluginIcon.svg" + }, + { + "id": 15458, + "productCode": "PCIRCLECI", + "name": "CircleCI Dashboard", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15458/463945/icon/pluginIcon.svg" + }, + { + "id": 22813, + "productCode": "PCITRIC", + "name": "Citric", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22813/515382/icon/pluginIcon.svg" + }, + { + "id": 23887, + "productCode": "PCLAI", + "name": "CLAi", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23887/515259/icon/pluginIcon.svg" + }, + { + "id": 12869, + "productCode": "PCMAKEPLUS", + "name": "CMake Plus", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/12869/496990/icon/pluginIcon.svg" + }, + { + "id": 17501, + "productCode": "PISCRATCH", + "name": "Code Note: In IDE Note-Taking, Project Notes", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/17501/509149/icon/pluginIcon.svg" + }, + { + "id": 18394, + "productCode": "PCODEREFACTORAI", + "name": "Code Refactor AI", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18394/153532/icon/pluginIcon.svg" + }, + { + "id": 14896, + "productCode": "PCWMP", + "name": "Code With Me", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 19097, + "productCode": "PWGCODECREATOR", + "name": "codeCreator", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 19578, + "productCode": "PCODEKITS", + "name": "CodeKits", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/19578/302019/icon/pluginIcon.svg" + }, + { + "id": 10811, + "productCode": "PCODEMRBASE", + "name": "CodeMR", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/10811/186959/icon/pluginIcon.svg" + }, + { + "id": 14104, + "productCode": "PVCS", + "name": "commit-template", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14104/250600/icon/pluginIcon.svg" + }, + { + "id": 20293, + "productCode": "PCONNECTUI", + "name": "Connect Api", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/20293/452254/icon/pluginIcon.svg" + }, + { + "id": 21857, + "productCode": "PCUEFY", + "name": "Cuefy", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/21857/428708/icon/pluginIcon.svg" + }, + { + "id": 23561, + "productCode": "PDATABASEBUDDY", + "name": "Database Buddy", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23561/474923/icon/pluginIcon.svg" + }, + { + "id": 16861, + "productCode": "PDATABASE", + "name": "Database Helper", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/16861/500171/icon/pluginIcon.svg" + }, + { + "id": 19161, + "productCode": "PDBDATABASETOOL", + "name": "Database Tool", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19161/514290/icon/pluginIcon.svg" + }, + { + "id": 10925, + "productCode": "PDB", + "name": "Database Tools and SQL for WebStorm", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/10925/511241/icon/pluginIcon.svg" + }, + { + "id": 22472, + "productCode": "PDATAGRAPH", + "name": "DataGraph - JSON, YAML, XML Visualization", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/22472/503936/icon/pluginIcon.svg" + }, + { + "id": 11461, + "productCode": "DC", + "name": "dotCover", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/11461/81836/icon/META-INF_pluginIcon.svg" + }, + { + "id": 11462, + "productCode": "DPN", + "name": "dotTrace", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/11462/81835/icon/META-INF_pluginIcon.svg" + }, + { + "id": 18896, + "productCode": "PDYNAMODB", + "name": "DynamoDB", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18896/503820/icon/pluginIcon.svg" + }, + { + "id": 14512, + "productCode": "PELASTICSEARCH", + "name": "Elasticsearch", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14512/511081/icon/pluginIcon.svg" + }, + { + "id": 18209, + "productCode": "PELSA", + "name": "ElasticSearch-Admin", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 18663, + "productCode": "PEXCELEDITOR", + "name": "ExcelEditor", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/18663/510865/icon/pluginIcon.svg" + }, + { + "id": 15379, + "productCode": "PGODRUNNER", + "name": "Execution God Recorder", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15379/102175/icon/pluginIcon.svg" + }, + { + "id": 20238, + "productCode": "PEXTENSION", + "name": "Extensions Manager", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20238/308627/icon/pluginIcon.svg" + }, + { + "id": 11058, + "productCode": "PEXTRAICONS", + "name": "Extra Icons", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/11058/516273/icon/pluginIcon.svg" + }, + { + "id": 23927, + "productCode": "PEXTRAIDETWEAKS", + "name": "Extra IDE Tweaks", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23927/515986/icon/pluginIcon.svg" + }, + { + "id": 16988, + "productCode": "PFASTREQUEST", + "name": "Fast Request - API Buddy", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/16988/498000/icon/pluginIcon.svg" + }, + { + "id": 18971, + "productCode": "PFASTSHELL", + "name": "FastShell", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/18971/200999/icon/pluginIcon.svg" + }, + { + "id": 23146, + "productCode": "PFEIGNHELPER", + "name": "Feign-Helper", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23146/473643/icon/pluginIcon.svg" + }, + { + "id": 16217, + "productCode": "PFUZYFIPC", + "name": "Find In Files (Favorites)", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/16217/518682/icon/pluginIcon.svg" + }, + { + "id": 23609, + "productCode": "PFIREBASE", + "name": "Firebase Firestore", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23609/503413/icon/pluginIcon.svg" + }, + { + "id": 15189, + "productCode": "PFIREHIGHLIGHT", + "name": "Firebase Rules", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15189/471752/icon/pluginIcon.svg" + }, + { + "id": 23685, + "productCode": "PSCIPIOFTL", + "name": "Flexible Freemarker", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23685/483800/icon/pluginIcon.svg" + }, + { + "id": 14718, + "productCode": "PFLUTTER", + "name": "Flutter Storm", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14718/367205/icon/pluginIcon.svg" + }, + { + "id": 13086, + "productCode": "PGDOC", + "name": "Generate Document", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13086/499172/icon/pluginIcon.svg" + }, + { + "id": 22971, + "productCode": "PGENSETANDSET", + "name": "GenerateSetAndGet", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22971/467619/icon/pluginIcon.svg" + }, + { + "id": 20319, + "productCode": "PGERRYAURORA", + "name": "Gerry Aurora", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20319/435418/icon/pluginIcon.svg" + }, + { + "id": 20246, + "productCode": "PGERRYCHERRY", + "name": "Gerry Cherry", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20246/435417/icon/pluginIcon.svg" + }, + { + "id": 20247, + "productCode": "PGERRYCOFFEE", + "name": "Gerry Coffee", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20247/435420/icon/pluginIcon.svg" + }, + { + "id": 20049, + "productCode": "PGERRYCYBERPUNK", + "name": "Gerry Cyberpunk", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20049/435415/icon/pluginIcon.svg" + }, + { + "id": 20236, + "productCode": "PGERRYNATURE", + "name": "Gerry Nature", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20236/435419/icon/pluginIcon.svg" + }, + { + "id": 20075, + "productCode": "PGERRYSPACE", + "name": "Gerry Space", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20075/435416/icon/pluginIcon.svg" + }, + { + "id": 19668, + "productCode": "PGERRYTHEMESPRO", + "name": "Gerry Themes Pro", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19668/517943/icon/pluginIcon.svg" + }, + { + "id": 10083, + "productCode": "PGITSCOPE", + "name": "Git Scope", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/10083/396420/icon/pluginIcon.svg" + }, + { + "id": 23813, + "productCode": "PGITWORKTREE", + "name": "Git Worktree", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/23813/493642/icon/pluginIcon.svg" + }, + { + "id": 14056, + "productCode": "PGITFLOWPLUS", + "name": "GitFlowPlus", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/14056/506220/icon/pluginIcon.svg" + }, + { + "id": 20144, + "productCode": "PGITHUBCI", + "name": "Github CI Dashboard", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20144/463946/icon/pluginIcon.svg" + }, + { + "id": 15457, + "productCode": "PGITLABCI", + "name": "Gitlab CI Pipeline Dashboard", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15457/463947/icon/pluginIcon.svg" + }, + { + "id": 22202, + "productCode": "PGITLABCICD", + "name": "GitLab CICD - Pipelines \u0026 Jobs, Builds Run Cancel Retry View Log", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22202/517828/icon/pluginIcon.svg" + }, + { + "id": 18689, + "productCode": "PGITLAB", + "name": "GitLab Merge Requests", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18689/516838/icon/pluginIcon.svg" + }, + { + "id": 7499, + "productCode": "PGITTOOLBOX", + "name": "GitToolBox", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/7499/512954/icon/pluginIcon.svg" + }, + { + "id": 19906, + "productCode": "PGOPARSER", + "name": "GoParser", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19906/293012/icon/pluginIcon.svg" + }, + { + "id": 20411, + "productCode": "PWXUFQYRHZCRSEO", + "name": "Gorm", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20411/502598/icon/pluginIcon.svg" + }, + { + "id": 22035, + "productCode": "PGPTASSISTANT", + "name": "GPT Assistant", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22035/510722/icon/pluginIcon.svg" + }, + { + "id": 15535, + "productCode": "PHEROKU", + "name": "Heroku Dashboard", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15535/463948/icon/pluginIcon.svg" + }, + { + "id": 7525, + "productCode": "PHYBRISCOMMERCE", + "name": "Hybris Integration", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/7525/517492/icon/pluginIcon.svg" + }, + { + "id": 12634, + "productCode": "PIEDIS", + "name": "Iedis 2", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/12634/167816/icon/pluginIcon.svg" + }, + { + "id": 22459, + "productCode": "PIMAGETOVECTOR", + "name": "ImageToVector", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22459/376877/icon/pluginIcon.svg" + }, + { + "id": 23859, + "productCode": "PINTELLIPHP", + "name": "IntelliPHP - AI Autocomplete for PHP", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23859/505657/icon/pluginIcon.svg" + }, + { + "id": 20526, + "productCode": "PWAUFKYVHQCRXEO", + "name": "IoGame", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20526/468605/icon/pluginIcon.svg" + }, + { + "id": 11560, + "productCode": "PBISJ", + "name": "Java Antidecompiler", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/11560/367010/icon/pluginIcon.svg" + }, + { + "id": 10828, + "productCode": "PJDCLEANREAD", + "name": "JavaDoc Clean Read", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/10828/375796/icon/pluginIcon.svg" + }, + { + "id": 20888, + "productCode": "PWXUQQYVOXCRSEO", + "name": "JavaOrm", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20888/438337/icon/pluginIcon.svg" + }, + { + "id": 14557, + "productCode": "PVISUALGC", + "name": "JDK VisualGC", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/14557/453632/icon/pluginIcon.svg" + }, + { + "id": 22282, + "productCode": "AIP", + "name": "JetBrains AI Assistant", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/22282/515367/icon/pluginIcon.svg" + }, + { + "id": 21173, + "productCode": "PJETCLIENT", + "name": "JetClient - The Ultimate REST Client", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/21173/515501/icon/pluginIcon.svg" + }, + { + "id": 9238, + "productCode": "PJETFORCER", + "name": "JetForcer | The Smartest Force.com IDE", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 12621, + "productCode": "PJFORMDESIGNER", + "name": "JFormDesigner (Marketplace Edition)", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/12621/516265/icon/pluginIcon.svg" + }, + { + "id": 23812, + "productCode": "PJMETERPLUGINSM", + "name": "JMeter Plugins Manager", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23812/492356/icon/pluginIcon.svg" + }, + { + "id": 23855, + "productCode": "PJMETERRUNNER", + "name": "JMeter Runner", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23855/494217/icon/pluginIcon.svg" + }, + { + "id": 15242, + "productCode": "PJPASQL", + "name": "JPA SQL", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/15242/510410/icon/pluginIcon.svg" + }, + { + "id": 23360, + "productCode": "PJQEXPRESS", + "name": "jqExpress", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23360/492713/icon/pluginIcon.svg" + }, + { + "id": 22597, + "productCode": "POXYJSONSCHGEN", + "name": "JSON Schema Generator", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22597/471041/icon/pluginIcon.svg" + }, + { + "id": 23554, + "productCode": "POXYJSONDIAGRAM", + "name": "JSON Schema Visualizer/Editor", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23554/503415/icon/pluginIcon.svg" + }, + { + "id": 20297, + "productCode": "POXYJSONCONVERT", + "name": "JSON-YAML-XML Converter", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20297/472486/icon/pluginIcon.svg" + }, + { + "id": 18975, + "productCode": "PJSONNETEMLSUP", + "name": "Jsonnet Pro", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18975/458972/icon/pluginIcon.svg" + }, + { + "id": 19297, + "productCode": "PJSONTOANYLANGU", + "name": "JsonToAnyLanguage", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/19297/351202/icon/pluginIcon.svg" + }, + { + "id": 14393, + "productCode": "PJSONTOTS", + "name": "JsonToTypeScript", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/14393/321300/icon/pluginIcon.svg" + }, + { + "id": 22284, + "productCode": "PKAFKA", + "name": "Kafka Client", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22284/428744/icon/pluginIcon.svg" + }, + { + "id": 20111, + "productCode": "PKAFKAIDE", + "name": "Kafkaide", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20111/425515/icon/pluginIcon.svg" + }, + { + "id": 18286, + "productCode": "PKSEXPLORER", + "name": "KS-Explorer", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18286/518701/icon/pluginIcon.svg" + }, + { + "id": 13441, + "productCode": "PLARAVEL", + "name": "Laravel Idea", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13441/507406/icon/pluginIcon.svg" + }, + { + "id": 19661, + "productCode": "PLATTEPRO", + "name": "Latte Pro", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19661/440924/icon/pluginIcon.svg" + }, + { + "id": 15405, + "productCode": "PLEDGER", + "name": "Ledger CLI", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15405/458942/icon/pluginIcon.svg" + }, + { + "id": 17166, + "productCode": "PLEP", + "name": "LeetCode Editor Pro", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/17166/502109/icon/pluginIcon.svg" + }, + { + "id": 22223, + "productCode": "PLOCALSTACK", + "name": "LocalStack Integrator", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/22223/518671/icon/pluginIcon.svg" + }, + { + "id": 20554, + "productCode": "PMAGE", + "name": "Magento and Adobe Commerce PhpStorm by Atwix", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/20554/505887/icon/pluginIcon.svg" + }, + { + "id": 23556, + "productCode": "PSCIPIOMGNL", + "name": "Magnolia CMS Integration", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23556/483799/icon/pluginIcon.svg" + }, + { + "id": 17688, + "productCode": "PRSMGNL", + "name": "Magnolia YAML Assistant", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/17688/511232/icon/pluginIcon.svg" + }, + { + "id": 8006, + "productCode": "PMATERIALUI", + "name": "Material Theme UI", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/8006/518563/icon/pluginIcon.svg" + }, + { + "id": 19308, + "productCode": "PMATERIALCUSTOM", + "name": "Material Theme UI Custom Theme", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19308/384272/icon/pluginIcon.svg" + }, + { + "id": 19250, + "productCode": "PMATERIALEXTRAS", + "name": "Material Theme UI Extras", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19250/384271/icon/pluginIcon.svg" + }, + { + "id": 17456, + "productCode": "PMATERIALHC", + "name": "Material Theme UI High Contrast", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/17456/384270/icon/pluginIcon.svg" + }, + { + "id": 19309, + "productCode": "PMATERIALLANG", + "name": "Material Theme UI Language Additions", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19309/384269/icon/pluginIcon.svg" + }, + { + "id": 19310, + "productCode": "PMATERIALFRAME", + "name": "Material Theme UI Project Frame", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19310/385745/icon/pluginIcon.svg" + }, + { + "id": 13615, + "productCode": "PMRINTEGEE", + "name": "Merge Request Integration EE - Code Review for GitLab", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13615/113000/icon/pluginIcon.svg" + }, + { + "id": 23687, + "productCode": "PMICRONAUTLAUNC", + "name": "Micronaut Launch", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23687/478379/icon/pluginIcon.svg" + }, + { + "id": 13720, + "productCode": "PMINBATIS", + "name": "MinBatis", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13720/116149/icon/pluginIcon.svg" + }, + { + "id": 23999, + "productCode": "PMONGODB", + "name": "Mongo DB", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23999/518250/icon/pluginIcon.svg" + }, + { + "id": 20761, + "productCode": "PMONGOEXPERT", + "name": "Mongo Expert", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20761/510302/icon/pluginIcon.svg" + }, + { + "id": 17465, + "productCode": "PCDMQTTCLIENT", + "name": "MQTT Client", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/17465/308433/icon/pluginIcon.svg" + }, + { + "id": 13905, + "productCode": "PMYBATISLOG", + "name": "MyBatis Log", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13905/447241/icon/pluginIcon.svg" + }, + { + "id": 18389, + "productCode": "PMBCODEHELPPRO", + "name": "Mybatis Smart Code Help Pro", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/18389/516824/icon/pluginIcon.svg" + }, + { + "id": 23478, + "productCode": "PMYBATISCODE", + "name": "MybatisCode", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23478/472229/icon/pluginIcon.svg" + }, + { + "id": 14522, + "productCode": "PMYBATISHELPER", + "name": "MyBatisCodeHelperPro (Marketplace Edition)", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14522/510194/icon/pluginIcon.svg" + }, + { + "id": 22655, + "productCode": "PMYSQLPROXY", + "name": "MySQL Proxy", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/22655/436599/icon/pluginIcon.svg" + }, + { + "id": 18387, + "productCode": "PNEONPRO", + "name": "NEON Nette Support", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18387/479200/icon/pluginIcon.svg" + }, + { + "id": 19977, + "productCode": "PNETLIFY", + "name": "Netlify Dashboard", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19977/463949/icon/pluginIcon.svg" + }, + { + "id": 19963, + "productCode": "PNEXTSKETCH", + "name": "NextSketch", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19963/272018/icon/pluginIcon.svg" + }, + { + "id": 20805, + "productCode": "PNEXTSKETCHTWO", + "name": "NextSketch2", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20805/308349/icon/pluginIcon.svg" + }, + { + "id": 23765, + "productCode": "PNFLUTTER", + "name": "NFlutter", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23765/492994/icon/pluginIcon.svg" + }, + { + "id": 18280, + "productCode": "PNGINX", + "name": "Nginx Configuration Pro", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18280/239000/icon/pluginIcon.svg" + }, + { + "id": 19205, + "productCode": "PNGROK", + "name": "Ngrok", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/19205/510423/icon/pluginIcon.svg" + }, + { + "id": 21833, + "productCode": "PNOSQLNAVMDB", + "name": "NoSQL Navigator For MongoDB", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/21833/433051/icon/pluginIcon.svg" + }, + { + "id": 22128, + "productCode": "PNPMPACKAGEJSON", + "name": "NPM Package Json", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22128/451192/icon/pluginIcon.svg" + }, + { + "id": 13499, + "productCode": "PODOO", + "name": "Odoo", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13499/512679/icon/pluginIcon.svg" + }, + { + "id": 13151, + "productCode": "POFFICEFLOOR", + "name": "OfficeFloor", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13151/131867/icon/pluginIcon.svg" + }, + { + "id": 19889, + "productCode": "POPENAPICRUDWIZ", + "name": "OpenAPI CRUD Wizard", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/19889/478359/icon/pluginIcon.svg" + }, + { + "id": 12887, + "productCode": "POPENAPI", + "name": "OpenAPI Editor", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/12887/512174/icon/pluginIcon.svg" + }, + { + "id": 14371, + "productCode": "PIMAGEVIEWER", + "name": "OpenCV Image Viewer", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/14371/480879/icon/pluginIcon.svg" + }, + { + "id": 12626, + "productCode": "PORCHIDE", + "name": "OrchidE - Ansible Language Support", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 19660, + "productCode": "PAWSQLADVISOR", + "name": "PawSQL Advisor,SQL Audit/Rewrite/Index Advice,Tune SQL by Clicks", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19660/502106/icon/pluginIcon.svg" + }, + { + "id": 17440, + "productCode": "PHPBUILDER", + "name": "PHP Data Object Generator", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/17440/458368/icon/pluginIcon.svg" + }, + { + "id": 18981, + "productCode": "PPHPHOUDINI", + "name": "PHP Houdini", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18981/271233/icon/pluginIcon.svg" + }, + { + "id": 16935, + "productCode": "PHPEAPLUGIN", + "name": "Php Inspections (EA Ultimate)", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 14821, + "productCode": "PPUMLSTUDIO", + "name": "PlantUML Studio", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14821/172312/icon/pluginIcon.svg" + }, + { + "id": 13733, + "productCode": "PPOJOTOJSONSCH", + "name": "POJO to JSON Schema", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13733/95154/icon/pluginIcon.svg" + }, + { + "id": 22429, + "productCode": "PPOLARISTOMCATS", + "name": "Polaris Tomcat Server", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22429/506445/icon/pluginIcon.svg" + }, + { + "id": 21361, + "productCode": "POLYBPMNGDNEXT", + "name": "PolyBPMN visualizer", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/21361/479001/icon/pluginIcon.svg" + }, + { + "id": 14434, + "productCode": "PQMLEDITOR", + "name": "QmlEditor", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14434/314029/icon/pluginIcon.svg" + }, + { + "id": 16405, + "productCode": "PQTSQSSEDITOR", + "name": "Qt Style Sheets Editor", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/16405/193379/icon/pluginIcon.svg" + }, + { + "id": 19027, + "productCode": "PQUARKUSHELPER", + "name": "Quarkus Assistant", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19027/477162/icon/pluginIcon.svg" + }, + { + "id": 18269, + "productCode": "PQUERYFLAG", + "name": "QueryFlag", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18269/508126/icon/pluginIcon.svg" + }, + { + "id": 10080, + "productCode": "PRAINBOWBRACKET", + "name": "Rainbow Brackets", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/10080/509542/icon/pluginIcon.svg" + }, + { + "id": 19316, + "productCode": "PRANCHER", + "name": "Rancher", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19316/367013/icon/pluginIcon.svg" + }, + { + "id": 13838, + "productCode": "PRDFANDSPARQL", + "name": "RDF and SPARQL", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13838/499816/icon/pluginIcon.svg" + }, + { + "id": 9564, + "productCode": "PRNCONSOLE", + "name": "React Native Console", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/9564/514551/icon/pluginIcon.svg" + }, + { + "id": 12820, + "productCode": "PREDIS", + "name": "Redis", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/12820/433300/icon/pluginIcon.svg" + }, + { + "id": 19360, + "productCode": "PREDISCLIHELPER", + "name": "Redis Client", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19360/479210/icon/pluginIcon.svg" + }, + { + "id": 15722, + "productCode": "PREDISMANAGER", + "name": "Redis Manager", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15722/270538/icon/pluginIcon.svg" + }, + { + "id": 19599, + "productCode": "PREDISS", + "name": "Redis Operator", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19599/518569/icon/pluginIcon.svg" + }, + { + "id": 16160, + "productCode": "PREDISTOOLS", + "name": "Redis-Cli", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/16160/286263/icon/pluginIcon.svg" + }, + { + "id": 15433, + "productCode": "PREGEXTOOL", + "name": "Regex Tool", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15433/510718/icon/pluginIcon.svg" + }, + { + "id": 14723, + "productCode": "PRESTKIT", + "name": "RestfulBox", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/14723/464469/icon/pluginIcon.svg" + }, + { + "id": 22726, + "productCode": "PRETROFITASSIT", + "name": "Retrofit Assistant", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22726/514538/icon/pluginIcon.svg" + }, + { + "id": 22428, + "productCode": "PWXUQRYTOXCRSEO", + "name": "RustTool", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22428/513930/icon/pluginIcon.svg" + }, + { + "id": 13668, + "productCode": "PSFCC", + "name": "Salesforce B2C Commerce (SFCC)", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/13668/510847/icon/pluginIcon.svg" + }, + { + "id": 22748, + "productCode": "PSCHEMAREGVIEW", + "name": "Schema Registry Viewer", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22748/496140/icon/pluginIcon.svg" + }, + { + "id": 12108, + "productCode": "PSCIPIO", + "name": "Scipio ERP Integration", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/12108/478355/icon/pluginIcon.svg" + }, + { + "id": 19556, + "productCode": "PSCREENCODEPRO", + "name": "ScreenCodePro", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19556/198086/icon/pluginIcon.svg" + }, + { + "id": 22232, + "productCode": "PSENTRY", + "name": "Sentry", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/22232/514906/icon/pluginIcon.svg" + }, + { + "id": 15945, + "productCode": "PSENTRYINTEG", + "name": "Sentry Integration", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15945/111527/icon/pluginIcon.svg" + }, + { + "id": 8286, + "productCode": "PSEQUENCEDIAGRA", + "name": "SequenceDiagram", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/8286/485614/icon/pluginIcon.svg" + }, + { + "id": 23115, + "productCode": "PSEQDIAORG", + "name": "SequenceDiagram.org", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23115/485275/icon/pluginIcon.svg" + }, + { + "id": 14437, + "productCode": "PSI", + "name": "Shared Project Indexes", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14437/508994/icon/pluginIcon.svg" + }, + { + "id": 7410, + "productCode": "PSWPLUGIN", + "name": "Shopware", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/7410/167127/icon/pluginIcon.svg" + }, + { + "id": 18151, + "productCode": "PBEANCONVERTER", + "name": "Simple Object Copy", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 20243, + "productCode": "PSKOL", + "name": "Skol", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20243/518236/icon/pluginIcon.svg" + }, + { + "id": 14053, + "productCode": "PSMARTJUMP", + "name": "Smart Jump", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14053/274462/icon/pluginIcon.svg" + }, + { + "id": 20565, + "productCode": "PTAILWINDTOOLS", + "name": "Snippet Toolkit for Tailwind CSS", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20565/502104/icon/pluginIcon.svg" + }, + { + "id": 23743, + "productCode": "PSOTERISECURITY", + "name": "Soteri Secret Scanner", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23743/484143/icon/pluginIcon.svg" + }, + { + "id": 22318, + "productCode": "PSOURCESYNCPRO", + "name": "Source Synchronizer Pro", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22318/503948/icon/pluginIcon.svg" + }, + { + "id": 14338, + "productCode": "PSPARQL", + "name": "SPARQL", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/14338/165810/icon/pluginIcon.svg" + }, + { + "id": 22635, + "productCode": "PSPEECHTOTEXT", + "name": "Speech-To-Text (AWS Transcribe)", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22635/388024/icon/pluginIcon.svg" + }, + { + "id": 18622, + "productCode": "PSPRINGBOOTIDEA", + "name": "Spring Boot Helper", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18622/472683/icon/pluginIcon.svg" + }, + { + "id": 22304, + "productCode": "PSRCODEGEN", + "name": "Spring Rest Code Generator", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22304/391163/icon/pluginIcon.svg" + }, + { + "id": 15574, + "productCode": "PFLYINSKYZJBZ", + "name": "spring-assistant-@valueToYml", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15574/412050/icon/pluginIcon.svg" + }, + { + "id": 20534, + "productCode": "PSQLFLUFFLINTER", + "name": "Sqlfluff Linter (Ultimate Edition)", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20534/502715/icon/pluginIcon.svg" + }, + { + "id": 22742, + "productCode": "PSQLFORMATTER", + "name": "SQLFormatter", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 22713, + "productCode": "PDBSSH", + "name": "SSH Tool", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/22713/516730/icon/pluginIcon.svg" + }, + { + "id": 15851, + "productCode": "PSTORMSECTIONS", + "name": "StormSections", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/15851/449282/icon/pluginIcon.svg" + }, + { + "id": 14482, + "productCode": "PSTRKER", + "name": "Stryker", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/14482/134911/icon/pluginIcon.svg" + }, + { + "id": 23458, + "productCode": "PSWISSKITCONVER", + "name": "SwissKit Converter", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23458/469170/icon/pluginIcon.svg" + }, + { + "id": 7219, + "productCode": "PSYMFONYPLUGIN", + "name": "Symfony Support", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/7219/514919/icon/pluginIcon.svg" + }, + { + "id": 10695, + "productCode": "PVLOG", + "name": "SystemVerilog", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/10695/163626/icon/pluginIcon.svg" + }, + { + "id": 14203, + "productCode": "PSVERILOG", + "name": "SystemVerilog Studio", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 22685, + "productCode": "PNEKOCAT", + "name": "TamaCat the Embedded Internet Browser", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/22685/456002/icon/pluginIcon.svg" + }, + { + "id": 18857, + "productCode": "PTERMINAL", + "name": "Terminal Pro", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/18857/505301/icon/pluginIcon.svg" + }, + { + "id": 20050, + "productCode": "PTLDRAI", + "name": "TLDR", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/20050/394140/icon/pluginIcon.svg" + }, + { + "id": 14384, + "productCode": "PTOOLSET", + "name": "Toolset", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/14384/497387/icon/pluginIcon.svg" + }, + { + "id": 20683, + "productCode": "PTRAVISCI", + "name": "Travis CI Dashboard", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/20683/463950/icon/pluginIcon.svg" + }, + { + "id": 18232, + "productCode": "PDJANGOTPLPEP", + "name": "Typed Django Template", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/18232/370564/icon/pluginIcon.svg" + }, + { + "id": 19675, + "productCode": "PUNIAPPSUPPORT", + "name": "Uniapp Support", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/19675/450668/icon/pluginIcon.svg" + }, + { + "id": 21813, + "productCode": "PVERILOGLANGUAG", + "name": "Verilog Language Support", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/21813/472208/icon/pluginIcon.svg" + }, + { + "id": 23086, + "productCode": "PVOQAL", + "name": "Voqal Assistant", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23086/518244/icon/pluginIcon.svg" + }, + { + "id": 18860, + "productCode": "PWIREMOCHA", + "name": "WireMocha", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18860/517127/icon/pluginIcon.svg" + }, + { + "id": 7232, + "productCode": "PWLANG", + "name": "Wolfram Language", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/7232/476166/icon/pluginIcon.svg" + }, + { + "id": 18425, + "productCode": "PXSDVISUALIZER", + "name": "XSD / WSDL Visualizer", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/18425/515020/icon/pluginIcon.svg" + }, + { + "id": 19024, + "productCode": "POXYXSDJSONSCH", + "name": "XSD to JSON Schema", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/19024/472499/icon/pluginIcon.svg" + }, + { + "id": 9739, + "productCode": "PYAOQIANGBPMN", + "name": "Yaoqiang BPMN Editor", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + }, + { + "id": 23693, + "productCode": "PYIIFRAMEWORK", + "name": "Yii2 Framework Support", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/23693/504334/icon/pluginIcon.svg" + }, + { + "id": 12437, + "productCode": "PZENUML", + "name": "ZenUML Support", + "pricingModel": "FREEMIUM", + "icon": "https://plugins.jetbrains.com/files/12437/466910/icon/pluginIcon.svg" + }, + { + "id": 15773, + "productCode": "PZEROCODE", + "name": "Zerocode Scenario Helper", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com/files/15773/155295/icon/pluginIcon.svg" + }, + { + "id": 18341, + "productCode": "PZKA", + "name": "Zookeeper-Admin", + "pricingModel": "PAID", + "icon": "https://plugins.jetbrains.com" + } +] diff --git a/src/main/resources/product.json b/src/main/resources/product.json new file mode 100644 index 0000000..0d10b03 --- /dev/null +++ b/src/main/resources/product.json @@ -0,0 +1,67 @@ +[ + { + "name": "All Jetbrains's Product Or Plugin", + "productCode": "", + "iconClass": "icon-al" + }, + { + "name": "IntelliJ IDEA", + "productCode": "II,PCWMP,PSI", + "iconClass": "icon-ii" + }, + { + "name": "PhpStorm", + "productCode": "PS,PCWMP,PSI", + "iconClass": "icon-ps" + }, + { + "name": "AppCode", + "productCode": "AC,PCWMP,PSI", + "iconClass": "icon-ac" + }, + { + "name": "DataGrip", + "productCode": "DB,PSI,PDB", + "iconClass": "icon-db" + }, + { + "name": "RubyMine", + "productCode": "RM,PCWMP,PSI", + "iconClass": "icon-rm" + }, + { + "name": "WebStorm", + "productCode": "WS,PCWMP,PSI", + "iconClass": "icon-ws" + }, + { + "name": "Rider", + "productCode": "RD,PDB,PSI,PCWMP", + "iconClass": "icon-rd" + }, + { + "name": "CLion", + "productCode": "CL,PSI,PCWMP", + "iconClass": "icon-cl" + }, + { + "name": "PyCharm", + "productCode": "PC,PSI,PCWMP", + "iconClass": "icon-pc" + }, + { + "name": "GoLand", + "productCode": "GO,PSI,PCWMP", + "iconClass": "icon-go" + }, + { + "name": "DataSpell", + "productCode": "DS,PSI,PDB,PCWMP", + "iconClass": "icon-ds" + }, + { + "name": "dotMemory", + "productCode": "DM", + "iconClass": "icon-dm" + } +] \ No newline at end of file diff --git a/src/main/resources/static/.DS_Store b/src/main/resources/static/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a9fab937bc61c8c185282e8c1a26bce1e3bf1278 GIT binary patch literal 6148 zcmeHKOH0E*5Z>*>HWVQTg&qT53)bL+;w8lT2aM=Jr6wfQV9b^#HHT8jS^to~#NXr0 z?gm;69!2a7?0&QJ*v)*9eK5wjy9kdMGZ|xDXowt@8bNcdtD%Dtxtt>pifk4nBB+_> zZ<_Gi+stQE7O|AAfB#1?OX4ga4nKLL*=p}}I!340dGMY@;pKk5$XtJZhofsDlAzN4 z;3kfWiMe+n(%g^JXf6}tFoKZ#+c*tH;fh5XW-`}P4#Vgg6SKcu+NZ;TWuKj_2G(+9 zgMK`+S1Y5te{gtyHF-{6Qt_sUh|hyh~YpE1B&V{hz2QTlBCRvwU3w0s{KRB>)DvkMyNe`7P8T&e2#Z V#97cT(*fxsAPJ$482AMSz5wvwO4{1Xp6sbo`J#Yyk*+NjoWeMTXD~sR&DC~BZc44!Ql1+1nBJH_- z7Vf?Fz!OyJ3-m$gj6D&QG+dCvk37=&8_#&`_*>Z%1Ayp^;}$?2031}p>Md-p5sH&8 zNQFHvqM$jVOhss)M1w3{7;PPv0n5PO#sHn&3Vebvnv4cNp5IZ?Y@UnCTJ^@wTFtGk z*WL#QY7!J-F&=fo;alpxQYwq)b{M@*lS!|>@m%FanC8h)C!}$LL*Bhf^H@zfYMjR- zog0{d>pE_)zB!$G?Pf!IPujDFobGsNKictTGuOGd_3-J--sh~Jt0P06z`I7v9mY8v zqoMbb?YDwG)gR0QbAMlTySzu|zI*oN^y2HY@3DAkY;bV>e22j>&s4sTbI@>K`U!woMYk5Tsl-u^Wb_$JgBU>(CKb`73Vvb; zla7AL<9x=_ph*Y8j}O5s3x1&py*kb>^>7frLEBmeECW{=STo%^)&CdE-~U&WY|k=a z8ThXl5Y=wb?ckQUwk~XrYOO^5fJ#E+N`pED8!pG%pi;bvss&?`3`C!?G>9G)`$s_2 LU>nQ8N*TBW{|>VZ literal 0 HcmV?d00001 diff --git a/src/main/resources/static/agent/ja-netfilter/.DS_Store b/src/main/resources/static/agent/ja-netfilter/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a500b721dca4646ca3adb41e380cc014707df875 GIT binary patch literal 6148 zcmeHK!A{#i5S>j@Yzraf01~~e#5EF0hzb!G%T0d(qxR6E5R){uFuPHlGzTk^&xH>v zKhp2%%u03f3Iumw;D03VgG65#NR&_3ygRGg)TD9jlt zjFUw^Niv;mc(dVuWPsk?7F>Y_1>a%y{oN;%EX`-l<{we1*4}M-Uf^we7x53hh-ZV@ zJdXy`ue3VXI!hkrgXD8MTJ-C?AGMkdQZ<^IfOI%Qmv3KEHPnkp&($zDv9a9<0zc^2 z-xtNv@rQMe8lL9|FBRdWs;0`A%N&Sqc zD${C=c8c*}0vXII=Mr@zg7Fayj0GqA=0-47C#Fmza2G*<@>rUgKx-$)}kr(S|$q{Gl*X%Tl&gbhWs zp~AHo!iJ+=I=|3iY0-v*aLtEsPZq925$5T5zBKM2LW?{y1I)lG168}MQ~m$+a{s>? z#4Bci8F*6+h*~f1MVOMStsBWvt(B;ks3hc9T6_$_i7CbCOQm=p)d<=pO%OwerA4%$ P@Q;9@fd^*bRT=mTr^1T! literal 0 HcmV?d00001 diff --git a/src/main/resources/static/agent/ja-netfilter/config/dns.conf b/src/main/resources/static/agent/ja-netfilter/config/dns.conf new file mode 100644 index 0000000..54de89f --- /dev/null +++ b/src/main/resources/static/agent/ja-netfilter/config/dns.conf @@ -0,0 +1,3 @@ +[DNS] +; put dns filter rules here + diff --git a/src/main/resources/static/agent/ja-netfilter/config/power.conf b/src/main/resources/static/agent/ja-netfilter/config/power.conf new file mode 100644 index 0000000..a245d18 --- /dev/null +++ b/src/main/resources/static/agent/ja-netfilter/config/power.conf @@ -0,0 +1 @@ +[Result] \ No newline at end of file diff --git a/src/main/resources/static/agent/ja-netfilter/config/url.conf b/src/main/resources/static/agent/ja-netfilter/config/url.conf new file mode 100644 index 0000000..6f77e41 --- /dev/null +++ b/src/main/resources/static/agent/ja-netfilter/config/url.conf @@ -0,0 +1,3 @@ +[URL] +; put url filter rules here + diff --git a/src/main/resources/static/agent/ja-netfilter/ja-netfilter.jar b/src/main/resources/static/agent/ja-netfilter/ja-netfilter.jar new file mode 100644 index 0000000000000000000000000000000000000000..b72565a350f502d0e07b0879272cf19d01664268 GIT binary patch literal 48639 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 E54%#Ny8r+H literal 0 HcmV?d00001 diff --git a/src/main/resources/static/agent/ja-netfilter/plugins/dns.jar b/src/main/resources/static/agent/ja-netfilter/plugins/dns.jar new file mode 100644 index 0000000000000000000000000000000000000000..113c6990747325b43e4f0a6affcc4bbc3e0d49e9 GIT binary patch literal 4859 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 b7X9B00Od#V0s#T*$4~EvawO}~&wu|1KF}#u literal 0 HcmV?d00001 diff --git a/src/main/resources/static/agent/ja-netfilter/plugins/url.jar b/src/main/resources/static/agent/ja-netfilter/plugins/url.jar new file mode 100644 index 0000000000000000000000000000000000000000..495804edbaf722bd507e828982879b3dce7ca728 GIT binary patch literal 4529 zcma)A2UJr_*9{;&2qXbQ?=|!)N>HjG(tGbsFqDKMV4+HvjuJu*O+Wh2dj;(9RfsTm{y|xMoZLPCF|HlRg>bTo)bPUfrgeI@`B!1tLPCI73D9*us@3Oi=s!ezy8Af0B9MPTG5rDMdf-6d^(^Gu>b=$S>>EU$ z)YT;B8+~d-Zf+?7f_}cyC*uG&#{10xiAZW?8V2dcUxwx5M zU65IH?V!&A1@G2&tJ~#LoR#_1^WX@f^9X+hTs-Hy)=H!0ZHIabbAdM*>a+6-MvXUl zmi&vp;I6+67}@HxnK-m5WrSX;qhTjyS~s%G>oLKsy-ULMaOlXp6J)XPkwJ*anM+{3 zE!8VEpwmQe=TRhgWBe?~^{k*Z6wSTY;jx^?RcvV5fFfTjy6O$dtV+@Fe4;C~X_cJ< zv__k);gl6To?kqn6eB_pW+TEWCLw1s0G}{9wqu5KgmI;n3m(tZ+Rc*B4Hf~(o8$KYC{Zv{xCzhSk;c+N7l z83@uQe(E%%dmt|wTld*oma(`3nG;INT*@L0zm1F9qcWF!nGDd z;+dw6Z?JDqLzV24k**?7${H#mlVnkm^{=82DYl5R7K}ZUtW{1|W$7;!H86IHVH@7> z>d9-wXbKfeq{1WDlM)vAs-wK1z5Hcb0IeKljPr-&*rBH}Epx1**kpb6Ds>sr5J}a2 zvgQj+?J?KW>_?a#icG#p4xls+2h8}d7#p-k@VE93$~=h-9N9?(6=PcN)U>CYOmT2- zz^a}}q*_9oo?H)KslR!+3E1n0-+er7X@X+nr){`9ZAZs>-fkPOM>^&)JoZrU(HOxE zkZhk^G(lnWj0*x+7Z$yh=C3v1zKYrcUOVh)!WKc`)NRQJHlu`KKXEi}MM&UCD9ga-FX zR>=%z{%TClaQ6Pd;MmlzS%Z=Kh?H34vpj*TtFVc$4Og#K&G}2Yb){L9lNuu(WwT~p z6)qcx*SxQ%+j&f`j~$ib#}4WPD_7LQ+2v=;l9r;95`sF)%RFmc${XbP-XPuU?O@c; z(KZ(4YWjq|Xvfc?U4L1pXPZ1b_i{Pb3i`EHnGbH!^_Jq5x{*D@m5EZ=1m z(}pbR2W9t(ZhKri+Xfz@_dd*y?kM(du^C$=BdX@qE%Y6Z$SWU%KTg0lC|Z$ei*FA( zq>V9iOZ$*yve|6jn!VSSRFvihjoI&RgpT3AUhj@I9EB+C4L6~j2@tqtGf3cATHyH_MC^f zoInNzce41s01TS(^R88zn7+$!Wx=DFfB|A8=86Q(;o`@}hYKIdCw5jw`-uFCEfEK} zL)ns1X{FCM&xPM`^4|I2dk+-mWc`chBCN}WvFF@kqP?ZbT2x7tdnD_$b?pBU( zvXj^2TRW6Uuv8Z*2lP`AE4_pk*u-g&uuN^*2iMq_{yaN`o0cfyILBBIwUwOxb4kqp zV-Lr*eH;`ut2^AT5GATR+u2HnmDZpig1h?VW+jQ-Dq}ZYwX0xZTD2)q9Beb-l+>se zoK?MrT0yg3zhCW&bjZZ87IQo{p6y~2{{2y`FOlDb)R+-=GZU`Qz{zfh>}&>yP;OGEPR(42 z;#hzHn{b{lkY=p;nw`94@{gT?xyn@+JGg6fCusG@4A|!H4)?rg8P?dh=%Cw8vh|Z~ zT`jboFKmh8uceMyvfl8#?Lm{Bj7*>lux2=ZO*!l1vEe^g&9 z)6v~Sh{4W^mtmBqSjoh_@Em-3q<7j=4w8fR8d`6z!WX-*st zlzD>>s~~1)STESOAzWkcCk-$jJZEIBsPgr5Hg)4AJ(8WF>WsHJI8$hCF<0ik+I{i| zUgtj(*gt(a>gYjtif@or`X_o?wR0v(voS|j6^n%fPoLb{4EmA4hg1C0z6&c zd&1$VSo8x{r9}n~aHNxO3Y$~}FPrm7AIL5)(fHO0VRb_>>Z5#`ESOnPR;|(n=FeQ)g zG8l~&yJ?un6j*5Yxh=g}BJ$z9hsYR042&>|*pjD{1iD$U^wwp66V_r&j7m%3vP$$v zF?~9y{MvWTF56K6D8yM{*)KK?%nk6A?iaUb%Xp3sS}gZ7Ahd{>v%>8 z4xO@oo{v#3p@`3fr*VTVgWq$N59AHY)dM(t%S7EC5+BlvRZ!VH>SyM5Nd{mdqu3uB7RWl2IRbOu7=`{b;B+%J5zy(ZKs@S8%yHM>>=Rz zXgGNQ=xE^KLkJ-MYJ-o?hwlv=e0=$3B~O^*9}HxGf3u%I@Kk_Rg}##vCt?3&M}NaM zkA^?Y>2az*9`tv_u|56KjvoZZ`+@jhv-3Hy zzZd?W?Cei2Y;fg&F#XNko_wRn#3u`Zh(FQ)p|;S`AUyH`008OHFAX06Af!CL`#;n>U_Sr= literal 0 HcmV?d00001 diff --git a/src/main/resources/static/css/index.css b/src/main/resources/static/css/index.css new file mode 100644 index 0000000..046bd39 --- /dev/null +++ b/src/main/resources/static/css/index.css @@ -0,0 +1,530 @@ +.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: 76px; +} + +.cut-short { + width: 50px; +} + +.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; +} +:root { + --text-grey: #9e9e9e; + --text-main: rgba(0, 0, 0, 0.87); + --spacing: 4px; + --size: 64px; + --radius: 1.5rem; + --accent: #5380f7; + --text-sm: 0.875rem; + --main-bg: #fff; + --card-bg: #fff; + --hover-color: #eee; + --border-color: rgba(0, 0, 0, 0.05); + --grey-400: rgba(0, 0, 0, 0.04); + --grey-600: rgba(0, 0, 0, 0.06); +} + +@media (prefers-color-scheme: dark) { + :root { + --main-bg: rgb(0, 0, 0); + --card-bg: rgb(31, 34, 38); + --text-main: #d9d9d9; + --text-grey: #6e767d; + --accent: #1d9bf0; + --hover-color: rgba(255, 255, 255, 0.07); + --border-color: #4b4648; + } +} + +body { + font-size: 1rem; + line-height: 1.5; + word-wrap: break-word; + font-kerning: normal; + font-family: 'Gotham SSm A', 'Gotham SSm B', 'Arial Unicode MS', Helvetica, sans-serif; + margin: 0; + padding: 0; + -webkit-font-smoothing: antialiased; + background-color: var(--main-bg); +} + +* ul, * ol { + list-style: none; + padding: 0; + margin: 0; +} + +*[role='button'], button { + cursor: pointer; +} + +.color-primary { + color: var(--text-main); +} + + +.mt-0 { + margin-top: 0; +} + + +.radius-1 { + border-radius: var(--radius); +} + +.px-6 { + padding-left: calc(var(--spacing) * 6); + padding-right: calc(var(--spacing) * 6); +} + +.py-6 { + padding-left: calc(var(--spacing)* 6); + padding-right: calc(var(--spacing)* 6); +} + +.py-10 { + padding-top: calc(var(--spacing) * 10); + padding-bottom: calc(var(--spacing) * 10); +} + +.pd-6 { + padding: calc(var(--spacing) * 6); +} + + +.pt-1 { + padding-top: var(--spacing); +} + +.pb-0 { + padding-bottom: 0; +} + +.overflow-hidden { + overflow: hidden; +} + +.flex { + display: flex; +} + +.justify-between { + justify-content: space-between; +} + +.justify-center { + justify-content: center; +} + + +.items-center { + align-items: center; +} + +.shrink-0 { + flex-shrink: 0; +} + +.text-grey { + color: var(--text-grey); +} + +.text-sm { + font-size: 0.875rem; +} + +.bg-card { + background-color: var(--card-bg); +} + +.truncate { + /* display: -webkit-box; */ + /* -webkit-box-orient: vertical; */ + /* -webkit-line-clamp: var(--line, 3); */ + /* overflow: hidden; */ +} + +.truncate-1 { + --line: 1; +} + +.overflow-ellipsis { + text-overflow: ellipsis; +} + +.z-grid { + display: grid; + grid-gap: var(--gutter, 1rem); + grid-template-columns: repeat(auto-fill, minmax(min(var(--space, 10rem), 100%), 1fr)); +} + + +.card { + box-shadow: rgb(0 0 0 / 30%) 0 8px 40px -12px; + border-radius: 1.5rem; + transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) 0ms; + width: 90%; + position: relative; + overflow: visible; + background-color: var(--card-bg); + margin: 0 auto; +} + +.card:hover { + transform: translateY(-2px); +} + +.card:hover .mask { + bottom: -1.5rem; +} + +.card:hover .mask-c-1 { + bottom: -2.5rem; +} + +.container { + padding-top: calc(var(--spacing) * 10); +} + +.container p { + position: relative; + cursor: pointer; + transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; +} + +.container p::after { + content: attr(data-content); + position: absolute; + transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + color: transparent; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--radius); +} + +.container p:hover { + color: transparent; +} + +.container p:hover::after { + color: var(--text-main); + background-color: var(--hover-color); +} + +.toggle li { + z-index: 99; + position: relative; + background: transparent; + padding: 0 20px; + color: var(--text-main); + transition: background-color 250ms ease-out; +} + +.toggle li:hover { + background-color: var(--hover-color); +} + +.toggle li.active a { + color: var(--accent); +} + +.toggle li:first-child { + border-top-left-radius: var(--text-sm); + border-top-right-radius: var(--text-sm); +} + +.toggle li:last-child { + border-bottom-left-radius: var(--text-sm); + border-bottom-right-radius: var(--text-sm); +} + +.toggle li:last-child a { + border-bottom: 0; +} + +.toggle li a { + display: block; + border-bottom: 1px solid var(--border-color); + padding: 16px 0; + color: inherit; + text-decoration: none; + white-space: nowrap; +} + +.icon { + background-image: url('../images/icons.svg?t=4567'); + background-size: 64px; + background-position-x: 0; +} + +.icon-al { + background-position-y: -1728px; +} + +.icon-ii { + background-position-y: -448px; +} + +.icon-ps { + background-position-y: -512px; +} + +.icon-ac { + background-position-y: -192px; +} + +.icon-db { + background-position-y: -320px; +} + +.icon-rm { + background-position-y: -896px; +} + +.icon-ws { + background-position-y: -960px; +} + +.icon-rd { + background-position-y: -832px; +} + +.icon-cl { + background-position-y: -256px; +} + +.icon-pc { + background-position-y: -576px; +} + +.icon-go { + background-position-y: -384px; +} + +.icon-ds { + background-position-y: -1792px; +} + +.icon-dc { + background-position-y: -1408px; +} + +.icon-dpn { + background-position-y: -1536px; +} + +.icon-dm { + background-position-y: -1472px; +} + +.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-c-1 { + bottom: 0; + width: 72%; + background-color: var(--grey-400); +} + +.avatar-wrapper { + position: relative; + width: var(--size); + height: var(--size); + font-size: 1.25rem; + user-select: none; + transform: translateY(50%); +} + +.avatar-wrapper img, .avatar-wrapper .icon { + width: 100%; + height: 100%; + margin: 0; + background-color: var(--card-bg); + color: transparent; + object-fit: cover; + text-align: center; + text-indent: 10000px; +} + + +header.tip a { + color: var(--accent); + text-decoration: none; +} + +header.tip p { + word-break: break-word; + word-wrap: break-word; +} + + +main hr { + margin: 0; + padding: 0; + background: var(--border-color); + height: 1px; + border: none; +} + +footer { + --_size: 40px; + padding-top: var(--_size); + width: 96%; + margin: calc(var(--spacing) * 10) auto 0; + padding-bottom: var(--_size); + border-top: 1px solid var(--border-color); + -moz-box-align: center; + -webkit-box-pack: justify; +} + +footer .lt-panel p:nth-of-type(1) { + color: inherit; +} +header.tip { + top: 2.3%; + background-color: var(--card-bg); + color: var(--text-main); + z-index: 99; + width: 80%; + margin: 0 auto; + border-radius: 16px; + box-shadow: rgb(0 0 0 / 30%) 0 8px 40px -12px; + transition: transform 250ms ease, box-shadow 250ms ease; +} +.sticky { + position: sticky; +} + + +.parent { + position: relative; +} +.search { + width: 300px; + height: 40px; + border-radius: 18px; + outline: none; + /*border: 1px solid #ccc;*/ + padding-left: 20px; + /*position: absolute;*/ +} \ No newline at end of file diff --git a/src/main/resources/static/images/icons.svg b/src/main/resources/static/images/icons.svg new file mode 100644 index 0000000..2b7ad34 --- /dev/null +++ b/src/main/resources/static/images/icons.svg @@ -0,0 +1,713 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/static/js/index.js b/src/main/resources/static/js/index.js new file mode 100644 index 0000000..4d18a1d --- /dev/null +++ b/src/main/resources/static/js/index.js @@ -0,0 +1,83 @@ +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' +} +document.getElementById('search').oninput = function (e) { + $("#product-list").load('/search?search=' + e.target.value) +} +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 = '光云' + document.getElementById('assigneeName').value = '藏柏' + document.getElementById('expiryDate').value = '2111-11-11' + } + document.getElementById('mask').style.display = 'block' + document.getElementById('form').style.display = 'block' +} +window.showVmoptins = function () { + alert("-javaagent:/(Your Path)/ja-netfilter/ja-netfilter.jar\n" + + "--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED\n" + + "--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED") +} +//@see https://zhuanlan.zhihu.com/p/597944027 +const copyText = async (val) => { + if (navigator.clipboard && navigator.permissions) { + await navigator.clipboard.writeText(val) + } else { + const textArea = document.createElement('textArea') + textArea.value = val + textArea.style.width = 0 + textArea.style.position = 'fixed' + textArea.style.left = '-999px' + textArea.style.top = '10px' + textArea.setAttribute('readonly', 'readonly') + document.body.appendChild(textArea) + + textArea.select() + document.execCommand('copy') + document.body.removeChild(textArea) + } +} +window.copyLicense = 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)); + } + let licenseInfo = JSON.parse(localStorage.getItem('licenseInfo')) + let productCode = e.closest('.card').dataset.productCodes; + let data = { + "licenseeName": licenseInfo.licenseeName, + "assigneeName": licenseInfo.assigneeName, + "expiryDate": licenseInfo.expiryDate, + "productCode": productCode, + } + let resp = await fetch('/generateLicense', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }).then(response => response.text()) + + copyText(resp) + .then(() => { + alert("The activation code has been copied"); + }) +} \ No newline at end of file diff --git a/src/main/resources/static/js/jquery.js b/src/main/resources/static/js/jquery.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/src/main/resources/static/js/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0 + + + + + + Jetbrains-Help + + + + +
+

+ 🇨🇳 Download ja-netfilter.zip , and configure + your JetBrains's vmoptions!
+ 🇨🇳 Also you can Refill license information to customizer your license!
+ 🇨🇳 Please note that this page is only developed and used by + personally! +

+
+ +
+
+
+ + +
+
+
+
+ +
+
+
+
+
+

+

+ ********** +

+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+

+

+ ********** +

+
+
+
+
+
+
+
+ + + + + + \ No newline at end of file