1
0
mirror of https://github.com/kochetkov-ma/allure-server.git synced 2025-07-17 01:32:38 +02:00

fix: support native executor.json and executor bu API #83

This commit is contained in:
kochetkov-ma
2024-07-02 20:03:49 +01:00
parent cd6d9d6064
commit abd2ebbc4d
47 changed files with 3145 additions and 3092 deletions

1
.gitignore vendored
View File

@ -46,6 +46,7 @@ id_rsa
!**/resources/**/*.zip
!**/resources/**/*.jar
allure-server-store/
allure-server-store-db/
tmp/
pg-secret.yaml

View File

@ -24,10 +24,12 @@ services:
- postgres
postgres:
image: postgres:latest
image: postgres:16.3-alpine
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: allure
ports:
- 5432:5432
volumes:
- ./allure-server-store-db:/var/lib/postgresql/data:rw

View File

@ -19,9 +19,9 @@ import ru.iopump.qa.allure.properties.TmsProperties;
@EnableTransactionManagement
@EnableConfigurationProperties({AllureProperties.class, CleanUpProperties.class, BasicProperties.class, TmsProperties.class})
@EnableVaadin
public class Application { //NOPMD
public class Application {
public static void main(String[] args) { //NOPMD
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

View File

@ -1,4 +1,4 @@
package ru.iopump.qa.allure.controller; //NOPMD
package ru.iopump.qa.allure.controller;
import com.google.common.base.Preconditions;
import io.qameta.allure.entity.ExecutorInfo;
@ -182,7 +182,7 @@ public class AllureReportController {
}
@ExceptionHandler(ConstraintViolationException.class)
private void constraintViolationException(HttpServletResponse response) throws IOException { //NOPMD
private void constraintViolationException(HttpServletResponse response) throws IOException {
response.sendError(HttpStatus.BAD_REQUEST.value());
}
}

View File

@ -1,4 +1,4 @@
package ru.iopump.qa.allure.controller; //NOPMD
package ru.iopump.qa.allure.controller;
import com.google.common.base.Preconditions;
import io.swagger.v3.oas.annotations.Operation;

View File

@ -48,20 +48,20 @@ public class ReportEntity {
private boolean active;
@Builder.Default
@PositiveOrZero
private long level = 0L; //NOPMD
private long level = 0L;
@Builder.Default
@PositiveOrZero
@Access(AccessType.PROPERTY)
@Column(columnDefinition = "bigint not null default '0'")
private long size = 0L; //NOPMD
private long size = 0L;
@Builder.Default
@PositiveOrZero
@Column(columnDefinition = "int not null default '0'")
private int version = 1; //NOPMD
private int version = 1;
@Builder.Default
@NotNull
@Column(nullable = false, columnDefinition = "varchar(255) not null default ''")
private String buildUrl = ""; //NOPMD
private String buildUrl = "";
public static long sizeKB(@Nullable Path path) {
if (path == null || Files.notExists(path)) {

View File

@ -87,7 +87,7 @@ public class ReportGenerateDialog extends Dialog {
info.setVisible(true);
info.setText("Success: " + res);
}
} catch (Exception e) { //NOPMD
} catch (Exception e) {
error.setVisible(true);
error.setText("Error: " + e.getLocalizedMessage());
log.error("Generation error", e);

View File

@ -24,7 +24,7 @@ import java.util.function.Function;
import static ru.iopump.qa.util.Str.format;
@Slf4j
public class ResultUploadDialog extends Dialog { //NOPMD
public class ResultUploadDialog extends Dialog {
private static final long serialVersionUID = -4958469225519042248L;
private final MemoryBuffer buffer;
@ -54,7 +54,7 @@ public class ResultUploadDialog extends Dialog { //NOPMD
event.getFileName(), event.getContentLength(), uploadResponse
)), false
);
} catch (Exception ex) { //NOPMD
} catch (Exception ex) {
show(error("Internal error: " + ex.getLocalizedMessage()), true);
log.error("Uploading error", ex);
}

View File

@ -1,7 +1,5 @@
package ru.iopump.qa.allure.gui.view;
import static ru.iopump.qa.allure.gui.MainLayout.ALLURE_SERVER;
import com.vaadin.flow.component.Tag;
import com.vaadin.flow.component.html.Anchor;
import com.vaadin.flow.component.html.Div;
@ -10,8 +8,6 @@ import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
@ -19,6 +15,11 @@ import org.apache.commons.lang3.StringUtils;
import ru.iopump.qa.allure.gui.MainLayout;
import ru.iopump.qa.util.ResourceUtil;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import static ru.iopump.qa.allure.gui.MainLayout.ALLURE_SERVER;
@Tag("about-view")
@PageTitle("About | " + ALLURE_SERVER)
@Route(value = "about", layout = MainLayout.class)
@ -63,9 +64,9 @@ public class AboutView extends VerticalLayout {
public static String getVersionOrDefault(@NonNull String defaultVersion) {
try (final InputStream inputStream = ResourceUtil.getResourceAsStream("version.info")) {
var version = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
log.info("App version from version.info = " + version); //NOPMD
log.info("App version from version.info = " + version);
return StringUtils.isBlank(version) ? defaultVersion : version;
} catch (Exception e) { //NOPMD
} catch (Exception e) {
log.error("Version error", e);
return defaultVersion;
}

View File

@ -1,4 +1,4 @@
package ru.iopump.qa.allure.gui.view; //NOPMD
package ru.iopump.qa.allure.gui.view;
import com.google.common.collect.ImmutableList;
import com.vaadin.flow.component.Tag;
@ -79,7 +79,7 @@ public class ReportsView extends VerticalLayout {
try {
jpaReportService.internalDeleteByUUID(uuid);
Notification.show("Delete success: " + uuid, 2000, Notification.Position.TOP_START);
} catch (Exception e) { //NOPMD
} catch (Exception e) {
Notification.show("Deleting error: " + e.getLocalizedMessage(),
5000,
Notification.Position.TOP_START);

View File

@ -1,4 +1,4 @@
package ru.iopump.qa.allure.gui.view; //NOPMD
package ru.iopump.qa.allure.gui.view;
import com.google.common.collect.ImmutableList;
import com.vaadin.flow.component.Tag;
@ -84,7 +84,7 @@ public class ResultsView extends VerticalLayout {
try {
allureResultController.deleteResult(uuid);
Notification.show("Delete success: " + uuid, 2000, Notification.Position.TOP_START);
} catch (Exception e) { //NOPMD
} catch (Exception e) {
Notification.show("Deleting error: " + e.getLocalizedMessage(),
5000,
Notification.Position.TOP_START);

View File

@ -1,7 +1,8 @@
package ru.iopump.qa.allure.helper; //NOPMD
package ru.iopump.qa.allure.helper;
import io.qameta.allure.Aggregator2;
import io.qameta.allure.ConfigurationBuilder;
import io.qameta.allure.Extension;
import io.qameta.allure.ReportGenerator;
import io.qameta.allure.ReportStorage;
import io.qameta.allure.core.Configuration;
@ -42,6 +43,7 @@ public final class AllureReportGenerator {
private final ReportGenerator delegate;
private final BeanFactory beanFactory;
private final AggregatorGrabber aggregatorGrabber = new AggregatorGrabber();
private final Extension ciExecutor = new ExecutorCiPlugin();
public AllureReportGenerator(@NonNull Collection<AllureServerPlugin> listeners, AllureProperties allureProperties, TmsProperties tmsProperties, BeanFactory beanFactory) {
this.listeners = listeners;
@ -55,7 +57,7 @@ public final class AllureReportGenerator {
return ConfigurationBuilder
.bundled()
.withPlugins(loadPlugins())
.withExtensions(List.of(aggregatorGrabber))
.withExtensions(List.of(aggregatorGrabber, ciExecutor))
.build();
}
@ -95,7 +97,7 @@ public final class AllureReportGenerator {
}
}
return to;
} catch (Exception exception) { //NOPMD
} catch (Exception exception) {
throw new IllegalStateException("Error default plugins loading from resources '/plugins/**'", exception);
}
}

View File

@ -5,24 +5,36 @@ import io.qameta.allure.core.Configuration;
import io.qameta.allure.core.ResultsVisitor;
import io.qameta.allure.entity.ExecutorInfo;
import io.qameta.allure.executor.ExecutorPlugin;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
@Slf4j
public class ExecutorCiPlugin extends ExecutorPlugin {
public static final String JSON_FILE_NAME = "ci-executor.json";
@Override
public void readResults(Configuration configuration, ResultsVisitor visitor, Path directory) {
final JacksonContext context = configuration.requireContext(JacksonContext.class);
final Path nativeExecutorFile = directory.resolve("executor.json");
if (Files.exists(nativeExecutorFile) && Files.isRegularFile(nativeExecutorFile))
try {
if (Files.readAllBytes(nativeExecutorFile).length > 1) return;
} catch (IOException e) {
log.error("Could not read existed native executor file {}", nativeExecutorFile, e);
}
final Path executorFile = directory.resolve(JSON_FILE_NAME);
if (Files.exists(executorFile) && Files.isRegularFile(executorFile)) {
try (InputStream is = Files.newInputStream(executorFile)) {
final ExecutorInfo info = context.getValue().readValue(is, ExecutorInfo.class);
visitor.visitExtra(EXECUTORS_BLOCK_NAME, info);
} catch (IOException e) {
visitor.error("Could not read executor file " + executorFile, e); //NOPMD
visitor.error("Could not read executor file " + executorFile, e);
}
}
}

View File

@ -37,7 +37,7 @@ public class ServeRedirectHelper {
}
log.info("Redirect NOT evaluated: '{}'", from);
throw new RuntimeException("Redirect NOT evaluated " + from); //NOPMD
throw new RuntimeException("Redirect NOT evaluated " + from);
}
public void mapRequestTo(String urlPath, String staticResourcePath) {
@ -62,7 +62,7 @@ public class ServeRedirectHelper {
// Add base url if not
if (!result.startsWith(cfg.reports().path())) {
result = cfg.reports().path() + result; //NOPMD
result = cfg.reports().path() + result;
}
// Remove '/index.html' if exists
@ -82,12 +82,12 @@ public class ServeRedirectHelper {
// Add first '/' if not
if (result.charAt(0) != CHAR) {
result = CHAR + result; //NOPMD
result = CHAR + result;
}
// Add '/index.html' if not
if (!result.endsWith(INDEX_HTML)) {
result = result + INDEX_HTML; //NOPMD
result = result + INDEX_HTML;
}
// Must be '/allure/123456890/index.html'

View File

@ -1,9 +1,10 @@
package ru.iopump.qa.allure.model;
import lombok.Builder;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Builder;
import lombok.Data;
@Data
@Builder

View File

@ -1,13 +1,14 @@
package ru.iopump.qa.allure.repo;
import lombok.NonNull;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import ru.iopump.qa.allure.entity.ReportEntity;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Optional;
import java.util.UUID;
import lombok.NonNull;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import ru.iopump.qa.allure.entity.ReportEntity;
@Repository
public interface JpaReportRepository extends JpaRepository<ReportEntity, UUID> {

View File

@ -1,4 +1,4 @@
package ru.iopump.qa.allure.service; //NOPMD
package ru.iopump.qa.allure.service;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import com.fasterxml.jackson.databind.ObjectMapper;

View File

@ -1,10 +1,10 @@
package ru.iopump.qa.allure.service;
import java.nio.file.Path;
import jakarta.annotation.Nullable;
import lombok.experimental.UtilityClass;
import java.nio.file.Path;
@SuppressWarnings("RedundantModifiersUtilityClassLombok")
@UtilityClass
public class PathUtil {

View File

@ -97,7 +97,7 @@ public class ResultService {
Files.createDirectories(resultDirectory);
checkAndUnzipTo(io, tmpResultDirectory);
move(tmpResultDirectory, resultDirectory);
} catch (Exception ex) { //NOPMD
} catch (Exception ex) {
if (resultDirectory != null) {
// Clean on error
FileUtils.deleteQuietly(resultDirectory.toFile());
@ -123,7 +123,7 @@ public class ResultService {
final Path newFile = fromZip(unzipTo, zipEntry);
try (final OutputStream fos = Files.newOutputStream(newFile)) {
int len;
while ((len = zis.read(buffer)) > 0) { //NOPMD
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
}
@ -147,7 +147,7 @@ public class ResultService {
try {
Files.walkFileTree(nestedResultDir, new MoveFileVisitor(to));
} catch (IOException e) {
throw new RuntimeException("Walk error " + nestedResultDir, e); //NOPMD
throw new RuntimeException("Walk error " + nestedResultDir, e);
}
}
);

View File

@ -1 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M349.9 236.3h-66.1v-59.4h66.1v59.4zm0-204.3h-66.1v60.7h66.1V32zm78.2 144.8H362v59.4h66.1v-59.4zm-156.3-72.1h-66.1v60.1h66.1v-60.1zm78.1 0h-66.1v60.1h66.1v-60.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4 .4 67.6 .1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1l-13.3-8.9zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm-78.1-72.1h-66.1v60.1h66.1v-60.1z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
<path
d="M349.9 236.3h-66.1v-59.4h66.1v59.4zm0-204.3h-66.1v60.7h66.1V32zm78.2 144.8H362v59.4h66.1v-59.4zm-156.3-72.1h-66.1v60.1h66.1v-60.1zm78.1 0h-66.1v60.1h66.1v-60.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4 .4 67.6 .1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1l-13.3-8.9zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm-78.1-72.1h-66.1v60.1h66.1v-60.1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 816 B

After

Width:  |  Height:  |  Size: 836 B

View File

@ -1 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 496 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
<path
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
<path
d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/>
</svg>

Before

Width:  |  Height:  |  Size: 655 B

After

Width:  |  Height:  |  Size: 675 B

View File

@ -1 +1,21 @@
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 128 128" version="1.1" viewBox="0 0 128 128" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Layer_1"><rect fill="#F4F5F5" height="1520" opacity="0" width="727.938" x="-59.984" y="-351"/></g><g id="Layer_2"><g><circle cx="64" cy="64" fill="#6E9583" r="64"/><g><defs><circle cx="64" cy="64" id="SVGID_3_" r="64"/></defs><clipPath id="SVGID_2_"><use overflow="visible" xlink:href="#SVGID_3_"/></clipPath><polygon clip-path="url(#SVGID_2_)" fill="#648778" points="93.572,29.677 128,64 128,128 54.36,128 33.341,106.906 "/></g><path d="M84.044,20H36.018C33.579,20,32,22.11,32,24.549v78.903c0,2.439,1.579,4.549,4.018,4.549h55.989 c2.439,0,4.018-2.11,4.018-4.549V32.143L84.044,20z" fill="#F1F1F1"/><g><defs><path d="M84.044,20H36.018C33.579,20,32,22.11,32,24.549v78.903c0,2.439,1.579,4.549,4.018,4.549h55.989 c2.439,0,4.018-2.11,4.018-4.549V32.143L84.044,20z" id="SVGID_5_"/></defs><clipPath id="SVGID_4_"><use overflow="visible" xlink:href="#SVGID_5_"/></clipPath><g clip-path="url(#SVGID_4_)"><polygon fill="#DDE1F1" points="50.948,67.621 65.539,82.042 42.971,83.087 49.777,90 42.971,91.087 49.277,97.555 42.971,99.087 53.027,109.305 97.684,109.305 97.684,75.707 97.075,54.055 81.059,37.758 70.97,44.918 62.684,35.107 "/></g></g><path d="M88.186,32.138l7.839,0.005L84.044,20v7.96C84.044,30.398,85.769,32.138,88.186,32.138z" fill="#C2DFC9"/><path d="M84,83.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,83.5,84,83.5z" fill="#495260"/><path d="M84,91.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,91.5,84,91.5z" fill="#495260"/><path d="M84,99.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,99.5,84,99.5z" fill="#495260"/><g><path d="M69.568,31.844l-1.319,11.303c2.314,0.88,4.242,2.728,5.132,5.245c0.573,1.619,0.631,3.292,0.274,4.851 l10.257,4.895c0.527,0.252,1.155-0.023,1.329-0.581c1.308-4.188,1.323-8.819-0.253-13.273 c-2.379-6.723-7.827-11.477-14.212-13.254C70.21,30.872,69.636,31.26,69.568,31.844z" fill="#0E9CD9"/><path d="M66.68,59.901c-3.653,0.668-7.398-1.12-9.176-4.38c-1.094-2.006-1.312-4.174-0.858-6.157L46.39,44.469 c-0.527-0.251-1.155,0.023-1.329,0.58c-1.286,4.118-1.322,8.663,0.175,13.049c3.701,10.842,15.624,16.783,26.503,13.191 c4.655-1.537,8.399-4.531,10.911-8.3c0.324-0.486,0.141-1.147-0.385-1.398l-10.257-4.896 C70.751,58.296,68.929,59.49,66.68,59.901z" fill="#E95037"/><path d="M62.239,43.074c0.734-0.26,1.479-0.405,2.22-0.464l1.316-11.275c0.067-0.576-0.389-1.08-0.968-1.071 c-2.218,0.035-4.469,0.421-6.676,1.202c-4.455,1.576-8.045,4.5-10.479,8.151c-0.324,0.486-0.142,1.147,0.385,1.399l10.257,4.895 C59.282,44.654,60.62,43.647,62.239,43.074z" fill="#69B32D"/><g><defs><path d="M69.695,30.76l-1.446,12.387c2.314,0.88,4.242,2.728,5.132,5.245c0.573,1.619,0.631,3.292,0.274,4.851 l10.257,4.895c0.527,0.252,1.155-0.023,1.329-0.581c1.308-4.188,1.323-8.819-0.253-13.273 C82.476,37.185,76.541,32.281,69.695,30.76z M66.68,59.901c-3.653,0.668-7.398-1.12-9.176-4.38 c-1.094-2.006-1.312-4.174-0.858-6.157L46.39,44.469c-0.527-0.251-1.155,0.023-1.329,0.58 c-1.286,4.118-1.322,8.663,0.175,13.049c3.701,10.842,15.624,16.783,26.503,13.191c4.655-1.537,8.399-4.531,10.911-8.3 c0.324-0.486,0.141-1.147-0.385-1.398l-10.257-4.896C70.751,58.296,68.929,59.49,66.68,59.901z M62.239,43.074 c0.734-0.26,1.479-0.405,2.22-0.464l1.316-11.275c0.067-0.576-0.389-1.08-0.968-1.071c-2.218,0.035-4.469,0.421-6.676,1.202 c-4.455,1.576-8.045,4.5-10.479,8.151c-0.324,0.486-0.142,1.147,0.385,1.399l10.257,4.895 C59.282,44.654,60.62,43.647,62.239,43.074z" id="SVGID_7_"/></defs><clipPath id="SVGID_6_"><use overflow="visible" xlink:href="#SVGID_7_"/></clipPath><circle clip-path="url(#SVGID_6_)" cx="65.151" cy="51.304" fill="#FFFFFF" opacity="0.4" r="12.507"/></g></g></g></g></svg>
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
<svg enable-background="new 0 0 128 128" version="1.1" viewBox="0 0 128 128" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Layer_1"><rect fill="#F4F5F5" height="1520" opacity="0" width="727.938" x="-59.984" y="-351"/></g>
<g id="Layer_2"><g><circle cx="64" cy="64" fill="#6E9583" r="64"/><g><defs><circle cx="64" cy="64" id="SVGID_3_" r="64"/></defs>
<clipPath id="SVGID_2_"><use overflow="visible" xlink:href="#SVGID_3_"/></clipPath>
<polygon clip-path="url(#SVGID_2_)" fill="#648778" points="93.572,29.677 128,64 128,128 54.36,128 33.341,106.906 "/></g><path
d="M84.044,20H36.018C33.579,20,32,22.11,32,24.549v78.903c0,2.439,1.579,4.549,4.018,4.549h55.989 c2.439,0,4.018-2.11,4.018-4.549V32.143L84.044,20z" fill="#F1F1F1"/><g><defs><path d="M84.044,20H36.018C33.579,20,32,22.11,32,24.549v78.903c0,2.439,1.579,4.549,4.018,4.549h55.989 c2.439,0,4.018-2.11,4.018-4.549V32.143L84.044,20z" id="SVGID_5_"/></defs>
<clipPath id="SVGID_4_"><use overflow="visible" xlink:href="#SVGID_5_"/></clipPath>
<g clip-path="url(#SVGID_4_)"><polygon fill="#DDE1F1" points="50.948,67.621 65.539,82.042 42.971,83.087 49.777,90 42.971,91.087 49.277,97.555 42.971,99.087 53.027,109.305 97.684,109.305 97.684,75.707 97.075,54.055 81.059,37.758 70.97,44.918 62.684,35.107 "/></g></g><path
d="M88.186,32.138l7.839,0.005L84.044,20v7.96C84.044,30.398,85.769,32.138,88.186,32.138z" fill="#C2DFC9"/><path
d="M84,83.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,83.5,84,83.5z" fill="#495260"/><path
d="M84,91.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,91.5,84,91.5z" fill="#495260"/><path
d="M84,99.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,99.5,84,99.5z" fill="#495260"/><g><path d="M69.568,31.844l-1.319,11.303c2.314,0.88,4.242,2.728,5.132,5.245c0.573,1.619,0.631,3.292,0.274,4.851 l10.257,4.895c0.527,0.252,1.155-0.023,1.329-0.581c1.308-4.188,1.323-8.819-0.253-13.273 c-2.379-6.723-7.827-11.477-14.212-13.254C70.21,30.872,69.636,31.26,69.568,31.844z" fill="#0E9CD9"/>
<path
d="M66.68,59.901c-3.653,0.668-7.398-1.12-9.176-4.38c-1.094-2.006-1.312-4.174-0.858-6.157L46.39,44.469 c-0.527-0.251-1.155,0.023-1.329,0.58c-1.286,4.118-1.322,8.663,0.175,13.049c3.701,10.842,15.624,16.783,26.503,13.191 c4.655-1.537,8.399-4.531,10.911-8.3c0.324-0.486,0.141-1.147-0.385-1.398l-10.257-4.896 C70.751,58.296,68.929,59.49,66.68,59.901z"
fill="#E95037"/>
<path
d="M62.239,43.074c0.734-0.26,1.479-0.405,2.22-0.464l1.316-11.275c0.067-0.576-0.389-1.08-0.968-1.071 c-2.218,0.035-4.469,0.421-6.676,1.202c-4.455,1.576-8.045,4.5-10.479,8.151c-0.324,0.486-0.142,1.147,0.385,1.399l10.257,4.895 C59.282,44.654,60.62,43.647,62.239,43.074z"
fill="#69B32D"/>
<g><defs><path d="M69.695,30.76l-1.446,12.387c2.314,0.88,4.242,2.728,5.132,5.245c0.573,1.619,0.631,3.292,0.274,4.851 l10.257,4.895c0.527,0.252,1.155-0.023,1.329-0.581c1.308-4.188,1.323-8.819-0.253-13.273 C82.476,37.185,76.541,32.281,69.695,30.76z M66.68,59.901c-3.653,0.668-7.398-1.12-9.176-4.38 c-1.094-2.006-1.312-4.174-0.858-6.157L46.39,44.469c-0.527-0.251-1.155,0.023-1.329,0.58 c-1.286,4.118-1.322,8.663,0.175,13.049c3.701,10.842,15.624,16.783,26.503,13.191c4.655-1.537,8.399-4.531,10.911-8.3 c0.324-0.486,0.141-1.147-0.385-1.398l-10.257-4.896C70.751,58.296,68.929,59.49,66.68,59.901z M62.239,43.074 c0.734-0.26,1.479-0.405,2.22-0.464l1.316-11.275c0.067-0.576-0.389-1.08-0.968-1.071c-2.218,0.035-4.469,0.421-6.676,1.202 c-4.455,1.576-8.045,4.5-10.479,8.151c-0.324,0.486-0.142,1.147,0.385,1.399l10.257,4.895 C59.282,44.654,60.62,43.647,62.239,43.074z" id="SVGID_7_"/></defs>
<clipPath id="SVGID_6_"><use overflow="visible" xlink:href="#SVGID_7_"/></clipPath>
<circle clip-path="url(#SVGID_6_)" cx="65.151" cy="51.304" fill="#FFFFFF" opacity="0.4" r="12.507"/></g></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -460,7 +460,8 @@
<div class="Icons_icon__2yUqd">
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M6 12A6 6 0 1 1 6 0a6 6 0 0 1 0 12zm0-1.126A4.881 4.881 0 0 0 10.888 6 4.881 4.881 0 0 0 6 1.126 4.881 4.881 0 0 0 1.112 6 4.881 4.881 0 0 0 6 10.874z"></path>
<path
d="M6 12A6 6 0 1 1 6 0a6 6 0 0 1 0 12zm0-1.126A4.881 4.881 0 0 0 10.888 6 4.881 4.881 0 0 0 6 1.126 4.881 4.881 0 0 0 1.112 6 4.881 4.881 0 0 0 6 10.874z"></path>
<path d="M10.282 10.635a.961.961 0 0 1-.01-1.35.94.94 0 0 1 1.338-.01l4.108 4.09c.372.37.376.975.01 1.35a.94.94 0 0 1-1.338.01l-4.108-4.09z"></path>
</g>
</svg>