chore: 全量提交(推广页、宣传册、社交资源、视频与后台同步)
Made-with: Cursor
@@ -1,5 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="page-builder-editor">
|
<div class="page-builder-editor">
|
||||||
|
<div class="pbe-split">
|
||||||
|
<div class="pbe-editor-col">
|
||||||
<PageBuilderBlocks v-model:blocks="blocks" :site-id="siteId" />
|
<PageBuilderBlocks v-model:blocks="blocks" :site-id="siteId" />
|
||||||
<el-collapse class="adv-collapse" accordion>
|
<el-collapse class="adv-collapse" accordion>
|
||||||
<el-collapse-item title="高级:直接编辑 JSON(慎用)" name="json">
|
<el-collapse-item title="高级:直接编辑 JSON(慎用)" name="json">
|
||||||
@@ -13,12 +15,26 @@
|
|||||||
</el-collapse-item>
|
</el-collapse-item>
|
||||||
</el-collapse>
|
</el-collapse>
|
||||||
</div>
|
</div>
|
||||||
|
<aside class="pbe-preview-col">
|
||||||
|
<div class="pbe-preview-head">
|
||||||
|
<span>实时预览</span>
|
||||||
|
<el-text size="small" type="info">与前台样式接近,保存后线上一致</el-text>
|
||||||
|
</div>
|
||||||
|
<div class="pbe-preview-body">
|
||||||
|
<BlockRenderer v-if="blocks.length" :blocks="blocks" />
|
||||||
|
<el-empty v-else description="添加模块后此处显示效果" :image-size="80" />
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, watch } from 'vue'
|
import { ref, watch } from 'vue'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import PageBuilderBlocks from './PageBuilderBlocks.vue'
|
import PageBuilderBlocks from './PageBuilderBlocks.vue'
|
||||||
|
import BlockRenderer from '@yh-web/components/blocks/BlockRenderer.vue'
|
||||||
|
import '@yh-web/styles/page-animations.css'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: { type: String, default: '' },
|
modelValue: { type: String, default: '' },
|
||||||
@@ -105,6 +121,57 @@ function applyJsonDraft() {
|
|||||||
.page-builder-editor {
|
.page-builder-editor {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
.pbe-split {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
align-items: flex-start;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.pbe-editor-col {
|
||||||
|
flex: 1 1 420px;
|
||||||
|
min-width: 320px;
|
||||||
|
}
|
||||||
|
.pbe-preview-col {
|
||||||
|
flex: 0 1 380px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 420px;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #0a0a12;
|
||||||
|
color: #e8e8ef;
|
||||||
|
overflow: hidden;
|
||||||
|
position: sticky;
|
||||||
|
top: 8px;
|
||||||
|
}
|
||||||
|
.pbe-preview-head {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 4px;
|
||||||
|
padding: 10px 12px;
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.pbe-preview-body {
|
||||||
|
padding: 16px;
|
||||||
|
max-height: min(62vh, 640px);
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
.pbe-preview-body :deep(.builder-heading),
|
||||||
|
.pbe-preview-body :deep(.builder-text),
|
||||||
|
.pbe-preview-body :deep(.builder-links a),
|
||||||
|
.pbe-preview-body :deep(.builder-btn) {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
.pbe-preview-body :deep(.builder-text) {
|
||||||
|
color: rgba(255, 255, 255, 0.75);
|
||||||
|
}
|
||||||
|
.pbe-preview-body :deep(.builder-links a) {
|
||||||
|
color: #7eb8ff;
|
||||||
|
}
|
||||||
|
.pbe-preview-body :deep(hr) {
|
||||||
|
border-color: rgba(255, 255, 255, 0.15) !important;
|
||||||
|
}
|
||||||
.adv-collapse {
|
.adv-collapse {
|
||||||
margin-top: 12px;
|
margin-top: 12px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import ElementPlus from 'element-plus'
|
|||||||
import 'element-plus/dist/index.css'
|
import 'element-plus/dist/index.css'
|
||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
import router from './router'
|
import router from './router'
|
||||||
import './utils/disable-debug'
|
|
||||||
|
|
||||||
const app = createApp(App)
|
const app = createApp(App)
|
||||||
app.use(ElementPlus)
|
app.use(ElementPlus)
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
/**
|
|
||||||
* 禁止调试模式及右键 - 全局安全模块
|
|
||||||
* 在页面加载时立即执行
|
|
||||||
*/
|
|
||||||
|
|
||||||
// 禁止右键
|
|
||||||
document.addEventListener('contextmenu', (e) => e.preventDefault())
|
|
||||||
|
|
||||||
// 禁止 F12、Ctrl+Shift+I/J/C 等开发者工具快捷键
|
|
||||||
document.addEventListener('keydown', (e) => {
|
|
||||||
if (
|
|
||||||
e.key === 'F12' ||
|
|
||||||
(e.ctrlKey && e.shiftKey && ['I', 'J', 'C'].includes(e.key.toUpperCase())) ||
|
|
||||||
(e.ctrlKey && e.key === 'U')
|
|
||||||
) {
|
|
||||||
e.preventDefault()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
<el-dialog
|
<el-dialog
|
||||||
v-model="dialogVisible"
|
v-model="dialogVisible"
|
||||||
:title="editId ? '编辑网页' : '新增网页'"
|
:title="editId ? '编辑网页' : '新增网页'"
|
||||||
:width="form.content_mode === 'builder' ? '1080px' : '720px'"
|
:width="form.content_mode === 'builder' || form.content_mode === 'html' ? '1080px' : '720px'"
|
||||||
top="4vh"
|
top="4vh"
|
||||||
@close="resetForm"
|
@close="resetForm"
|
||||||
>
|
>
|
||||||
@@ -63,7 +63,15 @@
|
|||||||
:closable="false"
|
:closable="false"
|
||||||
show-icon
|
show-icon
|
||||||
style="margin-bottom: 16px"
|
style="margin-bottom: 16px"
|
||||||
title="积木模式:从模块左侧 ⋮⋮ 手柄拖拽排序;链接可点「选择链接」选站内页或文件。"
|
title="积木模式:左侧编辑、右侧实时预览;⋮⋮ 可拖拽排序;链接可「选择链接」。"
|
||||||
|
/>
|
||||||
|
<el-alert
|
||||||
|
v-if="form.content_mode === 'html'"
|
||||||
|
type="info"
|
||||||
|
:closable="false"
|
||||||
|
show-icon
|
||||||
|
style="margin-bottom: 16px"
|
||||||
|
title="HTML 模式:左侧源码、右侧预览(沙箱内不执行脚本,与线上可能略有差异)。"
|
||||||
/>
|
/>
|
||||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
|
||||||
<el-form-item label="Slug" prop="slug">
|
<el-form-item label="Slug" prop="slug">
|
||||||
@@ -91,8 +99,21 @@
|
|||||||
<el-form-item label="发布到前台">
|
<el-form-item label="发布到前台">
|
||||||
<el-switch v-model="form.published" />
|
<el-switch v-model="form.published" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-if="form.content_mode === 'html'" label="内容" prop="content">
|
<el-form-item v-if="form.content_mode === 'html'" label="内容" prop="content" class="html-form-item">
|
||||||
<el-input v-model="form.content" type="textarea" :rows="14" placeholder="直接编写 HTML" />
|
<div class="html-split">
|
||||||
|
<div class="html-editor">
|
||||||
|
<el-input v-model="form.content" type="textarea" :rows="18" placeholder="直接编写 HTML" />
|
||||||
|
</div>
|
||||||
|
<div class="html-preview-wrap">
|
||||||
|
<div class="html-preview-title">实时预览</div>
|
||||||
|
<iframe
|
||||||
|
class="html-preview-iframe"
|
||||||
|
title="html-preview"
|
||||||
|
sandbox=""
|
||||||
|
:srcdoc="htmlPreviewSrcdoc"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-else label="页面积木" class="builder-form-item page-builder-wrap">
|
<el-form-item v-else label="页面积木" class="builder-form-item page-builder-wrap">
|
||||||
<PageBuilderEditor v-model="form.content" :site-id="siteId" />
|
<PageBuilderEditor v-model="form.content" :site-id="siteId" />
|
||||||
@@ -107,7 +128,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, reactive, onMounted, watch } from 'vue'
|
import { ref, reactive, computed, onMounted, watch } from 'vue'
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
import { getSites } from '../../api/admin'
|
import { getSites } from '../../api/admin'
|
||||||
import { getPages, createPage, updatePage, deletePage } from '../../api/admin'
|
import { getPages, createPage, updatePage, deletePage } from '../../api/admin'
|
||||||
@@ -215,6 +236,13 @@ const form = reactive({
|
|||||||
published: true
|
published: true
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/** HTML 预览 iframe(沙箱禁用脚本,避免编辑时执行恶意片段) */
|
||||||
|
const htmlPreviewSrcdoc = computed(() => {
|
||||||
|
const raw = form.content || ''
|
||||||
|
const body = raw.trim() ? raw : '<p style="color:#999">暂无内容</p>'
|
||||||
|
return `<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>body{font-family:system-ui,sans-serif;padding:12px;margin:0;background:#fff;color:#222;line-height:1.5;}</style></head><body>${body}</body></html>`
|
||||||
|
})
|
||||||
|
|
||||||
function insertBuilderTemplate() {
|
function insertBuilderTemplate() {
|
||||||
form.content_mode = 'builder'
|
form.content_mode = 'builder'
|
||||||
if (!form.content?.trim()) {
|
if (!form.content?.trim()) {
|
||||||
@@ -314,4 +342,43 @@ onMounted(() => {
|
|||||||
.page-builder-wrap {
|
.page-builder-wrap {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
.html-form-item :deep(.el-form-item__content) {
|
||||||
|
display: block;
|
||||||
|
margin-left: 0 !important;
|
||||||
|
}
|
||||||
|
.html-split {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.html-editor {
|
||||||
|
flex: 1 1 400px;
|
||||||
|
min-width: 280px;
|
||||||
|
}
|
||||||
|
.html-preview-wrap {
|
||||||
|
flex: 0 1 420px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 480px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
background: #fafafa;
|
||||||
|
}
|
||||||
|
.html-preview-title {
|
||||||
|
padding: 8px 12px;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 600;
|
||||||
|
border-bottom: 1px solid #ebeef5;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
.html-preview-iframe {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 360px;
|
||||||
|
height: 420px;
|
||||||
|
border: none;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,9 +1,19 @@
|
|||||||
|
import path from 'node:path'
|
||||||
|
import { fileURLToPath } from 'node:url'
|
||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from 'vite'
|
||||||
import vue from '@vitejs/plugin-vue'
|
import vue from '@vitejs/plugin-vue'
|
||||||
|
|
||||||
|
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [vue()],
|
plugins: [vue()],
|
||||||
base: '/admin/',
|
base: '/admin/',
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
// 与前台共用积木渲染,避免重复维护
|
||||||
|
'@yh-web': path.resolve(__dirname, '../web/src')
|
||||||
|
}
|
||||||
|
},
|
||||||
server: {
|
server: {
|
||||||
port: 3000,
|
port: 3000,
|
||||||
host: true,
|
host: true,
|
||||||
|
|||||||
@@ -1,16 +1,27 @@
|
|||||||
|
# 与 nginx/web.conf 保持同步;compose 挂载到 web 容器
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
index index.html;
|
index index.html;
|
||||||
|
|
||||||
# 根路径下的验证文件走热加载目录,替换文件即可生效
|
# 根路径下的验证文件走热加载目录
|
||||||
location ~ ^/([A-Za-z0-9._-]+\.(txt|html|xml))$ {
|
location ~ ^/([A-Za-z0-9._-]+\.(txt|html|xml))$ {
|
||||||
alias /verify-root/$1;
|
alias /verify-root/$1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 静态资源必须真实存在,避免错误回退成 index.html 导致白屏
|
||||||
|
location ^~ /assets/ {
|
||||||
|
try_files $uri =404;
|
||||||
|
access_log off;
|
||||||
|
expires 7d;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
location = / {
|
location = / {
|
||||||
try_files /index.html =404;
|
try_files /index.html =404;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Vue SPA:直接访问 /test 等路径须落到 index.html,否则会 nginx 404
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri/ /index.html;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
- 在 **网页管理** 中创建页面,设置 **前台路径**(`route_path` 或默认 `/{slug}`)、**发布**、**内容模式**。
|
- 在 **网页管理** 中创建页面,设置 **前台路径**(`route_path` 或默认 `/{slug}`)、**发布**、**内容模式**。
|
||||||
- **HTML**:`content` 为 HTML 字符串,前台用 `v-html` 渲染(仅信任后台内容)。
|
- **HTML**:`content` 为 HTML 字符串,前台用 `v-html` 渲染(仅信任后台内容)。
|
||||||
- **积木(builder)**:后台使用 **可视化编辑器**(添加模块、**按住左侧手柄拖拽**调整顺序、配置动画);链接可在弹窗中选择 **站内页面**、**可下载文件** 或 **自定义地址**。亦可展开「高级」直接改 JSON。
|
- **积木(builder)**:后台使用 **可视化编辑器**(添加模块、**按住左侧手柄拖拽**调整顺序、配置动画);编辑区右侧为 **实时预览**(与前台共用 `BlockRenderer`)。链接可在弹窗中选择 **站内页面**、**可下载文件** 或 **自定义地址**。亦可展开「高级」直接改 JSON。
|
||||||
|
- **HTML 模式**:网页管理弹窗内 **左侧源码、右侧 iframe 预览**(沙箱不执行脚本)。
|
||||||
- 存储仍为 JSON,结构如下,前台按模块渲染并支持入场动画。
|
- 存储仍为 JSON,结构如下,前台按模块渲染并支持入场动画。
|
||||||
|
|
||||||
## 动态路由
|
## 动态路由
|
||||||
|
|||||||
@@ -79,3 +79,4 @@ sudo systemctl start nginx
|
|||||||
- **原因**:提供静态文件的 `server` 未把「不存在的路径」交给 `index.html`,Nginx 在磁盘上找不到 `some-page` 文件就返回 404。
|
- **原因**:提供静态文件的 `server` 未把「不存在的路径」交给 `index.html`,Nginx 在磁盘上找不到 `some-page` 文件就返回 404。
|
||||||
- **要求**:托管 **web 前台** 的站点必须使用 **`try_files $uri $uri/ /index.html;`**(见仓库 `nginx/web.conf` 与 `web/Dockerfile` 内嵌配置)。若你自建 Nginx,请对照修改后再 `nginx -t` 并重载。
|
- **要求**:托管 **web 前台** 的站点必须使用 **`try_files $uri $uri/ /index.html;`**(见仓库 `nginx/web.conf` 与 `web/Dockerfile` 内嵌配置)。若你自建 Nginx,请对照修改后再 `nginx -t` 并重载。
|
||||||
- **应用内 404**:在 SPA 已正确回退的前提下,未在后台发布的路径会由前端路由进入 **「页面不存在」** 页(`NotFound.vue`),与上述 nginx 404 不同。
|
- **应用内 404**:在 SPA 已正确回退的前提下,未在后台发布的路径会由前端路由进入 **「页面不存在」** 页(`NotFound.vue`),与上述 nginx 404 不同。
|
||||||
|
- **Compose 部署**:`web` 容器实际加载的是 **`deploy/web/default.conf`**(见 `docker-compose.yml` 挂载)。若线上仍对 `/test` 等返回 **nginx 404**,请把仓库里最新的 `deploy/web/default.conf` 同步到服务器对应路径后,执行 `docker compose restart web`(或重建 `yh_web` 容器)。
|
||||||
|
|||||||
@@ -8,6 +8,13 @@ server {
|
|||||||
alias /verify-root/$1;
|
alias /verify-root/$1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
location ^~ /assets/ {
|
||||||
|
try_files $uri =404;
|
||||||
|
access_log off;
|
||||||
|
expires 7d;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
location = / {
|
location = / {
|
||||||
try_files /index.html =404;
|
try_files /index.html =404;
|
||||||
}
|
}
|
||||||
|
|||||||
186
server/middleware/admin_post_security.go
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/hex"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AdminPOSTSecurity 对 /api/admin 下 POST 校验时间戳、IP 频率、重复请求;multipart 上传仅做限流不做 body 去重
|
||||||
|
func AdminPOSTSecurity() gin.HandlerFunc {
|
||||||
|
ipLimit := getIntEnv("ADMIN_POST_IP_PER_MIN", 120)
|
||||||
|
dedupeSec := getIntEnv("ADMIN_DEDUPE_SEC", 3)
|
||||||
|
tsSkew := time.Duration(getIntEnv("ADMIN_REQUEST_TS_SKEW_SEC", 300)) * time.Second
|
||||||
|
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
if c.Request.Method != http.MethodPost {
|
||||||
|
c.Next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
tsStr := c.GetHeader("X-Request-Timestamp")
|
||||||
|
if tsStr == "" {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": "缺少请求头 X-Request-Timestamp(毫秒时间戳)"})
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tsMs, err := strconv.ParseInt(tsStr, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": "X-Request-Timestamp 格式无效"})
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
clientT := time.UnixMilli(tsMs)
|
||||||
|
if d := time.Since(clientT); d > tsSkew || d < -tsSkew {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": "请求时间戳无效或时钟偏差过大"})
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ip := c.ClientIP()
|
||||||
|
if !ipPostLimiter.allow("ip:"+ip, ipLimit, time.Minute) {
|
||||||
|
c.JSON(http.StatusTooManyRequests, gin.H{"error": "该 IP 请求过于频繁,请稍后再试"})
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ct := c.GetHeader("Content-Type")
|
||||||
|
if strings.Contains(strings.ToLower(ct), "multipart/form-data") {
|
||||||
|
c.Next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := io.ReadAll(c.Request.Body)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": "读取请求体失败"})
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Request.Body = io.NopCloser(bytes.NewReader(body))
|
||||||
|
|
||||||
|
sig := hashSig(c.FullPath(), c.Request.URL.RawQuery, body)
|
||||||
|
key := ip + "|" + sig
|
||||||
|
if !dedupeStore.try(key, time.Duration(dedupeSec)*time.Second) {
|
||||||
|
c.JSON(http.StatusTooManyRequests, gin.H{"error": "相同请求请勿在 3 秒内重复提交"})
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdminPOSTUserRateLimit 需在 AuthRequired 之后:按账号限制 POST 频率
|
||||||
|
func AdminPOSTUserRateLimit() gin.HandlerFunc {
|
||||||
|
userLimit := getIntEnv("ADMIN_POST_USER_PER_MIN", 80)
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
if c.Request.Method != http.MethodPost {
|
||||||
|
c.Next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
uid, ok := c.Get("user_id")
|
||||||
|
if !ok {
|
||||||
|
c.Next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
suid, _ := uid.(string)
|
||||||
|
if suid == "" {
|
||||||
|
c.Next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !ipPostLimiter.allow("uid:"+suid, userLimit, time.Minute) {
|
||||||
|
c.JSON(http.StatusTooManyRequests, gin.H{"error": "该账号请求过于频繁,请稍后再试"})
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func hashSig(path, query string, body []byte) string {
|
||||||
|
h := sha256.New()
|
||||||
|
h.Write([]byte(path))
|
||||||
|
h.Write([]byte{0})
|
||||||
|
h.Write([]byte(query))
|
||||||
|
h.Write([]byte{0})
|
||||||
|
h.Write(body)
|
||||||
|
return hex.EncodeToString(h.Sum(nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
type slidingLimiter struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
// key -> 时间戳列表(纳秒)
|
||||||
|
m map[string][]int64
|
||||||
|
}
|
||||||
|
|
||||||
|
var ipPostLimiter = &slidingLimiter{m: make(map[string][]int64)}
|
||||||
|
|
||||||
|
func (s *slidingLimiter) allow(key string, max int, window time.Duration) bool {
|
||||||
|
now := time.Now().UnixNano()
|
||||||
|
cutoff := now - window.Nanoseconds()
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
list := s.m[key]
|
||||||
|
out := list[:0]
|
||||||
|
for _, t := range list {
|
||||||
|
if t >= cutoff {
|
||||||
|
out = append(out, t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(out) >= max {
|
||||||
|
s.m[key] = out
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
out = append(out, now)
|
||||||
|
s.m[key] = out
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
type deduper struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
m map[string]int64 // key -> last unix nano
|
||||||
|
}
|
||||||
|
|
||||||
|
var dedupeStore = &deduper{m: make(map[string]int64)}
|
||||||
|
|
||||||
|
func (d *deduper) try(key string, minGap time.Duration) bool {
|
||||||
|
now := time.Now().UnixNano()
|
||||||
|
gap := minGap.Nanoseconds()
|
||||||
|
d.mu.Lock()
|
||||||
|
defer d.mu.Unlock()
|
||||||
|
if last, ok := d.m[key]; ok && now-last < gap {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
d.m[key] = now
|
||||||
|
if len(d.m) > 10000 {
|
||||||
|
// 简单清理过期项
|
||||||
|
cutoff := now - gap*10
|
||||||
|
for k, v := range d.m {
|
||||||
|
if v < cutoff {
|
||||||
|
delete(d.m, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func getIntEnv(key string, def int) int {
|
||||||
|
s := strings.TrimSpace(os.Getenv(key))
|
||||||
|
if s == "" {
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
n, err := strconv.Atoi(s)
|
||||||
|
if err != nil {
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
@@ -22,10 +22,15 @@ RUN printf '%s\n' \
|
|||||||
' alias /verify-root/$1;' \
|
' alias /verify-root/$1;' \
|
||||||
' }' \
|
' }' \
|
||||||
'' \
|
'' \
|
||||||
|
' location ^~ /assets/ {' \
|
||||||
|
' try_files $uri =404;' \
|
||||||
|
' expires 7d;' \
|
||||||
|
' add_header Cache-Control "public, immutable";' \
|
||||||
|
' }' \
|
||||||
|
'' \
|
||||||
' location = / {' \
|
' location = / {' \
|
||||||
' try_files /index.html =404;' \
|
' try_files /index.html =404;' \
|
||||||
' }' \
|
' }' \
|
||||||
' # SPA: 避免直接访问 /path 时 nginx 404' \
|
|
||||||
' location / {' \
|
' location / {' \
|
||||||
' try_files $uri $uri/ /index.html;' \
|
' try_files $uri $uri/ /index.html;' \
|
||||||
' }' \
|
' }' \
|
||||||
|
|||||||
22
web/promotion/README.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# 推广素材(首页与视频源)
|
||||||
|
|
||||||
|
- `index.html`:静态完整落地页参考;线上 Vue 首页已与之对齐,素材路径以本目录为准。
|
||||||
|
- `视频发布/`:产品视频与封面,首页「产品视频」区块使用下列相对路径(经 `promotionUrl` 转为 URL):
|
||||||
|
- `/promotion/视频发布/...`
|
||||||
|
- `social/`:**关注我们** 统一资源包(建议只用此目录上线),首页读取:
|
||||||
|
- `social/xiaohongshu.png`、`social/douyin.png`、`social/wechat-official.png`、`social/wechat-channels.jpg`
|
||||||
|
- 源文件可从根目录 `小红书.png`、`抖音.png`、`公众号.png`、`视频号.jpg` 同步复制进来(ASCII 文件名利于网关与日志)。
|
||||||
|
- `宇恒一号宣传册.pptx`:宣传册文案结构来源;SPA 中对应路由为 `/brochure/:topic`。
|
||||||
|
|
||||||
|
## 生产部署
|
||||||
|
|
||||||
|
1. **前端构建产物**(`dist/`)不包含本目录。部署时请把本文件夹 **完整复制** 到站点根下,与 `index.html` 同级,目录名为 `promotion`(即能通过 `https://你的域名/promotion/视频发布/...` 访问视频)。
|
||||||
|
2. 或使用 Nginx:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
location /promotion/ {
|
||||||
|
alias /path/to/yh_web/web/promotion/;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 开发环境:`npm run dev` 时已通过 Vite 中间件将 `/promotion` 映射到本目录,无需再拷贝。
|
||||||
BIN
web/promotion/_pptx.zip
Normal file
2
web/promotion/_pptx_extract/[Content_Types].xml
Normal file
2
web/promotion/_pptx_extract/_rels/.rels
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="ppt/presentation.xml"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties" Target="docProps/custom.xml"/></Relationships>
|
||||||
2
web/promotion/_pptx_extract/docProps/app.xml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><TotalTime>0</TotalTime><Words>3847</Words><Application>WPS 演示</Application><PresentationFormat></PresentationFormat><Paragraphs>383</Paragraphs><Slides>23</Slides><Notes>0</Notes><HiddenSlides>0</HiddenSlides><MMClips>0</MMClips><ScaleCrop>false</ScaleCrop><HeadingPairs><vt:vector size="6" baseType="variant"><vt:variant><vt:lpstr>已用的字体</vt:lpstr></vt:variant><vt:variant><vt:i4>8</vt:i4></vt:variant><vt:variant><vt:lpstr>主题</vt:lpstr></vt:variant><vt:variant><vt:i4>2</vt:i4></vt:variant><vt:variant><vt:lpstr>幻灯片标题</vt:lpstr></vt:variant><vt:variant><vt:i4>23</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size="33" baseType="lpstr"><vt:lpstr>Arial</vt:lpstr><vt:lpstr>宋体</vt:lpstr><vt:lpstr>Wingdings</vt:lpstr><vt:lpstr>Arial</vt:lpstr><vt:lpstr>Noto Sans SC</vt:lpstr><vt:lpstr>微软雅黑</vt:lpstr><vt:lpstr>Arial Unicode MS</vt:lpstr><vt:lpstr>Wingdings</vt:lpstr><vt:lpstr>Office 主题</vt:lpstr><vt:lpstr>默认主题</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr><vt:lpstr>PowerPoint 演示文稿</vt:lpstr></vt:vector></TitlesOfParts><LinksUpToDate>false</LinksUpToDate><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>14.0000</AppVersion></Properties>
|
||||||
2
web/promotion/_pptx_extract/docProps/core.xml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title></dc:title><dc:creator></dc:creator><cp:lastModifiedBy>光怪陆离</cp:lastModifiedBy><cp:revision>17</cp:revision><dcterms:created xsi:type="dcterms:W3CDTF">2026-03-20T02:18:00Z</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">2026-03-20T06:29:51Z</dcterms:modified></cp:coreProperties>
|
||||||
2
web/promotion/_pptx_extract/docProps/custom.xml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="ICV"><vt:lpwstr>CA1AE6ACDBFB44F4BB5DD209422E5CC0_13</vt:lpwstr></property><property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="3" name="KSOProductBuildVer"><vt:lpwstr>2052-12.1.0.24657</vt:lpwstr></property></Properties>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId9" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide5.xml"/><Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide4.xml"/><Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide3.xml"/><Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide2.xml"/><Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster" Target="notesMasters/notesMaster1.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide1.xml"/><Relationship Id="rId30" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableStyles" Target="tableStyles.xml"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" Target="slideMasters/slideMaster2.xml"/><Relationship Id="rId29" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/viewProps" Target="viewProps.xml"/><Relationship Id="rId28" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/presProps" Target="presProps.xml"/><Relationship Id="rId27" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide23.xml"/><Relationship Id="rId26" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide22.xml"/><Relationship Id="rId25" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide21.xml"/><Relationship Id="rId24" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide20.xml"/><Relationship Id="rId23" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide19.xml"/><Relationship Id="rId22" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide18.xml"/><Relationship Id="rId21" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide17.xml"/><Relationship Id="rId20" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide16.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId19" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide15.xml"/><Relationship Id="rId18" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide14.xml"/><Relationship Id="rId17" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide13.xml"/><Relationship Id="rId16" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide12.xml"/><Relationship Id="rId15" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide11.xml"/><Relationship Id="rId14" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide10.xml"/><Relationship Id="rId13" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide9.xml"/><Relationship Id="rId12" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide8.xml"/><Relationship Id="rId11" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide7.xml"/><Relationship Id="rId10" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide6.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" Target="slideMasters/slideMaster1.xml"/></Relationships>
|
||||||
BIN
web/promotion/_pptx_extract/ppt/media/image1.jpeg
Normal file
|
After Width: | Height: | Size: 532 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image10.jpeg
Normal file
|
After Width: | Height: | Size: 512 KiB |
3
web/promotion/_pptx_extract/ppt/media/image100.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M6 8.25564L24.0086 3L42 8.25564V19.0337C42 30.3622 34.7502 40.4194 24.0026 44.0005C13.2521 40.4195 6 30.36 6 19.0287V8.25564Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 593 B |
BIN
web/promotion/_pptx_extract/ppt/media/image101.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
6
web/promotion/_pptx_extract/ppt/media/image102.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<circle stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" r="7" cx="24" cy="11" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M4 41C4 32.1634 12.0589 25 22 25" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<rect stroke-linecap="round" x="27" y="31" fill-opacity="1.0" fill="#64FFDA" width="14" stroke-linejoin="round" height="10" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M37 31V28C37 26.3431 35.6569 25 34 25C32.3431 25 31 26.3431 31 28V31" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 964 B |
BIN
web/promotion/_pptx_extract/ppt/media/image103.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
5
web/promotion/_pptx_extract/ppt/media/image104.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M24 44C35.0457 44 44 35.0457 44 24C44 12.9543 35.0457 4 24 4C12.9543 4 4 12.9543 4 24C4 35.0457 12.9543 44 24 44Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M33.5424 27C32.2681 31.0571 28.4778 34 24.0002 34C19.5226 34 15.7323 31.0571 14.458 27V33" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
<path d="M33.5424 15V21C32.2681 16.9429 28.4778 14 24.0002 14C19.5226 14 15.7323 16.9429 14.458 21" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 970 B |
BIN
web/promotion/_pptx_extract/ppt/media/image105.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
4
web/promotion/_pptx_extract/ppt/media/image106.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M24 44C35.0457 44 44 35.0457 44 24C44 12.9543 35.0457 4 24 4C12.9543 4 4 12.9543 4 24C4 35.0457 12.9543 44 24 44Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M24.0084 12.0001L24.0072 24.0089L32.4866 32.4883" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 723 B |
BIN
web/promotion/_pptx_extract/ppt/media/image107.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
4
web/promotion/_pptx_extract/ppt/media/image108.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<circle stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" r="8" cx="24" cy="12" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M42 44C42 34.0589 33.9411 26 24 26C14.0589 26 6 34.0589 6 44" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 666 B |
BIN
web/promotion/_pptx_extract/ppt/media/image109.png
Normal file
|
After Width: | Height: | Size: 792 B |
BIN
web/promotion/_pptx_extract/ppt/media/image11.png
Normal file
|
After Width: | Height: | Size: 536 B |
5
web/promotion/_pptx_extract/ppt/media/image110.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path d="M21 13L11 20L11 44" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" fill-rule="evenodd" stroke-linejoin="round" d="M21 4L31 11V24L38 29V44H21V4Z" stroke="#64FFDA" clip-rule="evenodd" stroke-width="2.0"/>
|
||||||
|
<path d="M4 44H44" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 778 B |
BIN
web/promotion/_pptx_extract/ppt/media/image111.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image112.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
7
web/promotion/_pptx_extract/ppt/media/image113.svg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" d="M36 32C40.4183 32 44 28.4183 44 24C44 19.5817 40.4183 16 36 16" fill-opacity="1.0"/>
|
||||||
|
<path d="M36 32V32C40.4183 32 44 28.4183 44 24C44 19.5817 40.4183 16 36 16" stroke-width="2.0" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path fill="#64FFDA" d="M12 16C7.58172 16 4 19.5817 4 24C4 28.4183 7.58172 32 12 32" fill-opacity="1.0"/>
|
||||||
|
<path d="M12 16C7.58172 16 4 19.5817 4 24C4 28.4183 7.58172 32 12 32V32" stroke-width="2.0" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M12 32V31.5V29V24V16C12 9.37258 17.3726 4 24 4C30.6274 4 36 9.37258 36 16V32C36 38.6274 30.6274 44 24 44" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image114.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
6
web/promotion/_pptx_extract/ppt/media/image115.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path d="M37.8261 4C41.6276 7.58886 44 12.6753 44 18.3158C44 29.1871 35.1871 38 24.3158 38C18.6753 38 13.5889 35.6276 10 31.8261" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" fill-rule="evenodd" stroke-linejoin="round" d="M24 32C31.732 32 38 25.732 38 18C38 10.268 31.732 4 24 4C16.268 4 10 10.268 10 18C10 25.732 16.268 32 24 32Z" stroke="#64FFDA" clip-rule="evenodd" stroke-width="2.0"/>
|
||||||
|
<path d="M24 38V44" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M18 44H30" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image116.png
Normal file
|
After Width: | Height: | Size: 784 B |
6
web/promotion/_pptx_extract/ppt/media/image117.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M4 39H44V24V9H24H4V24V39Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M4 9L24 24L44 9" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
<path d="M24 9H4V24" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M44 24V9H24" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 815 B |
5
web/promotion/_pptx_extract/ppt/media/image12.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path d="M8 44H12H16" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M12 44V4" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M40 6H12V22H40L36 14L40 6Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 728 B |
BIN
web/promotion/_pptx_extract/ppt/media/image13.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
5
web/promotion/_pptx_extract/ppt/media/image14.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path d="M19.036 44.0002C18.0561 40.8046 16.5778 38.4223 14.6011 36.8533C11.636 34.4998 6.92483 35.9625 5.18458 33.535C3.44433 31.1074 6.40382 26.6432 7.44234 24.0091C8.48086 21.3751 3.46179 20.4437 4.04776 19.6959C4.43842 19.1974 6.97471 17.7588 11.6567 15.3802C12.987 7.79356 17.9008 4.00024 26.3982 4.00024C39.1441 4.00024 44 14.8062 44 21.6791C44 28.5521 38.1201 35.9564 29.7441 37.5529C28.9951 38.6437 30.0754 40.7928 32.9848 44.0002" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path fill-opacity="1.0" fill="#64FFDA" fill-rule="evenodd" stroke-linejoin="round" d="M19.4997 14.5001C18.8464 17.0344 19.0408 18.8139 20.0829 19.8386C21.125 20.8634 22.9011 21.5335 25.4112 21.849C24.8417 25.1177 25.5361 26.6512 27.4942 26.4494C29.4524 26.2476 30.6289 25.434 31.0239 24.0084C34.0842 24.8685 35.7428 24.1487 35.9997 21.849C36.3852 18.3994 34.525 15.6476 33.7624 15.6476C32.9997 15.6476 31.0239 15.5548 31.0239 14.5001C31.0239 13.4453 28.7159 12.8494 26.6329 12.8494C24.5499 12.8494 25.8035 11.4453 22.9432 12.0001C21.0363 12.3699 19.8885 13.2032 19.4997 14.5001Z" stroke="#64FFDA" clip-rule="evenodd" stroke-width="2.0"/>
|
||||||
|
<path d="M30.5002 25.5002C29.4833 26.1313 28.0878 27.1805 27.5002 28.0002C26.0313 30.0497 24.8398 31.2976 24.5791 32.6083" stroke-width="2.0" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image15.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
3
web/promotion/_pptx_extract/ppt/media/image16.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M24 44C32.2347 44 38.9998 37.4742 38.9998 29.0981C38.9998 27.0418 38.8953 24.8375 37.7555 21.4116C36.6157 17.9858 36.3861 17.5436 35.1809 15.4279C34.666 19.7454 31.911 21.5448 31.2111 22.0826C31.2111 21.5231 29.5445 15.3359 27.0176 11.6339C24.537 8 21.1634 5.61592 19.1853 4C19.1853 7.06977 18.3219 11.6339 17.0854 13.9594C15.8489 16.2849 15.6167 16.3696 14.0722 18.1002C12.5278 19.8308 11.8189 20.3653 10.5274 22.4651C9.23596 24.565 9 27.3618 9 29.4181C9 37.7942 15.7653 44 24 44Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 949 B |
BIN
web/promotion/_pptx_extract/ppt/media/image17.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
8
web/promotion/_pptx_extract/ppt/media/image18.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M23.8887 39.8887C32.7287 39.8887 39.8887 32.7287 39.8887 23.8887C39.8887 15.0487 32.7287 7.88867 23.8887 7.88867C15.0487 7.88867 7.88867 15.0487 7.88867 23.8887C7.88867 32.7287 15.0487 39.8887 23.8887 39.8887Z" stroke="#64FFDA" stroke-width="2.0" stroke-miterlimit="2"/>
|
||||||
|
<path fill-opacity="1.0" fill="white" stroke-linejoin="round" d="M23.8887 31.8887C28.3087 31.8887 31.8887 28.3087 31.8887 23.8887C31.8887 19.4687 28.3087 15.8887 23.8887 15.8887C19.4687 15.8887 15.8887 19.4687 15.8887 23.8887C15.8887 28.3087 19.4687 31.8887 23.8887 31.8887Z" stroke="white" stroke-width="2.0" stroke-miterlimit="2"/>
|
||||||
|
<path fill="#64FFDA" d="M23.8887 25.8887C24.9887 25.8887 25.8887 24.9887 25.8887 23.8887C25.8887 22.7887 24.9887 21.8887 23.8887 21.8887C22.7887 21.8887 21.8887 22.7887 21.8887 23.8887C21.8887 24.9887 22.7887 25.8887 23.8887 25.8887Z" fill-opacity="1.0"/>
|
||||||
|
<path stroke-miterlimit="2" d="M23.8887 7.88867V3.88867" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-miterlimit="2" d="M37.8887 43.8887L33.8887 36.8887" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-miterlimit="2" d="M13.8887 36.8887L9.88867 43.8887" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image19.png
Normal file
|
After Width: | Height: | Size: 888 B |
BIN
web/promotion/_pptx_extract/ppt/media/image2.png
Normal file
|
After Width: | Height: | Size: 7.2 MiB |
4
web/promotion/_pptx_extract/ppt/media/image20.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M24 20C27.866 20 31 16.866 31 13C31 9.13401 27.866 6 24 6C20.134 6 17 9.13401 17 13C17 16.866 20.134 20 24 20Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M6 40.8V42H42V40.8C42 36.3196 42 34.0794 41.1281 32.3681C40.3611 30.8628 39.1372 29.6389 37.6319 28.8719C35.9206 28 33.6804 28 29.2 28H18.8C14.3196 28 12.0794 28 10.3681 28.8719C8.86278 29.6389 7.63893 30.8628 6.87195 32.3681C6 34.0794 6 36.3196 6 40.8Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 984 B |
BIN
web/promotion/_pptx_extract/ppt/media/image21.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
4
web/promotion/_pptx_extract/ppt/media/image22.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M36.686 15.171C37.9364 16.9643 38.8163 19.0352 39.2147 21.2727H44V26.7273H39.2147C38.8163 28.9648 37.9364 31.0357 36.686 32.829L40.0706 36.2137L36.2137 40.0706L32.829 36.686C31.0357 37.9364 28.9648 38.8163 26.7273 39.2147V44H21.2727V39.2147C19.0352 38.8163 16.9643 37.9364 15.171 36.686L11.7863 40.0706L7.92939 36.2137L11.314 32.829C10.0636 31.0357 9.18372 28.9648 8.78533 26.7273H4V21.2727H8.78533C9.18372 19.0352 10.0636 16.9643 11.314 15.171L7.92939 11.7863L11.7863 7.92939L15.171 11.314C16.9643 10.0636 19.0352 9.18372 21.2727 8.78533V4H26.7273V8.78533C28.9648 9.18372 31.0357 10.0636 32.829 11.314L36.2137 7.92939L40.0706 11.7863L36.686 15.171Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path fill="white" fill-opacity="1.0" stroke-width="2.0" d="M24 29C26.7614 29 29 26.7614 29 24C29 21.2386 26.7614 19 24 19C21.2386 19 19 21.2386 19 24C19 26.7614 21.2386 29 24 29Z" stroke-linejoin="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image23.png
Normal file
|
After Width: | Height: | Size: 452 B |
6
web/promotion/_pptx_extract/ppt/media/image24.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M18 6H8C6.89543 6 6 6.89543 6 8V18C6 19.1046 6.89543 20 8 20H18C19.1046 20 20 19.1046 20 18V8C20 6.89543 19.1046 6 18 6Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M18 28H8C6.89543 28 6 28.8954 6 30V40C6 41.1046 6.89543 42 8 42H18C19.1046 42 20 41.1046 20 40V30C20 28.8954 19.1046 28 18 28Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M40 6H30C28.8954 6 28 6.89543 28 8V18C28 19.1046 28.8954 20 30 20H40C41.1046 20 42 19.1046 42 18V8C42 6.89543 41.1046 6 40 6Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M40 28H30C28.8954 28 28 28.8954 28 30V40C28 41.1046 28.8954 42 30 42H40C41.1046 42 42 41.1046 42 40V30C42 28.8954 41.1046 28 40 28Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image25.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
9
web/promotion/_pptx_extract/ppt/media/image26.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path d="M34 12V20V21C31.0449 21 28.3892 22.2818 26.5585 24.3198C24.9678 26.0906 24 28.4323 24 31C24 31.5789 24.0492 32.1463 24.1436 32.6983C24.6579 35.7046 26.5143 38.2529 29.0741 39.7046C26.4116 40.5096 22.8776 41 19 41C10.7157 41 4 38.7614 4 36V28V20V12" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M34 12C34 14.7614 27.2843 17 19 17C10.7157 17 4 14.7614 4 12C4 9.23858 10.7157 7 19 7C27.2843 7 34 9.23858 34 12Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M4 28C4 30.7614 10.7157 33 19 33C20.807 33 22.5393 32.8935 24.1436 32.6983" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M4 20C4 22.7614 10.7157 25 19 25C21.7563 25 24.339 24.7522 26.5585 24.3198" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M44 31C44 36.5228 39.5228 41 34 41C32.2091 41 30.5281 40.5292 29.0741 39.7046C26.5143 38.2529 24.6579 35.7046 24.1436 32.6983C24.0492 32.1463 24 31.5789 24 31C24 28.4323 24.9678 26.0906 26.5585 24.3198C28.3892 22.2818 31.0449 21 34 21C39.5228 21 44 25.4772 44 31Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M37 29L39 31L37 33" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
<path d="M31 33L29 31L31 29" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.9 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image27.png
Normal file
|
After Width: | Height: | Size: 642 B |
8
web/promotion/_pptx_extract/ppt/media/image28.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path d="M24 33V15" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<rect stroke-linecap="round" x="10" y="9" fill-opacity="1.0" fill="#64FFDA" width="28" stroke-linejoin="round" height="6" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M8 32L14 25H33.9743L40 32" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<rect stroke-linecap="round" x="4" y="33" fill-opacity="1.0" fill="#64FFDA" width="8" stroke-linejoin="round" height="8" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<rect stroke-linecap="round" x="20" y="33" fill-opacity="1.0" fill="#64FFDA" width="8" stroke-linejoin="round" height="8" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<rect stroke-linecap="round" x="36" y="33" fill-opacity="1.0" fill="#64FFDA" width="8" stroke-linejoin="round" height="8" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image29.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image3.jpeg
Normal file
|
After Width: | Height: | Size: 407 KiB |
8
web/promotion/_pptx_extract/ppt/media/image30.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M24 20C27.866 20 31 16.866 31 13C31 9.13401 27.866 6 24 6C20.134 6 17 9.13401 17 13C17 16.866 20.134 20 24 20Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M12 7.25488C10.1865 8.51983 9 10.6214 9 13.0002C9 15.5465 10.3596 17.7753 12.3924 19.0002" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M36 7.25488C37.8135 8.51983 39 10.6214 39 13.0002C39 15.3789 37.8135 17.4806 36 18.7455" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M12 40V42H36V40C36 36.2725 36 34.4087 35.391 32.9385C34.5791 30.9783 33.0217 29.4209 31.0615 28.609C29.5913 28 27.7275 28 24 28C20.2725 28 18.4087 28 16.9385 28.609C14.9783 29.4209 13.4209 30.9783 12.609 32.9385C12 34.4087 12 36.2725 12 40Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M43.9999 42.0001V40.8001C43.9999 36.3197 43.9999 34.0795 43.128 32.3682C42.361 30.8629 41.1371 29.6391 39.6318 28.8721" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M4.00009 42.0001V40.8001C4.00009 36.3197 4.00009 34.0795 4.87204 32.3682C5.63902 30.8629 6.86287 29.6391 8.36816 28.8721" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image31.jpeg
Normal file
|
After Width: | Height: | Size: 246 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image32.jpeg
Normal file
|
After Width: | Height: | Size: 271 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image33.png
Normal file
|
After Width: | Height: | Size: 438 B |
3
web/promotion/_pptx_extract/ppt/media/image34.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M20 12L32 24L20 36V12Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 490 B |
BIN
web/promotion/_pptx_extract/ppt/media/image35.jpeg
Normal file
|
After Width: | Height: | Size: 338 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image36.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
3
web/promotion/_pptx_extract/ppt/media/image37.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M19 4H37L26 18H41L17 44L22 25H8L19 4Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 505 B |
BIN
web/promotion/_pptx_extract/ppt/media/image38.png
Normal file
|
After Width: | Height: | Size: 862 B |
5
web/promotion/_pptx_extract/ppt/media/image39.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M5 8C5 6.89543 5.89543 6 7 6H19L24 12H41C42.1046 12 43 12.8954 43 14V40C43 41.1046 42.1046 42 41 42H7C5.89543 42 5 41.1046 5 40V8Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<circle fill-opacity="1.0" fill="white" r="6" cx="22" cy="26" stroke="white" stroke-width="2.0"/>
|
||||||
|
<path d="M27 30L32 34" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 802 B |
BIN
web/promotion/_pptx_extract/ppt/media/image4.png
Normal file
|
After Width: | Height: | Size: 483 B |
BIN
web/promotion/_pptx_extract/ppt/media/image40.png
Normal file
|
After Width: | Height: | Size: 637 B |
6
web/promotion/_pptx_extract/ppt/media/image41.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M10 44H38C39.1046 44 40 43.1046 40 42V14H30V4H10C8.89543 4 8 4.89543 8 6V42C8 43.1046 8.89543 44 10 44Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M30 4L40 14" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M24 22V36" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
<path d="M18 22H24L30 22" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 913 B |
BIN
web/promotion/_pptx_extract/ppt/media/image42.png
Normal file
|
After Width: | Height: | Size: 691 B |
5
web/promotion/_pptx_extract/ppt/media/image43.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M10 44H38C39.1046 44 40 43.1046 40 42V14H30V4H10C8.89543 4 8 4.89543 8 6V42C8 43.1046 8.89543 44 10 44Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M30 4L40 14" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="white" stroke-linejoin="round" d="M21 35L31 25L27 21L17 31V35H21Z" stroke="white" stroke-width="2.0"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 858 B |
BIN
web/promotion/_pptx_extract/ppt/media/image44.png
Normal file
|
After Width: | Height: | Size: 590 B |
5
web/promotion/_pptx_extract/ppt/media/image45.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M10 44H38C39.1046 44 40 43.1046 40 42V14H30V4H10C8.89543 4 8 4.89543 8 6V42C8 43.1046 8.89543 44 10 44Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M30 4L40 14" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M17 28H24L31 28" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 810 B |
BIN
web/promotion/_pptx_extract/ppt/media/image46.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
5
web/promotion/_pptx_extract/ppt/media/image47.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path d="M39 6H9C7.34315 6 6 7.34315 6 9V39C6 40.6569 7.34315 42 9 42H39C40.6569 42 42 40.6569 42 39V9C42 7.34315 40.6569 6 39 6Z" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M18 23C20.7614 23 23 20.7614 23 18C23 15.2386 20.7614 13 18 13C15.2386 13 13 15.2386 13 18C13 20.7614 15.2386 23 18 23Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M27.7901 26.2194C28.6064 25.1269 30.2528 25.1538 31.0329 26.2725L39.8077 38.8561C40.7322 40.182 39.7835 42.0001 38.1671 42.0001H16L27.7901 26.2194Z" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image48.png
Normal file
|
After Width: | Height: | Size: 818 B |
4
web/promotion/_pptx_extract/ppt/media/image49.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M10 4H30L40 14V42C40 43.1046 39.1046 44 38 44H10C8.89543 44 8 43.1046 8 42V6C8 4.89543 8.89543 4 10 4Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M16.0083 20L19.0083 34L24.0083 24L29.0083 34L32.0083 20" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 719 B |
11
web/promotion/_pptx_extract/ppt/media/image5.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<rect x="12" y="6" fill-opacity="1.0" fill="#64FFDA" width="24" rx="2" height="36" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M12 12H6" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M12 20H6" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M12 28H6" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M12 36H6" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M42 12H36" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M42 20H36" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M42 28H36" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M42 36H36" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image50.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
9
web/promotion/_pptx_extract/ppt/media/image51.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#40FFDA" fill-opacity="1.0" stroke-width="2.0" d="M44 29H4V42H44V29Z" stroke-linejoin="round" stroke="#40FFDA"/>
|
||||||
|
<path fill="white" d="M35.5 38C36.8807 38 38 36.8807 38 35.5C38 34.1193 36.8807 33 35.5 33C34.1193 33 33 34.1193 33 35.5C33 36.8807 34.1193 38 35.5 38Z" fill-opacity="1.0"/>
|
||||||
|
<path d="M4 28.9998L9.03837 4.99902H39.0205L44 28.9998" stroke-width="2.0" stroke-linejoin="round" stroke="#40FFDA"/>
|
||||||
|
<path d="M19.006 16.0259C16.8635 16.0259 15 17.5124 15 19.5128C15 21.9998 17.0947 22.9998 19.6973 22.9998C20.1437 22.9998 20.5567 22.9998 20.9768 22.9998" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#40FFDA"/>
|
||||||
|
<path d="M29.007 16.0259C31.1039 16.0259 33 16.9994 33 19.5128C33 21.9998 30.8902 22.9998 28.2877 22.9998C27.8412 22.9998 27.4013 22.9998 26.9871 22.9998" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#40FFDA"/>
|
||||||
|
<path d="M29.0069 16.0261C29.0069 13.0423 27.0231 11 23.9998 11C20.9766 11 19.0059 12.9927 19.0059 16.0261" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#40FFDA"/>
|
||||||
|
<path stroke-width="2.0" d="M20 23H28" stroke="#40FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image52.png
Normal file
|
After Width: | Height: | Size: 440 B |
6
web/promotion/_pptx_extract/ppt/media/image53.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#40FFDA" fill-opacity="1.0" stroke-width="2.0" d="M18 6H8C6.89543 6 6 6.89543 6 8V18C6 19.1046 6.89543 20 8 20H18C19.1046 20 20 19.1046 20 18V8C20 6.89543 19.1046 6 18 6Z" stroke-linejoin="round" stroke="#40FFDA"/>
|
||||||
|
<path fill="#40FFDA" fill-opacity="1.0" stroke-width="2.0" d="M18 28H8C6.89543 28 6 28.8954 6 30V40C6 41.1046 6.89543 42 8 42H18C19.1046 42 20 41.1046 20 40V30C20 28.8954 19.1046 28 18 28Z" stroke-linejoin="round" stroke="#40FFDA"/>
|
||||||
|
<path fill="#40FFDA" fill-opacity="1.0" stroke-width="2.0" d="M40 6H30C28.8954 6 28 6.89543 28 8V18C28 19.1046 28.8954 20 30 20H40C41.1046 20 42 19.1046 42 18V8C42 6.89543 41.1046 6 40 6Z" stroke-linejoin="round" stroke="#40FFDA"/>
|
||||||
|
<path fill="#40FFDA" fill-opacity="1.0" stroke-width="2.0" d="M40 28H30C28.8954 28 28 28.8954 28 30V40C28 41.1046 28.8954 42 30 42H40C41.1046 42 42 41.1046 42 40V30C42 28.8954 41.1046 28 40 28Z" stroke-linejoin="round" stroke="#40FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image54.png
Normal file
|
After Width: | Height: | Size: 268 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image55.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
6
web/promotion/_pptx_extract/ppt/media/image56.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M44.0001 24C44.0001 35.0457 35.0458 44 24.0001 44C18.0266 44 4.00006 44 4.00006 44C4.00006 44 4.00006 29.0722 4.00006 24C4.00006 12.9543 12.9544 4 24.0001 4C35.0458 4 44.0001 12.9543 44.0001 24Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M14 18L32 18" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
<path d="M14 26H32" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
<path d="M14 34H24" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 997 B |
BIN
web/promotion/_pptx_extract/ppt/media/image57.png
Normal file
|
After Width: | Height: | Size: 284 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image58.png
Normal file
|
After Width: | Height: | Size: 815 B |
4
web/promotion/_pptx_extract/ppt/media/image59.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path fill="#64FFDA" fill-opacity="1.0" stroke-width="2.0" d="M5.32497 43.4996L13.81 43.4998L44.9227 12.3871L36.4374 3.90186L5.32471 35.0146L5.32497 43.4996Z" stroke-linejoin="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M27.9521 12.3872L36.4374 20.8725" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 691 B |
BIN
web/promotion/_pptx_extract/ppt/media/image6.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image60.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
4
web/promotion/_pptx_extract/ppt/media/image61.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M44 24C44 35.0457 35.0457 44 24 44C18.0265 44 4 44 4 44C4 44 4 29.0722 4 24C4 12.9543 12.9543 4 24 4C35.0457 4 44 12.9543 44 24Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M13.9999 26L20 32L33 19" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 736 B |
BIN
web/promotion/_pptx_extract/ppt/media/image62.png
Normal file
|
After Width: | Height: | Size: 242 KiB |
BIN
web/promotion/_pptx_extract/ppt/media/image63.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
5
web/promotion/_pptx_extract/ppt/media/image64.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<path stroke-linecap="round" fill-opacity="1.0" fill="#64FFDA" stroke-linejoin="round" d="M40 20C40 26.8077 35.7484 32.6224 29.7555 34.9336H24H18.2445C12.2516 32.6224 8 26.8077 8 20C8 11.1634 15.1634 4 24 4C32.8366 4 40 11.1634 40 20Z" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M29.7557 34.9336L29.0766 43.0831C29.0334 43.6014 28.6001 44 28.08 44H19.9203C19.4002 44 18.9669 43.6014 18.9238 43.0831L18.2446 34.9336" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<path d="M18 17V23L24 20L30 23V17" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="round" stroke="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 984 B |
BIN
web/promotion/_pptx_extract/ppt/media/image65.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
6
web/promotion/_pptx_extract/ppt/media/image66.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" style="stroke-opacity: 1.0;" version="1.0" width="48" fill="none" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48" height="48" opacity="1.0">
|
||||||
|
<rect x="6" y="28" width="36" rx="4" height="14" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<path d="M20 7H10C7.79086 7 6 8.79086 6 11V17C6 19.2091 7.79086 21 10 21H20" stroke-width="2.0" stroke-linecap="round" stroke="#64FFDA"/>
|
||||||
|
<circle fill-opacity="1.0" fill="#64FFDA" r="8" cx="34" cy="14" stroke="#64FFDA" stroke-width="2.0"/>
|
||||||
|
<circle fill="white" fill-opacity="1.0" r="3" cx="34" cy="14"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 752 B |