diff --git a/wallitor-core/wallitor-core.sln b/wallitor-core/wallitor-core.sln index eea2d07..4497a46 100644 --- a/wallitor-core/wallitor-core.sln +++ b/wallitor-core/wallitor-core.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.9.34622.214 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wallitor-core", "wallitor-core.vcxproj", "{36591862-6F9C-4A1D-BBAD-4B1CBB1EC24B}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wallitor-cmd", "..\wallitor-cmd\wallitor-cmd.vcxproj", "{5675A6E4-1AEF-4AA3-A366-0D975C311AAF}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -23,14 +21,6 @@ Global {36591862-6F9C-4A1D-BBAD-4B1CBB1EC24B}.Release|x64.Build.0 = Release|x64 {36591862-6F9C-4A1D-BBAD-4B1CBB1EC24B}.Release|x86.ActiveCfg = Release|Win32 {36591862-6F9C-4A1D-BBAD-4B1CBB1EC24B}.Release|x86.Build.0 = Release|Win32 - {5675A6E4-1AEF-4AA3-A366-0D975C311AAF}.Debug|x64.ActiveCfg = Debug|x64 - {5675A6E4-1AEF-4AA3-A366-0D975C311AAF}.Debug|x64.Build.0 = Debug|x64 - {5675A6E4-1AEF-4AA3-A366-0D975C311AAF}.Debug|x86.ActiveCfg = Debug|Win32 - {5675A6E4-1AEF-4AA3-A366-0D975C311AAF}.Debug|x86.Build.0 = Debug|Win32 - {5675A6E4-1AEF-4AA3-A366-0D975C311AAF}.Release|x64.ActiveCfg = Release|x64 - {5675A6E4-1AEF-4AA3-A366-0D975C311AAF}.Release|x64.Build.0 = Release|x64 - {5675A6E4-1AEF-4AA3-A366-0D975C311AAF}.Release|x86.ActiveCfg = Release|Win32 - {5675A6E4-1AEF-4AA3-A366-0D975C311AAF}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/wallitor-gui/.gitignore b/wallitor-gui/.gitignore index 4564690..c51b579 100644 --- a/wallitor-gui/.gitignore +++ b/wallitor-gui/.gitignore @@ -16,6 +16,7 @@ coverage /cypress/videos/ /cypress/screenshots/ +target/ # Editor directories and files .vscode/ diff --git a/wallitor-gui/src-tauri/capabilities/default.json b/wallitor-gui/src-tauri/capabilities/default.json index 7eb6f37..d670ba5 100644 --- a/wallitor-gui/src-tauri/capabilities/default.json +++ b/wallitor-gui/src-tauri/capabilities/default.json @@ -3,5 +3,5 @@ "identifier": "default", "description": "Capability for the main window", "windows": ["main"], - "permissions": ["core:default", "shell:allow-open", "dialog:allow-open", "dialog:default","core:webview:allow-create-webview-window"] + "permissions": ["core:default", "shell:allow-open", "dialog:allow-open", "dialog:default","core:webview:allow-create-webview-window","core:window:allow-destroy"] } diff --git a/wallitor-gui/src-tauri/capabilities/video.json b/wallitor-gui/src-tauri/capabilities/video.json index 658ac11..eda78bd 100644 --- a/wallitor-gui/src-tauri/capabilities/video.json +++ b/wallitor-gui/src-tauri/capabilities/video.json @@ -3,5 +3,5 @@ "identifier": "video", "description": "Capability for the main window", "windows": ["wallitor_video_playback"], - "permissions": ["core:default", "shell:allow-open"] + "permissions": ["core:default", "shell:allow-open","core:window:allow-destroy"] } diff --git a/wallitor-gui/src-tauri/gen/schemas/capabilities.json b/wallitor-gui/src-tauri/gen/schemas/capabilities.json index dca2d86..027651f 100644 --- a/wallitor-gui/src-tauri/gen/schemas/capabilities.json +++ b/wallitor-gui/src-tauri/gen/schemas/capabilities.json @@ -1 +1 @@ -{"default":{"identifier":"default","description":"Capability for the main window","local":true,"windows":["main"],"permissions":["core:default","shell:allow-open","dialog:allow-open","dialog:default","core:webview:allow-create-webview-window"]},"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["core:default","core:window:allow-maximize","core:window:allow-unmaximize","core:window:allow-toggle-maximize","core:window:allow-minimize","core:window:allow-unminimize","core:window:allow-show","core:window:allow-hide","core:window:allow-close","core:window:allow-start-dragging"]},"video":{"identifier":"video","description":"Capability for the main window","local":true,"windows":["wallitor_video_playback"],"permissions":["core:default","shell:allow-open"]}} \ No newline at end of file +{"default":{"identifier":"default","description":"Capability for the main window","local":true,"windows":["main"],"permissions":["core:default","shell:allow-open","dialog:allow-open","dialog:default","core:webview:allow-create-webview-window","core:window:allow-destroy"]},"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["core:default","core:window:allow-maximize","core:window:allow-unmaximize","core:window:allow-toggle-maximize","core:window:allow-minimize","core:window:allow-unminimize","core:window:allow-show","core:window:allow-hide","core:window:allow-close","core:window:allow-start-dragging"]},"video":{"identifier":"video","description":"Capability for the main window","local":true,"windows":["wallitor_video_playback"],"permissions":["core:default","shell:allow-open","core:window:allow-destroy"]}} \ No newline at end of file diff --git a/wallitor-gui/src-tauri/src/lib.rs b/wallitor-gui/src-tauri/src/lib.rs index 8ee52c0..3a2f994 100644 --- a/wallitor-gui/src-tauri/src/lib.rs +++ b/wallitor-gui/src-tauri/src/lib.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; use serde_json::{self, json}; use std::ffi::CString; use std::path::Path; -use std::{fs, path}; +use std::{fs}; use tauri::ipc::Response; #[cfg_attr(mobile, tauri::mobile_entry_point)] @@ -44,11 +44,9 @@ async fn read_resource_dir() -> String { #[tauri::command] async fn get_file(path: String) -> Response { let p = Path::new(&path); - if p.starts_with(".\\") { - if let Ok(true) = fs::exists(p) { - let data: Vec = fs::read(p).unwrap(); - return tauri::ipc::Response::new(data); - } + if let Ok(true) = fs::exists(p) { + let data: Vec = fs::read(p).unwrap(); + return tauri::ipc::Response::new(data); } tauri::ipc::Response::new(String::from("")) } diff --git a/wallitor-gui/src/App.vue b/wallitor-gui/src/App.vue index 10c4029..7d714f9 100644 --- a/wallitor-gui/src/App.vue +++ b/wallitor-gui/src/App.vue @@ -1,7 +1,6 @@ @@ -256,7 +268,7 @@ function handleAdd() { } .item-add-preview:hover { - background: var(--bg-color-alpha-darker); + background: var(--bg-hover-fill); } .item-add-preview:active { @@ -264,7 +276,7 @@ function handleAdd() { } .item-add-image { - background: linear-gradient(135deg, transparent 0%, #FFFFFF10 100%); + background: linear-gradient(135deg, #0000001A 0%, #FFFFFF1A 100%); border-radius: 5px; width: 400px; margin-bottom: 10px; diff --git a/wallitor-gui/src/components/ApplyBar.vue b/wallitor-gui/src/components/ApplyBar.vue index f6294a5..32b9ea0 100644 --- a/wallitor-gui/src/components/ApplyBar.vue +++ b/wallitor-gui/src/components/ApplyBar.vue @@ -54,9 +54,10 @@ diff --git a/wallitor-gui/src/components/TitleBar.vue b/wallitor-gui/src/components/TitleBar.vue index 190cb19..6aff9bd 100644 --- a/wallitor-gui/src/components/TitleBar.vue +++ b/wallitor-gui/src/components/TitleBar.vue @@ -91,7 +91,7 @@ function close() { position: relative; justify-content: space-between; height: var(--titlebar-height); - padding: 5px; + padding: 4px; color: var(--text-color); } @@ -114,7 +114,9 @@ function close() { } .titlebar-button-wrapper { - height: var(--titlebar-height); + height: calc(var(--titlebar-height) - 4px); + margin-top: 5px; + margin-right: 5px; width: fit-content; place-self: center; place-items: center; @@ -128,15 +130,15 @@ function close() { } .titlebar-button { - height: calc(var(--titlebar-height) - 6px); - width: calc(var(--titlebar-height) - 6px); + height: 30px; + width: 30px; padding-top: 3px; padding-bottom: 3px; } .titlebar-button-rect { - height: 34px; - width: 34px; + height: 30px; + width: 30px; border-radius: 100%; transition: .3s; display: flex; diff --git a/wallitor-gui/src/store/index.ts b/wallitor-gui/src/store/index.ts index 691dff6..5cc6e7e 100644 --- a/wallitor-gui/src/store/index.ts +++ b/wallitor-gui/src/store/index.ts @@ -1,6 +1,7 @@ import { createStore } from 'vuex' import { invoke } from '@tauri-apps/api/core' import type { ResourceDir, wpConfig, Cell } from '@/ts/types' +import { WebviewWindow, } from '@tauri-apps/api/webviewWindow' function arrayBufferToString(buffer: ArrayBuffer): string { const decoder = new TextDecoder('utf-8') @@ -15,10 +16,12 @@ const support_ext_map: { [key in (typeof support_ext)[number]]: string } = { '.webp': 'image/webp' } +type VideoWindow = null | WebviewWindow export const store = createStore({ state() { return { - wpList: [] as Cell[] + wpList: [] as Cell[], + videoWindow: null as VideoWindow } }, mutations: { @@ -69,6 +72,22 @@ export const store = createStore({ }) } }) + }, + apply_wallpaper(state, payload:{ + title:string, + url:string + }) { + const window_options = { + title: payload.title, + url: payload.url, + fullscreen: true, + shadow:false, + decorations: false, + transparent: true + } + if (state.videoWindow) + state.videoWindow.destroy().then((_) => {state.videoWindow = new WebviewWindow(payload.title, window_options)}) + else state.videoWindow = new WebviewWindow(payload.title,window_options) } } }) diff --git a/wallitor-gui/src/style/global.css b/wallitor-gui/src/style/global.css index 1e8d616..9b48ea6 100644 --- a/wallitor-gui/src/style/global.css +++ b/wallitor-gui/src/style/global.css @@ -14,17 +14,15 @@ html { --bg-color-alter: #ffffff; --bg-color: #ffffffae; --text-color: #1c1c1c; - --bd-color: #bbbbbbce; + --bd-color: #b2b2b2da; --text-active: #7cbeff; - --login-button-bg: #9acdff; - --login-button-bd: #c8c8c8; - --login-button-hover: #7db7f0; - --branch-viewing-color: rgb(122, 212, 215); - --branch-viewing-hover-color: rgb(102, 177, 180); - --delete-box-left-border: #f56c6c; - --delete-box-bg: #f56c6c42; - --delete-box-title: #511f1f; - --delete-box-text: black; + --titlebar-height: 40px; + --shadow-edge-glow: inset 1px 1px 1px -.5px rgba(255, 255, 255, .2), inset -1px -1px 1px -.5px rgba(255, 255, 255, .12), inset 0 0 4px rgba(255, 255, 255, .4); + --shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .06); + --bg-color-alpha: hsla(240, 17%, 91%, 0.68); + --bg-color-alpha-darker: hsla(0, 22%, 96%, 0.948); + --bg-hover-fill: rgba(172, 172, 193, 0.24); + --bg-hover-fill-close: rgba(239, 90, 90, 0.579); } html.dark { @@ -133,7 +131,7 @@ textarea:focus { } .apply-button:hover { - background-color: var(--bg-color-alter); + background-color: var(--bg-hover-fill); } .apply-button:active { diff --git a/wallitor-gui/src/views/HomeView.vue b/wallitor-gui/src/views/HomeView.vue index a31a94c..deec42b 100644 --- a/wallitor-gui/src/views/HomeView.vue +++ b/wallitor-gui/src/views/HomeView.vue @@ -17,7 +17,22 @@ const apply_bar_visible = ref(false); const applyBar = ref | null>(null); const item_add_visible = ref(false); const r_display = ref(false); -const r_data = ref(); +const r_data = ref({ + img: "", + path: "", + config: { + name: "", + info: { + description: "", + created: 0, + media_type: "Video", + entry_point: "" + }, + option: { + mute: true + } + } +}); const menu = ref | null>(null); const options = ref<{ name: string, icon: string, handler: (data: Cell) => void }[]>([{ name: "删除", @@ -30,7 +45,6 @@ onMounted(() => { }) function openCard(config: Cell) { - console.log(applyBar.value) if (applyBar.value) applyBar.value.open(config); } diff --git a/wallitor-gui/video/index.html b/wallitor-gui/video/index.html index 2154130..5bcaac6 100644 --- a/wallitor-gui/video/index.html +++ b/wallitor-gui/video/index.html @@ -12,10 +12,16 @@ margin: 0; padding: 0; overflow: hidden; + background: transparent; } #player{ width: 100%; height: 100%; + margin: 0; + padding: 0; + opacity: 0; + transition: .5s ease-in-out; + object-fit: cover; } diff --git a/wallitor-gui/video/playback.ts b/wallitor-gui/video/playback.ts index a2aa802..8dd25cf 100644 --- a/wallitor-gui/video/playback.ts +++ b/wallitor-gui/video/playback.ts @@ -1,6 +1,8 @@ import { invoke } from '@tauri-apps/api/core' -interface Params{ - url?:string +import { getCurrentWindow } from '@tauri-apps/api/window' +interface Params { + url?: string, + mute?: string } function getSearchParamsAsObject() { const params = new URLSearchParams(window.location.search) @@ -10,22 +12,36 @@ function getSearchParamsAsObject() { }) return paramsObject } -const params:Params = getSearchParamsAsObject() -if (params.url) { - console.log(params.url) - invoke('get_file', { - path: params.url + +window.onload = () => { + invoke('set_wallpaper', { + title: 'wallitor_video_playback' }).then((res) => { - console.log(res) - const binary_data_arr = new Uint8Array(res as number[]) - const blob = new Blob([binary_data_arr], { type: 'video/mp4' }) - const videoUrl = URL.createObjectURL(blob) - const player = document.getElementById("player") as HTMLVideoElement; - if(player) { - player.src = videoUrl; - player.play(); - player.muted = true; - player.loop = true; + if(!res) { + console.error("Unable to set wallpaper."); + const win = getCurrentWindow(); + win.destroy(); + return; + } + const params: Params = getSearchParamsAsObject() + if (params.url) { + invoke('get_file', { + path: params.url + }).then((res) => { + const binary_data_arr = new Uint8Array(res as number[]) + const blob = new Blob([binary_data_arr], { type: 'video/mp4' }) + const videoUrl = URL.createObjectURL(blob) + const player = document.getElementById('player') as HTMLVideoElement + if (player) { + player.src = videoUrl + player.play() + if(params.mute) { + player.muted = JSON.parse(params.mute); + } + player.loop = true + setTimeout(()=>{player.style.opacity = '1'},0); + } + }) } }) } diff --git a/wallitor-gui/vite.config.ts b/wallitor-gui/vite.config.ts index 641728a..ee9367f 100644 --- a/wallitor-gui/vite.config.ts +++ b/wallitor-gui/vite.config.ts @@ -40,5 +40,11 @@ export default defineConfig({ minify: !process.env.TAURI_DEBUG ? 'esbuild' : false, // 为调试构建生成源代码映射 (sourcemap) sourcemap: !!process.env.TAURI_DEBUG, + rollupOptions: { + input: { + main: path.resolve(__dirname, 'index.html'), + video: path.resolve(__dirname, 'video/index.html'), + }, + }, }, }) diff --git a/wallitor-gui/vite.config.ts.timestamp-1728907575500-ace9aca6c3bef.mjs b/wallitor-gui/vite.config.ts.timestamp-1728907575500-ace9aca6c3bef.mjs new file mode 100644 index 0000000..057ffe3 --- /dev/null +++ b/wallitor-gui/vite.config.ts.timestamp-1728907575500-ace9aca6c3bef.mjs @@ -0,0 +1,54 @@ +// vite.config.ts +import { fileURLToPath, URL } from "node:url"; +import { defineConfig } from "file:///D:/code/wallitor/wallitor-gui/node_modules/.pnpm/vite@5.4.7_@types+node@20.16.7/node_modules/vite/dist/node/index.js"; +import vue from "file:///D:/code/wallitor/wallitor-gui/node_modules/.pnpm/@vitejs+plugin-vue@5.1.4_vite@5.4.7_@types+node@20.16.7__vue@3.5.8_typescript@5.4.5_/node_modules/@vitejs/plugin-vue/dist/index.mjs"; +import vueDevTools from "file:///D:/code/wallitor/wallitor-gui/node_modules/.pnpm/vite-plugin-vue-devtools@7.4.6_rollup@4.22.4_vite@5.4.7_@types+node@20.16.7__vue@3.5.8_typescript@5.4.5_/node_modules/vite-plugin-vue-devtools/dist/vite.mjs"; +import ElementPlus from "file:///D:/code/wallitor/wallitor-gui/node_modules/.pnpm/unplugin-element-plus@0.8.0_rollup@4.22.4/node_modules/unplugin-element-plus/dist/vite.mjs"; +import path from "path"; +import { createSvgIconsPlugin } from "file:///D:/code/wallitor/wallitor-gui/node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_vite@5.4.7_@types+node@20.16.7_/node_modules/vite-plugin-svg-icons/dist/index.mjs"; +var __vite_injected_original_dirname = "D:\\code\\wallitor\\wallitor-gui"; +var __vite_injected_original_import_meta_url = "file:///D:/code/wallitor/wallitor-gui/vite.config.ts"; +var vite_config_default = defineConfig({ + clearScreen: false, + // Tauri expects a fixed port, fail if that port is not available + server: { + strictPort: true + }, + envPrefix: ["VITE_", "TAURI_PLATFORM", "TAURI_ARCH", "TAURI_FAMILY", "TAURI_PLATFORM_VERSION", "TAURI_PLATFORM_TYPE", "TAURI_DEBUG"], + plugins: [ + vue(), + vueDevTools(), + createSvgIconsPlugin({ + iconDirs: [ + path.resolve(__vite_injected_original_dirname, "src/assets/svgs") + ], + symbolId: "icon-[name]" + }), + ElementPlus({ + // options + }) + ], + resolve: { + alias: { + "@": fileURLToPath(new URL("./src", __vite_injected_original_import_meta_url)) + } + }, + build: { + // Tauri uses Chromium on Windows and WebKit on macOS and Linux + target: process.env.TAURI_PLATFORM == "windows" ? "chrome105" : "safari13", + // don't minify for debug builds + minify: !process.env.TAURI_DEBUG ? "esbuild" : false, + // 为调试构建生成源代码映射 (sourcemap) + sourcemap: !!process.env.TAURI_DEBUG, + rollupOptions: { + input: { + main: path.resolve(__vite_injected_original_dirname, "index.html"), + video: path.resolve(__vite_injected_original_dirname, "video/index.html") + } + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxjb2RlXFxcXHdhbGxpdG9yXFxcXHdhbGxpdG9yLWd1aVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRDpcXFxcY29kZVxcXFx3YWxsaXRvclxcXFx3YWxsaXRvci1ndWlcXFxcdml0ZS5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0Q6L2NvZGUvd2FsbGl0b3Ivd2FsbGl0b3ItZ3VpL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZmlsZVVSTFRvUGF0aCwgVVJMIH0gZnJvbSAnbm9kZTp1cmwnXHJcblxyXG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJ1xyXG5pbXBvcnQgdnVlIGZyb20gJ0B2aXRlanMvcGx1Z2luLXZ1ZSdcclxuaW1wb3J0IHZ1ZURldlRvb2xzIGZyb20gJ3ZpdGUtcGx1Z2luLXZ1ZS1kZXZ0b29scydcclxuaW1wb3J0IEVsZW1lbnRQbHVzIGZyb20gJ3VucGx1Z2luLWVsZW1lbnQtcGx1cy92aXRlJ1xyXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQgeyBjcmVhdGVTdmdJY29uc1BsdWdpbiB9IGZyb20gXCJ2aXRlLXBsdWdpbi1zdmctaWNvbnNcIjtcclxuXHJcbi8vIGh0dHBzOi8vdml0ZWpzLmRldi9jb25maWcvXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XHJcbiAgY2xlYXJTY3JlZW46IGZhbHNlLFxyXG4gIC8vIFRhdXJpIGV4cGVjdHMgYSBmaXhlZCBwb3J0LCBmYWlsIGlmIHRoYXQgcG9ydCBpcyBub3QgYXZhaWxhYmxlXHJcbiAgc2VydmVyOiB7XHJcbiAgICBzdHJpY3RQb3J0OiB0cnVlLFxyXG4gIH0sXHJcbiAgZW52UHJlZml4OiBbJ1ZJVEVfJywgJ1RBVVJJX1BMQVRGT1JNJywgJ1RBVVJJX0FSQ0gnLCAnVEFVUklfRkFNSUxZJywgJ1RBVVJJX1BMQVRGT1JNX1ZFUlNJT04nLCAnVEFVUklfUExBVEZPUk1fVFlQRScsICdUQVVSSV9ERUJVRyddLFxyXG4gIHBsdWdpbnM6IFtcclxuICAgIHZ1ZSgpLFxyXG4gICAgdnVlRGV2VG9vbHMoKSxcclxuICAgIGNyZWF0ZVN2Z0ljb25zUGx1Z2luKHtcclxuICAgICAgaWNvbkRpcnM6IFtcclxuICAgICAgICBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcInNyYy9hc3NldHMvc3Znc1wiKSxcclxuICAgICAgXSxcclxuICAgICAgc3ltYm9sSWQ6IFwiaWNvbi1bbmFtZV1cIlxyXG4gICAgfSksXHJcbiAgICBFbGVtZW50UGx1cyh7XHJcbiAgICAgIC8vIG9wdGlvbnNcclxuICAgIH0pLFxyXG4gIF0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgJ0AnOiBmaWxlVVJMVG9QYXRoKG5ldyBVUkwoJy4vc3JjJywgaW1wb3J0Lm1ldGEudXJsKSlcclxuICAgIH1cclxuICB9LFxyXG4gIGJ1aWxkOiB7XHJcbiAgICAvLyBUYXVyaSB1c2VzIENocm9taXVtIG9uIFdpbmRvd3MgYW5kIFdlYktpdCBvbiBtYWNPUyBhbmQgTGludXhcclxuICAgIHRhcmdldDogcHJvY2Vzcy5lbnYuVEFVUklfUExBVEZPUk0gPT0gJ3dpbmRvd3MnID8gJ2Nocm9tZTEwNScgOiAnc2FmYXJpMTMnLFxyXG4gICAgLy8gZG9uJ3QgbWluaWZ5IGZvciBkZWJ1ZyBidWlsZHNcclxuICAgIG1pbmlmeTogIXByb2Nlc3MuZW52LlRBVVJJX0RFQlVHID8gJ2VzYnVpbGQnIDogZmFsc2UsXHJcbiAgICAvLyBcdTRFM0FcdThDMDNcdThCRDVcdTY3ODRcdTVFRkFcdTc1MUZcdTYyMTBcdTZFOTBcdTRFRTNcdTc4MDFcdTY2MjBcdTVDMDQgKHNvdXJjZW1hcClcclxuICAgIHNvdXJjZW1hcDogISFwcm9jZXNzLmVudi5UQVVSSV9ERUJVRyxcclxuICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgaW5wdXQ6IHtcclxuICAgICAgICBtYWluOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXguaHRtbCcpLFxyXG4gICAgICAgIHZpZGVvOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAndmlkZW8vaW5kZXguaHRtbCcpLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICB9LFxyXG59KVxyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQWlSLFNBQVMsZUFBZSxXQUFXO0FBRXBULFNBQVMsb0JBQW9CO0FBQzdCLE9BQU8sU0FBUztBQUNoQixPQUFPLGlCQUFpQjtBQUN4QixPQUFPLGlCQUFpQjtBQUN4QixPQUFPLFVBQVU7QUFDakIsU0FBUyw0QkFBNEI7QUFQckMsSUFBTSxtQ0FBbUM7QUFBZ0ksSUFBTSwyQ0FBMkM7QUFVMU4sSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsYUFBYTtBQUFBO0FBQUEsRUFFYixRQUFRO0FBQUEsSUFDTixZQUFZO0FBQUEsRUFDZDtBQUFBLEVBQ0EsV0FBVyxDQUFDLFNBQVMsa0JBQWtCLGNBQWMsZ0JBQWdCLDBCQUEwQix1QkFBdUIsYUFBYTtBQUFBLEVBQ25JLFNBQVM7QUFBQSxJQUNQLElBQUk7QUFBQSxJQUNKLFlBQVk7QUFBQSxJQUNaLHFCQUFxQjtBQUFBLE1BQ25CLFVBQVU7QUFBQSxRQUNSLEtBQUssUUFBUSxrQ0FBVyxpQkFBaUI7QUFBQSxNQUMzQztBQUFBLE1BQ0EsVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLElBQ0QsWUFBWTtBQUFBO0FBQUEsSUFFWixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBLE1BQ0wsS0FBSyxjQUFjLElBQUksSUFBSSxTQUFTLHdDQUFlLENBQUM7QUFBQSxJQUN0RDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE9BQU87QUFBQTtBQUFBLElBRUwsUUFBUSxRQUFRLElBQUksa0JBQWtCLFlBQVksY0FBYztBQUFBO0FBQUEsSUFFaEUsUUFBUSxDQUFDLFFBQVEsSUFBSSxjQUFjLFlBQVk7QUFBQTtBQUFBLElBRS9DLFdBQVcsQ0FBQyxDQUFDLFFBQVEsSUFBSTtBQUFBLElBQ3pCLGVBQWU7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNMLE1BQU0sS0FBSyxRQUFRLGtDQUFXLFlBQVk7QUFBQSxRQUMxQyxPQUFPLEtBQUssUUFBUSxrQ0FBVyxrQkFBa0I7QUFBQSxNQUNuRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K