diff --git a/extensions/cocos-code-mode/@types/.DS_Store b/extensions/cocos-code-mode/@types/.DS_Store new file mode 100644 index 0000000..05aaa2a Binary files /dev/null and b/extensions/cocos-code-mode/@types/.DS_Store differ diff --git a/extensions/cocos-code-mode/@types/schema/.DS_Store b/extensions/cocos-code-mode/@types/schema/.DS_Store new file mode 100644 index 0000000..5e45c14 Binary files /dev/null and b/extensions/cocos-code-mode/@types/schema/.DS_Store differ diff --git a/extensions/cocos-code-mode/@types/schema/package/.DS_Store b/extensions/cocos-code-mode/@types/schema/package/.DS_Store new file mode 100644 index 0000000..8cade47 Binary files /dev/null and b/extensions/cocos-code-mode/@types/schema/package/.DS_Store differ diff --git a/extensions/cocos-code-mode/@types/schema/package/base/panels.json b/extensions/cocos-code-mode/@types/schema/package/base/panels.json new file mode 100644 index 0000000..9e268fb --- /dev/null +++ b/extensions/cocos-code-mode/@types/schema/package/base/panels.json @@ -0,0 +1,81 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "description": "面板数据 / Panel data", + "additionalProperties": false, + "patternProperties": { + "^[a-zA-Z0-9_-]+$": { + "type": "object", + "description": "面板名 / Panel name", + "properties": { + "title": { + "type": "string", + "default": "Default Panel", + "description": "面板标题,支持 i18n:key / Panel title, support for i18n:key (required)" + }, + "main": { + "type": "string", + "default": "dist/panels/default/index.js", + "description": "入口函数 / Entry function (required)" + }, + "icon": { + "type": "string", + "description": "面板图标存放相对目录 / Relative directory for panel icon storage" + }, + "type": { + "type": "string", + "enum": ["dockable", "simple"], + "default": "dockable", + "description": "面板类型(dockable | simple) / Panel type (dockable | simple)" + }, + "flags": { + "type": "object", + "properties": { + "resizable": { + "type": "boolean", + "default": true, + "description": "是否可以改变大小,默认 true / Whether the size can be changed, default true" + }, + "save": { + "type": "boolean", + "default": true, + "description": "是否需要保存,默认 false / Whether to save, default false" + }, + "alwaysOnTop": { + "type": "boolean", + "default": true, + "description": "是否保持顶层显示,默认 false / Whether to keep the top level display, default false" + } + } + }, + "size": { + "type": "object", + "description": "面板大小信息 / Panel size information", + "properties": { + "min-width": { + "type": "number", + "default": 200, + "description": "面板最小宽度 / Minimum panel width" + }, + "min-height": { + "type": "number", + "default": 200, + "description": "面板最小高度 / Minimum panel height" + }, + "width": { + "type": "number", + "default": 400, + "description": " 面板默认宽度 / Panel Default Width" + }, + "height": { + "type": "number", + "default": 600, + "description": "面板默认高度 / Panel Default Height" + } + } + } + }, + "required": ["title", "main"] + } + } +} diff --git a/extensions/cocos-code-mode/@types/schema/package/contributions/index.json b/extensions/cocos-code-mode/@types/schema/package/contributions/index.json new file mode 100644 index 0000000..263ab76 --- /dev/null +++ b/extensions/cocos-code-mode/@types/schema/package/contributions/index.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "description": "其他扩展插件的扩展配置 / Extended configuration for other extension plugins", + "properties": {}, + "required": [] +} diff --git a/extensions/cocos-code-mode/@types/schema/package/index.json b/extensions/cocos-code-mode/@types/schema/package/index.json new file mode 100644 index 0000000..be569fa --- /dev/null +++ b/extensions/cocos-code-mode/@types/schema/package/index.json @@ -0,0 +1,59 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "description": "插件定义文件 / Extension definition file", + "properties": { + "author": { + "type": "string", + "description": "作者 / Author", + "default": "Cocos Creator Developer" + }, + "contributions": { + "$ref": "./contributions/index.json" + }, + "dependencies": { + "type": "object", + "description": "发布时所需的依赖库 / Dependencies required for publishing" + }, + "description": { + "type": "string", + "description": "简要介绍扩展关键特性、用途,支持 i18n / Brief introduction of the key features and uses of the extension, supporting i18n" + }, + "devDependencies": { + "type": "object", + "description": "开发时所需的依赖库 / Dependencies required for development" + }, + "editor": { + "type": "string", + "description": "支持的 Cocos Creator 编辑器版本,支持 semver 格式 / Supported Cocos Creator editor version, supporting semver format" + }, + "main": { + "type": "string", + "description": "入口函数 / Entry function", + "default": "./dist/index.js" + }, + "name": { + "type": "string", + "description": "不能以 _ 或 . 开头、不能含有大写字母,也不能含有 URL 的非法字符例如 .、' 和 ,。 / Cannot start with _ or., cannot contain uppercase letters, and cannot contain URL illegal characters such as.,'and,", + "default": "Custom Extension" + }, + "package_version": { + "type": "number", + "description": "扩展系统预留版本号 / Extension system reserved version number", + "default": 2 + }, + "panels": { + "$ref": "./base/panels.json" + }, + "scripts": { + "type": "object", + "description": "NPM 脚本 / NPM scripts" + }, + "version": { + "type": "string", + "description": "版本号字符串 / Version number string", + "default": "1.0.0" + } + }, + "required": ["author", "name", "package_version", "version"] +} diff --git a/extensions/cocos-code-mode/README.md b/extensions/cocos-code-mode/README.md new file mode 100644 index 0000000..7d32161 --- /dev/null +++ b/extensions/cocos-code-mode/README.md @@ -0,0 +1,219 @@ +# Code Mode for Cocos Creator + +**Code Mode** turns the Cocos Creator Editor into an AI-controllable tool. It runs an HTTP server inside the editor that exposes scene manipulation, asset management, and property inspection as structured tool calls via [UTCP Protocol](https://www.utcp.io/) — letting AI agents build, inspect, and modify Cocos Creator projects the same way a developer would through the UI. +These tools are combined in [UTCP Code Mode](https://github.com/universal-tool-calling-protocol/code-mode/) environment to achieve maximum performance and token efficiency for AI agents, letting them call the tools in isolated JS sandbox. + +## Tools + +![Tools <> UI Mapping](tools_screenshot.jpg) + +| Category | Tools | Purpose | +|----------|-------|---------| +| **Scene** | `nodeGetTree`, `nodeGetAtPath`, `nodeCreate`, `nodeCreatePrimitive`, `nodeOperate` | Navigate and build scene hierarchy | +| **Components** | `nodeComponentsGet`, `nodeComponentAdd`, `nodeComponentRemove`, `nodeGetAvailableComponentTypes` | Attach, remove, and discover components | +| **Inspector** | `inspectorGetInstanceDefinition`, `inspectorGetSettingsDefinition`, `inspectorGetInstanceProperties`, `inspectorGetSettingsProperties`, `inspectorSetInstanceProperties`, `inspectorSetSettingsProperties` | Introspect types and read/write properties | +| **Assets** | `assetGetTree`, `assetGetAtPath`, `assetCreate`, `assetImport`, `assetOperate`, `assetGetPreview` | Browse, create, and manage project assets | +| **Editor** | `editorOperate`, `editorGetLogs`, `editorGetScenePreview` | Control editor state and capture previews | + + +## How It Works + +**Code Mode** follows a **discover, then act** pattern. AI agents never guess at property names or component structures — they query for the real definitions first. + +``` +1. Get the scene tree → find the node you need +2. Get its type definition → learn its actual properties +3. Set properties by name → make precise changes +``` + +### Example + +```typescript +// Find the camera node +const tree = CocosEditor.nodeGetTree({}); +const cameraRef = tree.children[0].components[0]; // component reference + +// Discover what properties Camera has +const def = CocosEditor.inspectorGetInstanceDefinition({ reference: cameraRef }); +// → "export class Camera { fov: number; near: number; far: number; ... }" + +// Set multiple properties in one call +CocosEditor.inspectorSetInstanceProperties({ + reference: cameraRef, + propertyPaths: ["fov", "near", "far"], + values: [60, 0.1, 1000] +}); +``` + +## Architecture + +### Tool Execution + +The extension runs an Express.js HTTP server on a configurable port (default: auto-assigned). Tool handlers execute asynchronously using Cocos Creator's Editor Message API — all editor interactions go through `Editor.Message.request`, which marshals calls to the appropriate editor subsystem. + +- **Read tools** (GET) — query scene state and return structured data immediately. +- **Write tools** (POST) — mutate scene state and call `Editor.Message.request('scene', 'snapshot')` to register the change as an undoable step. + +This means AI agents can safely chain read calls and batch writes without blocking the editor. + +### Tool Discovery + +Tools are TypeScript class methods decorated with `@utcpTool`. The `ToolRegistry` collects them at startup, builds JSON schemas from the inline definitions, and serves a UTCP manual at the `/utcp` endpoint. + +```typescript +export class SceneTools { + + @utcpTool( + 'nodeGetTree', + 'Get the hierarchy tree of specific node or scene root if no reference is provided.', + { + type: 'object', + properties: { + reference: InstanceReferenceSchema + } + }, + SceneTreeItemSchema, "GET", ['scene', 'graph', 'node', 'hierarchy', 'tree'] + ) + async nodeGetTree(args: { reference?: IInstanceReference }): Promise { + // ... + } +} +``` + +### Instance References + +Nodes, components, and assets are passed around as lightweight UUID-based handles: + +```typescript +{ id: "a1b2c3d4-...", type: "cc.Camera" } +``` + +Returned by tree queries, component lookups, and creation tools. Passed back to any tool that needs to target a specific object. + +### TypeScript Definitions + +Code Mode dynamically generates TypeScript class definitions from the live editor property dump. When an AI agent calls `inspectorGetInstanceDefinition`, it receives a complete TypeScript class with the correct field names, types, enums, and decorator hints — including `@property` attributes like `min`, `max`, `unit`, and `tooltip`. + +```typescript +// Example output for a Transform-like node +export class Node { + readonly uuid: string; + /** World position */ + worldPosition: Vec3; + /** World rotation (euler angles) */ + worldRotation: Vec3; + worldScale: Vec3; + active: boolean; +} +``` + +Components without special handling are reflected automatically from the serialized property dump. Common Cocos math types (`Vec2`, `Vec3`, `Vec4`, `Color`, `Rect`, `Quat`, `Mat4`, `Gradient`, etc.) are always available via `inspectorGetSettingsDefinition({ settingsType: 'CommonTypes' })`. + +### Settings Inspection + +Two special settings types can be inspected and modified directly: +- **`CurrentSceneGlobals`** — ambient light, skybox, shadows, and other scene-level rendering settings. +- **`ProjectSettings`** — engine and project configuration. + +## Installation + +### From release + +1. Download last release from this repository. +2. Open Cocos Creator, go to **Extension → Extension Manager**, and click `Import Extension File(.zip)` button (icon with arrow). +3. Select the downloaded zip file. +4. The UTCP server starts automatically and registers itself in `~/.utcp_config.json` by default. + +### Build from source + +1. Clone this repository. +2. Install `node` and `npm`. +3. run +```bash +git clone https://github.com/romarogov/cocos-code-mode.git +cd cocos-code-mode +npm i +npm run package +``` +4. If everything builds fine, `cocos-code-mode.zip` file should appear in repository root. +5. Install it in Cocos Creator with **Extension Manager**. + +## Adding Custom Tools + +You should add custom tools right in extension package and build it from source as described above. + +Implementation example: + +```typescript +import { utcpTool } from './utcp/decorators'; + +export class MyTools { + + @utcpTool( + 'myCustomTool', + 'Describe what this tool does', + { + type: 'object', + properties: { + input: { type: 'string' }, + count: { type: 'number', default: 10 } + }, + required: ['input'] + }, + { type: 'object', properties: { result: { type: 'string' } } }, + "POST", + ['custom', 'tags'] + ) + async myCustomTool(args: { input: string, count?: number }): Promise<{ result: string }> { + // Implementation + } +} +``` + +Register the class by importing it in `utcp-server.ts`. Tools are served automatically at startup. No additional registration needed. + +## UTCP Call Templates Configuration + +The extension provides a **Configuration** panel accessible from the **Code Mode** top menu. It shows the current server port, the path to the UTCP config file, and lets you manage additional UTCP call templates to connect other UTCP-compatible tool providers (including MCP servers) into the same Code Mode execution context. + +You can find Call Template structures in [UTCP documentation](https://www.utcp.io/protocols): +- [MCP Call Template](https://utcp.io/protocols/mcp#call-template-structure) +- [HTTP Call Template](https://utcp.io/protocols/http#call-template-structure) ([Streamable](https://utcp.io/protocols/http#call-template-structure), [SSE](https://utcp.io/protocols/http#call-template-structure)) +- [CLI Call Template](https://utcp.io/protocols/cli#call-template-structure) +- [Text Call Template](http://utcp.io/protocols/text#call-template-structure) + +The extension automatically maintains a `CocosEditor` entry in UTCP Config pointing to the running server port. + +## Integration + +Code Mode works with any UTCP-compatible client, including the [Code Mode MCP server](https://github.com/universal-tool-calling-protocol/code-mode/?tab=readme-ov-file#even-easier-ready-to-use-mcp-server) for AI assistants. + +### MCP Server Config + +```json +{ + "mcpServers": { + "code-mode": { + "command": "npx", + "args": ["@utcp/code-mode-mcp"], + "env": { + "UTCP_CONFIG_FILE": "~/.utcp_config.json" + } + } + } +} +``` + +### Claude Code Configuration + +To set up a Claude Code agent to use Code Mode, open your project and run: + +Linux/MacOS: +``` bash +claude mcp add --transport stdio --env UTCP_CONFIG_FILE="~/.utcp_config.json" -- code-mode npx @utcp/code-mode-mcp +``` + +Windows: +``` powershell +claude mcp add --transport stdio --env UTCP_CONFIG_FILE="%userprofile%/.utcp_config.json" -- code-mode cmd /c npx @utcp/code-mode-mcp +``` \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/main.js b/extensions/cocos-code-mode/dist/main.js new file mode 100644 index 0000000..9353e4a --- /dev/null +++ b/extensions/cocos-code-mode/dist/main.js @@ -0,0 +1,70 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.methods = void 0; +exports.load = load; +exports.unload = unload; +const package_json_1 = __importDefault(require("../package.json")); +const utcp_server_1 = require("./utcp/utcp-server"); +const config_manager_1 = require("./utcp/config-manager"); +let utcpServer = null; +exports.methods = { + openPanel() { + Editor.Panel.open(package_json_1.default.name + '.configuration'); + }, + openPreviewPanel() { + Editor.Panel.open(package_json_1.default.name + '.preview'); + }, + async restartServer(newPort) { + if (utcpServer) { + console.log(`[${package_json_1.default.name}] Restarting UTCP Server on port ${newPort}...`); + utcpServer.stop(); + try { + const actualPort = await utcpServer.start(newPort); + console.log(`[${package_json_1.default.name}] UTCP Server restarted on port ${actualPort}`); + // Используем менеджер конфигурации для обновления порта + const configManager = (0, config_manager_1.getConfigManager)(); + await configManager.updatePort(actualPort); + } + catch (err) { + console.error(`[${package_json_1.default.name}] Failed to restart UTCP Server:`, err); + } + } + } +}; +async function load() { + // Initialize config manager + const configManager = (0, config_manager_1.getConfigManager)(); + await configManager.initialize(); + utcpServer = new utcp_server_1.UtcpServerManager(); + let wasConfiguredPort = true; + // Load port from profile, default to 0 (random free port) if not set + let port = await Editor.Profile.getConfig(package_json_1.default.name, 'serverPort'); + if (typeof port !== 'number') { + port = 0; + wasConfiguredPort = false; + } + try { + const actualPort = await utcpServer.start(port); + console.log(`[${package_json_1.default.name}] UTCP Server started on port ${actualPort}`); + // Automatically update the port in the configuration on startup + await configManager.updatePort(actualPort); + console.log(`[${package_json_1.default.name}] UTCP config automatically updated with port ${actualPort}`); + } + catch (err) { + console.error(`[${package_json_1.default.name}] Failed to start UTCP Server:`, err); + } + if (!wasConfiguredPort) { + Editor.Panel.open(package_json_1.default.name); + } +} +function unload() { + if (utcpServer) { + console.log(`[${package_json_1.default.name}] Stopping UTCP Server...`); + utcpServer.stop(); + utcpServer = null; + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQW9DQSxvQkE2QkM7QUFFRCx3QkFNQztBQXpFRCxtRUFBMEM7QUFDMUMsb0RBQXVEO0FBQ3ZELDBEQUF5RDtBQUV6RCxJQUFJLFVBQVUsR0FBNkIsSUFBSSxDQUFDO0FBR25DLFFBQUEsT0FBTyxHQUE0QztJQUU1RCxTQUFTO1FBQ0wsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQVcsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ1osTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQVcsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUdELEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZTtRQUMvQixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLHNCQUFXLENBQUMsSUFBSSxvQ0FBb0MsT0FBTyxLQUFLLENBQUMsQ0FBQztZQUNsRixVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDO2dCQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLHNCQUFXLENBQUMsSUFBSSxtQ0FBbUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFFakYsd0RBQXdEO2dCQUN4RCxNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixHQUFFLENBQUM7Z0JBQ3pDLE1BQU0sYUFBYSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksc0JBQVcsQ0FBQyxJQUFJLGtDQUFrQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9FLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztDQUNKLENBQUM7QUFFSyxLQUFLLFVBQVUsSUFBSTtJQUN0Qiw0QkFBNEI7SUFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBQSxpQ0FBZ0IsR0FBRSxDQUFDO0lBQ3pDLE1BQU0sYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRWpDLFVBQVUsR0FBRyxJQUFJLCtCQUFpQixFQUFFLENBQUM7SUFFckMsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDN0IscUVBQXFFO0lBQ3JFLElBQUksSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsc0JBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDMUUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQixJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLHNCQUFXLENBQUMsSUFBSSxpQ0FBaUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUUvRSxnRUFBZ0U7UUFDaEUsTUFBTSxhQUFhLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxzQkFBVyxDQUFDLElBQUksaURBQWlELFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksc0JBQVcsQ0FBQyxJQUFJLGdDQUFnQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBZ0IsTUFBTTtJQUNsQixJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLHNCQUFXLENBQUMsSUFBSSwyQkFBMkIsQ0FBQyxDQUFDO1FBQzdELFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhY2thZ2VKU09OIGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBVdGNwU2VydmVyTWFuYWdlciB9IGZyb20gJy4vdXRjcC91dGNwLXNlcnZlcic7XG5pbXBvcnQgeyBnZXRDb25maWdNYW5hZ2VyIH0gZnJvbSAnLi91dGNwL2NvbmZpZy1tYW5hZ2VyJztcblxubGV0IHV0Y3BTZXJ2ZXI6IFV0Y3BTZXJ2ZXJNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG5cblxuZXhwb3J0IGNvbnN0IG1ldGhvZHM6IHsgW2tleTogc3RyaW5nXTogKC4uLmFueTogYW55KSA9PiBhbnkgfSA9IHtcblxuICAgIG9wZW5QYW5lbCgpIHtcbiAgICAgICAgRWRpdG9yLlBhbmVsLm9wZW4ocGFja2FnZUpTT04ubmFtZSArICcuY29uZmlndXJhdGlvbicpO1xuICAgIH0sXG5cbiAgICBvcGVuUHJldmlld1BhbmVsKCkge1xuICAgICAgICBFZGl0b3IuUGFuZWwub3BlbihwYWNrYWdlSlNPTi5uYW1lICsgJy5wcmV2aWV3Jyk7XG4gICAgfSxcblxuXG4gICAgYXN5bmMgcmVzdGFydFNlcnZlcihuZXdQb3J0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHV0Y3BTZXJ2ZXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbJHtwYWNrYWdlSlNPTi5uYW1lfV0gUmVzdGFydGluZyBVVENQIFNlcnZlciBvbiBwb3J0ICR7bmV3UG9ydH0uLi5gKTtcbiAgICAgICAgICAgIHV0Y3BTZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxQb3J0ID0gYXdhaXQgdXRjcFNlcnZlci5zdGFydChuZXdQb3J0KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgWyR7cGFja2FnZUpTT04ubmFtZX1dIFVUQ1AgU2VydmVyIHJlc3RhcnRlZCBvbiBwb3J0ICR7YWN0dWFsUG9ydH1gKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyDQmNGB0L/QvtC70YzQt9GD0LXQvCDQvNC10L3QtdC00LbQtdGAINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQuCDQtNC70Y8g0L7QsdC90L7QstC70LXQvdC40Y8g0L/QvtGA0YLQsFxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBnZXRDb25maWdNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci51cGRhdGVQb3J0KGFjdHVhbFBvcnQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgWyR7cGFja2FnZUpTT04ubmFtZX1dIEZhaWxlZCB0byByZXN0YXJ0IFVUQ1AgU2VydmVyOmAsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZCgpIHtcbiAgICAvLyBJbml0aWFsaXplIGNvbmZpZyBtYW5hZ2VyXG4gICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICBhd2FpdCBjb25maWdNYW5hZ2VyLmluaXRpYWxpemUoKTtcbiAgICBcbiAgICB1dGNwU2VydmVyID0gbmV3IFV0Y3BTZXJ2ZXJNYW5hZ2VyKCk7XG5cbiAgICBsZXQgd2FzQ29uZmlndXJlZFBvcnQgPSB0cnVlO1xuICAgIC8vIExvYWQgcG9ydCBmcm9tIHByb2ZpbGUsIGRlZmF1bHQgdG8gMCAocmFuZG9tIGZyZWUgcG9ydCkgaWYgbm90IHNldFxuICAgIGxldCBwb3J0ID0gYXdhaXQgRWRpdG9yLlByb2ZpbGUuZ2V0Q29uZmlnKHBhY2thZ2VKU09OLm5hbWUsICdzZXJ2ZXJQb3J0Jyk7XG4gICAgaWYgKHR5cGVvZiBwb3J0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICBwb3J0ID0gMDtcbiAgICAgICAgd2FzQ29uZmlndXJlZFBvcnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhY3R1YWxQb3J0ID0gYXdhaXQgdXRjcFNlcnZlci5zdGFydChwb3J0KTtcbiAgICAgICAgY29uc29sZS5sb2coYFske3BhY2thZ2VKU09OLm5hbWV9XSBVVENQIFNlcnZlciBzdGFydGVkIG9uIHBvcnQgJHthY3R1YWxQb3J0fWApO1xuICAgICAgICBcbiAgICAgICAgLy8gQXV0b21hdGljYWxseSB1cGRhdGUgdGhlIHBvcnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gb24gc3RhcnR1cFxuICAgICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLnVwZGF0ZVBvcnQoYWN0dWFsUG9ydCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbJHtwYWNrYWdlSlNPTi5uYW1lfV0gVVRDUCBjb25maWcgYXV0b21hdGljYWxseSB1cGRhdGVkIHdpdGggcG9ydCAke2FjdHVhbFBvcnR9YCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFske3BhY2thZ2VKU09OLm5hbWV9XSBGYWlsZWQgdG8gc3RhcnQgVVRDUCBTZXJ2ZXI6YCwgZXJyKTtcbiAgICB9XG5cbiAgICBpZiAoIXdhc0NvbmZpZ3VyZWRQb3J0KSB7XG4gICAgICAgIEVkaXRvci5QYW5lbC5vcGVuKHBhY2thZ2VKU09OLm5hbWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICBpZiAodXRjcFNlcnZlcikge1xuICAgICAgICBjb25zb2xlLmxvZyhgWyR7cGFja2FnZUpTT04ubmFtZX1dIFN0b3BwaW5nIFVUQ1AgU2VydmVyLi4uYCk7XG4gICAgICAgIHV0Y3BTZXJ2ZXIuc3RvcCgpO1xuICAgICAgICB1dGNwU2VydmVyID0gbnVsbDtcbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/panels/configuration/index.js b/extensions/cocos-code-mode/dist/panels/configuration/index.js new file mode 100644 index 0000000..78e2cd8 --- /dev/null +++ b/extensions/cocos-code-mode/dist/panels/configuration/index.js @@ -0,0 +1,201 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const package_json_1 = __importDefault(require("../../../package.json")); +const fs_extra_1 = require("fs-extra"); +const path_1 = require("path"); +const config_manager_1 = require("../../utcp/config-manager"); +module.exports = Editor.Panel.define({ + listeners: { + show() { console.log('show'); }, + hide() { console.log('hide'); }, + }, + template: (0, fs_extra_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/template/configuration/index.html'), 'utf-8'), + style: (0, fs_extra_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/style/configuration/index.css'), 'utf-8'), + $: { + app: '.panel', + portInput: '#port-input', + savePortBtn: '#save-port-btn', + // MCP Integration + mcpConfigCode: '#mcp-config-code', + // UTCP Config + utcpConfigPathInput: '#utcp-config-path', + utcpConfigPathSaveBtn: '#save-utcp-path-btn', + bridgeList: '#bridge-container', + addBridgeBtn: '#add-bridge-btn', + newTemplateJson: '#new-template-json', + }, + methods: { + async loadSettings() { + const configManager = (0, config_manager_1.getConfigManager)(); + await configManager.initialize(); + // Update UI with config path + if (this.$.utcpConfigPathInput) { + this.$.utcpConfigPathInput.value = configManager.getConfigPath(); + } + // Load Port + const port = await configManager.getCurrentPort(); + if (this.$.portInput) { + this.$.portInput.value = port || 0; + } + this.updateMcpCodeBlock(); + this.fetchBridgeList(); + }, + async saveSettings() { + const newPath = this.$.utcpConfigPathInput.value; + if (newPath) { + const configManager = (0, config_manager_1.getConfigManager)(); + await configManager.setConfigPath(newPath); + this.updateMcpCodeBlock(); + this.fetchBridgeList(); // Reload templates from new path + console.log('Saved UTCP Config Path:', newPath); + } + }, + async updatePort() { + const portVal = this.$.portInput.value; + const port = parseInt(portVal); + console.log(`Updating port to: ${port}`); + // Send message to main process to restart server + Editor.Message.send(package_json_1.default.name, 'restart-server', port); + }, + updateMcpCodeBlock() { + const codeEl = this.$.mcpConfigCode; + if (!codeEl) + return; + const configManager = (0, config_manager_1.getConfigManager)(); + const configPath = configManager.getConfigPath(); + const config = { + "mcpServers": { + "code-mode": { + "command": "npx", + "args": ["-y", "@utcp/code-mode-mcp"], + "env": { + "UTCP_CONFIG_FILE": configPath + } + } + } + }; + codeEl.textContent = JSON.stringify(config, null, 2); + }, + fetchBridgeList() { + const container = this.$.bridgeList; + if (!container) { + console.warn('Bridge Config Container not found'); + return; + } + // Clear "Loading..." or previous content + container.innerHTML = ''; + const configManager = (0, config_manager_1.getConfigManager)(); + const config = configManager.readConfig(); + const templates = config.manual_call_templates || []; + if (templates.length === 0) { + container.innerHTML = '
No templates found.
'; + } + else { + let html = ''; + templates.forEach((t) => { + const isCocos = t.name === 'CocosEditor'; + const delBtn = isCocos + ? `` // No delete for Cocos + : ` + + `; + const headerText = `${t.name} (${t.call_template_type})`; + html += ` + +
+ ${headerText} + ${delBtn} +
+
+ +
+
+ `; + }); + container.innerHTML = html; + // Now populate the code values correctly + templates.forEach((t) => { + const el = container.querySelector(`#code-${t.name}`); + if (el) + el.textContent = JSON.stringify(t, null, 2); + }); + } + }, + addBridgeTemplate() { + const input = this.$.newTemplateJson; + if (!input) + return; + const content = input.value.trim(); + if (!content) + return; + try { + let newTpl = JSON.parse(content); + // Validate with @utcp/sdk or simple schema + if (!newTpl.name || !newTpl.call_template_type) { + alert('Invalid template. Must have name and call_template_type.'); + return; + } + const configManager = (0, config_manager_1.getConfigManager)(); + const config = configManager.readConfig(); + // Check duplicates + if (config.manual_call_templates.find((t) => t.name === newTpl.name)) { + alert(`Template ${newTpl.name} already exists.`); + return; + } + config.manual_call_templates.push(newTpl); + configManager.writeConfig(config); + input.value = ''; + this.fetchBridgeList(); + } + catch (e) { + alert('Invalid JSON: ' + e.message); + } + }, + removeBridge(name) { + if (name === 'CocosEditor') + return; + if (!confirm(`Remove template ${name}?`)) + return; + const configManager = (0, config_manager_1.getConfigManager)(); + const config = configManager.readConfig(); + if (config.manual_call_templates) { + config.manual_call_templates = config.manual_call_templates.filter((t) => t.name !== name); + configManager.writeConfig(config); + this.fetchBridgeList(); + } + }, + }, + ready() { + this.loadSettings(); + // Listeners + const savePort = this.$.savePortBtn; + if (savePort) + savePort.addEventListener('click', () => this.updatePort()); + const savePath = this.$.utcpConfigPathSaveBtn; + if (savePath) + savePath.addEventListener('click', () => this.saveSettings()); + const addBtn = this.$.addBridgeBtn; + if (addBtn) + addBtn.addEventListener('click', () => this.addBridgeTemplate()); + const list = this.$.bridgeList; + if (list) { + list.addEventListener('click', (e) => { + // Handle delete clicks + const btn = e.target.closest('.remove-btn'); + if (btn) { + // In new structure, btn is inside .bridge-item-content inside ui-section + const section = btn.closest('.bridge-item-section'); + if (section && section.dataset.name) { + this.removeBridge(section.dataset.name); + } + } + }); + } + }, + beforeClose() { }, + close() { }, +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvcGFuZWxzL2NvbmZpZ3VyYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5RUFBZ0Q7QUFDaEQsdUNBQXdDO0FBQ3hDLCtCQUE0QjtBQUM1Qiw4REFBNkQ7QUFFN0QsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNqQyxTQUFTLEVBQUU7UUFDUCxJQUFJLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2xDO0lBQ0QsUUFBUSxFQUFFLElBQUEsdUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsbURBQW1ELENBQUMsRUFBRSxPQUFPLENBQUM7SUFDckcsS0FBSyxFQUFFLElBQUEsdUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsK0NBQStDLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDOUYsQ0FBQyxFQUFFO1FBQ0MsR0FBRyxFQUFFLFFBQVE7UUFDYixTQUFTLEVBQUUsYUFBYTtRQUN4QixXQUFXLEVBQUUsZ0JBQWdCO1FBRTdCLGtCQUFrQjtRQUNsQixhQUFhLEVBQUUsa0JBQWtCO1FBRWpDLGNBQWM7UUFDZCxtQkFBbUIsRUFBRSxtQkFBbUI7UUFDeEMscUJBQXFCLEVBQUUscUJBQXFCO1FBQzVDLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixlQUFlLEVBQUUsb0JBQW9CO0tBQ3hDO0lBRUQsT0FBTyxFQUFFO1FBQ0wsS0FBSyxDQUFDLFlBQVk7WUFDZCxNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixHQUFFLENBQUM7WUFDekMsTUFBTSxhQUFhLENBQUMs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TUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBMkIsQ0FBQztRQUNsRCxJQUFJLE1BQU07WUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFFN0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUF5QixDQUFDO1FBQzlDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7Z0JBQ3RDLHVCQUF1QjtnQkFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzVDLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ04seUVBQXlFO29CQUN6RSxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7b0JBQ3BELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUNELFdBQVcsS0FBSyxDQUFDO0lBQ2pCLEtBQUssS0FBSyxDQUFDO0NBQ2QsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhY2thZ2VKU09OIGZyb20gJy4uLy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRDb25maWdNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vdXRjcC9jb25maWctbWFuYWdlcic7XG5cbm1vZHVsZS5leHBvcnRzID0gRWRpdG9yLlBhbmVsLmRlZmluZSh7XG4gICAgbGlzdGVuZXJzOiB7XG4gICAgICAgIHNob3coKSB7IGNvbnNvbGUubG9nKCdzaG93Jyk7IH0sXG4gICAgICAgIGhpZGUoKSB7IGNvbnNvbGUubG9nKCdoaWRlJyk7IH0sXG4gICAgfSxcbiAgICB0ZW1wbGF0ZTogcmVhZEZpbGVTeW5jKGpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vc3RhdGljL3RlbXBsYXRlL2NvbmZpZ3VyYXRpb24vaW5kZXguaHRtbCcpLCAndXRmLTgnKSxcbiAgICBzdHlsZTogcmVhZEZpbGVTeW5jKGpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vc3RhdGljL3N0eWxlL2NvbmZpZ3VyYXRpb24vaW5kZXguY3NzJyksICd1dGYtOCcpLFxuICAgICQ6IHtcbiAgICAgICAgYXBwOiAnLnBhbmVsJyxcbiAgICAgICAgcG9ydElucHV0OiAnI3BvcnQtaW5wdXQnLFxuICAgICAgICBzYXZlUG9ydEJ0bjogJyNzYXZlLXBvcnQtYnRuJyxcblxuICAgICAgICAvLyBNQ1AgSW50ZWdyYXRpb25cbiAgICAgICAgbWNwQ29uZmlnQ29kZTogJyNtY3AtY29uZmlnLWNvZGUnLFxuICAgICAgICBcbiAgICAgICAgLy8gVVRDUCBDb25maWdcbiAgICAgICAgdXRjcENvbmZpZ1BhdGhJbnB1dDogJyN1dGNwLWNvbmZpZy1wYXRoJyxcbiAgICAgICAgdXRjcENvbmZpZ1BhdGhTYXZlQnRuOiAnI3NhdmUtdXRjcC1wYXRoLWJ0bicsXG4gICAgICAgIGJyaWRnZUxpc3Q6ICcjYnJpZGdlLWNvbnRhaW5lcicsXG4gICAgICAgIGFkZEJyaWRnZUJ0bjogJyNhZGQtYnJpZGdlLWJ0bicsXG4gICAgICAgIG5ld1RlbXBsYXRlSnNvbjogJyNuZXctdGVtcGxhdGUtanNvbicsXG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgVUkgd2l0aCBjb25maWcgcGF0aFxuICAgICAgICAgICAgaWYgKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0KSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0IGFzIGFueSkudmFsdWUgPSBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTG9hZCBQb3J0XG4gICAgICAgICAgICBjb25zdCBwb3J0ID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRDdXJyZW50UG9ydCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuJC5wb3J0SW5wdXQpIHtcbiAgICAgICAgICAgICAgICAodGhpcy4kLnBvcnRJbnB1dCBhcyBhbnkpLnZhbHVlID0gcG9ydCB8fCAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1jcENvZGVCbG9jaygpO1xuICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0IGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICBpZiAobmV3UGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBnZXRDb25maWdNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5zZXRDb25maWdQYXRoKG5ld1BhdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTWNwQ29kZUJsb2NrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTsgLy8gUmVsb2FkIHRlbXBsYXRlcyBmcm9tIG5ldyBwYXRoXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NhdmVkIFVUQ1AgQ29uZmlnIFBhdGg6JywgbmV3UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgdXBkYXRlUG9ydCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcnRWYWwgPSAodGhpcy4kLnBvcnRJbnB1dCBhcyBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHBvcnRWYWwpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFVwZGF0aW5nIHBvcnQgdG86ICR7cG9ydH1gKTtcbiAgICAgICAgICAgIC8vIFNlbmQgbWVzc2FnZSB0byBtYWluIHByb2Nlc3MgdG8gcmVzdGFydCBzZXJ2ZXJcbiAgICAgICAgICAgIEVkaXRvci5NZXNzYWdlLnNlbmQocGFja2FnZUpTT04ubmFtZSwgJ3Jlc3RhcnQtc2VydmVyJywgcG9ydCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlTWNwQ29kZUJsb2NrKCkge1xuICAgICAgICAgICAgY29uc3QgY29kZUVsID0gdGhpcy4kLm1jcENvbmZpZ0NvZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvZGVFbCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gZ2V0Q29uZmlnTWFuYWdlcigpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlnUGF0aCgpO1xuXG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICAgICAgXCJtY3BTZXJ2ZXJzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJjb2RlLW1vZGVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb21tYW5kXCI6IFwibnB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFyZ3NcIjogW1wiLXlcIiwgXCJAdXRjcC9jb2RlLW1vZGUtbWNwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnZcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVVRDUF9DT05GSUdfRklMRVwiOiBjb25maWdQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb2RlRWwudGV4dENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZldGNoQnJpZGdlTGlzdCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuJC5icmlkZ2VMaXN0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0JyaWRnZSBDb25maWcgQ29udGFpbmVyIG5vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2xlYXIgXCJMb2FkaW5nLi4uXCIgb3IgcHJldmlvdXMgY29udGVudFxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gZ2V0Q29uZmlnTWFuYWdlcigpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnTWFuYWdlci5yZWFkQ29uZmlnKCk7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzIHx8IFtdO1xuXG4gICAgICAgICAgICBpZiAodGVtcGxhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweDsgY29sb3I6ICM4ODg7XCI+Tm8gdGVtcGxhdGVzIGZvdW5kLjwvZGl2Pic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBodG1sID0gJyc7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVzLmZvckVhY2goKHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0NvY29zID0gdC5uYW1lID09PSAnQ29jb3NFZGl0b3InO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxCdG4gPSBpc0NvY29zXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBgIC8vIE5vIGRlbGV0ZSBmb3IgQ29jb3NcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYDx1aS1idXR0b24gc2xvdD1cImhlYWRlclwiIHR5cGU9XCJkYW5nZXJcIiBjbGFzcz1cInJlbW92ZS1idG5cIiB0b29sdGlwPVwiUmVtb3ZlIFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aS1pY29uIHZhbHVlPVwiZGVsXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91aS1idXR0b24+YDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJUZXh0ID0gYCR7dC5uYW1lfSAoJHt0LmNhbGxfdGVtcGxhdGVfdHlwZX0pYDtcblxuICAgICAgICAgICAgICAgICAgICBodG1sICs9IGBcbiAgICAgICAgICAgICAgICAgICAgPHVpLXNlY3Rpb24gY2xhc3M9XCJicmlkZ2UtaXRlbS1zZWN0aW9uXCIgZGF0YS1uYW1lPVwiJHt0Lm5hbWV9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHNsb3Q9XCJoZWFkZXJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgd2lkdGg6IDEwMCU7IHBhZGRpbmctcmlnaHQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWxhYmVsPiR7aGVhZGVyVGV4dH08L3VpLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7ZGVsQnRufVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJpZGdlLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWktY29kZSBsYW5ndWFnZT1cImpzb25cIiByZWFkb25seSBpZD1cImNvZGUtJHt0Lm5hbWV9XCI+PC91aS1jb2RlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdWktc2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyBwb3B1bGF0ZSB0aGUgY29kZSB2YWx1ZXMgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVzLmZvckVhY2goKHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAjY29kZS0ke3QubmFtZX1gKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSh0LCBudWxsLCAyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBhZGRCcmlkZ2VUZW1wbGF0ZSgpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy4kLm5ld1RlbXBsYXRlSnNvbiBhcyBhbnk7XG4gICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1RwbCA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgd2l0aCBAdXRjcC9zZGsgb3Igc2ltcGxlIHNjaGVtYVxuICAgICAgICAgICAgICAgIGlmICghbmV3VHBsLm5hbWUgfHwgIW5ld1RwbC5jYWxsX3RlbXBsYXRlX3R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ0ludmFsaWQgdGVtcGxhdGUuIE11c3QgaGF2ZSBuYW1lIGFuZCBjYWxsX3RlbXBsYXRlX3R5cGUuJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gZ2V0Q29uZmlnTWFuYWdlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ01hbmFnZXIucmVhZENvbmZpZygpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZHVwbGljYXRlc1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzLmZpbmQoKHQ6IGFueSkgPT4gdC5uYW1lID09PSBuZXdUcGwubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoYFRlbXBsYXRlICR7bmV3VHBsLm5hbWV9IGFscmVhZHkgZXhpc3RzLmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uZmlnLm1hbnVhbF9jYWxsX3RlbXBsYXRlcy5wdXNoKG5ld1RwbCk7XG4gICAgICAgICAgICAgICAgY29uZmlnTWFuYWdlci53cml0ZUNvbmZpZyhjb25maWcpO1xuICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTtcblxuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgYWxlcnQoJ0ludmFsaWQgSlNPTjogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtb3ZlQnJpZGdlKG5hbWU6IHN0cmluZykge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdDb2Nvc0VkaXRvcicpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghY29uZmlybShgUmVtb3ZlIHRlbXBsYXRlICR7bmFtZX0/YCkpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ01hbmFnZXIucmVhZENvbmZpZygpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5tYW51YWxfY2FsbF90ZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzID0gY29uZmlnLm1hbnVhbF9jYWxsX3RlbXBsYXRlcy5maWx0ZXIoKHQ6IGFueSkgPT4gdC5uYW1lICE9PSBuYW1lKTtcbiAgICAgICAgICAgICAgICBjb25maWdNYW5hZ2VyLndyaXRlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHJlYWR5KCkge1xuICAgICAgICB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgICAgIC8vIExpc3RlbmVyc1xuICAgICAgICBjb25zdCBzYXZlUG9ydCA9IHRoaXMuJC5zYXZlUG9ydEJ0biBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHNhdmVQb3J0KSBzYXZlUG9ydC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMudXBkYXRlUG9ydCgpKTtcblxuICAgICAgICBjb25zdCBzYXZlUGF0aCA9IHRoaXMuJC51dGNwQ29uZmlnUGF0aFNhdmVCdG4gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChzYXZlUGF0aCkgc2F2ZVBhdGguYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNhdmVTZXR0aW5ncygpKTtcblxuICAgICAgICBjb25zdCBhZGRCdG4gPSB0aGlzLiQuYWRkQnJpZGdlQnRuIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoYWRkQnRuKSBhZGRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmFkZEJyaWRnZVRlbXBsYXRlKCkpO1xuXG4gICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLiQuYnJpZGdlTGlzdCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKGxpc3QpIHtcbiAgICAgICAgICAgIGxpc3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGRlbGV0ZSBjbGlja3NcbiAgICAgICAgICAgICAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcucmVtb3ZlLWJ0bicpO1xuICAgICAgICAgICAgICAgIGlmIChidG4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gbmV3IHN0cnVjdHVyZSwgYnRuIGlzIGluc2lkZSAuYnJpZGdlLWl0ZW0tY29udGVudCBpbnNpZGUgdWktc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gYnRuLmNsb3Nlc3QoJy5icmlkZ2UtaXRlbS1zZWN0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uICYmIHNlY3Rpb24uZGF0YXNldC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUJyaWRnZShzZWN0aW9uLmRhdGFzZXQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgYmVmb3JlQ2xvc2UoKSB7IH0sXG4gICAgY2xvc2UoKSB7IH0sXG59KTsiXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/panels/default/index.js b/extensions/cocos-code-mode/dist/panels/default/index.js new file mode 100644 index 0000000..b81525c --- /dev/null +++ b/extensions/cocos-code-mode/dist/panels/default/index.js @@ -0,0 +1,204 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs_extra_1 = require("fs-extra"); +const path_1 = require("path"); +const config_manager_1 = require("../../utcp/config-manager"); +/** + * @zh 如果希望兼容 3.3 之前的版本可以使用下方的代码 + * @en You can add the code below if you want compatibility with versions prior to 3.3 + */ +// Editor.Panel.define = Editor.Panel.define || function(options: any) { return options } +module.exports = Editor.Panel.define({ + listeners: { + show() { console.log('show'); }, + hide() { console.log('hide'); }, + }, + template: (0, fs_extra_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/template/default/index.html'), 'utf-8'), + style: (0, fs_extra_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/style/default/index.css'), 'utf-8'), + $: { + app: '.panel', + portInput: '#port-input', + savePortBtn: '#save-port-btn', + // MCP Integration + mcpConfigCode: '#mcp-config-code', + // UTCP Config + utcpConfigPathInput: '#utcp-config-path', + utcpConfigPathSaveBtn: '#save-utcp-path-btn', + bridgeList: '#bridge-container', + addBridgeBtn: '#add-bridge-btn', + newTemplateJson: '#new-template-json', + }, + methods: { + async loadSettings() { + const configManager = (0, config_manager_1.getConfigManager)(); + await configManager.initialize(); + // Update UI with config path + if (this.$.utcpConfigPathInput) { + this.$.utcpConfigPathInput.value = configManager.getConfigPath(); + } + // Load Port + const port = await configManager.getCurrentPort(); + if (this.$.portInput) { + this.$.portInput.value = port || 0; + } + this.updateMcpCodeBlock(); + this.fetchBridgeList(); + }, + async saveSettings() { + const newPath = this.$.utcpConfigPathInput.value; + if (newPath) { + const configManager = (0, config_manager_1.getConfigManager)(); + await configManager.setConfigPath(newPath); + this.updateMcpCodeBlock(); + this.fetchBridgeList(); // Reload templates from new path + console.log('Saved UTCP Config Path:', newPath); + } + }, + async updatePort() { + const portVal = this.$.portInput.value; + const port = parseInt(portVal); + console.log(`Updating port to: ${port}`); + // Send message to main process to restart server + Editor.Message.send('cocos-code-mode-ai', 'restart-server', port); + }, + updateMcpCodeBlock() { + const codeEl = this.$.mcpConfigCode; + if (!codeEl) + return; + const configManager = (0, config_manager_1.getConfigManager)(); + const configPath = configManager.getConfigPath(); + const config = { + "mcpServers": { + "code-mode": { + "command": "npx", + "args": ["-y", "@utcp/code-mode-mcp"], + "env": { + "UTCP_CONFIG_FILE": configPath + } + } + } + }; + codeEl.textContent = JSON.stringify(config, null, 2); + }, + // Renamed from fetchBridgeList to be more generic 'renderTemplates' logic + fetchBridgeList() { + const container = this.$.bridgeList; + if (!container) { + console.warn('Bridge Config Container not found'); + return; + } + // Clear "Loading..." or previous content + container.innerHTML = ''; + const configManager = (0, config_manager_1.getConfigManager)(); + const config = configManager.readConfig(); + const templates = config.manual_call_templates || []; + console.log('Rendering templates:', templates.length); + if (templates.length === 0) { + container.innerHTML = '
No templates found.
'; + } + else { + let html = ''; + templates.forEach((t) => { + const isCocos = t.name === 'CocosEditor'; + const delBtn = isCocos + ? `` // No delete for Cocos + : ` + + `; + const headerText = `${t.name} (${t.call_template_type})`; + html += ` + +
+ ${headerText} + ${delBtn} +
+
+ +
+
+ `; + }); + container.innerHTML = html; + // Now populate the code values correctly + templates.forEach((t) => { + const el = container.querySelector(`#code-${t.name}`); + if (el) + el.textContent = JSON.stringify(t, null, 2); + }); + } + }, + addBridgeTemplate() { + const input = this.$.newTemplateJson; + if (!input) + return; + const content = input.value.trim(); + if (!content) + return; + try { + let newTpl = JSON.parse(content); + // Validate with @utcp/sdk or simple schema + if (!newTpl.name || !newTpl.call_template_type) { + alert('Invalid template. Must have name and call_template_type.'); + return; + } + const configManager = (0, config_manager_1.getConfigManager)(); + const config = configManager.readConfig(); + // Check duplicates + if (config.manual_call_templates.find((t) => t.name === newTpl.name)) { + alert(`Template ${newTpl.name} already exists.`); + return; + } + config.manual_call_templates.push(newTpl); + configManager.writeConfig(config); + input.value = ''; + this.fetchBridgeList(); + } + catch (e) { + alert('Invalid JSON: ' + e.message); + } + }, + removeBridge(name) { + if (name === 'CocosEditor') + return; + if (!confirm(`Remove template ${name}?`)) + return; + const configManager = (0, config_manager_1.getConfigManager)(); + const config = configManager.readConfig(); + if (config.manual_call_templates) { + config.manual_call_templates = config.manual_call_templates.filter((t) => t.name !== name); + configManager.writeConfig(config); + this.fetchBridgeList(); + } + }, + }, + ready() { + this.loadSettings(); + // Listeners + const savePort = this.$.savePortBtn; + if (savePort) + savePort.addEventListener('click', () => this.updatePort()); + const savePath = this.$.utcpConfigPathSaveBtn; + if (savePath) + savePath.addEventListener('click', () => this.saveSettings()); + const addBtn = this.$.addBridgeBtn; + if (addBtn) + addBtn.addEventListener('click', () => this.addBridgeTemplate()); + const list = this.$.bridgeList; + if (list) { + list.addEventListener('click', (e) => { + // Handle delete clicks + const btn = e.target.closest('.remove-btn'); + if (btn) { + // In new structure, btn is inside .bridge-item-content inside ui-section + const section = btn.closest('.bridge-item-section'); + if (section && section.dataset.name) { + this.removeBridge(section.dataset.name); + } + } + }); + } + }, + beforeClose() { }, + close() { }, +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvcGFuZWxzL2RlZmF1bHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBd0M7QUFDeEMsK0JBQTRCO0FBQzVCLDhEQUE2RDtBQUc3RDs7O0dBR0c7QUFDSCx5RkFBeUY7QUFFekYsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNqQyxTQUFTLEVBQUU7UUFDUCxJQUFJLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2xDO0lBQ0QsUUFBUSxFQUFFLElBQUEsdUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsNkNBQTZDLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDL0YsS0FBSyxFQUFFLElBQUEsdUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUseUNBQXlDLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDeEYsQ0FBQyxFQUFFO1FBQ0MsR0FBRyxFQUFFLFFBQVE7UUFDYixTQUFTLEVBQUUsYUFBYTtRQUN4QixXQUFXLEVBQUUsZ0JBQWdCO1FBRTdCLGtCQUFrQjtRQUNsQixhQUFhLEVBQUUsa0JBQWtCO1FBRWpDLGNBQWM7UUFDZCxtQkFBbUIsRUFBRSxtQkFBbUI7UUFDeEMscUJBQXFCLEVBQUUscUJBQXFCO1FBQzVDLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixlQUFlLEVBQUUsb0JBQW9CO0tBQ3hDO0lBRUQsT0FBTyxFQUFFO1FBQ0wsS0FBSyxDQUFDLFlBQVk7WUFDZCxNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixHQUFFLENBQUM7WUFDekMsTUFBTSxhQUFhLENB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QUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUU1RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQTJCLENBQUM7UUFDbEQsSUFBSSxNQUFNO1lBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBRTdFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBeUIsQ0FBQztRQUM5QyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUN0Qyx1QkFBdUI7Z0JBQ3ZCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNOLHlFQUF5RTtvQkFDekUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVDLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFDRCxXQUFXLEtBQUssQ0FBQztJQUNqQixLQUFLLEtBQUssQ0FBQztDQUNkLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldENvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi8uLi91dGNwL2NvbmZpZy1tYW5hZ2VyJztcbmltcG9ydCB7IENhbGxUZW1wbGF0ZVNlcmlhbGl6ZXIgfSBmcm9tICdAdXRjcC9zZGsnO1xuXG4vKipcbiAqIEB6aCDlpoLmnpzluIzmnJvlhbzlrrkgMy4zIOS5i+WJjeeahOeJiOacrOWPr+S7peS9v+eUqOS4i+aWueeahOS7o+eggVxuICogQGVuIFlvdSBjYW4gYWRkIHRoZSBjb2RlIGJlbG93IGlmIHlvdSB3YW50IGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyBwcmlvciB0byAzLjNcbiAqL1xuLy8gRWRpdG9yLlBhbmVsLmRlZmluZSA9IEVkaXRvci5QYW5lbC5kZWZpbmUgfHwgZnVuY3Rpb24ob3B0aW9uczogYW55KSB7IHJldHVybiBvcHRpb25zIH1cblxubW9kdWxlLmV4cG9ydHMgPSBFZGl0b3IuUGFuZWwuZGVmaW5lKHtcbiAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgc2hvdygpIHsgY29uc29sZS5sb2coJ3Nob3cnKTsgfSxcbiAgICAgICAgaGlkZSgpIHsgY29uc29sZS5sb2coJ2hpZGUnKTsgfSxcbiAgICB9LFxuICAgIHRlbXBsYXRlOiByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9zdGF0aWMvdGVtcGxhdGUvZGVmYXVsdC9pbmRleC5odG1sJyksICd1dGYtOCcpLFxuICAgIHN0eWxlOiByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9zdGF0aWMvc3R5bGUvZGVmYXVsdC9pbmRleC5jc3MnKSwgJ3V0Zi04JyksXG4gICAgJDoge1xuICAgICAgICBhcHA6ICcucGFuZWwnLFxuICAgICAgICBwb3J0SW5wdXQ6ICcjcG9ydC1pbnB1dCcsXG4gICAgICAgIHNhdmVQb3J0QnRuOiAnI3NhdmUtcG9ydC1idG4nLFxuXG4gICAgICAgIC8vIE1DUCBJbnRlZ3JhdGlvblxuICAgICAgICBtY3BDb25maWdDb2RlOiAnI21jcC1jb25maWctY29kZScsXG5cbiAgICAgICAgLy8gVVRDUCBDb25maWdcbiAgICAgICAgdXRjcENvbmZpZ1BhdGhJbnB1dDogJyN1dGNwLWNvbmZpZy1wYXRoJyxcbiAgICAgICAgdXRjcENvbmZpZ1BhdGhTYXZlQnRuOiAnI3NhdmUtdXRjcC1wYXRoLWJ0bicsXG4gICAgICAgIGJyaWRnZUxpc3Q6ICcjYnJpZGdlLWNvbnRhaW5lcicsXG4gICAgICAgIGFkZEJyaWRnZUJ0bjogJyNhZGQtYnJpZGdlLWJ0bicsXG4gICAgICAgIG5ld1RlbXBsYXRlSnNvbjogJyNuZXctdGVtcGxhdGUtanNvbicsXG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgVUkgd2l0aCBjb25maWcgcGF0aFxuICAgICAgICAgICAgaWYgKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0KSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0IGFzIGFueSkudmFsdWUgPSBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTG9hZCBQb3J0XG4gICAgICAgICAgICBjb25zdCBwb3J0ID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRDdXJyZW50UG9ydCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuJC5wb3J0SW5wdXQpIHtcbiAgICAgICAgICAgICAgICAodGhpcy4kLnBvcnRJbnB1dCBhcyBhbnkpLnZhbHVlID0gcG9ydCB8fCAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1jcENvZGVCbG9jaygpO1xuICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0IGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICBpZiAobmV3UGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBnZXRDb25maWdNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5zZXRDb25maWdQYXRoKG5ld1BhdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTWNwQ29kZUJsb2NrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTsgLy8gUmVsb2FkIHRlbXBsYXRlcyBmcm9tIG5ldyBwYXRoXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NhdmVkIFVUQ1AgQ29uZmlnIFBhdGg6JywgbmV3UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgdXBkYXRlUG9ydCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcnRWYWwgPSAodGhpcy4kLnBvcnRJbnB1dCBhcyBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHBvcnRWYWwpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFVwZGF0aW5nIHBvcnQgdG86ICR7cG9ydH1gKTtcbiAgICAgICAgICAgIC8vIFNlbmQgbWVzc2FnZSB0byBtYWluIHByb2Nlc3MgdG8gcmVzdGFydCBzZXJ2ZXJcbiAgICAgICAgICAgIEVkaXRvci5NZXNzYWdlLnNlbmQoJ2NvY29zLWNvZGUtbW9kZS1haScsICdyZXN0YXJ0LXNlcnZlcicsIHBvcnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZU1jcENvZGVCbG9jaygpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVFbCA9IHRoaXMuJC5tY3BDb25maWdDb2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCFjb2RlRWwpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKTtcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgIFwibWNwU2VydmVyc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiY29kZS1tb2RlXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBcIm5weFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmdzXCI6IFtcIi15XCIsIFwiQHV0Y3AvY29kZS1tb2RlLW1jcFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZW52XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVUQ1BfQ09ORklHX0ZJTEVcIjogY29uZmlnUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29kZUVsLnRleHRDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBSZW5hbWVkIGZyb20gZmV0Y2hCcmlkZ2VMaXN0IHRvIGJlIG1vcmUgZ2VuZXJpYyAncmVuZGVyVGVtcGxhdGVzJyBsb2dpY1xuICAgICAgICBmZXRjaEJyaWRnZUxpc3QoKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLiQuYnJpZGdlTGlzdCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdCcmlkZ2UgQ29uZmlnIENvbnRhaW5lciBub3QgZm91bmQnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsZWFyIFwiTG9hZGluZy4uLlwiIG9yIHByZXZpb3VzIGNvbnRlbnRcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ01hbmFnZXIucmVhZENvbmZpZygpO1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gY29uZmlnLm1hbnVhbF9jYWxsX3RlbXBsYXRlcyB8fCBbXTtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlbmRlcmluZyB0ZW1wbGF0ZXM6JywgdGVtcGxhdGVzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4OyBjb2xvcjogIzg4ODtcIj5ObyB0ZW1wbGF0ZXMgZm91bmQuPC9kaXY+JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29jb3MgPSB0Lm5hbWUgPT09ICdDb2Nvc0VkaXRvcic7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbEJ0biA9IGlzQ29jb3NcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGAgLy8gTm8gZGVsZXRlIGZvciBDb2Nvc1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBgPHVpLWJ1dHRvbiBzbG90PVwiaGVhZGVyXCIgdHlwZT1cImRhbmdlclwiIGNsYXNzPVwicmVtb3ZlLWJ0blwiIHRvb2x0aXA9XCJSZW1vdmUgVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gdmFsdWU9XCJkZWxcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VpLWJ1dHRvbj5gO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlclRleHQgPSBgJHt0Lm5hbWV9ICgke3QuY2FsbF90ZW1wbGF0ZV90eXBlfSlgO1xuXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgICAgICAgICAgICA8dWktc2VjdGlvbiBjbGFzcz1cImJyaWRnZS1pdGVtLXNlY3Rpb25cIiBkYXRhLW5hbWU9XCIke3QubmFtZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD1cImhlYWRlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyB3aWR0aDogMTAwJTsgcGFkZGluZy1yaWdodDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWktbGFiZWw+JHtoZWFkZXJUZXh0fTwvdWktbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtkZWxCdG59XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJicmlkZ2UtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aS1jb2RlIGxhbmd1YWdlPVwianNvblwiIHJlYWRvbmx5IGlkPVwiY29kZS0ke3QubmFtZX1cIj48L3VpLWNvZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC91aS1zZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICAgICAgICAgICAgLy8gTm93IHBvcHVsYXRlIHRoZSBjb2RlIHZhbHVlcyBjb3JyZWN0bHlcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYCNjb2RlLSR7dC5uYW1lfWApIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHQsIG51bGwsIDIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGFkZEJyaWRnZVRlbXBsYXRlKCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLiQubmV3VGVtcGxhdGVKc29uIGFzIGFueTtcbiAgICAgICAgICAgIGlmICghaW5wdXQpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VHBsID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB3aXRoIEB1dGNwL3NkayBvciBzaW1wbGUgc2NoZW1hXG4gICAgICAgICAgICAgICAgaWYgKCFuZXdUcGwubmFtZSB8fCAhbmV3VHBsLmNhbGxfdGVtcGxhdGVfdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydCgnSW52YWxpZCB0ZW1wbGF0ZS4gTXVzdCBoYXZlIG5hbWUgYW5kIGNhbGxfdGVtcGxhdGVfdHlwZS4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBnZXRDb25maWdNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnTWFuYWdlci5yZWFkQ29uZmlnKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYW51YWxfY2FsbF90ZW1wbGF0ZXMuZmluZCgodDogYW55KSA9PiB0Lm5hbWUgPT09IG5ld1RwbC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChgVGVtcGxhdGUgJHtuZXdUcGwubmFtZX0gYWxyZWFkeSBleGlzdHMuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzLnB1c2gobmV3VHBsKTtcbiAgICAgICAgICAgICAgICBjb25maWdNYW5hZ2VyLndyaXRlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQnJpZGdlTGlzdCgpO1xuXG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBhbGVydCgnSW52YWxpZCBKU09OOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmVCcmlkZ2UobmFtZTogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ0NvY29zRWRpdG9yJykgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFjb25maXJtKGBSZW1vdmUgdGVtcGxhdGUgJHtuYW1lfT9gKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gZ2V0Q29uZmlnTWFuYWdlcigpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnTWFuYWdlci5yZWFkQ29uZmlnKCk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLm1hbnVhbF9jYWxsX3RlbXBsYXRlcykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5tYW51YWxfY2FsbF90ZW1wbGF0ZXMgPSBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzLmZpbHRlcigodDogYW55KSA9PiB0Lm5hbWUgIT09IG5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ01hbmFnZXIud3JpdGVDb25maWcoY29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQnJpZGdlTGlzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMubG9hZFNldHRpbmdzKCk7XG5cbiAgICAgICAgLy8gTGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHNhdmVQb3J0ID0gdGhpcy4kLnNhdmVQb3J0QnRuIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoc2F2ZVBvcnQpIHNhdmVQb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy51cGRhdGVQb3J0KCkpO1xuXG4gICAgICAgIGNvbnN0IHNhdmVQYXRoID0gdGhpcy4kLnV0Y3BDb25maWdQYXRoU2F2ZUJ0biBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHNhdmVQYXRoKSBzYXZlUGF0aC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2F2ZVNldHRpbmdzKCkpO1xuXG4gICAgICAgIGNvbnN0IGFkZEJ0biA9IHRoaXMuJC5hZGRCcmlkZ2VCdG4gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChhZGRCdG4pIGFkZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuYWRkQnJpZGdlVGVtcGxhdGUoKSk7XG5cbiAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMuJC5icmlkZ2VMaXN0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgbGlzdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZGVsZXRlIGNsaWNrc1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5yZW1vdmUtYnRuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGJ0bikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBuZXcgc3RydWN0dXJlLCBidG4gaXMgaW5zaWRlIC5icmlkZ2UtaXRlbS1jb250ZW50IGluc2lkZSB1aS1zZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBidG4uY2xvc2VzdCgnLmJyaWRnZS1pdGVtLXNlY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbi5kYXRhc2V0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQnJpZGdlKHNlY3Rpb24uZGF0YXNldC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBiZWZvcmVDbG9zZSgpIHsgfSxcbiAgICBjbG9zZSgpIHsgfSxcbn0pOyJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/panels/preview/index.js b/extensions/cocos-code-mode/dist/panels/preview/index.js new file mode 100644 index 0000000..3ea8981 --- /dev/null +++ b/extensions/cocos-code-mode/dist/panels/preview/index.js @@ -0,0 +1,93 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs_1 = require("fs"); +const path_1 = require("path"); +const templateRaw = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/template/preview/index.html'), 'utf-8'); +const styleRaw = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/style/preview/index.css'), 'utf-8'); +module.exports = Editor.Panel.define({ + template: templateRaw, + style: styleRaw, + $: { + container: '#preview-container', + }, + listeners: {}, + methods: { + async generatePreview(uuid, width = 512, height = 512, jpegQuality = 80) { + try { + const info = await Editor.Message.request('asset-db', 'query-asset-info', uuid); + if (!info) + throw new Error("Asset info not found"); + let previewType = ''; + let queryMethod = ''; + switch (info.importer) { + case 'prefab': + case 'fbx': + case 'gltf': + case 'gltf-skeleton': + previewType = 'scene:prefab-preview'; + queryMethod = 'query-prefab-preview-data'; + break; + case 'material': + previewType = 'scene:material-preview'; + queryMethod = 'query-material-preview-data'; + break; + case 'gltf-mesh': + case 'mesh': + previewType = 'scene:mesh-preview'; + queryMethod = 'query-mesh-preview-data'; + break; + case 'spine': + previewType = 'scene:spine-preview'; + queryMethod = 'query-spine-preview-data'; + break; + default: + previewType = 'scene:mini-preview'; + queryMethod = 'query-scene-preview-data'; + break; + } + // @ts-ignore + const GLPreview = Editor._Module.require('PreviewExtends').default; + const glPreview = new GLPreview(previewType, queryMethod); + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + await glPreview.init({ width, height }); + await glPreview.initGL(canvas, { width, height }); + await glPreview.resizeGL(width, height); + // Set Target + const call = async (func, ...args) => { + return await Editor.Message.request('scene', 'call-preview-function', previewType, func, ...args); + }; + if (info.importer === 'prefab' || info.importer === 'scene' || info.importer === 'fbx' || info.importer === 'gltf') { + await call('setPrefab', uuid); + } + else if (info.importer === 'material') { + // Match Inspector implementation + await call('resetCamera'); + await call('setLightEnable', true); + await call('setPrimitive', 'sphere'); + await Editor.Message.request('scene', 'preview-material', uuid); + } + else if (info.importer === 'gltf-mesh') { + await call('setModel', uuid); + } + else if (info.importer === 'spine') { + await call('setSpine', uuid); + } + else { + await call('setScene', uuid); + } + // Draw + const data = await glPreview.queryPreviewData({ width, height }); + glPreview.drawGL(data); + const dataURL = canvas.toDataURL('image/jpeg', jpegQuality); + return dataURL.replace(/^data:image\/\w+;base64,/, ''); + } + catch (error) { + console.error(`[Preview] Error:`, error); + throw new Error(`Generaton failed: ${error.message}`); + } + }, + } +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvcGFuZWxzL3ByZXZpZXcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQkFBa0M7QUFDbEMsK0JBQTRCO0FBRTVCLE1BQU0sV0FBVyxHQUFHLElBQUEsaUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsNkNBQTZDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMxRyxNQUFNLFFBQVEsR0FBRyxJQUFBLGlCQUFZLEVBQUMsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLHlDQUF5QyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFbkcsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNqQyxRQUFRLEVBQUUsV0FBVztJQUNyQixLQUFLLEVBQUUsUUFBUTtJQUNmLENBQUMsRUFBRTtRQUNDLFNBQVMsRUFBRSxvQkFBb0I7S0FDbEM7SUFFRCxTQUFTLEVBQUUsRUFDVjtJQUVELE9BQU8sRUFBRTtRQUNMLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBWSxFQUFFLFFBQWdCLEdBQUcsRUFBRSxTQUFpQixHQUFHLEVBQUUsY0FBc0IsRUFBRTtZQUNuRyxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hGLElBQUksQ0FBQyxJQUFJO29CQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFFbkQsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7Z0JBRXJCLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixLQUFLLFFBQVEsQ0FBQztvQkFDZCxLQUFL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TUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO3FCQUFNLENBQUM7b0JBQ0gsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO2dCQUVELE9BQU87Z0JBQ1AsTUFBTSxJQUFJLEdBQUcsTUFBTSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFFakUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFdkIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBRTVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUUzRCxDQUFDO1lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNMLENBQUM7S0FDSjtDQUNHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcblxuY29uc3QgdGVtcGxhdGVSYXcgPSByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9zdGF0aWMvdGVtcGxhdGUvcHJldmlldy9pbmRleC5odG1sJyksICd1dGYtOCcpO1xuY29uc3Qgc3R5bGVSYXcgPSByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9zdGF0aWMvc3R5bGUvcHJldmlldy9pbmRleC5jc3MnKSwgJ3V0Zi04Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRWRpdG9yLlBhbmVsLmRlZmluZSh7XG4gICAgdGVtcGxhdGU6IHRlbXBsYXRlUmF3LFxuICAgIHN0eWxlOiBzdHlsZVJhdyxcbiAgICAkOiB7XG4gICAgICAgIGNvbnRhaW5lcjogJyNwcmV2aWV3LWNvbnRhaW5lcicsXG4gICAgfSxcbiAgICBcbiAgICBsaXN0ZW5lcnM6IHtcbiAgICB9LFxuICAgIFxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgYXN5bmMgZ2VuZXJhdGVQcmV2aWV3KHV1aWQ6IHN0cmluZywgd2lkdGg6IG51bWJlciA9IDUxMiwgaGVpZ2h0OiBudW1iZXIgPSA1MTIsIGpwZWdRdWFsaXR5OiBudW1iZXIgPSA4MCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1pbmZvJywgdXVpZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgRXJyb3IoXCJBc3NldCBpbmZvIG5vdCBmb3VuZFwiKTtcbiAgICBcbiAgICAgICAgICAgICAgICBsZXQgcHJldmlld1R5cGUgPSAnJztcbiAgICAgICAgICAgICAgICBsZXQgcXVlcnlNZXRob2QgPSAnJztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGluZm8uaW1wb3J0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJlZmFiJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZmJ4JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZ2x0Zic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2dsdGYtc2tlbGV0b24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld1R5cGUgPSAnc2NlbmU6cHJlZmFiLXByZXZpZXcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlNZXRob2QgPSAncXVlcnktcHJlZmFiLXByZXZpZXctZGF0YSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWF0ZXJpYWwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld1R5cGUgPSAnc2NlbmU6bWF0ZXJpYWwtcHJldmlldyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeU1ldGhvZCA9ICdxdWVyeS1tYXRlcmlhbC1wcmV2aWV3LWRhdGEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2dsdGYtbWVzaCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ21lc2gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld1R5cGUgPSAnc2NlbmU6bWVzaC1wcmV2aWV3JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5TWV0aG9kID0gJ3F1ZXJ5LW1lc2gtcHJldmlldy1kYXRhJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGluZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VHlwZSA9ICdzY2VuZTpzcGluZS1wcmV2aWV3JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5TWV0aG9kID0gJ3F1ZXJ5LXNwaW5lLXByZXZpZXctZGF0YSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUeXBlID0gJ3NjZW5lOm1pbmktcHJldmlldyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeU1ldGhvZCA9ICdxdWVyeS1zY2VuZS1wcmV2aWV3LWRhdGEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBHTFByZXZpZXcgPSBFZGl0b3IuX01vZHVsZS5yZXF1aXJlKCdQcmV2aWV3RXh0ZW5kcycpLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2xQcmV2aWV3ID0gbmV3IEdMUHJldmlldyhwcmV2aWV3VHlwZSwgcXVlcnlNZXRob2QpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2xQcmV2aWV3LmluaXQoeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGdsUHJldmlldy5pbml0R0woY2FudmFzLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2xQcmV2aWV3LnJlc2l6ZUdMKHdpZHRoLCBoZWlnaHQpO1xuICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBUYXJnZXRcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsID0gYXN5bmMgKGZ1bmM6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHsgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdjYWxsLXByZXZpZXctZnVuY3Rpb24nLCBwcmV2aWV3VHlwZSwgZnVuYywgLi4uYXJncyk7IFxuICAgICAgICAgICAgICAgIH07XG4gICAgXG4gICAgICAgICAgICAgICAgaWYgKGluZm8uaW1wb3J0ZXIgPT09ICdwcmVmYWInIHx8IGluZm8uaW1wb3J0ZXIgPT09ICdzY2VuZScgfHwgaW5mby5pbXBvcnRlciA9PT0gJ2ZieCcgfHwgaW5mby5pbXBvcnRlciA9PT0gJ2dsdGYnKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNhbGwoJ3NldFByZWZhYicsIHV1aWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5pbXBvcnRlciA9PT0gJ21hdGVyaWFsJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCBJbnNwZWN0b3IgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2FsbCgncmVzZXRDYW1lcmEnKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2FsbCgnc2V0TGlnaHRFbmFibGUnLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2FsbCgnc2V0UHJpbWl0aXZlJywgJ3NwaGVyZScpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdwcmV2aWV3LW1hdGVyaWFsJywgdXVpZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvLmltcG9ydGVyID09PSAnZ2x0Zi1tZXNoJykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYWxsKCdzZXRNb2RlbCcsIHV1aWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5pbXBvcnRlciA9PT0gJ3NwaW5lJykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYWxsKCdzZXRTcGluZScsIHV1aWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYWxsKCdzZXRTY2VuZScsIHV1aWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICAvLyBEcmF3XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdsUHJldmlldy5xdWVyeVByZXZpZXdEYXRhKHsgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBnbFByZXZpZXcuZHJhd0dMKGRhdGEpO1xuICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFVUkwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywganBlZ1F1YWxpdHkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFVUkwucmVwbGFjZSgvXmRhdGE6aW1hZ2VcXC9cXHcrO2Jhc2U2NCwvLCAnJyk7XG4gICAgXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW1ByZXZpZXddIEVycm9yOmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRvbiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9XG59IGFzIGFueSk7XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/scene.js b/extensions/cocos-code-mode/dist/scene.js new file mode 100644 index 0000000..f18b3f3 --- /dev/null +++ b/extensions/cocos-code-mode/dist/scene.js @@ -0,0 +1,168 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.methods = void 0; +exports.load = load; +exports.unload = unload; +function load() { } +function unload() { } +let _originalConsoleError = () => { }; +let _caughtLogs = []; +exports.methods = { + async startCatchLogging() { + _caughtLogs = []; + _originalConsoleError = console.error; + console.error = (...data) => { + const msg = data.map(a => a instanceof Error ? a.message : a).join(' '); + _caughtLogs.push(msg); + _originalConsoleError(...data); + }; + }, + async stopCatchLogging() { + console.error = _originalConsoleError; + return _caughtLogs; + }, + async createPrefabFromNode(nodeUuid, path) { + const cce = globalThis['cce']; + if (!cce || !cce.Prefab || !cce.Prefab.createPrefabAssetFromNode) { + throw new Error('CCE API not found'); + } + return await cce.Prefab.createPrefabAssetFromNode(nodeUuid, path); + }, + async applyPrefabByNode(nodeUuid) { + try { + const cce = globalThis['cce']; + if (!cce || !cce.Prefab || !cce.Prefab.applyPrefab) { + throw new Error('CCE API not found'); + } + const success = await cce.Prefab.applyPrefab(nodeUuid); + if (!success) { + throw new Error('Failed to apply prefab'); + } + else { + return null; + } + } + catch (error) { + return error instanceof Error ? error.message : String(error); + } + }, + async unlinkPrefabByNode(nodeUuid, recursive) { + try { + const cce = globalThis['cce']; + if (!cce || !cce.Prefab || !cce.Prefab.unWrapPrefabInstance) { + throw new Error('CCE API not found'); + } + const success = await cce.Prefab.unWrapPrefabInstance(nodeUuid, recursive); + if (!success) { + throw new Error('Failed to unlink prefab'); + } + else { + return null; + } + } + catch (error) { + return error instanceof Error ? error.message : String(error); + } + }, + async createOffscreenCanvas(width, height) { + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + return canvas; + }, + async captureScreenshot(imageSize = { width: 512, height: 512 }, jpegQuality = 80, cameraPosition, targetPosition, orthographic = false, orthographicSize = 10) { + return new Promise((resolve, reject) => { + var _a, _b, _c, _d, _e, _f, _g, _h; + const cce = globalThis['cce']; + const cc = globalThis['cc']; + let prevWidth; + let prevHeight; + // Optional: Save camera state + let prevCamPos; + let prevCamRot; + let prevProjection; + let prevOrthoSize; + // Apply Camera Changes + try { + if (cce && cce.Camera && cce.Camera.camera) { + const camNode = cce.Camera.camera.node; + if (camNode) { + prevCamPos = camNode.position.clone(); + prevCamRot = camNode.rotation.clone(); + prevProjection = cce.Camera.camera.projection; + prevOrthoSize = cce.Camera.camera.orthoSize; + cce.Camera.camera.projection = orthographic ? + cc.Camera.ProjectionType.ORTHO : cc.Camera.ProjectionType.PERSPECTIVE; + if (orthographic) { + cce.Camera.camera.orthoSize = orthographicSize; + } + if (cameraPosition) { + camNode.setPosition(new cc.Vec3((_a = cameraPosition.x) !== null && _a !== void 0 ? _a : 0, (_b = cameraPosition.y) !== null && _b !== void 0 ? _b : 0, (_c = cameraPosition.z) !== null && _c !== void 0 ? _c : 0)); + } + if (targetPosition) { + camNode.lookAt(new cc.Vec3((_d = targetPosition.x) !== null && _d !== void 0 ? _d : 0, (_e = targetPosition.y) !== null && _e !== void 0 ? _e : 0, (_f = targetPosition.z) !== null && _f !== void 0 ? _f : 0)); + } + if (cce.Camera.refresh) + cce.Camera.refresh(); + } + } + } + catch (e) { + console.warn("[captureScreenshot] Failed to modify camera:", e); + } + if (cc.director && cc.director.root) { + prevWidth = ((_g = cc.director.root.mainWindow) === null || _g === void 0 ? void 0 : _g.width) || 0; + prevHeight = ((_h = cc.director.root.mainWindow) === null || _h === void 0 ? void 0 : _h.height) || 0; + cc.director.root.resize(imageSize.width, imageSize.height); + } + else { + return reject(new Error("cc.game.canvas not found or is not an HTMLCanvasElement")); + } + try { + if (cce && cce.Engine) { + cce.Engine.repaintInEditMode(); + } + } + catch (e) { + console.warn("Failed to repaintInEditMode:", e); + } + cc.director.once(cc.Director.EVENT_AFTER_RENDER, () => { + try { + if (cc.game && cc.game.canvas && (cc.game.canvas instanceof HTMLCanvasElement)) { + const dataURL = cc.game.canvas.toDataURL('image/jpeg', jpegQuality / 100); + const base64 = dataURL.replace(/^data:image\/\w+;base64,/, ''); + resolve(base64); + } + else { + reject(new Error("cc.game.canvas not found or is not an HTMLCanvasElement")); + } + } + catch (error) { + reject(new Error(error.message || String(error))); + } + finally { + // Restore previous size + if (cc.director && cc.director.root) { + cc.director.root.resize(prevWidth, prevHeight); + } + // Restore camera + setTimeout(() => { + if (cce && cce.Camera && cce.Camera.camera && cce.Camera.camera.node) { + if (prevCamPos) + cce.Camera.camera.node.setPosition(prevCamPos); + if (prevCamRot) + cce.Camera.camera.node.setRotation(prevCamRot); + if (prevProjection !== undefined) + cce.Camera.camera.projection = prevProjection; + if (prevOrthoSize !== undefined) + cce.Camera.camera.orthoSize = prevOrthoSize; + if (cce.Camera.refresh) + cce.Camera.refresh(); + } + }, 50); + } + }); + }); + } +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zb3VyY2Uvc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0JBQTBCO0FBQzFCLHdCQUE0QjtBQUQ1QixTQUFnQixJQUFJLEtBQUssQ0FBQztBQUMxQixTQUFnQixNQUFNLEtBQUssQ0FBQztBQUM1QixJQUFJLHFCQUFxQixHQUFpQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEUsSUFBSSxXQUFXLEdBQWEsRUFBRSxDQUFDO0FBRWxCLFFBQUEsT0FBTyxHQUFHO0lBQ25CLEtBQUssQ0FBQyxpQkFBaUI7UUFDbkIsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixxQkFBcUIsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFO1lBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEUsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixxQkFBcUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQTtJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ2xCLE9BQU8sQ0FBQyxLQUFLLEdBQUcscUJBQXFCLENBQUM7UUFDdEMsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLElBQVk7UUFDckQsTUFBTSxHQUFHLEdBQUksVUFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsR0FBRyxJQUFJLENB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QUMsQ0FBQztnQkFDWCxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGxvYWQoKSB7IH1cbmV4cG9ydCBmdW5jdGlvbiB1bmxvYWQoKSB7IH1cbmxldCBfb3JpZ2luYWxDb25zb2xlRXJyb3I6ICguLi5kYXRhOiB1bmtub3duW10pID0+IHZvaWQgPSAoKSA9PiB7IH07XG5sZXQgX2NhdWdodExvZ3M6IHN0cmluZ1tdID0gW107XG5cbmV4cG9ydCBjb25zdCBtZXRob2RzID0ge1xuICAgIGFzeW5jIHN0YXJ0Q2F0Y2hMb2dnaW5nKCkge1xuICAgICAgICBfY2F1Z2h0TG9ncyA9IFtdO1xuICAgICAgICBfb3JpZ2luYWxDb25zb2xlRXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBjb25zb2xlLmVycm9yID0gKC4uLmRhdGE6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gZGF0YS5tYXAoYSA9PiBhIGluc3RhbmNlb2YgRXJyb3IgPyBhLm1lc3NhZ2UgOiBhKS5qb2luKCcgJyk7XG4gICAgICAgICAgICBfY2F1Z2h0TG9ncy5wdXNoKG1zZyk7XG4gICAgICAgICAgICBfb3JpZ2luYWxDb25zb2xlRXJyb3IoLi4uZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgc3RvcENhdGNoTG9nZ2luZygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IgPSBfb3JpZ2luYWxDb25zb2xlRXJyb3I7XG4gICAgICAgIHJldHVybiBfY2F1Z2h0TG9ncztcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlUHJlZmFiRnJvbU5vZGUobm9kZVV1aWQ6IHN0cmluZywgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgY2NlID0gKGdsb2JhbFRoaXMgYXMgYW55KVsnY2NlJ107XG4gICAgICAgIFxuICAgICAgICBpZiAoIWNjZSB8fCAhY2NlLlByZWZhYiB8fCAhY2NlLlByZWZhYi5jcmVhdGVQcmVmYWJBc3NldEZyb21Ob2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NDRSBBUEkgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgY2NlLlByZWZhYi5jcmVhdGVQcmVmYWJBc3NldEZyb21Ob2RlKG5vZGVVdWlkLCBwYXRoKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgYXBwbHlQcmVmYWJCeU5vZGUobm9kZVV1aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2NlID0gKGdsb2JhbFRoaXMgYXMgYW55KVsnY2NlJ107XG4gICAgICAgICAgICBpZiAoIWNjZSB8fCAhY2NlLlByZWZhYiB8fCAhY2NlLlByZWZhYi5hcHBseVByZWZhYikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ0NFIEFQSSBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzczogYm9vbGVhbiA9IGF3YWl0IGNjZS5QcmVmYWIuYXBwbHlQcmVmYWIobm9kZVV1aWQpO1xuICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gYXBwbHkgcHJlZmFiJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyB1bmxpbmtQcmVmYWJCeU5vZGUobm9kZVV1aWQ6IHN0cmluZywgcmVjdXJzaXZlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjY2UgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpWydjY2UnXTtcbiAgICAgICAgICAgIGlmICghY2NlIHx8ICFjY2UuUHJlZmFiIHx8ICFjY2UuUHJlZmFiLnVuV3JhcFByZWZhYkluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDQ0UgQVBJIG5vdCBmb3VuZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgY2NlLlByZWZhYi51bldyYXBQcmVmYWJJbnN0YW5jZShub2RlVXVpZCwgcmVjdXJzaXZlKTtcbiAgICAgICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHVubGluayBwcmVmYWInKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVPZmZzY3JlZW5DYW52YXMod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPEhUTUxDYW52YXNFbGVtZW50PiB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICB9LFxuXG4gICAgYXN5bmMgY2FwdHVyZVNjcmVlbnNob3QoXG4gICAgICAgIGltYWdlU2l6ZTogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciB9ID0geyB3aWR0aDogNTEyLCBoZWlnaHQ6IDUxMiB9LCBcbiAgICAgICAganBlZ1F1YWxpdHk6IG51bWJlciA9IDgwLFxuICAgICAgICBjYW1lcmFQb3NpdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciB9LFxuICAgICAgICB0YXJnZXRQb3NpdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciB9LFxuICAgICAgICBvcnRob2dyYXBoaWM6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgb3J0aG9ncmFwaGljU2l6ZTogbnVtYmVyID0gMTBcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2NlID0gKGdsb2JhbFRoaXMgYXMgYW55KVsnY2NlJ107XG4gICAgICAgICAgICBjb25zdCBjYyA9IChnbG9iYWxUaGlzIGFzIGFueSlbJ2NjJ107XG5cbiAgICAgICAgICAgIGxldCBwcmV2V2lkdGg6IG51bWJlcjtcbiAgICAgICAgICAgIGxldCBwcmV2SGVpZ2h0OiBudW1iZXI7XG5cbiAgICAgICAgICAgIC8vIE9wdGlvbmFsOiBTYXZlIGNhbWVyYSBzdGF0ZVxuICAgICAgICAgICAgbGV0IHByZXZDYW1Qb3M6IGFueTtcbiAgICAgICAgICAgIGxldCBwcmV2Q2FtUm90OiBhbnk7XG4gICAgICAgICAgICBsZXQgcHJldlByb2plY3Rpb246IG51bWJlcjtcbiAgICAgICAgICAgIGxldCBwcmV2T3J0aG9TaXplOiBudW1iZXI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEFwcGx5IENhbWVyYSBDaGFuZ2VzXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChjY2UgJiYgY2NlLkNhbWVyYSAmJiBjY2UuQ2FtZXJhLmNhbWVyYSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1Ob2RlID0gY2NlLkNhbWVyYS5jYW1lcmEubm9kZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FtTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNhbVBvcyA9IGNhbU5vZGUucG9zaXRpb24uY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDYW1Sb3QgPSBjYW1Ob2RlLnJvdGF0aW9uLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2UHJvamVjdGlvbiA9IGNjZS5DYW1lcmEuY2FtZXJhLnByb2plY3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2T3J0aG9TaXplID0gY2NlLkNhbWVyYS5jYW1lcmEub3J0aG9TaXplO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjY2UuQ2FtZXJhLmNhbWVyYS5wcm9qZWN0aW9uID0gb3J0aG9ncmFwaGljID8gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MuQ2FtZXJhLlByb2plY3Rpb25UeXBlLk9SVEhPIDogY2MuQ2FtZXJhLlByb2plY3Rpb25UeXBlLlBFUlNQRUNUSVZFO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3J0aG9ncmFwaGljKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NlLkNhbWVyYS5jYW1lcmEub3J0aG9TaXplID0gb3J0aG9ncmFwaGljU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWVyYVBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtTm9kZS5zZXRQb3NpdGlvbihuZXcgY2MuVmVjMyhjYW1lcmFQb3NpdGlvbi54ID8/IDAsIGNhbWVyYVBvc2l0aW9uLnkgPz8gMCwgY2FtZXJhUG9zaXRpb24ueiA/PyAwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1Ob2RlLmxvb2tBdChuZXcgY2MuVmVjMyh0YXJnZXRQb3NpdGlvbi54ID8/IDAsIHRhcmdldFBvc2l0aW9uLnkgPz8gMCwgdGFyZ2V0UG9zaXRpb24ueiA/PyAwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjY2UuQ2FtZXJhLnJlZnJlc2gpIGNjZS5DYW1lcmEucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIltjYXB0dXJlU2NyZWVuc2hvdF0gRmFpbGVkIHRvIG1vZGlmeSBjYW1lcmE6XCIsIGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2MuZGlyZWN0b3IgJiYgY2MuZGlyZWN0b3Iucm9vdCkge1xuICAgICAgICAgICAgICAgIHByZXZXaWR0aCA9IGNjLmRpcmVjdG9yLnJvb3QubWFpbldpbmRvdz8ud2lkdGggfHwgMDtcbiAgICAgICAgICAgICAgICBwcmV2SGVpZ2h0ID0gY2MuZGlyZWN0b3Iucm9vdC5tYWluV2luZG93Py5oZWlnaHQgfHwgMDtcbiAgICAgICAgICAgICAgICBjYy5kaXJlY3Rvci5yb290LnJlc2l6ZShpbWFnZVNpemUud2lkdGgsIGltYWdlU2l6ZS5oZWlnaHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNjLmdhbWUuY2FudmFzIG5vdCBmb3VuZCBvciBpcyBub3QgYW4gSFRNTENhbnZhc0VsZW1lbnRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChjY2UgJiYgY2NlLkVuZ2luZSkge1xuICAgICAgICAgICAgICAgICAgICBjY2UuRW5naW5lLnJlcGFpbnRJbkVkaXRNb2RlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gcmVwYWludEluRWRpdE1vZGU6XCIsIGUpOyB9XG5cbiAgICAgICAgICAgIGNjLmRpcmVjdG9yLm9uY2UoY2MuRGlyZWN0b3IuRVZFTlRfQUZURVJfUkVOREVSLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNjLmdhbWUgJiYgY2MuZ2FtZS5jYW52YXMgJiYgKGNjLmdhbWUuY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhVVJMID0gY2MuZ2FtZS5jYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywganBlZ1F1YWxpdHkgLyAxMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTY0ID0gZGF0YVVSTC5yZXBsYWNlKC9eZGF0YTppbWFnZVxcL1xcdys7YmFzZTY0LC8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYmFzZTY0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJjYy5nYW1lLmNhbnZhcyBub3QgZm91bmQgb3IgaXMgbm90IGFuIEhUTUxDYW52YXNFbGVtZW50XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzaXplXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYy5kaXJlY3RvciAmJiBjYy5kaXJlY3Rvci5yb290KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYy5kaXJlY3Rvci5yb290LnJlc2l6ZShwcmV2V2lkdGgsIHByZXZIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgY2FtZXJhXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjZSAmJiBjY2UuQ2FtZXJhICYmIGNjZS5DYW1lcmEuY2FtZXJhICYmIGNjZS5DYW1lcmEuY2FtZXJhLm5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkNhbVBvcykgY2NlLkNhbWVyYS5jYW1lcmEubm9kZS5zZXRQb3NpdGlvbihwcmV2Q2FtUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkNhbVJvdCkgY2NlLkNhbWVyYS5jYW1lcmEubm9kZS5zZXRSb3RhdGlvbihwcmV2Q2FtUm90KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldlByb2plY3Rpb24gIT09IHVuZGVmaW5lZCkgY2NlLkNhbWVyYS5jYW1lcmEucHJvamVjdGlvbiA9IHByZXZQcm9qZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2T3J0aG9TaXplICE9PSB1bmRlZmluZWQpIGNjZS5DYW1lcmEuY2FtZXJhLm9ydGhvU2l6ZSA9IHByZXZPcnRob1NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjZS5DYW1lcmEucmVmcmVzaCkgY2NlLkNhbWVyYS5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/config-manager.js b/extensions/cocos-code-mode/dist/utcp/config-manager.js new file mode 100644 index 0000000..32103f6 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/config-manager.js @@ -0,0 +1,121 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UtcpConfigManager = void 0; +exports.getConfigManager = getConfigManager; +const fs_extra_1 = require("fs-extra"); +const path_1 = require("path"); +const os_1 = require("os"); +// @ts-ignore +const package_json_1 = __importDefault(require("../../package.json")); +class UtcpConfigManager { + constructor() { + this.configPath = ''; + } + static getInstance() { + if (!UtcpConfigManager.instance) { + UtcpConfigManager.instance = new UtcpConfigManager(); + } + return UtcpConfigManager.instance; + } + async initialize() { + const savedPath = await Editor.Profile.getConfig(package_json_1.default.name, 'utcpConfigPath'); + if (savedPath && typeof savedPath === 'string') { + this.configPath = savedPath; + } + else { + this.configPath = (0, path_1.join)((0, os_1.homedir)(), '.utcp_config.json'); + } + console.log(`[UtcpConfigManager] Initialized with config path: ${this.configPath}`); + } + getConfigPath() { + if (!this.configPath) { + this.configPath = (0, path_1.join)((0, os_1.homedir)(), '.utcp_config.json'); + } + return this.configPath; + } + async setConfigPath(path) { + this.configPath = path; + await Editor.Profile.setConfig(package_json_1.default.name, 'utcpConfigPath', path); + console.log(`[UtcpConfigManager] Config path updated to: ${path}`); + } + readConfig() { + const path = this.getConfigPath(); + if (path && (0, fs_extra_1.existsSync)(path)) { + try { + const content = (0, fs_extra_1.readFileSync)(path, 'utf-8'); + return JSON.parse(content); + } + catch (e) { + console.error('[UtcpConfigManager] Failed to parse UTCP config:', e); + return { manual_call_templates: [] }; + } + } + return { manual_call_templates: [] }; + } + writeConfig(config) { + const path = this.getConfigPath(); + if (!path) { + console.error('[UtcpConfigManager] Config path is not set'); + return; + } + try { + (0, fs_extra_1.writeFileSync)(path, JSON.stringify(config, null, 2)); + console.log(`[UtcpConfigManager] Saved UTCP config to ${path}`); + } + catch (e) { + console.error('[UtcpConfigManager] Failed to write UTCP config:', e); + } + } + async ensureCocosEditorTemplate(port) { + if (!port || port <= 0) { + console.warn('[UtcpConfigManager] Invalid port provided:', port); + return false; + } + const expectedUrl = `http://localhost:${port}/utcp`; + const config = this.readConfig(); + if (!config.manual_call_templates) { + config.manual_call_templates = []; + } + const templates = config.manual_call_templates; + const idx = templates.findIndex((t) => t.name === 'CocosEditor'); + let changed = false; + if (idx === -1) { + templates.push({ + name: 'CocosEditor', + call_template_type: 'http', + url: expectedUrl, + http_method: 'GET', + content_type: 'application/json', + }); + changed = true; + console.log(`[UtcpConfigManager] Created CocosEditor template with port ${port}`); + } + else { + if (templates[idx].url !== expectedUrl) { + templates[idx].url = expectedUrl; + changed = true; + console.log(`[UtcpConfigManager] Updated CocosEditor template port to ${port}`); + } + } + if (changed) { + this.writeConfig(config); + } + return changed; + } + async getCurrentPort() { + const port = await Editor.Profile.getConfig(package_json_1.default.name, 'serverPort'); + return typeof port === 'number' ? port : 0; + } + async updatePort(port) { + await Editor.Profile.setConfig(package_json_1.default.name, 'serverPort', port); + await this.ensureCocosEditorTemplate(port); + } +} +exports.UtcpConfigManager = UtcpConfigManager; +function getConfigManager() { + return UtcpConfigManager.getInstance(); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvdXRjcC9jb25maWctbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUE2SEEsNENBRUM7QUEvSEQsdUNBQW1FO0FBQ25FLCtCQUE0QjtBQUM1QiwyQkFBNkI7QUFFN0IsYUFBYTtBQUNiLHNFQUE2QztBQUc3QyxNQUFhLGlCQUFpQjtJQUkxQjtRQUZRLGVBQVUsR0FBVyxFQUFFLENBQUM7SUFFVCxDQUFDO0lBRXhCLE1BQU0sQ0FBQyxXQUFXO1FBQ2QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDekQsQ0FBQztRQUNELE9BQU8saUJBQWlCLENBQUMsUUFBUSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVTtRQUNaLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsc0JBQVcsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRixJQUFJLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUNoQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBQSxXQUFJLEVBQUMsSUFBQSxZQUFPLEdBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLHFEQUFxRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsYUFBYTtRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFBLFdB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Q0o7QUFuSEQsOENBbUhDO0FBRUQsU0FBZ0IsZ0JBQWdCO0lBQzVCLE9BQU8saUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYywgZXhpc3RzU3luYyB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcyc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBwYWNrYWdlSlNPTiBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nO1xuXG5cbmV4cG9ydCBjbGFzcyBVdGNwQ29uZmlnTWFuYWdlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFV0Y3BDb25maWdNYW5hZ2VyO1xuICAgIHByaXZhdGUgY29uZmlnUGF0aDogc3RyaW5nID0gJyc7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBVdGNwQ29uZmlnTWFuYWdlciB7XG4gICAgICAgIGlmICghVXRjcENvbmZpZ01hbmFnZXIuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFV0Y3BDb25maWdNYW5hZ2VyLmluc3RhbmNlID0gbmV3IFV0Y3BDb25maWdNYW5hZ2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFV0Y3BDb25maWdNYW5hZ2VyLmluc3RhbmNlO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHNhdmVkUGF0aCA9IGF3YWl0IEVkaXRvci5Qcm9maWxlLmdldENvbmZpZyhwYWNrYWdlSlNPTi5uYW1lLCAndXRjcENvbmZpZ1BhdGgnKTtcbiAgICAgICAgaWYgKHNhdmVkUGF0aCAmJiB0eXBlb2Ygc2F2ZWRQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5jb25maWdQYXRoID0gc2F2ZWRQYXRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb25maWdQYXRoID0gam9pbihob21lZGlyKCksICcudXRjcF9jb25maWcuanNvbicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBbVXRjcENvbmZpZ01hbmFnZXJdIEluaXRpYWxpemVkIHdpdGggY29uZmlnIHBhdGg6ICR7dGhpcy5jb25maWdQYXRofWApO1xuICAgIH1cblxuICAgIGdldENvbmZpZ1BhdGgoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnUGF0aCA9IGpvaW4oaG9tZWRpcigpLCAnLnV0Y3BfY29uZmlnLmpzb24nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdQYXRoO1xuICAgIH1cblxuICAgIGFzeW5jIHNldENvbmZpZ1BhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29uZmlnUGF0aCA9IHBhdGg7XG4gICAgICAgIGF3YWl0IEVkaXRvci5Qcm9maWxlLnNldENvbmZpZyhwYWNrYWdlSlNPTi5uYW1lLCAndXRjcENvbmZpZ1BhdGgnLCBwYXRoKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtVdGNwQ29uZmlnTWFuYWdlcl0gQ29uZmlnIHBhdGggdXBkYXRlZCB0bzogJHtwYXRofWApO1xuICAgIH1cblxuICAgIHJlYWRDb25maWcoKTogYW55IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuZ2V0Q29uZmlnUGF0aCgpO1xuICAgICAgICBpZiAocGF0aCAmJiBleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1V0Y3BDb25maWdNYW5hZ2VyXSBGYWlsZWQgdG8gcGFyc2UgVVRDUCBjb25maWc6JywgZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWFudWFsX2NhbGxfdGVtcGxhdGVzOiBbXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1hbnVhbF9jYWxsX3RlbXBsYXRlczogW10gfTtcbiAgICB9XG5cbiAgICB3cml0ZUNvbmZpZyhjb25maWc6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5nZXRDb25maWdQYXRoKCk7XG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1V0Y3BDb25maWdNYW5hZ2VyXSBDb25maWcgcGF0aCBpcyBub3Qgc2V0Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1V0Y3BDb25maWdNYW5hZ2VyXSBTYXZlZCBVVENQIGNvbmZpZyB0byAke3BhdGh9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tVdGNwQ29uZmlnTWFuYWdlcl0gRmFpbGVkIHRvIHdyaXRlIFVUQ1AgY29uZmlnOicsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZW5zdXJlQ29jb3NFZGl0b3JUZW1wbGF0ZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKCFwb3J0IHx8IHBvcnQgPD0gMCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbVXRjcENvbmZpZ01hbmFnZXJdIEludmFsaWQgcG9ydCBwcm92aWRlZDonLCBwb3J0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkVXJsID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fS91dGNwYDtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5yZWFkQ29uZmlnKCk7XG5cbiAgICAgICAgaWYgKCFjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzKSB7XG4gICAgICAgICAgICBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzO1xuICAgICAgICBjb25zdCBpZHggPSB0ZW1wbGF0ZXMuZmluZEluZGV4KCh0OiBhbnkpID0+IHQubmFtZSA9PT0gJ0NvY29zRWRpdG9yJyk7XG5cbiAgICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29jb3NFZGl0b3InLFxuICAgICAgICAgICAgICAgIGNhbGxfdGVtcGxhdGVfdHlwZTogJ2h0dHAnLFxuICAgICAgICAgICAgICAgIHVybDogZXhwZWN0ZWRVcmwsXG4gICAgICAgICAgICAgICAgaHR0cF9tZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbVXRjcENvbmZpZ01hbmFnZXJdIENyZWF0ZWQgQ29jb3NFZGl0b3IgdGVtcGxhdGUgd2l0aCBwb3J0ICR7cG9ydH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZXNbaWR4XS51cmwgIT09IGV4cGVjdGVkVXJsKSB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVzW2lkeF0udXJsID0gZXhwZWN0ZWRVcmw7XG4gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtVdGNwQ29uZmlnTWFuYWdlcl0gVXBkYXRlZCBDb2Nvc0VkaXRvciB0ZW1wbGF0ZSBwb3J0IHRvICR7cG9ydH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRDdXJyZW50UG9ydCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBwb3J0ID0gYXdhaXQgRWRpdG9yLlByb2ZpbGUuZ2V0Q29uZmlnKHBhY2thZ2VKU09OLm5hbWUsICdzZXJ2ZXJQb3J0Jyk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcG9ydCA9PT0gJ251bWJlcicgPyBwb3J0IDogMDtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVQb3J0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBFZGl0b3IuUHJvZmlsZS5zZXRDb25maWcocGFja2FnZUpTT04ubmFtZSwgJ3NlcnZlclBvcnQnLCBwb3J0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVDb2Nvc0VkaXRvclRlbXBsYXRlKHBvcnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ01hbmFnZXIoKTogVXRjcENvbmZpZ01hbmFnZXIge1xuICAgIHJldHVybiBVdGNwQ29uZmlnTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xufVxuIl19 \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/decorators.js b/extensions/cocos-code-mode/dist/utcp/decorators.js new file mode 100644 index 0000000..130b045 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/decorators.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ToolRegistry = void 0; +exports.utcpTool = utcpTool; +class ToolRegistry { + static register(options) { + this.tools.set(options.tool.name, options); + } + static getTools() { + return Array.from(this.tools.values()); + } +} +exports.ToolRegistry = ToolRegistry; +ToolRegistry.tools = new Map(); +function utcpTool(name, description, inputs, outputs, httpMethod, tags = []) { + return function (target, propertyKey, descriptor) { + if (!descriptor) + return; + ToolRegistry.register({ + method: descriptor.value, + target, + tool: { + name, + description, + inputs, + outputs, + tags, + tool_call_template: { + call_template_type: "http", + http_method: httpMethod, + request_body_format: "json", + url: `/tools/${name}`, + content_type: "application/json" + }, + } + }); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS91dGNwL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBcUJBLDRCQXVCQztBQW5DRCxNQUFhLFlBQVk7SUFHckIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFxQjtRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVE7UUFDWCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7O0FBVEwsb0NBVUM7QUFUa0Isa0JBQUssR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQVdoRSxTQUFnQixRQUFRLENBQUMsSUFBWSxFQUFFLFdBQW1CLEVBQUUsTUFBa0IsRUFBRSxPQUFtQixFQUFFLFVBQXVELEVBQUUsT0FBaUIsRUFBRTtJQUM3SyxPQUFPLFVBQVUsTUFBVyxFQUFFLFdBQW1CLEVBQUUsVUFBK0I7UUFDOUUsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBRXhCLFlBQVksQ0FBQyxRQUFRLENBQUM7WUFDbEIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQ3hCLE1BQU07WUFDTixJQUFJLEVBQUU7Z0JBQ0YsSUFBSTtnQkFDSixXQUFXO2dCQUNYLE1BQU07Z0JBQ04sT0FBTztnQkFDUCxJQUFJO2dCQUNKLGtCQUFrQixFQUFFO29CQUNoQixrQkFBa0IsRUFBRSxNQUFNO29CQUMxQixXQUFXLEVBQUUsVUFBVTtvQkFDdkIsbUJBQW1CLEVBQUUsTUFBTTtvQkFDM0IsR0FBRyxFQUFFLFVBQVUsSUFBSSxFQUFFO29CQUNyQixZQUFZLEVBQUUsa0JBQWtCO2lCQUNmO2FBQ3hCO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDYWxsVGVtcGxhdGUgfSBmcm9tICdAdXRjcC9odHRwJztcbmltcG9ydCB7IEpzb25TY2hlbWEsIFRvb2wgfSBmcm9tICdAdXRjcC9zZGsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xNZXRhZGF0YSB7XG4gICAgbWV0aG9kOiBGdW5jdGlvbjtcbiAgICB0YXJnZXQ6IGFueTtcbiAgICB0b29sOiBUb29sO1xufVxuXG5leHBvcnQgY2xhc3MgVG9vbFJlZ2lzdHJ5IHtcbiAgICBwcml2YXRlIHN0YXRpYyB0b29sczogTWFwPHN0cmluZywgVG9vbE1ldGFkYXRhPiA9IG5ldyBNYXAoKTtcblxuICAgIHN0YXRpYyByZWdpc3RlcihvcHRpb25zOiBUb29sTWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy50b29scy5zZXQob3B0aW9ucy50b29sLm5hbWUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRUb29scygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy50b29scy52YWx1ZXMoKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXRjcFRvb2wobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBpbnB1dHM6IEpzb25TY2hlbWEsIG91dHB1dHM6IEpzb25TY2hlbWEsIGh0dHBNZXRob2Q6ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnREVMRVRFJyB8ICdQQVRDSCcsIHRhZ3M6IHN0cmluZ1tdID0gW10pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmICghZGVzY3JpcHRvcikgcmV0dXJuO1xuXG4gICAgICAgIFRvb2xSZWdpc3RyeS5yZWdpc3Rlcih7XG4gICAgICAgICAgICBtZXRob2Q6IGRlc2NyaXB0b3IudmFsdWUsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICB0b29sOiB7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgICAgICAgICB0YWdzLFxuICAgICAgICAgICAgICAgIHRvb2xfY2FsbF90ZW1wbGF0ZToge1xuICAgICAgICAgICAgICAgICAgICBjYWxsX3RlbXBsYXRlX3R5cGU6IFwiaHR0cFwiLFxuICAgICAgICAgICAgICAgICAgICBodHRwX21ldGhvZDogaHR0cE1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9ib2R5X2Zvcm1hdDogXCJqc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIHVybDogYC90b29scy8ke25hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgICAgIH0gYXMgSHR0cENhbGxUZW1wbGF0ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/schemas.js b/extensions/cocos-code-mode/dist/utcp/schemas.js new file mode 100644 index 0000000..37f0863 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/schemas.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SceneTreeItemSchema = exports.AssetTreeItemSchema = exports.Base64ImageSchema = exports.SuccessIndicatorSchema = exports.InstanceReferenceSchema = void 0; +// -=-=-=-=-=- Zod schemas for different result types -=-=-=-=-=- +exports.InstanceReferenceSchema = { type: 'object', properties: { id: { type: 'string' }, type: { type: 'string' } }, required: ['id'] }; +exports.SuccessIndicatorSchema = { type: 'object', properties: { success: { type: 'boolean' }, error: { type: 'string' } }, required: ['success'] }; +exports.Base64ImageSchema = { type: 'object', properties: { type: { type: 'string', const: "image" }, data: { type: 'string' }, mimeType: { type: 'string' } }, required: ['type', 'data', 'mimeType'] }; +exports.AssetTreeItemSchema = { + type: 'object', + properties: { + filesystemPath: { type: 'string' }, + reference: exports.InstanceReferenceSchema, + name: { type: 'string' }, + children: { type: 'array', items: { type: 'object' } } + }, required: ['reference', 'name', 'type', 'children'] +}; +exports.SceneTreeItemSchema = { + type: 'object', + properties: { + path: { type: 'string' }, + reference: exports.InstanceReferenceSchema, + name: { type: 'string' }, + active: { type: 'boolean' }, + components: { + type: 'array', + items: exports.InstanceReferenceSchema + }, + children: { type: 'array', items: { type: 'object' } } + }, required: ['reference', 'name', 'active', 'components', 'children'] +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS91dGNwL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMENBLGlFQUFpRTtBQUVwRCxRQUFBLHVCQUF1QixHQUFlLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUM3SSxRQUFBLHNCQUFzQixHQUFlLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztBQUN2SixRQUFBLGlCQUFpQixHQUFlLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO0FBRTdNLFFBQUEsbUJBQW1CLEdBQWU7SUFDM0MsSUFBSSxFQUFFLFFBQVE7SUFDZCxVQUFVLEVBQUU7UUFDUixjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDO1FBQ2pDLFNBQVMsRUFBRSwrQkFBdUI7UUFDbEMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtRQUN4QixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTtLQUN6RCxFQUFFLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQztDQUN6RCxDQUFDO0FBRVcsUUFBQSxtQkFBbUIsR0FBZTtJQUMzQyxJQUFJLEVBQUUsUUFBUTtJQUNkLFVBQVUsRUFBRTtRQUNSLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7UUFDeEIsU0FBUyxFQUFFLCtCQUF1QjtRQUNsQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO1FBQ3hCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7UUFDM0IsVUFBVSxFQUFFO1lBQ1IsSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsK0JBQXVCO1NBQ2hDO1FBQ0YsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUU7S0FDekQsRUFBRSxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDO0NBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKc29uU2NoZW1hIH0gZnJvbSAnQHV0Y3Avc2RrJztcblxuLy8gLT0tPS09LT0tPS0gaW50ZXJmYWNlcyBmb3IgZGlmZmVyZW50IHJlc3VsdCB0eXBlcyAtPS09LT0tPS09LVxuXG5leHBvcnQgaW50ZXJmYWNlIElCYXNlNjRJbWFnZSB7XG4gICAgdHlwZTogXCJpbWFnZVwiO1xuICAgIGRhdGE6IHN0cmluZztcbiAgICBtaW1lVHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCYXNlNjRBdWRpbyB7XG4gICAgdHlwZTogXCJhdWRpb1wiO1xuICAgIGRhdGE6IHN0cmluZztcbiAgICBtaW1lVHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdWNjZXNzSW5kaWNhdG9yIHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGVycm9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJbnN0YW5jZVJlZmVyZW5jZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBc3NldFRyZWVJdGVtIHtcbiAgICBmaWxlc3lzdGVtUGF0aD86IHN0cmluZztcbiAgICByZWZlcmVuY2U6IElJbnN0YW5jZVJlZmVyZW5jZTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY2hpbGRyZW46IEFycmF5PElBc3NldFRyZWVJdGVtPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2NlbmVUcmVlSXRlbSB7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICByZWZlcmVuY2U6IElJbnN0YW5jZVJlZmVyZW5jZTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIGNvbXBvbmVudHM6IEFycmF5PElJbnN0YW5jZVJlZmVyZW5jZT47XG4gICAgY2hpbGRyZW46IEFycmF5PElTY2VuZVRyZWVJdGVtPjtcbn1cblxuLy8gLT0tPS09LT0tPS0gWm9kIHNjaGVtYXMgZm9yIGRpZmZlcmVudCByZXN1bHQgdHlwZXMgLT0tPS09LT0tPS1cblxuZXhwb3J0IGNvbnN0IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hOiBKc29uU2NoZW1hID0geyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyBpZDogeyB0eXBlOiAnc3RyaW5nJyB9LCB0eXBlOiB7IHR5cGU6ICdzdHJpbmcnIH0gfSwgcmVxdWlyZWQ6IFsnaWQnXSB9O1xuZXhwb3J0IGNvbnN0IFN1Y2Nlc3NJbmRpY2F0b3JTY2hlbWE6IEpzb25TY2hlbWEgPSB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IHN1Y2Nlc3M6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sIGVycm9yOiB7IHR5cGU6ICdzdHJpbmcnfSB9LCByZXF1aXJlZDogWydzdWNjZXNzJ10gfTtcbmV4cG9ydCBjb25zdCBCYXNlNjRJbWFnZVNjaGVtYTogSnNvblNjaGVtYSA9IHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgdHlwZTogeyB0eXBlOiAnc3RyaW5nJywgY29uc3Q6IFwiaW1hZ2VcIiB9LCBkYXRhOiB7IHR5cGU6ICdzdHJpbmcnIH0sIG1pbWVUeXBlOiB7IHR5cGU6ICdzdHJpbmcnIH0gfSwgcmVxdWlyZWQ6IFsndHlwZScsICdkYXRhJywgJ21pbWVUeXBlJ10gfTtcblxuZXhwb3J0IGNvbnN0IEFzc2V0VHJlZUl0ZW1TY2hlbWE6IEpzb25TY2hlbWEgPSB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgICBmaWxlc3lzdGVtUGF0aDogeyB0eXBlOiAnc3RyaW5nJ30sXG4gICAgICAgIHJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEsXG4gICAgICAgIG5hbWU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgY2hpbGRyZW46IHsgdHlwZTogJ2FycmF5JywgaXRlbXM6IHsgdHlwZTogJ29iamVjdCcgfSB9XG4gICAgfSwgcmVxdWlyZWQ6IFsncmVmZXJlbmNlJywgJ25hbWUnLCAndHlwZScsICdjaGlsZHJlbiddXG59O1xuXG5leHBvcnQgY29uc3QgU2NlbmVUcmVlSXRlbVNjaGVtYTogSnNvblNjaGVtYSA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHBhdGg6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgcmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSxcbiAgICAgICAgbmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICBhY3RpdmU6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIGNvbXBvbmVudHM6IHsgXG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgaXRlbXM6IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hXG4gICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogeyB0eXBlOiAnYXJyYXknLCBpdGVtczogeyB0eXBlOiAnb2JqZWN0JyB9IH1cbiAgICB9LCByZXF1aXJlZDogWydyZWZlcmVuY2UnLCAnbmFtZScsICdhY3RpdmUnLCAnY29tcG9uZW50cycsICdjaGlsZHJlbiddXG59OyJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/tools/asset-tools.js b/extensions/cocos-code-mode/dist/utcp/tools/asset-tools.js new file mode 100644 index 0000000..846cd10 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/tools/asset-tools.js @@ -0,0 +1,482 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AssetTools = void 0; +const package_json_1 = __importDefault(require("../../../package.json")); +const sharp_1 = __importDefault(require("sharp")); +const fs_extra_1 = __importDefault(require("fs-extra")); +const decorators_1 = require("../decorators"); +const schemas_1 = require("../schemas"); +const path_1 = __importStar(require("path")); +const os_1 = __importDefault(require("os")); +function normalizePath(p) { + if (!p) + return 'db://assets'; + let path = p.replace(/\\/g, '/').trim(); + // Handle db:// protocol + if (path.startsWith('db://')) { + return path.endsWith('/') && path !== 'db://' ? path.slice(0, -1) : path; + } + // Remove leading slash + if (path.startsWith('/')) { + path = path.slice(1); + } + // Handle root aliases + if (path === '' || path === 'assets') { + return 'db://assets'; + } + // Handle 'assets/' prefix + if (path.startsWith('assets/')) { + const result = 'db://' + path; + return result.endsWith('/') ? result.slice(0, -1) : result; + } + // Treat as relative path under assets + if (path.endsWith('/')) { + path = path.slice(0, -1); + } + return `db://assets/${path}`; +} +class AssetTools { + async assetGetTree(args) { + if (args.reference) { + const info = await Editor.Message.request('asset-db', 'query-asset-info', args.reference.id); + if (!info) { + throw new Error(`Asset with UUID ${args.reference.id} not found.`); + } + args.assetPath = info.url; + } + let rootPath = normalizePath(args.assetPath); + const pattern = `${rootPath}/**`; + const assets = await Editor.Message.request('asset-db', 'query-assets', { pattern }); + const rootUuid = await Editor.Message.request('asset-db', 'query-uuid', rootPath); + const assetsMap = new Map(); + // Create Root Node first + const rootName = rootPath.split('/').pop() || 'assets'; + const rootNode = { + filesystemPath: Editor.Project.path + '/' + rootPath.replace('db://', ''), + reference: { id: rootUuid || 'root', type: 'folder' }, + name: rootName, + children: [] + }; + assetsMap.set(rootPath, rootNode); + // First pass: Map assets + assets.forEach((asset) => { + if (asset.url === rootPath) + return; // Skip root, already created + const type = asset.isDirectory ? 'folder' : asset.type; + const treeItem = { + reference: { id: asset.uuid, type: type }, + name: asset.name, + children: [] + }; + assetsMap.set(asset.url, treeItem); + }); + // Second pass: Build hierarchy + assets.forEach((asset) => { + if (asset.url === rootPath) + return; + const treeItem = assetsMap.get(asset.url); + if (!treeItem) + return; + const parentUrl = asset.url.substring(0, asset.url.lastIndexOf('/')); + const parentItem = assetsMap.get(parentUrl); + if (parentItem) { + parentItem.children.push(treeItem); + } + }); + return rootNode; + } + async assetGetAtPath(args) { + let targetPath = normalizePath(args.assetPath); + console.log(`Looking for asset at path: ${targetPath}`); + const assetInfo = await Editor.Message.request('asset-db', 'query-asset-info', targetPath); + if (!assetInfo) { + throw new Error(`Asset not found at path: ${targetPath}`); + } + else { + return { reference: { id: assetInfo.uuid, type: assetInfo.type } }; + } + } + async assetCreate(args) { + var _a, _b, _c, _d; + let targetPath = normalizePath(args.assetPath); + // Map 'preset' from schema to 'type' expected by function + const type = args.preset; + const presetMap = { + 'material': 'db://internal/default_file_content/material/default.mtl', + 'effect': 'db://internal/default_file_content/effect/default.effect', + 'scene': 'db://internal/default_file_content/scene/default.scene', + 'prefab': 'db://internal/default_file_content/prefab/default.prefab', + 'animation-clip': 'db://internal/default_file_content/animation-clip/default.anim', + 'render-texture': 'db://internal/default_file_content/render-texture/default.rt', + 'physics-material': 'db://internal/default_file_content/physics-material/default.pmtl', + 'animation-graph': 'db://internal/default_file_content/animation-graph/default.animgraph', + 'animation-graph-variant': 'db://internal/default_file_content/animation-graph-variant/default.animgraphvari', + 'animation-mask': 'db://internal/default_file_content/animation-mask/default.animask', + 'auto-atlas': 'db://internal/default_file_content/auto-atlas/default.pac', + 'effect-header': 'db://internal/default_file_content/effect-header/chunk', + 'label-atlas': 'db://internal/default_file_content/label-atlas/default.labelatlas', + 'terrain': 'db://internal/default_file_content/terrain/default.terrain' + }; + const assetOptions = { + overwrite: (_b = (_a = args.options) === null || _a === void 0 ? void 0 : _a.overwrite) !== null && _b !== void 0 ? _b : false, + rename: (_d = (_c = args.options) === null || _c === void 0 ? void 0 : _c.rename) !== null && _d !== void 0 ? _d : false + }; + if (type === 'folder' || type === 'typescript') { + let content = null; + if (type === 'typescript') { + const currentExtName = (0, path_1.extname)(targetPath); + if (currentExtName !== '.ts') { + targetPath = currentExtName ? targetPath.slice(0, -currentExtName.length) : targetPath; + targetPath += '.ts'; + } + const className = (0, path_1.basename)(targetPath.slice('db://'.length), '.ts'); + content = this.generateTypescriptClassTemplate(className); + } + const result = await Editor.Message.request('asset-db', 'create-asset', targetPath, content, assetOptions); + if (!result) { + throw new Error(`Failed to create folder at ${targetPath}`); + } + else { + return { reference: { id: result.uuid, type: type } }; + } + } + const source = presetMap[type]; + if (!source) { + throw new Error(`Unknown asset preset type: ${type}`); + } + if ((0, path_1.extname)(targetPath) === '' && type !== 'folder') { + targetPath += type == 'chunk' ? '.chunk' : (0, path_1.extname)(presetMap[type]); + } + const assetInfo = await Editor.Message.request('asset-db', 'copy-asset', source, targetPath, assetOptions); + if (!assetInfo) { + throw new Error(`Failed to create asset at ${targetPath}`); + } + else { + return { reference: { id: assetInfo.uuid, type: assetInfo.type } }; + } + } + async assetImport(args) { + var _a, _b, _c, _d; + let targetPath = normalizePath(args.targetAssetPath); + const assetOptions = { + overwrite: (_b = (_a = args.options) === null || _a === void 0 ? void 0 : _a.overwrite) !== null && _b !== void 0 ? _b : false, + rename: (_d = (_c = args.options) === null || _c === void 0 ? void 0 : _c.rename) !== null && _d !== void 0 ? _d : false + }; + // Additional resolving for absolute path + if (args.sourceFilesystemPath.startsWith('~')) { + args.sourceFilesystemPath = path_1.default.join(os_1.default.homedir(), args.sourceFilesystemPath.slice(1)); + } + args.sourceFilesystemPath = path_1.default.resolve(args.sourceFilesystemPath); + args.sourceFilesystemPath = await fs_extra_1.default.realpath(args.sourceFilesystemPath); + // Checking for existing asset at target path + let existingAssetInfo = null; + // If caller tries to import the same file in assets - just reimport + if (`${Editor.Project.path}${targetPath.slice('db:/'.length)}` === args.sourceFilesystemPath) { + await Editor.Message.request('asset-db', 'refresh-asset', targetPath); + existingAssetInfo = await Editor.Message.request('asset-db', 'query-asset-info', targetPath); + } + const assetInfo = existingAssetInfo ? existingAssetInfo : + await Editor.Message.request('asset-db', 'import-asset', args.sourceFilesystemPath, targetPath, assetOptions); + if (!assetInfo) { + throw new Error(`Failed to import asset to ${targetPath}`); + } + else { + if (assetInfo.extends && assetInfo.importer === 'image' && args.imageType) { + // Handle image type override + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (meta && meta.userData) { + let typeToSet = args.imageType; + if (typeToSet === 'normal-map') { + typeToSet = 'normal map'; + } + if (typeToSet === 'texture-cube') { + typeToSet = 'texture cube'; + } + meta.userData.type = typeToSet; + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + } + } + return { reference: { id: assetInfo.uuid, type: assetInfo.type } }; + } + } + async assetOperate(args) { + var _a, _b, _c, _d, _e, _f; + const assetOptions = { + overwrite: (_b = (_a = args.options) === null || _a === void 0 ? void 0 : _a.overwrite) !== null && _b !== void 0 ? _b : false, + rename: (_d = (_c = args.options) === null || _c === void 0 ? void 0 : _c.rename) !== null && _d !== void 0 ? _d : false + }; + args.targetAssetPath = normalizePath(args.targetAssetPath); + let result = null; + switch (args.operation) { + case 'move': + if (!args.targetAssetPath) { + throw new Error('Target is required for move'); + } + result = await Editor.Message.request('asset-db', 'move-asset', args.reference.id, args.targetAssetPath, assetOptions); + break; + case 'copy': + if (!args.targetAssetPath) { + throw new Error('Target is required for copy'); + } + result = await Editor.Message.request('asset-db', 'copy-asset', args.reference.id, args.targetAssetPath, assetOptions); + break; + case 'delete': + result = await Editor.Message.request('asset-db', 'delete-asset', args.reference.id); + break; + case 'open': + await Editor.Message.request('asset-db', 'open-asset', args.reference.id); + result = null; + break; + case 'refresh': + await Editor.Message.request('asset-db', 'refresh-asset', args.reference.id); + result = null; + break; + case 'reimport': + await Editor.Message.request('asset-db', 'reimport-asset', args.reference.id); + result = null; + break; + default: + throw new Error(`Unknown operation: ${args.operation}`); + } + return { reference: { id: (_e = result === null || result === void 0 ? void 0 : result.uuid) !== null && _e !== void 0 ? _e : '', type: (_f = result === null || result === void 0 ? void 0 : result.type) !== null && _f !== void 0 ? _f : '' } }; + } + async assetGetPreview(args) { + const info = await Editor.Message.request('asset-db', 'query-asset-info', args.reference.id); + if (!info) { + throw new Error(`Asset ${args.reference.id} not found.`); + } + if (!info.importer) { + throw new Error(`Asset ${args.reference.id} has no importer and cannot be previewed.`); + } + args.imageSize = args.imageSize || 512; + args.jpegQuality = args.jpegQuality || 80; + args.transparentColor = args.transparentColor || { r: 0, g: 0, b: 0 }; + let importer = info.importer; + const supportedImporters = [ + 'erp-texture-cube', + 'image', + 'sprite-frame', + 'texture', + 'fbx', + 'gltf', + 'gltf-mesh', + 'prefab', + 'material', + 'spine', + 'gltf-skeleton', + 'scene' + ]; + if (!supportedImporters.includes(importer)) { + throw new Error(`Asset preview not supported for asset type: ${info.type}`); + } + if (importer === 'fbx' || importer === 'gltf') { + const mesh = Object.values(info.subAssets).find((sub) => sub.importer === 'gltf-mesh'); + if (!mesh) { + throw new Error(`Asset ${args.reference.id} has no gltf-mesh sub-asset for preview.`); + } + args.reference.id = mesh.uuid; + importer = 'gltf-mesh'; + } + let sourcePath = null; + if (importer === 'gltf-mesh' || importer === 'mesh') { + sourcePath = (await Editor.Message.request('asset-db', 'query-asset-thumbnail', args.reference.id, "origin")).value; + } + else if (['erp-texture-cube', 'image', 'sprite-frame', 'texture'].includes(importer)) { + let fileUuid = args.reference.id; + if (args.reference.id.includes('@')) { + fileUuid = args.reference.id.split('@')[0]; + } + const fileInfo = await Editor.Message.request('asset-db', 'query-asset-info', fileUuid); + if (fileInfo && fileInfo.file) { + sourcePath = fileInfo.file; + } + } + if (sourcePath && fs_extra_1.default.existsSync(sourcePath)) { + try { + const image = (0, sharp_1.default)(sourcePath); + const metadata = await image.metadata(); + const requestedSize = args.imageSize || 512; + let processed = image; + if ((metadata.width && metadata.width > requestedSize) || + (metadata.height && metadata.height > requestedSize)) { + processed = processed.resize(requestedSize, requestedSize, { fit: 'contain', background: { r: 0, g: 0, b: 0, alpha: 0 } }); + } + let buffer; + if ((metadata.format === 'png' || metadata.hasAlpha)) { + buffer = await processed.flatten({ background: args.transparentColor }) + .jpeg({ quality: args.jpegQuality || 80 }) + .toBuffer(); + } + else { + buffer = await processed + .jpeg({ quality: args.jpegQuality || 80 }) + .toBuffer(); + } + return { type: "image", data: buffer.toString('base64'), mimeType: "image/jpeg" }; + } + catch (e) { + console.error(`Failed to process image from ${sourcePath} with sharp:`, e); + } + } + // Open panel to ensure renderer process is alive + await Editor.Panel.openBeside('scene', `${package_json_1.default.name}.preview`); + let base64Image; + try { + // Request generation + base64Image = await Editor.Message.request(package_json_1.default.name, 'generate-preview', args.reference.id, args.imageSize || 512, args.imageSize || 512, (args.jpegQuality || 80) / 100); + } + finally { + // Close panel + await Editor.Panel.close(`${package_json_1.default.name}.preview`); + } + if (!base64Image) { + throw new Error(`Failed to generate preview for asset ${args.reference.id}.`); + } + return { type: "image", data: base64Image, mimeType: "image/jpeg" }; + } + generateTypescriptClassTemplate(className) { + return `import { _decorator, Component, Node } from 'cc'; +const { ccclass, property } = _decorator; + +@ccclass('${className}') +export class ${className} extends Component { + start() { + + } + + update(deltaTime: number) { + + } +}`; + } +} +exports.AssetTools = AssetTools; +__decorate([ + (0, decorators_1.utcpTool)('assetGetTree', 'Get the asset and subAsset hierarchy tree. Children have recursive structure.', { + type: 'object', + properties: { + reference: schemas_1.InstanceReferenceSchema, + assetPath: { type: 'string', description: 'Root path to start from' } + } + }, schemas_1.AssetTreeItemSchema, "GET", ['asset', 'file', 'tree', 'hierarchy', 'folder', 'subasset']) +], AssetTools.prototype, "assetGetTree", null); +__decorate([ + (0, decorators_1.utcpTool)('assetGetAtPath', 'Get asset reference by given local path and name, including extension. Can be used for subassets too. Returns reference to the asset.', { + type: 'object', + properties: { + assetPath: { type: 'string' } + }, + required: ['assetPath'] + }, { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, "GET", ['asset', 'get', 'path', 'look', 'find']) +], AssetTools.prototype, "assetGetAtPath", null); +__decorate([ + (0, decorators_1.utcpTool)('assetCreate', 'Create empty asset or folder of given type. Automatically handles folders creation along the path. Returns reference to the new asset.', { + type: 'object', + properties: { + assetPath: { type: 'string' }, + preset: { + type: 'string', + enum: [ + 'folder', + 'material', + 'effect', + 'scene', + 'prefab', + 'typescript', + 'animation-clip', + 'render-texture', + 'physics-material', + 'animation-graph', + 'animation-graph-variant', + 'animation-mask', + 'auto-atlas', + 'effect-header', + 'label-atlas', + 'terrain' + ], + description: 'Preset type for the new asset' + }, + options: { type: 'object', properties: { overwrite: { type: 'boolean' }, rename: { type: 'boolean' } }, description: 'Additional options for the operation', nullable: true }, + }, + required: ['assetPath', 'preset'] + }, { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, "POST", ['asset', 'create', 'new', 'preset', 'folder', 'typescript']) +], AssetTools.prototype, "assetCreate", null); +__decorate([ + (0, decorators_1.utcpTool)('assetImport', 'Import an external file as an asset into the project. Path must end with the extension. Returns reference to the new asset.', { + type: 'object', + properties: { + sourceFilesystemPath: { type: 'string', description: 'Source filesystem path of the file to import' }, + targetAssetPath: { type: 'string', description: 'Target path in the asset database' }, + imageType: { type: 'string', enum: ['raw', 'texture', 'normal-map', 'sprite-frame', 'texture-cube'], description: 'For image files, specify how to import them' }, + options: { type: 'object', properties: { overwrite: { type: 'boolean' }, rename: { type: 'boolean' } }, description: 'Additional options for the operation' }, + }, + required: ['sourceFilesystemPath', 'targetAssetPath'] + }, { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, "POST", ['asset', 'import', 'file', 'external', 'image']) +], AssetTools.prototype, "assetImport", null); +__decorate([ + (0, decorators_1.utcpTool)('assetOperate', 'Perform operations on assets (move, copy, delete, open). Returns reference to the affected asset (for delete/open returns the source asset reference).', { + type: 'object', + properties: { + operation: { type: 'string', enum: ['move', 'copy', 'delete', 'open', 'refresh', 'reimport'] }, + reference: schemas_1.InstanceReferenceSchema, + targetAssetPath: { type: 'string', description: 'Target path (for move/copy/import)' }, + options: { type: 'object', properties: { overwrite: { type: 'boolean' }, rename: { type: 'boolean' } }, description: 'Additional options for the operation', nullable: true }, + }, + required: ['operation', 'reference'] + }, { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, "POST", ['asset', 'operate', 'move', 'copy', 'delete', 'open', 'refresh', 'reimport']) +], AssetTools.prototype, "assetOperate", null); +__decorate([ + (0, decorators_1.utcpTool)('assetGetPreview', 'Returns preview image of the asset (Prefab, Image, Model or Material is supported). IMPORTANT: To visualize the image, you must return the result of this function DIRECTLY as the final value of your code, do NOT wrap it in an object.', { + type: 'object', + properties: { + reference: schemas_1.InstanceReferenceSchema, + imageSize: { type: 'number', description: 'Size of the preview image (square)', default: 512 }, + jpegQuality: { type: 'integer', description: 'JPEG Quality of the preview image', minimum: 40, maximum: 100, default: 80 }, + transparentColor: { type: 'object', properties: { r: { type: 'integer', minimum: 0, maximum: 255 }, g: { type: 'integer', minimum: 0, maximum: 255 }, b: { type: 'integer', minimum: 0, maximum: 255 } }, required: ['r', 'g', 'b'], description: 'Background color for transparent images in RGB format' } + }, + required: ['reference'] + }, schemas_1.Base64ImageSchema, "GET", ['asset', 'preview', 'screenshot']) +], AssetTools.prototype, "assetGetPreview", null); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvdXRjcC90b29scy9hc3NldC10b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5RUFBZ0Q7QUFDaEQsa0RBQTBCO0FBQzFCLHdEQUEwQjtBQUMxQiw4Q0FBeUM7QUFFekMsd0NBQTBMO0FBQzFMLDZDQUErQztBQUMvQyw0Q0FBb0I7QUFFcEIsU0FBUyxhQUFhLENBQUMsQ0FBVTtJQUM3QixJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sYUFBYSxDQUFDO0lBQzdCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRXhDLHdCQUF3QjtJQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdFLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELHNCQUFzQjtJQUN0QixJQUFJLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxD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RSxFQUFFLEVBQUU7WUFDMUgsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsdURBQXVELEVBQUU7U0FDOVM7UUFDRCxRQUFRLEVBQUUsQ0FBQyxXQUFXLENBQUM7S0FDMUIsRUFDRCwyQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUMvRDtpREF5R0EiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGFja2FnZUpTT04gZnJvbSAnLi4vLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCBzaGFycCBmcm9tICdzaGFycCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgdXRjcFRvb2wgfSBmcm9tICcuLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFzc2V0SW5mbywgQXNzZXRPcGVyYXRpb25PcHRpb24gfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvYXNzZXQtZGIvQHR5cGVzL3B1YmxpYyc7XG5pbXBvcnQgeyBBc3NldFRyZWVJdGVtU2NoZW1hLCBJQXNzZXRUcmVlSXRlbSwgQmFzZTY0SW1hZ2VTY2hlbWEsIElCYXNlNjRJbWFnZSwgU3VjY2Vzc0luZGljYXRvclNjaGVtYSwgSVN1Y2Nlc3NJbmRpY2F0b3IsIEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hLCBJSW5zdGFuY2VSZWZlcmVuY2UgfSBmcm9tICcuLi9zY2hlbWFzJztcbmltcG9ydCBwYXRoLCB7IGJhc2VuYW1lLCBleHRuYW1lIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHA/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghcCkgcmV0dXJuICdkYjovL2Fzc2V0cyc7XG4gICAgbGV0IHBhdGggPSBwLnJlcGxhY2UoL1xcXFwvZywgJy8nKS50cmltKCk7XG5cbiAgICAvLyBIYW5kbGUgZGI6Ly8gcHJvdG9jb2xcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCdkYjovLycpKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmVuZHNXaXRoKCcvJykgJiYgcGF0aCAhPT0gJ2RiOi8vJyA/IHBhdGguc2xpY2UoMCwgLTEpIDogcGF0aDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbGVhZGluZyBzbGFzaFxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgxKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcm9vdCBhbGlhc2VzXG4gICAgaWYgKHBhdGggPT09ICcnIHx8IHBhdGggPT09ICdhc3NldHMnKSB7XG4gICAgICAgIHJldHVybiAnZGI6Ly9hc3NldHMnO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSAnYXNzZXRzLycgcHJlZml4XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnYXNzZXRzLycpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9ICdkYjovLycgKyBwYXRoO1xuICAgICAgICByZXR1cm4gcmVzdWx0LmVuZHNXaXRoKCcvJykgPyByZXN1bHQuc2xpY2UoMCwgLTEpIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFRyZWF0IGFzIHJlbGF0aXZlIHBhdGggdW5kZXIgYXNzZXRzXG4gICAgaWYgKHBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBkYjovL2Fzc2V0cy8ke3BhdGh9YDtcbn1cblxuZXhwb3J0IGNsYXNzIEFzc2V0VG9vbHMge1xuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnYXNzZXRHZXRUcmVlJyxcbiAgICAgICAgJ0dldCB0aGUgYXNzZXQgYW5kIHN1YkFzc2V0IGhpZXJhcmNoeSB0cmVlLiBDaGlsZHJlbiBoYXZlIHJlY3Vyc2l2ZSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSxcbiAgICAgICAgICAgICAgICBhc3NldFBhdGg6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnUm9vdCBwYXRoIHRvIHN0YXJ0IGZyb20nIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgQXNzZXRUcmVlSXRlbVNjaGVtYSwgXCJHRVRcIiwgWydhc3NldCcsICdmaWxlJywgJ3RyZWUnLCAnaGllcmFyY2h5JywgJ2ZvbGRlcicsICdzdWJhc3NldCddXG4gICAgKVxuICAgIGFzeW5jIGFzc2V0R2V0VHJlZShhcmdzOiB7IHJlZmVyZW5jZT86IElJbnN0YW5jZVJlZmVyZW5jZSwgYXNzZXRQYXRoPzogc3RyaW5nIH0pOiBQcm9taXNlPElBc3NldFRyZWVJdGVtPiB7XG4gICAgICAgIGlmIChhcmdzLnJlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LWluZm8nLCBhcmdzLnJlZmVyZW5jZS5pZCk7XG4gICAgICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzc2V0IHdpdGggVVVJRCAke2FyZ3MucmVmZXJlbmNlLmlkfSBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcmdzLmFzc2V0UGF0aCA9IGluZm8udXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJvb3RQYXRoID0gbm9ybWFsaXplUGF0aChhcmdzLmFzc2V0UGF0aCk7XG5cbiAgICAgICAgY29uc3QgcGF0dGVybiA9IGAke3Jvb3RQYXRofS8qKmA7XG4gICAgICAgIGNvbnN0IGFzc2V0cyA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0cycsIHsgcGF0dGVybiB9KTtcbiAgICAgICAgY29uc3Qgcm9vdFV1aWQgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS11dWlkJywgcm9vdFBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFzc2V0c01hcCA9IG5ldyBNYXA8c3RyaW5nLCBJQXNzZXRUcmVlSXRlbT4oKTtcblxuICAgICAgICAvLyBDcmVhdGUgUm9vdCBOb2RlIGZpcnN0XG4gICAgICAgIGNvbnN0IHJvb3ROYW1lID0gcm9vdFBhdGguc3BsaXQoJy8nKS5wb3AoKSB8fCAnYXNzZXRzJztcbiAgICAgICAgY29uc3Qgcm9vdE5vZGU6IElBc3NldFRyZWVJdGVtID0ge1xuICAgICAgICAgICAgZmlsZXN5c3RlbVBhdGg6IEVkaXRvci5Qcm9qZWN0LnBhdGggKyAnLycgKyByb290UGF0aC5yZXBsYWNlKCdkYjovLycsICcnKSxcbiAgICAgICAgICAgIHJlZmVyZW5jZTogeyBpZDogcm9vdFV1aWQgfHwgJ3Jvb3QnLCB0eXBlOiAnZm9sZGVyJyB9LFxuICAgICAgICAgICAgbmFtZTogcm9vdE5hbWUsXG4gICAgICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXRzTWFwLnNldChyb290UGF0aCwgcm9vdE5vZGUpO1xuXG4gICAgICAgIC8vIEZpcnN0IHBhc3M6IE1hcCBhc3NldHNcbiAgICAgICAgYXNzZXRzLmZvckVhY2goKGFzc2V0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChhc3NldC51cmwgPT09IHJvb3RQYXRoKSByZXR1cm47IC8vIFNraXAgcm9vdCwgYWxyZWFkeSBjcmVhdGVkXG5cbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBhc3NldC5pc0RpcmVjdG9yeSA/ICdmb2xkZXInIDogYXNzZXQudHlwZTtcblxuICAgICAgICAgICAgY29uc3QgdHJlZUl0ZW06IElBc3NldFRyZWVJdGVtID0ge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZTogeyBpZDogYXNzZXQudXVpZCwgdHlwZTogdHlwZSB9LFxuICAgICAgICAgICAgICAgIG5hbWU6IGFzc2V0Lm5hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhc3NldHNNYXAuc2V0KGFzc2V0LnVybCwgdHJlZUl0ZW0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZWNvbmQgcGFzczogQnVpbGQgaGllcmFyY2h5XG4gICAgICAgIGFzc2V0cy5mb3JFYWNoKChhc3NldDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoYXNzZXQudXJsID09PSByb290UGF0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0cmVlSXRlbSA9IGFzc2V0c01hcC5nZXQoYXNzZXQudXJsKTtcbiAgICAgICAgICAgIGlmICghdHJlZUl0ZW0pIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgcGFyZW50VXJsID0gYXNzZXQudXJsLnN1YnN0cmluZygwLCBhc3NldC51cmwubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gYXNzZXRzTWFwLmdldChwYXJlbnRVcmwpO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50SXRlbSkge1xuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0uY2hpbGRyZW4ucHVzaCh0cmVlSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByb290Tm9kZTtcbiAgICB9XG5cbiAgICBAdXRjcFRvb2woXG4gICAgICAgICdhc3NldEdldEF0UGF0aCcsXG4gICAgICAgICdHZXQgYXNzZXQgcmVmZXJlbmNlIGJ5IGdpdmVuIGxvY2FsIHBhdGggYW5kIG5hbWUsIGluY2x1ZGluZyBleHRlbnNpb24uIENhbiBiZSB1c2VkIGZvciBzdWJhc3NldHMgdG9vLiBSZXR1cm5zIHJlZmVyZW5jZSB0byB0aGUgYXNzZXQuJyxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgYXNzZXRQYXRoOiB7IHR5cGU6ICdzdHJpbmcnIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogWydhc3NldFBhdGgnXVxuICAgICAgICB9LFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IHJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEgfSwgcmVxdWlyZWQ6IFsncmVmZXJlbmNlJ10gfSwgXCJHRVRcIiwgWydhc3NldCcsICdnZXQnLCAncGF0aCcsICdsb29rJywgJ2ZpbmQnXVxuICAgIClcbiAgICBhc3luYyBhc3NldEdldEF0UGF0aChhcmdzOiB7IGFzc2V0UGF0aDogc3RyaW5nIH0pOiBQcm9taXNlPHsgcmVmZXJlbmNlOiBJSW5zdGFuY2VSZWZlcmVuY2UgfT4ge1xuICAgICAgICBsZXQgdGFyZ2V0UGF0aCA9IG5vcm1hbGl6ZVBhdGgoYXJncy5hc3NldFBhdGgpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKGBMb29raW5nIGZvciBhc3NldCBhdCBwYXRoOiAke3RhcmdldFBhdGh9YCk7XG5cbiAgICAgICAgY29uc3QgYXNzZXRJbmZvID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtaW5mbycsIHRhcmdldFBhdGgpO1xuICAgICAgICBpZiAoIWFzc2V0SW5mbykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NldCBub3QgZm91bmQgYXQgcGF0aDogJHt0YXJnZXRQYXRofWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVmZXJlbmNlOiB7IGlkOiBhc3NldEluZm8udXVpZCwgdHlwZTogYXNzZXRJbmZvLnR5cGUgfSB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnYXNzZXRDcmVhdGUnLFxuICAgICAgICAnQ3JlYXRlIGVtcHR5IGFzc2V0IG9yIGZvbGRlciBvZiBnaXZlbiB0eXBlLiBBdXRvbWF0aWNhbGx5IGhhbmRsZXMgZm9sZGVycyBjcmVhdGlvbiBhbG9uZyB0aGUgcGF0aC4gUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIG5ldyBhc3NldC4nLFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBhc3NldFBhdGg6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgICAgICBwcmVzZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgIGVudW06IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmb2xkZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21hdGVyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdlZmZlY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NjZW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcmVmYWInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGVzY3JpcHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1jbGlwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdyZW5kZXItdGV4dHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGh5c2ljcy1tYXRlcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnYW5pbWF0aW9uLWdyYXBoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhbmltYXRpb24tZ3JhcGgtdmFyaWFudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnYW5pbWF0aW9uLW1hc2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dG8tYXRsYXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2VmZmVjdC1oZWFkZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsLWF0bGFzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0ZXJyYWluJ1xuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1ByZXNldCB0eXBlIGZvciB0aGUgbmV3IGFzc2V0J1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uczogeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyBvdmVyd3JpdGU6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sIHJlbmFtZTogeyB0eXBlOiAnYm9vbGVhbicgfSB9LCBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIG9wZXJhdGlvbicsIG51bGxhYmxlOiB0cnVlIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFsnYXNzZXRQYXRoJywgJ3ByZXNldCddXG4gICAgICAgIH0sXG4gICAgICAgIHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgcmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSB9LCByZXF1aXJlZDogWydyZWZlcmVuY2UnXSB9LCBcIlBPU1RcIiwgWydhc3NldCcsICdjcmVhdGUnLCAnbmV3JywgJ3ByZXNldCcsICdmb2xkZXInLCAndHlwZXNjcmlwdCddXG4gICAgKVxuICAgIGFzeW5jIGFzc2V0Q3JlYXRlKGFyZ3M6IHsgYXNzZXRQYXRoOiBzdHJpbmc7IHByZXNldDogc3RyaW5nOyBvcHRpb25zPzogeyBvdmVyd3JpdGU/OiBib29sZWFuLCByZW5hbWU/OiBib29sZWFuIH0gfSk6IFByb21pc2U8eyByZWZlcmVuY2U6IElJbnN0YW5jZVJlZmVyZW5jZSB9PiB7XG4gICAgICAgIGxldCB0YXJnZXRQYXRoID0gbm9ybWFsaXplUGF0aChhcmdzLmFzc2V0UGF0aCk7XG5cbiAgICAgICAgLy8gTWFwICdwcmVzZXQnIGZyb20gc2NoZW1hIHRvICd0eXBlJyBleHBlY3RlZCBieSBmdW5jdGlvblxuICAgICAgICBjb25zdCB0eXBlID0gYXJncy5wcmVzZXQ7XG4gICAgICAgIGNvbnN0IHByZXNldE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgICdtYXRlcmlhbCc6ICdkYjovL2ludGVybmFsL2RlZmF1bHRfZmlsZV9jb250ZW50L21hdGVyaWFsL2RlZmF1bHQubXRsJyxcbiAgICAgICAgICAgICdlZmZlY3QnOiAnZGI6Ly9pbnRlcm5hbC9kZWZhdWx0X2ZpbGVfY29udGVudC9lZmZlY3QvZGVmYXVsdC5lZmZlY3QnLFxuICAgICAgICAgICAgJ3NjZW5lJzogJ2RiOi8vaW50ZXJuYWwvZGVmYXVsdF9maWxlX2NvbnRlbnQvc2NlbmUvZGVmYXVsdC5zY2VuZScsXG4gICAgICAgICAgICAncHJlZmFiJzogJ2RiOi8vaW50ZXJuYWwvZGVmYXVsdF9maWxlX2NvbnRlbnQvcHJlZmFiL2RlZmF1bHQucHJlZmFiJyxcbiAgICAgICAgICAgICdhbmltYXRpb24tY2xpcCc6ICdkYjovL2ludGVybmFsL2RlZmF1bHRfZmlsZV9jb250ZW50L2FuaW1hdGlvbi1jbGlwL2RlZmF1bHQuYW5pbScsXG4gICAgICAgICAgICAncmVuZGVyLXRleHR1cmUnOiAnZGI6Ly9pbnRlcm5hbC9kZWZhdWx0X2ZpbGVfY29udGVudC9yZW5kZXItdGV4dHVyZS9kZWZhdWx0LnJ0JyxcbiAgICAgICAgICAgICdwaHlzaWNzLW1hdGVyaWFsJzogJ2RiOi8vaW50ZXJuYWwvZGVmYXVsdF9maWxlX2NvbnRlbnQvcGh5c2ljcy1tYXRlcmlhbC9kZWZhdWx0LnBtdGwnLFxuICAgICAgICAgICAgJ2FuaW1hdGlvbi1ncmFwaCc6ICdkYjovL2ludGVybmFsL2RlZmF1bHRfZmlsZV9jb250ZW50L2FuaW1hdGlvbi1ncmFwaC9kZWZhdWx0LmFuaW1ncmFwaCcsXG4gICAgICAgICAgICAnYW5pbWF0aW9uLWdyYXBoLXZhcmlhbnQnOiAnZGI6Ly9pbnRlcm5hbC9kZWZhdWx0X2ZpbGVfY29udGVudC9hbmltYXRpb24tZ3JhcGgtdmFyaWFudC9kZWZhdWx0LmFuaW1ncmFwaHZhcmknLFxuICAgICAgICAgICAgJ2FuaW1hdGlvbi1tYXNrJzogJ2RiOi8vaW50ZXJuYWwvZGVmYXVsdF9maWxlX2NvbnRlbnQvYW5pbWF0aW9uLW1hc2svZGVmYXVsdC5hbmltYXNrJyxcbiAgICAgICAgICAgICdhdXRvLWF0bGFzJzogJ2RiOi8vaW50ZXJuYWwvZGVmYXVsdF9maWxlX2NvbnRlbnQvYXV0by1hdGxhcy9kZWZhdWx0LnBhYycsXG4gICAgICAgICAgICAnZWZmZWN0LWhlYWRlcic6ICdkYjovL2ludGVybmFsL2RlZmF1bHRfZmlsZV9jb250ZW50L2VmZmVjdC1oZWFkZXIvY2h1bmsnLFxuICAgICAgICAgICAgJ2xhYmVsLWF0bGFzJzogJ2RiOi8vaW50ZXJuYWwvZGVmYXVsdF9maWxlX2NvbnRlbnQvbGFiZWwtYXRsYXMvZGVmYXVsdC5sYWJlbGF0bGFzJyxcbiAgICAgICAgICAgICd0ZXJyYWluJzogJ2RiOi8vaW50ZXJuYWwvZGVmYXVsdF9maWxlX2NvbnRlbnQvdGVycmFpbi9kZWZhdWx0LnRlcnJhaW4nXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXNzZXRPcHRpb25zOiBBc3NldE9wZXJhdGlvbk9wdGlvbiA9IHtcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogYXJncy5vcHRpb25zPy5vdmVyd3JpdGUgPz8gZmFsc2UsXG4gICAgICAgICAgICByZW5hbWU6IGFyZ3Mub3B0aW9ucz8ucmVuYW1lID8/IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdmb2xkZXInIHx8IHR5cGUgPT09ICd0eXBlc2NyaXB0Jykge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICd0eXBlc2NyaXB0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFeHROYW1lID0gZXh0bmFtZSh0YXJnZXRQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEV4dE5hbWUgIT09ICcudHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFBhdGggPSBjdXJyZW50RXh0TmFtZSA/IHRhcmdldFBhdGguc2xpY2UoMCwgLWN1cnJlbnRFeHROYW1lLmxlbmd0aCkgOiB0YXJnZXRQYXRoO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRQYXRoICs9ICcudHMnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBiYXNlbmFtZSh0YXJnZXRQYXRoLnNsaWNlKCdkYjovLycubGVuZ3RoKSwgJy50cycpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLmdlbmVyYXRlVHlwZXNjcmlwdENsYXNzVGVtcGxhdGUoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAnY3JlYXRlLWFzc2V0JywgdGFyZ2V0UGF0aCwgY29udGVudCwgYXNzZXRPcHRpb25zKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZvbGRlciBhdCAke3RhcmdldFBhdGh9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJlZmVyZW5jZTogeyBpZDogcmVzdWx0LnV1aWQsIHR5cGU6IHR5cGUgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlID0gcHJlc2V0TWFwW3R5cGVdO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFzc2V0IHByZXNldCB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXh0bmFtZSh0YXJnZXRQYXRoKSA9PT0gJycgJiYgdHlwZSAhPT0gJ2ZvbGRlcicpIHtcbiAgICAgICAgICAgIHRhcmdldFBhdGggKz0gdHlwZSA9PSAnY2h1bmsnID8gJy5jaHVuaycgOiBleHRuYW1lKHByZXNldE1hcFt0eXBlXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhc3NldEluZm8gPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdjb3B5LWFzc2V0Jywgc291cmNlLCB0YXJnZXRQYXRoLCBhc3NldE9wdGlvbnMpO1xuICAgICAgICBpZiAoIWFzc2V0SW5mbykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGFzc2V0IGF0ICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJlZmVyZW5jZTogeyBpZDogYXNzZXRJbmZvLnV1aWQsIHR5cGU6IGFzc2V0SW5mby50eXBlIH0gfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEB1dGNwVG9vbChcbiAgICAgICAgJ2Fzc2V0SW1wb3J0JyxcbiAgICAgICAgJ0ltcG9ydCBhbiBleHRlcm5hbCBmaWxlIGFzIGFuIGFzc2V0IGludG8gdGhlIHByb2plY3QuIFBhdGggbXVzdCBlbmQgd2l0aCB0aGUgZXh0ZW5zaW9uLiBSZXR1cm5zIHJlZmVyZW5jZSB0byB0aGUgbmV3IGFzc2V0LicsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVzeXN0ZW1QYXRoOiB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1NvdXJjZSBmaWxlc3lzdGVtIHBhdGggb2YgdGhlIGZpbGUgdG8gaW1wb3J0JyB9LFxuICAgICAgICAgICAgICAgIHRhcmdldEFzc2V0UGF0aDogeyB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdUYXJnZXQgcGF0aCBpbiB0aGUgYXNzZXQgZGF0YWJhc2UnIH0sXG4gICAgICAgICAgICAgICAgaW1hZ2VUeXBlOiB7IHR5cGU6ICdzdHJpbmcnLCBlbnVtOiBbJ3JhdycsICd0ZXh0dXJlJywgJ25vcm1hbC1tYXAnLCAnc3ByaXRlLWZyYW1lJywgJ3RleHR1cmUtY3ViZSddLCBkZXNjcmlwdGlvbjogJ0ZvciBpbWFnZSBmaWxlcywgc3BlY2lmeSBob3cgdG8gaW1wb3J0IHRoZW0nIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uczogeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyBvdmVyd3JpdGU6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sIHJlbmFtZTogeyB0eXBlOiAnYm9vbGVhbicgfSB9LCBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIG9wZXJhdGlvbicgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogWydzb3VyY2VGaWxlc3lzdGVtUGF0aCcsICd0YXJnZXRBc3NldFBhdGgnXVxuICAgICAgICB9LFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IHJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEgfSwgcmVxdWlyZWQ6IFsncmVmZXJlbmNlJ10gfSwgXCJQT1NUXCIsIFsnYXNzZXQnLCAnaW1wb3J0JywgJ2ZpbGUnLCAnZXh0ZXJuYWwnLCAnaW1hZ2UnXVxuICAgIClcbiAgICBhc3luYyBhc3NldEltcG9ydChhcmdzOiB7IHNvdXJjZUZpbGVzeXN0ZW1QYXRoOiBzdHJpbmcsIHRhcmdldEFzc2V0UGF0aDogc3RyaW5nLCBpbWFnZVR5cGU/OiAncmF3JyB8ICd0ZXh0dXJlJyB8ICdub3JtYWwtbWFwJyB8ICdzcHJpdGUtZnJhbWUnIHwgJ3RleHR1cmUtY3ViZScsIG9wdGlvbnM/OiB7IG92ZXJ3cml0ZT86IGJvb2xlYW4sIHJlbmFtZT86IGJvb2xlYW4gfSB9KTogUHJvbWlzZTx7IHJlZmVyZW5jZTogSUluc3RhbmNlUmVmZXJlbmNlIH0+IHtcbiAgICAgICAgbGV0IHRhcmdldFBhdGggPSBub3JtYWxpemVQYXRoKGFyZ3MudGFyZ2V0QXNzZXRQYXRoKTtcblxuICAgICAgICBjb25zdCBhc3NldE9wdGlvbnM6IEFzc2V0T3BlcmF0aW9uT3B0aW9uID0ge1xuICAgICAgICAgICAgb3ZlcndyaXRlOiBhcmdzLm9wdGlvbnM/Lm92ZXJ3cml0ZSA/PyBmYWxzZSxcbiAgICAgICAgICAgIHJlbmFtZTogYXJncy5vcHRpb25zPy5yZW5hbWUgPz8gZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBBZGRpdGlvbmFsIHJlc29sdmluZyBmb3IgYWJzb2x1dGUgcGF0aFxuICAgICAgICBpZiAoYXJncy5zb3VyY2VGaWxlc3lzdGVtUGF0aC5zdGFydHNXaXRoKCd+JykpIHtcbiAgICAgICAgICAgIGFyZ3Muc291cmNlRmlsZXN5c3RlbVBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCBhcmdzLnNvdXJjZUZpbGVzeXN0ZW1QYXRoLnNsaWNlKDEpKTtcbiAgICAgICAgfVxuICAgICAgICBhcmdzLnNvdXJjZUZpbGVzeXN0ZW1QYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3Muc291cmNlRmlsZXN5c3RlbVBhdGgpO1xuICAgICAgICBhcmdzLnNvdXJjZUZpbGVzeXN0ZW1QYXRoID0gYXdhaXQgZnMucmVhbHBhdGgoYXJncy5zb3VyY2VGaWxlc3lzdGVtUGF0aCk7XG5cbiAgICAgICAgLy8gQ2hlY2tpbmcgZm9yIGV4aXN0aW5nIGFzc2V0IGF0IHRhcmdldCBwYXRoXG4gICAgICAgIGxldCBleGlzdGluZ0Fzc2V0SW5mbzogQXNzZXRJbmZvIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIC8vIElmIGNhbGxlciB0cmllcyB0byBpbXBvcnQgdGhlIHNhbWUgZmlsZSBpbiBhc3NldHMgLSBqdXN0IHJlaW1wb3J0XG4gICAgICAgIGlmIChgJHtFZGl0b3IuUHJvamVjdC5wYXRofSR7dGFyZ2V0UGF0aC5zbGljZSgnZGI6LycubGVuZ3RoKX1gID09PSBhcmdzLnNvdXJjZUZpbGVzeXN0ZW1QYXRoKSB7XG4gICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdyZWZyZXNoLWFzc2V0JywgdGFyZ2V0UGF0aCk7XG4gICAgICAgICAgICBleGlzdGluZ0Fzc2V0SW5mbyA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LWluZm8nLCB0YXJnZXRQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFzc2V0SW5mbyA9IGV4aXN0aW5nQXNzZXRJbmZvID8gZXhpc3RpbmdBc3NldEluZm8gOlxuICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAnaW1wb3J0LWFzc2V0JywgYXJncy5zb3VyY2VGaWxlc3lzdGVtUGF0aCwgdGFyZ2V0UGF0aCwgYXNzZXRPcHRpb25zKTtcbiAgICAgICAgaWYgKCFhc3NldEluZm8pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGltcG9ydCBhc3NldCB0byAke3RhcmdldFBhdGh9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYXNzZXRJbmZvLmV4dGVuZHMgJiYgYXNzZXRJbmZvLmltcG9ydGVyID09PSAnaW1hZ2UnICYmIGFyZ3MuaW1hZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGltYWdlIHR5cGUgb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgICAgICAgICBpZiAobWV0YSAmJiBtZXRhLnVzZXJEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlVG9TZXQ6IHN0cmluZyA9IGFyZ3MuaW1hZ2VUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVRvU2V0ID09PSAnbm9ybWFsLW1hcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUb1NldCA9ICdub3JtYWwgbWFwJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVRvU2V0ID09PSAndGV4dHVyZS1jdWJlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVRvU2V0ID0gJ3RleHR1cmUgY3ViZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWV0YS51c2VyRGF0YS50eXBlID0gdHlwZVRvU2V0O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdzYXZlLWFzc2V0LW1ldGEnLCBhc3NldEluZm8udXVpZCwgSlNPTi5zdHJpbmdpZnkobWV0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgcmVmZXJlbmNlOiB7IGlkOiBhc3NldEluZm8udXVpZCwgdHlwZTogYXNzZXRJbmZvLnR5cGUgfSB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnYXNzZXRPcGVyYXRlJyxcbiAgICAgICAgJ1BlcmZvcm0gb3BlcmF0aW9ucyBvbiBhc3NldHMgKG1vdmUsIGNvcHksIGRlbGV0ZSwgb3BlbikuIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBhZmZlY3RlZCBhc3NldCAoZm9yIGRlbGV0ZS9vcGVuIHJldHVybnMgdGhlIHNvdXJjZSBhc3NldCByZWZlcmVuY2UpLicsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogeyB0eXBlOiAnc3RyaW5nJywgZW51bTogWydtb3ZlJywgJ2NvcHknLCAnZGVsZXRlJywgJ29wZW4nLCAncmVmcmVzaCcsICdyZWltcG9ydCddIH0sXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSxcbiAgICAgICAgICAgICAgICB0YXJnZXRBc3NldFBhdGg6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnVGFyZ2V0IHBhdGggKGZvciBtb3ZlL2NvcHkvaW1wb3J0KScgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IG92ZXJ3cml0ZTogeyB0eXBlOiAnYm9vbGVhbicgfSwgcmVuYW1lOiB7IHR5cGU6ICdib29sZWFuJyB9IH0sIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgb3BlcmF0aW9uJywgbnVsbGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogWydvcGVyYXRpb24nLCAncmVmZXJlbmNlJ11cbiAgICAgICAgfSxcbiAgICAgICAgeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyByZWZlcmVuY2U6IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hIH0sIHJlcXVpcmVkOiBbJ3JlZmVyZW5jZSddIH0sIFwiUE9TVFwiLCBbJ2Fzc2V0JywgJ29wZXJhdGUnLCAnbW92ZScsICdjb3B5JywgJ2RlbGV0ZScsICdvcGVuJywgJ3JlZnJlc2gnLCAncmVpbXBvcnQnXVxuICAgIClcbiAgICBhc3luYyBhc3NldE9wZXJhdGUoYXJnczogeyBvcGVyYXRpb246IHN0cmluZywgcmVmZXJlbmNlOiBJSW5zdGFuY2VSZWZlcmVuY2UsIHRhcmdldEFzc2V0UGF0aD86IHN0cmluZywgb3B0aW9ucz86IHsgb3ZlcndyaXRlPzogYm9vbGVhbiwgcmVuYW1lPzogYm9vbGVhbiB9IH0pOiBQcm9taXNlPHsgcmVmZXJlbmNlOiBJSW5zdGFuY2VSZWZlcmVuY2UgfT4ge1xuICAgICAgICBjb25zdCBhc3NldE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvdmVyd3JpdGU6IGFyZ3Mub3B0aW9ucz8ub3ZlcndyaXRlID8/IGZhbHNlLFxuICAgICAgICAgICAgcmVuYW1lOiBhcmdzLm9wdGlvbnM/LnJlbmFtZSA/PyBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIGFyZ3MudGFyZ2V0QXNzZXRQYXRoID0gbm9ybWFsaXplUGF0aChhcmdzLnRhcmdldEFzc2V0UGF0aCk7XG4gICAgICAgIGxldCByZXN1bHQ6IEFzc2V0SW5mbyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIHN3aXRjaCAoYXJncy5vcGVyYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICAgICAgICAgIGlmICghYXJncy50YXJnZXRBc3NldFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgaXMgcmVxdWlyZWQgZm9yIG1vdmUnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdtb3ZlLWFzc2V0JywgYXJncy5yZWZlcmVuY2UuaWQsIGFyZ3MudGFyZ2V0QXNzZXRQYXRoLCBhc3NldE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdjb3B5JzpcbiAgICAgICAgICAgICAgICBpZiAoIWFyZ3MudGFyZ2V0QXNzZXRQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGlzIHJlcXVpcmVkIGZvciBjb3B5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ2NvcHktYXNzZXQnLCBhcmdzLnJlZmVyZW5jZS5pZCwgYXJncy50YXJnZXRBc3NldFBhdGgsIGFzc2V0T3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAnZGVsZXRlLWFzc2V0JywgYXJncy5yZWZlcmVuY2UuaWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdvcGVuJzpcbiAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdvcGVuLWFzc2V0JywgYXJncy5yZWZlcmVuY2UuaWQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3JlZnJlc2gnOlxuICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3JlZnJlc2gtYXNzZXQnLCBhcmdzLnJlZmVyZW5jZS5pZCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlaW1wb3J0JzpcbiAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdyZWltcG9ydC1hc3NldCcsIGFyZ3MucmVmZXJlbmNlLmlkKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gb3BlcmF0aW9uOiAke2FyZ3Mub3BlcmF0aW9ufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgcmVmZXJlbmNlOiB7IGlkOiByZXN1bHQ/LnV1aWQgPz8gJycsIHR5cGU6IHJlc3VsdD8udHlwZSA/PyAnJyB9IH07XG4gICAgfVxuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnYXNzZXRHZXRQcmV2aWV3JyxcbiAgICAgICAgJ1JldHVybnMgcHJldmlldyBpbWFnZSBvZiB0aGUgYXNzZXQgKFByZWZhYiwgSW1hZ2UsIE1vZGVsIG9yIE1hdGVyaWFsIGlzIHN1cHBvcnRlZCkuIElNUE9SVEFOVDogVG8gdmlzdWFsaXplIHRoZSBpbWFnZSwgeW91IG11c3QgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBESVJFQ1RMWSBhcyB0aGUgZmluYWwgdmFsdWUgb2YgeW91ciBjb2RlLCBkbyBOT1Qgd3JhcCBpdCBpbiBhbiBvYmplY3QuJyxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSxcbiAgICAgICAgICAgICAgICBpbWFnZVNpemU6IHsgdHlwZTogJ251bWJlcicsIGRlc2NyaXB0aW9uOiAnU2l6ZSBvZiB0aGUgcHJldmlldyBpbWFnZSAoc3F1YXJlKScsIGRlZmF1bHQ6IDUxMiB9LFxuICAgICAgICAgICAgICAgIGpwZWdRdWFsaXR5OiB7IHR5cGU6ICdpbnRlZ2VyJywgZGVzY3JpcHRpb246ICdKUEVHIFF1YWxpdHkgb2YgdGhlIHByZXZpZXcgaW1hZ2UnLCBtaW5pbXVtOiA0MCwgbWF4aW11bTogMTAwLCBkZWZhdWx0OiA4MCB9LFxuICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50Q29sb3I6IHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgcjogeyB0eXBlOiAnaW50ZWdlcicsIG1pbmltdW06IDAsIG1heGltdW06IDI1NSB9LCBnOiB7IHR5cGU6ICdpbnRlZ2VyJywgbWluaW11bTogMCwgbWF4aW11bTogMjU1IH0sIGI6IHsgdHlwZTogJ2ludGVnZXInLCBtaW5pbXVtOiAwLCBtYXhpbXVtOiAyNTUgfSB9LCByZXF1aXJlZDogWydyJywgJ2cnLCAnYiddLCBkZXNjcmlwdGlvbjogJ0JhY2tncm91bmQgY29sb3IgZm9yIHRyYW5zcGFyZW50IGltYWdlcyBpbiBSR0IgZm9ybWF0JyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFsncmVmZXJlbmNlJ11cbiAgICAgICAgfSxcbiAgICAgICAgQmFzZTY0SW1hZ2VTY2hlbWEsIFwiR0VUXCIsIFsnYXNzZXQnLCAncHJldmlldycsICdzY3JlZW5zaG90J11cbiAgICApXG4gICAgYXN5bmMgYXNzZXRHZXRQcmV2aWV3KGFyZ3M6IHsgcmVmZXJlbmNlOiBJSW5zdGFuY2VSZWZlcmVuY2UsIGltYWdlU2l6ZT86IG51bWJlciwganBlZ1F1YWxpdHk/OiBudW1iZXIsIHRyYW5zcGFyZW50Q29sb3I/OiB7IHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIgfSB9KTogUHJvbWlzZTxJQmFzZTY0SW1hZ2U+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LWluZm8nLCBhcmdzLnJlZmVyZW5jZS5pZCk7XG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NldCAke2FyZ3MucmVmZXJlbmNlLmlkfSBub3QgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbmZvLmltcG9ydGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzc2V0ICR7YXJncy5yZWZlcmVuY2UuaWR9IGhhcyBubyBpbXBvcnRlciBhbmQgY2Fubm90IGJlIHByZXZpZXdlZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3MuaW1hZ2VTaXplID0gYXJncy5pbWFnZVNpemUgfHwgNTEyO1xuICAgICAgICBhcmdzLmpwZWdRdWFsaXR5ID0gYXJncy5qcGVnUXVhbGl0eSB8fCA4MDtcbiAgICAgICAgYXJncy50cmFuc3BhcmVudENvbG9yID0gYXJncy50cmFuc3BhcmVudENvbG9yIHx8IHsgcjogMCwgZzogMCwgYjogMCB9O1xuICAgICAgICBsZXQgaW1wb3J0ZXIgPSBpbmZvLmltcG9ydGVyO1xuXG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEltcG9ydGVycyA9IFtcbiAgICAgICAgICAgICdlcnAtdGV4dHVyZS1jdWJlJyxcbiAgICAgICAgICAgICdpbWFnZScsXG4gICAgICAgICAgICAnc3ByaXRlLWZyYW1lJyxcbiAgICAgICAgICAgICd0ZXh0dXJlJyxcbiAgICAgICAgICAgICdmYngnLFxuICAgICAgICAgICAgJ2dsdGYnLFxuICAgICAgICAgICAgJ2dsdGYtbWVzaCcsXG4gICAgICAgICAgICAncHJlZmFiJyxcbiAgICAgICAgICAgICdtYXRlcmlhbCcsXG4gICAgICAgICAgICAnc3BpbmUnLFxuICAgICAgICAgICAgJ2dsdGYtc2tlbGV0b24nLFxuICAgICAgICAgICAgJ3NjZW5lJ1xuICAgICAgICBdO1xuXG4gICAgICAgIGlmICghc3VwcG9ydGVkSW1wb3J0ZXJzLmluY2x1ZGVzKGltcG9ydGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NldCBwcmV2aWV3IG5vdCBzdXBwb3J0ZWQgZm9yIGFzc2V0IHR5cGU6ICR7aW5mby50eXBlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltcG9ydGVyID09PSAnZmJ4JyB8fCBpbXBvcnRlciA9PT0gJ2dsdGYnKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNoID0gT2JqZWN0LnZhbHVlcyhpbmZvLnN1YkFzc2V0cykuZmluZCgoc3ViOiBhbnkpID0+IHN1Yi5pbXBvcnRlciA9PT0gJ2dsdGYtbWVzaCcpO1xuICAgICAgICAgICAgaWYgKCFtZXNoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NldCAke2FyZ3MucmVmZXJlbmNlLmlkfSBoYXMgbm8gZ2x0Zi1tZXNoIHN1Yi1hc3NldCBmb3IgcHJldmlldy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3MucmVmZXJlbmNlLmlkID0gbWVzaC51dWlkO1xuICAgICAgICAgICAgaW1wb3J0ZXIgPSAnZ2x0Zi1tZXNoJztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzb3VyY2VQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBpZiAoaW1wb3J0ZXIgPT09ICdnbHRmLW1lc2gnIHx8IGltcG9ydGVyID09PSAnbWVzaCcpIHtcbiAgICAgICAgICAgIHNvdXJjZVBhdGggPSAoYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtdGh1bWJuYWlsJywgYXJncy5yZWZlcmVuY2UuaWQsIFwib3JpZ2luXCIpIGFzIGFueSkudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoWydlcnAtdGV4dHVyZS1jdWJlJywgJ2ltYWdlJywgJ3Nwcml0ZS1mcmFtZScsICd0ZXh0dXJlJ10uaW5jbHVkZXMoaW1wb3J0ZXIpKSB7XG4gICAgICAgICAgICBsZXQgZmlsZVV1aWQgPSBhcmdzLnJlZmVyZW5jZS5pZDtcbiAgICAgICAgICAgIGlmIChhcmdzLnJlZmVyZW5jZS5pZC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgICAgICAgICAgZmlsZVV1aWQgPSBhcmdzLnJlZmVyZW5jZS5pZC5zcGxpdCgnQCcpWzBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LWluZm8nLCBmaWxlVXVpZCk7XG4gICAgICAgICAgICBpZiAoZmlsZUluZm8gJiYgZmlsZUluZm8uZmlsZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVBhdGggPSBmaWxlSW5mby5maWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNvdXJjZVBhdGggJiYgZnMuZXhpc3RzU3luYyhzb3VyY2VQYXRoKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IHNoYXJwKHNvdXJjZVBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgaW1hZ2UubWV0YWRhdGEoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZWRTaXplID0gYXJncy5pbWFnZVNpemUgfHwgNTEyO1xuICAgICAgICAgICAgICAgIGxldCBwcm9jZXNzZWQgPSBpbWFnZTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhLndpZHRoICYmIG1ldGFkYXRhLndpZHRoID4gcmVxdWVzdGVkU2l6ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhLmhlaWdodCAmJiBtZXRhZGF0YS5oZWlnaHQgPiByZXF1ZXN0ZWRTaXplKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgPSBwcm9jZXNzZWQucmVzaXplKHJlcXVlc3RlZFNpemUsIHJlcXVlc3RlZFNpemUsIHsgZml0OiAnY29udGFpbicsIGJhY2tncm91bmQ6IHsgcjogMCwgZzogMCwgYjogMCwgYWxwaGE6IDAgfSB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmICgobWV0YWRhdGEuZm9ybWF0ID09PSAncG5nJyB8fCBtZXRhZGF0YS5oYXNBbHBoYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gYXdhaXQgcHJvY2Vzc2VkLmZsYXR0ZW4oeyBiYWNrZ3JvdW5kOiBhcmdzLnRyYW5zcGFyZW50Q29sb3IgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qcGVnKHsgcXVhbGl0eTogYXJncy5qcGVnUXVhbGl0eSB8fCA4MCB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gYXdhaXQgcHJvY2Vzc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAuanBlZyh7IHF1YWxpdHk6IGFyZ3MuanBlZ1F1YWxpdHkgfHwgODAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0J1ZmZlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyB0eXBlOiBcImltYWdlXCIsIGRhdGE6IGJ1ZmZlci50b1N0cmluZygnYmFzZTY0JyksIG1pbWVUeXBlOiBcImltYWdlL2pwZWdcIiB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIGltYWdlIGZyb20gJHtzb3VyY2VQYXRofSB3aXRoIHNoYXJwOmAsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3BlbiBwYW5lbCB0byBlbnN1cmUgcmVuZGVyZXIgcHJvY2VzcyBpcyBhbGl2ZVxuICAgICAgICBhd2FpdCBFZGl0b3IuUGFuZWwub3BlbkJlc2lkZSgnc2NlbmUnLCBgJHtwYWNrYWdlSlNPTi5uYW1lfS5wcmV2aWV3YCk7XG5cbiAgICAgICAgbGV0IGJhc2U2NEltYWdlOiBzdHJpbmc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBSZXF1ZXN0IGdlbmVyYXRpb25cbiAgICAgICAgICAgIGJhc2U2NEltYWdlID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdChwYWNrYWdlSlNPTi5uYW1lLCAnZ2VuZXJhdGUtcHJldmlldycsIGFyZ3MucmVmZXJlbmNlLmlkLCBhcmdzLmltYWdlU2l6ZSB8fCA1MTIsIGFyZ3MuaW1hZ2VTaXplIHx8IDUxMiwgKGFyZ3MuanBlZ1F1YWxpdHkgfHwgODApIC8gMTAwKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIENsb3NlIHBhbmVsXG4gICAgICAgICAgICBhd2FpdCBFZGl0b3IuUGFuZWwuY2xvc2UoYCR7cGFja2FnZUpTT04ubmFtZX0ucHJldmlld2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFiYXNlNjRJbWFnZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2VuZXJhdGUgcHJldmlldyBmb3IgYXNzZXQgJHthcmdzLnJlZmVyZW5jZS5pZH0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJpbWFnZVwiLCBkYXRhOiBiYXNlNjRJbWFnZSwgbWltZVR5cGU6IFwiaW1hZ2UvanBlZ1wiIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVR5cGVzY3JpcHRDbGFzc1RlbXBsYXRlKGNsYXNzTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyBfZGVjb3JhdG9yLCBDb21wb25lbnQsIE5vZGUgfSBmcm9tICdjYyc7XG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5IH0gPSBfZGVjb3JhdG9yO1xuXG5AY2NjbGFzcygnJHtjbGFzc05hbWV9JylcbmV4cG9ydCBjbGFzcyAke2NsYXNzTmFtZX0gZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHN0YXJ0KCkge1xuXG4gICAgfVxuXG4gICAgdXBkYXRlKGRlbHRhVGltZTogbnVtYmVyKSB7XG4gICAgICAgIFxuICAgIH1cbn1gO1xuICAgIH1cbn0iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/tools/component-tools.js b/extensions/cocos-code-mode/dist/utcp/tools/component-tools.js new file mode 100644 index 0000000..65a248d --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/tools/component-tools.js @@ -0,0 +1,129 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ComponentTools = void 0; +const package_json_1 = __importDefault(require("../../../package.json")); +const decorators_1 = require("../decorators"); +const schemas_1 = require("../schemas"); +class ComponentTools { + async nodeGetAvailableComponentTypes(args) { + const allComponents = await Editor.Message.request('scene', 'query-components'); + if (!Array.isArray(allComponents)) { + throw new Error('Failed to retrieve component types'); + } + const lowerFilter = args.filter ? args.filter.toLowerCase() : null; + const filtered = allComponents.filter((comp) => { + let matchesFilter = true; + if (lowerFilter) { + matchesFilter = comp.type && comp.type.toLowerCase().includes(lowerFilter); + } + if (!args.includeInternal) { + matchesFilter = matchesFilter && comp.assetUuid && comp.assetUuid.length > 0; + } + return matchesFilter; + }); + const names = filtered.map((comp) => comp.name).filter((name) => typeof name === 'string'); + return { componentTypes: names }; + } + async nodeComponentsGet(args) { + var _a, _b, _c; + const node = await Editor.Message.request('scene', 'query-node', args.reference.id); + if (!node) { + throw new Error(`Node ${args.reference.id} not found`); + } + const components = node.__comps__ || []; + const foundComponents = []; + for (const comp of components) { + const compUuid = (_b = (_a = comp.value) === null || _a === void 0 ? void 0 : _a.uuid) === null || _b === void 0 ? void 0 : _b.value; + if (!args.componentType || ((_c = comp.type) === null || _c === void 0 ? void 0 : _c.includes(args.componentType))) { + foundComponents.push({ id: compUuid, type: comp.type }); + } + } + if (foundComponents.length > 0) { + return { references: foundComponents }; + } + throw new Error(`Components of type ${args.componentType} not found on node ${args.reference.id}`); + } + async nodeComponentRemove(args) { + try { + const component = await Editor.Message.request('scene', 'query-component', args.reference.id); + if (component === null || component === undefined) { + throw new Error(`Component ${args.reference.id} not found`); + } + await Editor.Message.request('scene', 'remove-component', { + uuid: args.reference.id + }); + await Editor.Message.request('scene', 'snapshot'); + return { success: true }; + } + catch (error) { + throw new Error(`Failed to remove component ${args.reference.id}. Reason: ${(error === null || error === void 0 ? void 0 : error.message) || error}`); + } + } + async nodeComponentAdd(args) { + const node = await Editor.Message.request('scene', 'query-node', args.reference.id); + if (!node) { + throw new Error(`Node ${args.reference.id} not found`); + } + const beforeComponents = node.__comps__ ? node.__comps__.map((c) => { var _a, _b, _c; return ((_b = (_a = c.value) === null || _a === void 0 ? void 0 : _a.uuid) === null || _b === void 0 ? void 0 : _b.value) || ((_c = c.value) === null || _c === void 0 ? void 0 : _c.uuid) || c.uuid; }) : []; + const existingUuids = new Set(beforeComponents); + await Editor.Message.request('scene', 'execute-scene-script', { name: package_json_1.default.name, method: 'startCatchLogging', args: [] }); + await Editor.Message.request('scene', 'create-component', { + uuid: args.reference.id, + component: args.componentType + }); + const nodeAfter = await Editor.Message.request('scene', 'query-node', args.reference.id); + const afterComponents = nodeAfter.__comps__ ? + nodeAfter.__comps__.map((c) => { var _a, _b; return { id: (_b = (_a = c.value) === null || _a === void 0 ? void 0 : _a.uuid) === null || _b === void 0 ? void 0 : _b.value, type: c.type }; }) : []; + const caughtLogs = await Editor.Message.request('scene', 'execute-scene-script', { name: package_json_1.default.name, method: 'stopCatchLogging', args: [] }); + const newComponentRef = afterComponents.find(ref => !existingUuids.has(ref.id)); + if (newComponentRef) { + await Editor.Message.request('scene', 'snapshot'); + return { reference: { id: newComponentRef.id, type: newComponentRef.type } }; + } + throw new Error("Failed to add component. Captured logs: " + caughtLogs.join('\n')); + } +} +exports.ComponentTools = ComponentTools; +__decorate([ + (0, decorators_1.utcpTool)('nodeGetAvailableComponentTypes', 'Get list of globally available component types (class names) at the moment.', { + type: 'object', + properties: { + includeInternal: { type: 'boolean', default: false, description: 'Whether to include internal engine components.' }, + filter: { type: 'string', description: 'Optional filter string to match component types or categories (case-insensitive substring match).' } + }, + required: ['includeInternal'] + }, { type: 'object', properties: { componentTypes: { type: 'array', items: { type: 'string' } } }, required: ['componentTypes'] }, "GET", ['scene', 'node', 'component', 'types', 'inspection']) +], ComponentTools.prototype, "nodeGetAvailableComponentTypes", null); +__decorate([ + (0, decorators_1.utcpTool)('nodeComponentsGet', 'Get components of specific type on a node. If componentType is not provided, returns all components on the node.', { + type: 'object', + properties: { + reference: schemas_1.InstanceReferenceSchema, + componentType: { type: 'string' } + }, + required: ['reference'] + }, { type: 'object', properties: { references: { type: 'array', items: schemas_1.InstanceReferenceSchema } }, required: ['references'] }, "GET", ['scene', 'node', 'component', 'get', 'inspection']) +], ComponentTools.prototype, "nodeComponentsGet", null); +__decorate([ + (0, decorators_1.utcpTool)('nodeComponentRemove', 'Remove referenced component from node it is attached to.', { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, schemas_1.SuccessIndicatorSchema, "POST", ['scene', 'node', 'component', 'remove', 'delete']) +], ComponentTools.prototype, "nodeComponentRemove", null); +__decorate([ + (0, decorators_1.utcpTool)('nodeComponentAdd', 'Add a component to a referenced node, returns reference to the new component', { + type: 'object', + properties: { + reference: schemas_1.InstanceReferenceSchema, + componentType: { type: 'string' } + }, + required: ['reference', 'componentType'] + }, { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, "POST", ['scene', 'node', 'component', 'add']) +], ComponentTools.prototype, "nodeComponentAdd", null); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc291cmNlL3V0Y3AvdG9vbHMvY29tcG9uZW50LXRvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHlFQUFnRDtBQUNoRCw4Q0FBeUM7QUFDekMsd0NBQW9IO0FBRXBILE1BQWEsY0FBYztJQWVqQixBQUFOLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxJQUFtRDtRQUNwRixNQUFNLGFBQWEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ2hELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNkLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9FLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixhQUFhLEdBQUcsYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2pG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dUIsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQzNMO3VEQXFCQTtBQVFLO0lBTkwsSUFBQSxxQkFBUSxFQUNMLHFCQUFxQixFQUNyQiwwREFBMEQsRUFDMUQsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxpQ0FBdUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQy9GLGdDQUFzQixFQUFFLE1BQU0sRUFBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FDdEY7eURBa0JBO0FBZUs7SUFiTCxJQUFBLHFCQUFRLEVBQ0wsa0JBQWtCLEVBQ2xCLDhFQUE4RSxFQUM5RTtRQUNJLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLGlDQUF1QjtZQUNsQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO1NBQ3BDO1FBQ0QsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQztLQUMzQyxFQUNELEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsaUNBQXVCLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUNsSjtzREFrQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGFja2FnZUpTT04gZnJvbSAnLi4vLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7IHV0Y3BUb29sIH0gZnJvbSAnLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBTdWNjZXNzSW5kaWNhdG9yU2NoZW1hLCBJU3VjY2Vzc0luZGljYXRvciwgSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEsIElJbnN0YW5jZVJlZmVyZW5jZSB9IGZyb20gJy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50VG9vbHMge1xuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnbm9kZUdldEF2YWlsYWJsZUNvbXBvbmVudFR5cGVzJyxcbiAgICAgICAgJ0dldCBsaXN0IG9mIGdsb2JhbGx5IGF2YWlsYWJsZSBjb21wb25lbnQgdHlwZXMgKGNsYXNzIG5hbWVzKSBhdCB0aGUgbW9tZW50LicsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIGluY2x1ZGVJbnRlcm5hbDogeyB0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gaW5jbHVkZSBpbnRlcm5hbCBlbmdpbmUgY29tcG9uZW50cy4nIH0sXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIGZpbHRlciBzdHJpbmcgdG8gbWF0Y2ggY29tcG9uZW50IHR5cGVzIG9yIGNhdGVnb3JpZXMgKGNhc2UtaW5zZW5zaXRpdmUgc3Vic3RyaW5nIG1hdGNoKS4nIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogWydpbmNsdWRlSW50ZXJuYWwnXVxuICAgICAgICB9LFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IGNvbXBvbmVudFR5cGVzOiB7IHR5cGU6ICdhcnJheScsIGl0ZW1zOiB7IHR5cGU6ICdzdHJpbmcnIH0gfSB9LCByZXF1aXJlZDogWydjb21wb25lbnRUeXBlcyddIH0sIFwiR0VUXCIsICBbJ3NjZW5lJywgJ25vZGUnLCAnY29tcG9uZW50JywgJ3R5cGVzJywgJ2luc3BlY3Rpb24nXVxuICAgIClcbiAgICBhc3luYyBub2RlR2V0QXZhaWxhYmxlQ29tcG9uZW50VHlwZXMoYXJnczogeyBpbmNsdWRlSW50ZXJuYWw6IGJvb2xlYW4sIGZpbHRlcj86IHN0cmluZyB9KTogUHJvbWlzZTx7IGNvbXBvbmVudFR5cGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgICAgIGNvbnN0IGFsbENvbXBvbmVudHMgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1jb21wb25lbnRzJyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWxsQ29tcG9uZW50cykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJldHJpZXZlIGNvbXBvbmVudCB0eXBlcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG93ZXJGaWx0ZXIgPSBhcmdzLmZpbHRlciA/IGFyZ3MuZmlsdGVyLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGFsbENvbXBvbmVudHMuZmlsdGVyKChjb21wOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxldCBtYXRjaGVzRmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsb3dlckZpbHRlcikge1xuICAgICAgICAgICAgICAgIG1hdGNoZXNGaWx0ZXIgPSBjb21wLnR5cGUgJiYgY29tcC50eXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJGaWx0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhcmdzLmluY2x1ZGVJbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXNGaWx0ZXIgPSBtYXRjaGVzRmlsdGVyICYmIGNvbXAuYXNzZXRVdWlkICYmIGNvbXAuYXNzZXRVdWlkLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc0ZpbHRlcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbmFtZXMgPSBmaWx0ZXJlZC5tYXAoKGNvbXA6IGFueSkgPT4gY29tcC5uYW1lKS5maWx0ZXIoKG5hbWU6IGFueSkgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKTtcblxuICAgICAgICByZXR1cm4geyBjb21wb25lbnRUeXBlczogbmFtZXMgfTtcbiAgICB9XG5cbiAgICBAdXRjcFRvb2woXG4gICAgICAgICdub2RlQ29tcG9uZW50c0dldCcsXG4gICAgICAgICdHZXQgY29tcG9uZW50cyBvZiBzcGVjaWZpYyB0eXBlIG9uIGEgbm9kZS4gSWYgY29tcG9uZW50VHlwZSBpcyBub3QgcHJvdmlkZWQsIHJldHVybnMgYWxsIGNvbXBvbmVudHMgb24gdGhlIG5vZGUuJyxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlOiB7IHR5cGU6ICdzdHJpbmcnIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogWydyZWZlcmVuY2UnXVxuICAgICAgICB9LFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IHJlZmVyZW5jZXM6IHsgdHlwZTogJ2FycmF5JywgaXRlbXM6IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hIH0gfSwgcmVxdWlyZWQ6IFsncmVmZXJlbmNlcyddIH0sIFwiR0VUXCIsICBbJ3NjZW5lJywgJ25vZGUnLCAnY29tcG9uZW50JywgJ2dldCcsICdpbnNwZWN0aW9uJ11cbiAgICApXG4gICAgYXN5bmMgbm9kZUNvbXBvbmVudHNHZXQoYXJnczogeyByZWZlcmVuY2U6IElJbnN0YW5jZVJlZmVyZW5jZSwgY29tcG9uZW50VHlwZT86IHN0cmluZyB9KTogUHJvbWlzZTx7IHJlZmVyZW5jZXM6IElJbnN0YW5jZVJlZmVyZW5jZVtdIH0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3F1ZXJ5LW5vZGUnLCBhcmdzLnJlZmVyZW5jZS5pZCk7XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlICR7YXJncy5yZWZlcmVuY2UuaWR9IG5vdCBmb3VuZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG5vZGUuX19jb21wc19fIHx8IFtdO1xuICAgICAgICBjb25zdCBmb3VuZENvbXBvbmVudHM6IElJbnN0YW5jZVJlZmVyZW5jZVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wVXVpZCA9IChjb21wLnZhbHVlIGFzIGFueSk/LnV1aWQ/LnZhbHVlO1xuICAgICAgICAgICAgaWYgKCFhcmdzLmNvbXBvbmVudFR5cGUgfHwgY29tcC50eXBlPy5pbmNsdWRlcyhhcmdzLmNvbXBvbmVudFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZm91bmRDb21wb25lbnRzLnB1c2goeyBpZDogY29tcFV1aWQsIHR5cGU6IGNvbXAudHlwZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3VuZENvbXBvbmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVmZXJlbmNlczogZm91bmRDb21wb25lbnRzIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBvbmVudHMgb2YgdHlwZSAke2FyZ3MuY29tcG9uZW50VHlwZX0gbm90IGZvdW5kIG9uIG5vZGUgJHthcmdzLnJlZmVyZW5jZS5pZH1gKTtcbiAgICB9XG5cbiAgICBAdXRjcFRvb2woXG4gICAgICAgICdub2RlQ29tcG9uZW50UmVtb3ZlJyxcbiAgICAgICAgJ1JlbW92ZSByZWZlcmVuY2VkIGNvbXBvbmVudCBmcm9tIG5vZGUgaXQgaXMgYXR0YWNoZWQgdG8uJyxcbiAgICAgICAgeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyByZWZlcmVuY2U6IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hIH0sIHJlcXVpcmVkOiBbJ3JlZmVyZW5jZSddIH0sXG4gICAgICAgIFN1Y2Nlc3NJbmRpY2F0b3JTY2hlbWEsIFwiUE9TVFwiLCAgWydzY2VuZScsICdub2RlJywgJ2NvbXBvbmVudCcsICdyZW1vdmUnLCAnZGVsZXRlJ11cbiAgICApXG4gICAgYXN5bmMgbm9kZUNvbXBvbmVudFJlbW92ZShhcmdzOiB7IHJlZmVyZW5jZTogSUluc3RhbmNlUmVmZXJlbmNlIH0pOiBQcm9taXNlPElTdWNjZXNzSW5kaWNhdG9yPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1jb21wb25lbnQnLCBhcmdzLnJlZmVyZW5jZS5pZCk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50ID09PSBudWxsIHx8IGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgJHthcmdzLnJlZmVyZW5jZS5pZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3JlbW92ZS1jb21wb25lbnQnLCB7XG4gICAgICAgICAgICAgICAgdXVpZDogYXJncy5yZWZlcmVuY2UuaWRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdzbmFwc2hvdCcpO1xuXG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlbW92ZSBjb21wb25lbnQgJHthcmdzLnJlZmVyZW5jZS5pZH0uIFJlYXNvbjogJHtlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEB1dGNwVG9vbChcbiAgICAgICAgJ25vZGVDb21wb25lbnRBZGQnLFxuICAgICAgICAnQWRkIGEgY29tcG9uZW50IHRvIGEgcmVmZXJlbmNlZCBub2RlLCByZXR1cm5zIHJlZmVyZW5jZSB0byB0aGUgbmV3IGNvbXBvbmVudCcsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZTogeyB0eXBlOiAnc3RyaW5nJyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFsncmVmZXJlbmNlJywgJ2NvbXBvbmVudFR5cGUnXVxuICAgICAgICB9LFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IHJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEgfSwgcmVxdWlyZWQ6IFsncmVmZXJlbmNlJ10gfSwgXCJQT1NUXCIsICBbJ3NjZW5lJywgJ25vZGUnLCAnY29tcG9uZW50JywgJ2FkZCddXG4gICAgKVxuICAgIGFzeW5jIG5vZGVDb21wb25lbnRBZGQoYXJnczogeyByZWZlcmVuY2U6IElJbnN0YW5jZVJlZmVyZW5jZSwgY29tcG9uZW50VHlwZTogc3RyaW5nIH0pOiBQcm9taXNlPHsgcmVmZXJlbmNlOiBJSW5zdGFuY2VSZWZlcmVuY2UgfT4ge1xuICAgICAgICBjb25zdCBub2RlID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktbm9kZScsIGFyZ3MucmVmZXJlbmNlLmlkKTtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgJHthcmdzLnJlZmVyZW5jZS5pZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiZWZvcmVDb21wb25lbnRzID0gbm9kZS5fX2NvbXBzX18gPyBub2RlLl9fY29tcHNfXy5tYXAoKGM6IGFueSkgPT4gYy52YWx1ZT8udXVpZD8udmFsdWUgfHwgYy52YWx1ZT8udXVpZCB8fCBjLnV1aWQpIDogW107XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nVXVpZHMgPSBuZXcgU2V0KGJlZm9yZUNvbXBvbmVudHMpO1xuXG4gICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2V4ZWN1dGUtc2NlbmUtc2NyaXB0JywgXG4gICAgICAgICAgICB7IG5hbWU6IHBhY2thZ2VKU09OLm5hbWUsIG1ldGhvZDogJ3N0YXJ0Q2F0Y2hMb2dnaW5nJywgYXJnczogW10gfSk7XG5cbiAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAnY3JlYXRlLWNvbXBvbmVudCcsIHtcbiAgICAgICAgICAgIHV1aWQ6IGFyZ3MucmVmZXJlbmNlLmlkLFxuICAgICAgICAgICAgY29tcG9uZW50OiBhcmdzLmNvbXBvbmVudFR5cGVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgbm9kZUFmdGVyID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktbm9kZScsIGFyZ3MucmVmZXJlbmNlLmlkKTtcbiAgICAgICAgY29uc3QgYWZ0ZXJDb21wb25lbnRzOiBJSW5zdGFuY2VSZWZlcmVuY2VbXSA9IG5vZGVBZnRlci5fX2NvbXBzX18gPyBcbiAgICAgICAgICAgIG5vZGVBZnRlci5fX2NvbXBzX18ubWFwKChjOiBhbnkpID0+IHsgcmV0dXJuIHsgaWQ6IGMudmFsdWU/LnV1aWQ/LnZhbHVlLCB0eXBlOiBjLnR5cGUgfSB9KSA6IFtdO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgY2F1Z2h0TG9nczogc3RyaW5nW10gPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdleGVjdXRlLXNjZW5lLXNjcmlwdCcsIFxuICAgICAgICAgICAgeyBuYW1lOiBwYWNrYWdlSlNPTi5uYW1lLCBtZXRob2Q6ICdzdG9wQ2F0Y2hMb2dnaW5nJywgYXJnczogW10gfSk7XG5cbiAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50UmVmID0gYWZ0ZXJDb21wb25lbnRzLmZpbmQocmVmID0+ICFleGlzdGluZ1V1aWRzLmhhcyhyZWYuaWQpKTtcblxuICAgICAgICBpZiAobmV3Q29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdzbmFwc2hvdCcpO1xuXG4gICAgICAgICAgICByZXR1cm4geyByZWZlcmVuY2U6IHsgaWQ6IG5ld0NvbXBvbmVudFJlZi5pZCwgdHlwZTogbmV3Q29tcG9uZW50UmVmLnR5cGUgfSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGFkZCBjb21wb25lbnQuIENhcHR1cmVkIGxvZ3M6IFwiICsgY2F1Z2h0TG9ncy5qb2luKCdcXG4nKSk7XG4gICAgfVxufSJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/tools/editor-tools.js b/extensions/cocos-code-mode/dist/utcp/tools/editor-tools.js new file mode 100644 index 0000000..298d7ae --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/tools/editor-tools.js @@ -0,0 +1,209 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EditorTools = void 0; +const package_json_1 = __importDefault(require("../../../package.json")); +const decorators_1 = require("../decorators"); +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const schemas_1 = require("../schemas"); +class EditorTools { + async editorOperate(args) { + switch (args.operation) { + case 'save_scene_or_prefab': + await Editor.Message.request('scene', 'save-scene'); + return { success: true }; + case 'close_scene_or_prefab': + await Editor.Message.request('scene', 'close-scene'); + return { success: true }; + case 'play_preview': + await Editor.Message.request('scene', 'editor-preview-set-play', true); + return { success: true }; + case 'pause': + await Editor.Message.request('scene', 'editor-preview-call-method', 'pause', true); + return { success: true }; + case 'step': + await Editor.Message.request('scene', 'editor-preview-call-method', 'step'); + return { success: true }; + case 'stop': + await Editor.Message.request('scene', 'editor-preview-set-play', false); + return { success: true }; + case 'refresh': + await Editor.Message.request('asset-db', 'refresh-asset', 'db://assets'); + return { success: true }; + default: + throw new Error(`Unknown operation: ${args.operation}`); + } + } + async editorGetLogs(args) { + const projectPath = Editor.Project.path; + const logPath = path.join(projectPath, 'temp', 'logs', 'project.log'); + if (args.showStack === undefined) { + args.showStack = false; + } + if (!fs.existsSync(logPath)) { + throw new Error(`Log file not found at ${logPath}`); + } + const entries = []; + const fd = fs.openSync(logPath, 'r'); + try { + const stats = fs.fstatSync(fd); + const fileSize = stats.size; + const bufferSize = 10 * 1024; // 10KB chunks + const buffer = Buffer.alloc(bufferSize); + let position = fileSize; + let leftover = ''; + let accumulatedBody = ''; // Text belonging to the current (bottom-most) entry being parsed + const regex = /^(\d{1,2}-\d{1,2}-\d{4}\s\d{2}:\d{2}:\d{2}\s-\s(?:log|warn|error|info):\s)/; + const timestampRegex = /^\d{1,2}-\d{1,2}-\d{4}\s\d{2}:\d{2}:\d{2}\s-\s/; + let lastContent = null; + let lastCount = 0; + while (position > 0 && entries.length < args.count) { + const readSize = Math.min(bufferSize, position); + const readPos = position - readSize; + fs.readSync(fd, buffer, 0, readSize, readPos); + position -= readSize; + const chunk = buffer.toString('utf-8', 0, readSize); + const combined = chunk + leftover; + // Split by newline + const lines = combined.split(/\r?\n/); + if (position > 0) { + leftover = lines.shift() || ''; + } + else { + leftover = ''; // Process all + } + // Process lines in reverse (bottom to top of the chunk) + for (let i = lines.length - 1; i >= 0; i--) { + const line = lines[i]; + // Check if this line is a Header (Start of Entry) + if (regex.test(line)) { + let entry = line; + if (args.showStack && accumulatedBody.length > 0) { + entry += '\n' + accumulatedBody; + } + const cleaned = entry.replace(timestampRegex, ''); + if (cleaned === lastContent) { + lastCount++; + entries[entries.length - 1] = `(${lastCount}) ${cleaned}`; + } + else { + if (entries.length >= args.count) { + // Found a new group but we already have enough + position = 0; // Stop reading file loop + break; // Stop lines loop + } + lastContent = cleaned; + lastCount = 1; + entries.push(cleaned); + } + accumulatedBody = ''; // Reset for the next entry (upwards) + } + else { + // This identifies as body text (or empty line) belonging to the entry "above" it + if (args.showStack && accumulatedBody.length > 0) { + accumulatedBody = line + '\n' + accumulatedBody; + } + else { + accumulatedBody = line; + } + } + } + } + } + finally { + fs.closeSync(fd); + } + // We pushed entries in reverse order (newest first). + if (args.order === 'oldest-to-newest') { + return { logLines: entries.reverse() }; + } + return { logLines: entries }; + } + async editorGetScenePreview(args) { + var _a, _b, _c, _d; + const result = await Editor.Message.request('scene', 'execute-scene-script', { + name: package_json_1.default.name, + method: 'captureScreenshot', + args: [(_a = args.imageSize) !== null && _a !== void 0 ? _a : { width: 512, height: 512 }, (_b = args.jpegQuality) !== null && _b !== void 0 ? _b : 80, args.cameraPosition, args.targetPosition, (_c = args.orthographic) !== null && _c !== void 0 ? _c : false, (_d = args.orthographicSize) !== null && _d !== void 0 ? _d : 10] + }); + return { type: 'image', data: result, mimeType: 'image/jpeg' }; + } +} +exports.EditorTools = EditorTools; +__decorate([ + (0, decorators_1.utcpTool)('editorOperate', 'Common editor operations for scene and prefab view, game preview controls and asset database refresh', { + type: 'object', + properties: { + operation: { type: 'string', enum: ['save_scene_or_prefab', 'close_scene_or_prefab', 'play_preview', 'pause', 'step', 'stop', 'refresh'] } + }, + required: ['operation'] + }, schemas_1.SuccessIndicatorSchema, "POST", ['operation', 'editor', 'scene', 'prefab', 'preview', 'asset', 'refresh']) +], EditorTools.prototype, "editorOperate", null); +__decorate([ + (0, decorators_1.utcpTool)('editorGetLogs', 'Get last N editor log entries', { + type: 'object', + properties: { + count: { type: 'number', description: 'Number of log entries to retrieve', default: 10 }, + showStack: { type: 'boolean', description: 'Return full stack trace for each log entry' }, + order: { type: 'string', enum: ['newest-to-oldest', 'oldest-to-newest'], description: 'Order of logs', default: 'newest-to-oldest' } + }, + required: ['count', 'order'] + }, { type: 'object', properties: { logLines: { type: 'array', items: { type: 'string' } } }, required: ['logLines'] }, "GET", ['editor', 'logs', 'debug', 'info']) +], EditorTools.prototype, "editorGetLogs", null); +__decorate([ + (0, decorators_1.utcpTool)('editorGetScenePreview', 'Returns preview image of scene view. IMPORTANT: To visualize the image, you must return the result of this function DIRECTLY as the final value of your code, do NOT wrap it in an object.', { + type: 'object', + properties: { + imageSize: { type: 'object', properties: { width: { type: 'number', default: 512 }, height: { type: 'number', default: 512 } }, nullable: true }, + jpegQuality: { type: 'integer', minimum: 40, maximum: 100, default: 80 }, + cameraPosition: { type: 'object', properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } }, required: ['x', 'y', 'z'], description: 'Camera world position' }, + targetPosition: { type: 'object', properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } }, required: ['x', 'y', 'z'], description: 'Point the camera looks at' }, + orthographic: { type: 'boolean', default: false, description: 'Whether to use orthographic projection' }, + orthographicSize: { type: 'number', default: 10, description: 'Orthographic size (only applies if orthographic is true)' } + }, + required: ['cameraPosition', 'targetPosition'] + }, schemas_1.Base64ImageSchema, "GET", ['scene', 'screenshot', 'preview', 'inspection', 'image']) +], EditorTools.prototype, "editorGetScenePreview", null); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc291cmNlL3V0Y3AvdG9vbHMvZWRpdG9yLXRvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlFQUFnRDtBQUNoRCw4Q0FBeUM7QUFDekMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qix3Q0FBd0c7QUFFeEcsTUFBYSxXQUFXO0lBY2QsQUFBTixLQUFLLENBQUMsYUFBYSxDQUFDLElBQTJCO1FBQzNDLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JCLEtBQUssc0JBQXNCO2dCQUN2QixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM3QixLQUFLLHVCQUF1QjtnQkFDeEIsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDN0IsS0FBSyxjQUFjO2dCQUNmLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzdCLEtBQUssT0FBTztnQkFDUixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25GLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDN0IsS0FBSyxNQUFNO2dCQUNOLE1BQU0sTUFBTSxD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LEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUM7WUFDdkwsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLDJCQUEyQixFQUFDO1lBQzNMLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsd0NBQXdDLEVBQUM7WUFDdkcsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLDBEQUEwRCxFQUFDO1NBQzVIO1FBQ0QsUUFBUSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7S0FDakQsRUFDRCwyQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQ3RGO3dEQWlCQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYWNrYWdlSlNPTiBmcm9tICcuLi8uLi8uLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgdXRjcFRvb2wgfSBmcm9tICcuLi9kZWNvcmF0b3JzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCYXNlNjRJbWFnZVNjaGVtYSwgSUJhc2U2NEltYWdlLCBJU3VjY2Vzc0luZGljYXRvciwgU3VjY2Vzc0luZGljYXRvclNjaGVtYSB9IGZyb20gJy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgY2xhc3MgRWRpdG9yVG9vbHMge1xuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnZWRpdG9yT3BlcmF0ZScsXG4gICAgICAgICdDb21tb24gZWRpdG9yIG9wZXJhdGlvbnMgZm9yIHNjZW5lIGFuZCBwcmVmYWIgdmlldywgZ2FtZSBwcmV2aWV3IGNvbnRyb2xzIGFuZCBhc3NldCBkYXRhYmFzZSByZWZyZXNoJyxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiB7IHR5cGU6ICdzdHJpbmcnLCBlbnVtOiBbJ3NhdmVfc2NlbmVfb3JfcHJlZmFiJywgJ2Nsb3NlX3NjZW5lX29yX3ByZWZhYicsICdwbGF5X3ByZXZpZXcnLCAncGF1c2UnLCAnc3RlcCcsICdzdG9wJywgJ3JlZnJlc2gnXSB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFsnb3BlcmF0aW9uJ11cbiAgICAgICAgfSxcbiAgICAgICAgU3VjY2Vzc0luZGljYXRvclNjaGVtYSwgXCJQT1NUXCIsICBbJ29wZXJhdGlvbicsICdlZGl0b3InLCAnc2NlbmUnLCAncHJlZmFiJywgJ3ByZXZpZXcnLCAnYXNzZXQnLCAncmVmcmVzaCddXG4gICAgKVxuICAgIGFzeW5jIGVkaXRvck9wZXJhdGUoYXJnczogeyBvcGVyYXRpb246IHN0cmluZyB9KTogUHJvbWlzZTxJU3VjY2Vzc0luZGljYXRvcj4ge1xuICAgICAgICBzd2l0Y2ggKGFyZ3Mub3BlcmF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdzYXZlX3NjZW5lX29yX3ByZWZhYic6XG4gICAgICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAnc2F2ZS1zY2VuZScpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgICAgICAgIGNhc2UgJ2Nsb3NlX3NjZW5lX29yX3ByZWZhYic6XG4gICAgICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAnY2xvc2Utc2NlbmUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgICAgICBjYXNlICdwbGF5X3ByZXZpZXcnOlxuICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2VkaXRvci1wcmV2aWV3LXNldC1wbGF5JywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgICAgICAgY2FzZSAncGF1c2UnOlxuICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2VkaXRvci1wcmV2aWV3LWNhbGwtbWV0aG9kJywgJ3BhdXNlJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgICAgICAgY2FzZSAnc3RlcCc6XG4gICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2VkaXRvci1wcmV2aWV3LWNhbGwtbWV0aG9kJywgJ3N0ZXAnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgICAgICBjYXNlICdzdG9wJzpcbiAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdlZGl0b3ItcHJldmlldy1zZXQtcGxheScsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgICAgICBjYXNlICdyZWZyZXNoJzpcbiAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdyZWZyZXNoLWFzc2V0JywgJ2RiOi8vYXNzZXRzJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gb3BlcmF0aW9uOiAke2FyZ3Mub3BlcmF0aW9ufWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnZWRpdG9yR2V0TG9ncycsXG4gICAgICAgICdHZXQgbGFzdCBOIGVkaXRvciBsb2cgZW50cmllcycsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIGNvdW50OiB7IHR5cGU6ICdudW1iZXInLCBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBsb2cgZW50cmllcyB0byByZXRyaWV2ZScsIGRlZmF1bHQ6IDEwIH0sXG4gICAgICAgICAgICAgICAgc2hvd1N0YWNrOiB7IHR5cGU6ICdib29sZWFuJywgZGVzY3JpcHRpb246ICdSZXR1cm4gZnVsbCBzdGFjayB0cmFjZSBmb3IgZWFjaCBsb2cgZW50cnknIH0sXG4gICAgICAgICAgICAgICAgb3JkZXI6IHsgdHlwZTogJ3N0cmluZycsIGVudW06IFsnbmV3ZXN0LXRvLW9sZGVzdCcsICdvbGRlc3QtdG8tbmV3ZXN0J10sIGRlc2NyaXB0aW9uOiAnT3JkZXIgb2YgbG9ncycsIGRlZmF1bHQ6ICduZXdlc3QtdG8tb2xkZXN0JyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFsnY291bnQnLCAnb3JkZXInXVxuICAgICAgICB9LFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IGxvZ0xpbmVzOiB7IHR5cGU6ICdhcnJheScsIGl0ZW1zOiB7IHR5cGU6ICdzdHJpbmcnIH0gfSB9LCByZXF1aXJlZDogWydsb2dMaW5lcyddIH0sIFwiR0VUXCIsICBbJ2VkaXRvcicsICdsb2dzJywgJ2RlYnVnJywgJ2luZm8nXVxuICAgIClcbiAgICBhc3luYyBlZGl0b3JHZXRMb2dzKGFyZ3M6IHsgY291bnQ6IG51bWJlciwgc2hvd1N0YWNrOiBib29sZWFuLCBvcmRlcjogJ25ld2VzdC10by1vbGRlc3QnIHwgJ29sZGVzdC10by1uZXdlc3QnIH0pOiBQcm9taXNlPHsgbG9nTGluZXM6IHN0cmluZ1tdIH0+IHtcbiAgICAgICAgY29uc3QgcHJvamVjdFBhdGggPSBFZGl0b3IuUHJvamVjdC5wYXRoO1xuICAgICAgICBjb25zdCBsb2dQYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAndGVtcCcsICdsb2dzJywgJ3Byb2plY3QubG9nJyk7XG5cbiAgICAgICAgaWYgKGFyZ3Muc2hvd1N0YWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFyZ3Muc2hvd1N0YWNrID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobG9nUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTG9nIGZpbGUgbm90IGZvdW5kIGF0ICR7bG9nUGF0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGZkID0gZnMub3BlblN5bmMobG9nUGF0aCwgJ3InKTtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLmZzdGF0U3luYyhmZCk7XG4gICAgICAgICAgICBjb25zdCBmaWxlU2l6ZSA9IHN0YXRzLnNpemU7XG4gICAgICAgICAgICBjb25zdCBidWZmZXJTaXplID0gMTAgKiAxMDI0OyAvLyAxMEtCIGNodW5rc1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKGJ1ZmZlclNpemUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBmaWxlU2l6ZTtcbiAgICAgICAgICAgIGxldCBsZWZ0b3ZlciA9ICcnO1xuICAgICAgICAgICAgbGV0IGFjY3VtdWxhdGVkQm9keSA9ICcnOyAvLyBUZXh0IGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCAoYm90dG9tLW1vc3QpIGVudHJ5IGJlaW5nIHBhcnNlZFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCByZWdleCA9IC9eKFxcZHsxLDJ9LVxcZHsxLDJ9LVxcZHs0fVxcc1xcZHsyfTpcXGR7Mn06XFxkezJ9XFxzLVxccyg/OmxvZ3x3YXJufGVycm9yfGluZm8pOlxccykvO1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wUmVnZXggPSAvXlxcZHsxLDJ9LVxcZHsxLDJ9LVxcZHs0fVxcc1xcZHsyfTpcXGR7Mn06XFxkezJ9XFxzLVxccy87XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBsYXN0Q29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgbGFzdENvdW50ID0gMDtcblxuICAgICAgICAgICAgd2hpbGUgKHBvc2l0aW9uID4gMCAmJiBlbnRyaWVzLmxlbmd0aCA8IGFyZ3MuY291bnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkU2l6ZSA9IE1hdGgubWluKGJ1ZmZlclNpemUsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkUG9zID0gcG9zaXRpb24gLSByZWFkU2l6ZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmcy5yZWFkU3luYyhmZCwgYnVmZmVyLCAwLCByZWFkU2l6ZSwgcmVhZFBvcyk7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gLT0gcmVhZFNpemU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBidWZmZXIudG9TdHJpbmcoJ3V0Zi04JywgMCwgcmVhZFNpemUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkID0gY2h1bmsgKyBsZWZ0b3ZlcjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTcGxpdCBieSBuZXdsaW5lXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBjb21iaW5lZC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdG92ZXIgPSBsaW5lcy5zaGlmdCgpIHx8ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnRvdmVyID0gJyc7IC8vIFByb2Nlc3MgYWxsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBsaW5lcyBpbiByZXZlcnNlIChib3R0b20gdG8gdG9wIG9mIHRoZSBjaHVuaylcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gbGluZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBsaW5lIGlzIGEgSGVhZGVyIChTdGFydCBvZiBFbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnRyeSA9IGxpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5zaG93U3RhY2sgJiYgYWNjdW11bGF0ZWRCb2R5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSArPSAnXFxuJyArIGFjY3VtdWxhdGVkQm9keTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5lZCA9IGVudHJ5LnJlcGxhY2UodGltZXN0YW1wUmVnZXgsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFuZWQgPT09IGxhc3RDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdID0gYCgke2xhc3RDb3VudH0pICR7Y2xlYW5lZH1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPj0gYXJncy5jb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCBhIG5ldyBncm91cCBidXQgd2UgYWxyZWFkeSBoYXZlIGVub3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IDA7IC8vIFN0b3AgcmVhZGluZyBmaWxlIGxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFN0b3AgbGluZXMgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29udGVudCA9IGNsZWFuZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENvdW50ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goY2xlYW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkQm9keSA9ICcnOyAvLyBSZXNldCBmb3IgdGhlIG5leHQgZW50cnkgKHVwd2FyZHMpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlkZW50aWZpZXMgYXMgYm9keSB0ZXh0IChvciBlbXB0eSBsaW5lKSBiZWxvbmdpbmcgdG8gdGhlIGVudHJ5IFwiYWJvdmVcIiBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3Muc2hvd1N0YWNrICYmIGFjY3VtdWxhdGVkQm9keS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRCb2R5ID0gbGluZSArICdcXG4nICsgYWNjdW11bGF0ZWRCb2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZEJvZHkgPSBsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgcHVzaGVkIGVudHJpZXMgaW4gcmV2ZXJzZSBvcmRlciAobmV3ZXN0IGZpcnN0KS5cbiAgICAgICAgaWYgKGFyZ3Mub3JkZXIgPT09ICdvbGRlc3QtdG8tbmV3ZXN0Jykge1xuICAgICAgICAgICAgIHJldHVybiB7IGxvZ0xpbmVzOiBlbnRyaWVzLnJldmVyc2UoKSB9O1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHsgbG9nTGluZXM6IGVudHJpZXMgfTtcbiAgICB9XG5cbiAgICBAdXRjcFRvb2woXG4gICAgICAgICdlZGl0b3JHZXRTY2VuZVByZXZpZXcnLFxuICAgICAgICAnUmV0dXJucyBwcmV2aWV3IGltYWdlIG9mIHNjZW5lIHZpZXcuIElNUE9SVEFOVDogVG8gdmlzdWFsaXplIHRoZSBpbWFnZSwgeW91IG11c3QgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBESVJFQ1RMWSBhcyB0aGUgZmluYWwgdmFsdWUgb2YgeW91ciBjb2RlLCBkbyBOT1Qgd3JhcCBpdCBpbiBhbiBvYmplY3QuJyxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgaW1hZ2VTaXplOiB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IHdpZHRoOiB7IHR5cGU6ICdudW1iZXInLCBkZWZhdWx0OiA1MTIgfSwgaGVpZ2h0OiB7IHR5cGU6ICdudW1iZXInLCBkZWZhdWx0OiA1MTIgfSB9LCBudWxsYWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGpwZWdRdWFsaXR5OiB7IHR5cGU6ICdpbnRlZ2VyJywgbWluaW11bTogNDAsIG1heGltdW06IDEwMCwgZGVmYXVsdDogODAgfSxcbiAgICAgICAgICAgICAgICBjYW1lcmFQb3NpdGlvbjogeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyB4OiB7IHR5cGU6ICdudW1iZXInIH0sIHk6IHsgdHlwZTogJ251bWJlcicgfSwgejogeyB0eXBlOiAnbnVtYmVyJyB9IH0sIHJlcXVpcmVkOiBbJ3gnLCAneScsICd6J10sIGRlc2NyaXB0aW9uOiAnQ2FtZXJhIHdvcmxkIHBvc2l0aW9uJ30sXG4gICAgICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb246IHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgeDogeyB0eXBlOiAnbnVtYmVyJyB9LCB5OiB7IHR5cGU6ICdudW1iZXInIH0sIHo6IHsgdHlwZTogJ251bWJlcicgfSB9LCByZXF1aXJlZDogWyd4JywgJ3knLCAneiddLCBkZXNjcmlwdGlvbjogJ1BvaW50IHRoZSBjYW1lcmEgbG9va3MgYXQnfSxcbiAgICAgICAgICAgICAgICBvcnRob2dyYXBoaWM6IHsgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0OiBmYWxzZSwgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbid9LFxuICAgICAgICAgICAgICAgIG9ydGhvZ3JhcGhpY1NpemU6IHsgdHlwZTogJ251bWJlcicsIGRlZmF1bHQ6IDEwLCBkZXNjcmlwdGlvbjogJ09ydGhvZ3JhcGhpYyBzaXplIChvbmx5IGFwcGxpZXMgaWYgb3J0aG9ncmFwaGljIGlzIHRydWUpJ31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogWydjYW1lcmFQb3NpdGlvbicsICd0YXJnZXRQb3NpdGlvbiddXG4gICAgICAgIH0sXG4gICAgICAgIEJhc2U2NEltYWdlU2NoZW1hLCBcIkdFVFwiLCBbJ3NjZW5lJywgJ3NjcmVlbnNob3QnLCAncHJldmlldycsICdpbnNwZWN0aW9uJywgJ2ltYWdlJ11cbiAgICApXG4gICAgYXN5bmMgZWRpdG9yR2V0U2NlbmVQcmV2aWV3KGFyZ3M6IHsgXG4gICAgICAgIGltYWdlU2l6ZT86IHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfSwgXG4gICAgICAgIGpwZWdRdWFsaXR5PzogbnVtYmVyLCBcbiAgICAgICAgY2FtZXJhUG9zaXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIgfSwgXG4gICAgICAgIHRhcmdldFBvc2l0aW9uPzogeyB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyIH0sXG4gICAgICAgIG9ydGhvZ3JhcGhpYz86IGJvb2xlYW4sXG4gICAgICAgIG9ydGhvZ3JhcGhpY1NpemU/OiBudW1iZXJcbiAgICB9KTogUHJvbWlzZTxJQmFzZTY0SW1hZ2U+IHtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdleGVjdXRlLXNjZW5lLXNjcmlwdCcsIHtcbiAgICAgICAgICAgIG5hbWU6IHBhY2thZ2VKU09OLm5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6ICdjYXB0dXJlU2NyZWVuc2hvdCcsXG4gICAgICAgICAgICBhcmdzOiBbYXJncy5pbWFnZVNpemUgPz8geyB3aWR0aDogNTEyLCBoZWlnaHQ6IDUxMiB9LCBhcmdzLmpwZWdRdWFsaXR5ID8/IDgwLCBhcmdzLmNhbWVyYVBvc2l0aW9uICwgYXJncy50YXJnZXRQb3NpdGlvbiwgYXJncy5vcnRob2dyYXBoaWMgPz8gZmFsc2UsIGFyZ3Mub3J0aG9ncmFwaGljU2l6ZSA/PyAxMF1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2ltYWdlJywgZGF0YTogcmVzdWx0LCBtaW1lVHlwZTogJ2ltYWdlL2pwZWcnIH07XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/tools/get-properties-tool.js b/extensions/cocos-code-mode/dist/utcp/tools/get-properties-tool.js new file mode 100644 index 0000000..8cbae6c --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/tools/get-properties-tool.js @@ -0,0 +1,37 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GetPropertiesTool = void 0; +const decorators_1 = require("../decorators"); +const schemas_1 = require("../schemas"); +const tools_utils_1 = require("../utils/tools-utils"); +class GetPropertiesTool { + async inspectorGetSettingsProperties(params) { + return await this.inspectorGetProperties({ reference: { id: params.settingsType } }); + } + async inspectorGetProperties(args) { + const info = await tools_utils_1.ToolsUtils.inspectInstance(args.reference.id); + if (!info) { + throw new Error(`Target ${args.reference.id} not found or not supported.`); + } + const { props, type, assetInfo } = info; + if (!props) { + throw new Error(`Could not retrieve properties for ${type} (${args.reference.id}).`); + } + const parsedProps = tools_utils_1.ToolsUtils.unwrapProperties(props); + return { dump: parsedProps }; + } +} +exports.GetPropertiesTool = GetPropertiesTool; +__decorate([ + (0, decorators_1.utcpTool)("inspectorGetSettingsProperties", "Gets plain object of properties for the specific settings.", { type: 'object', properties: { settingsType: { type: 'string', enum: ['CurrentSceneGlobals', 'ProjectSettings'] } }, required: ['settingsType'] }, { type: 'object', properties: { dump: { type: 'object' } }, required: ['dump'] }, "GET", ['inspect', 'scene', 'properties', 'settings', 'config', 'dump']) +], GetPropertiesTool.prototype, "inspectorGetSettingsProperties", null); +__decorate([ + (0, decorators_1.utcpTool)("inspectorGetInstanceProperties", "Gets plain object of properties, with no serialization info for any instance (scene node, component, asset).", { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, { type: 'object', properties: { dump: { type: 'object' } }, required: ['dump'] }, "GET", ['inspect', 'properties', 'dump', 'instance', 'node', 'component', 'asset', 'data']) +], GetPropertiesTool.prototype, "inspectorGetProperties", null); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXByb3BlcnRpZXMtdG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS91dGNwL3Rvb2xzL2dldC1wcm9wZXJ0aWVzLXRvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsOENBQXlDO0FBQ3pDLHdDQUF5RTtBQUN6RSxzREFBa0Q7QUFFbEQsTUFBYSxpQkFBaUI7SUFRcEIsQUFBTixLQUFLLENBQUMsOEJBQThCLENBQUMsTUFBZ0M7UUFDakUsT0FBTyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFRSyxBQUFOLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUF1QztRQUNoRSxNQUFNLElBQUksR0FBRyxNQUFNLHdCQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRCxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsd0JBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSjtBQWpDRCw4Q0FpQ0M7QUF6QlM7SUFOTCxJQUFBLHFCQUFRLEVBQ0wsZ0NBQWdDLEVBQ2hDLDREQUE0RCxFQUM1RCxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUNsSixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUM3Sjt1RUFHQTtBQVFLO0lBTkwsSUFBQSxxQkFBUSxFQUNMLGdDQUFnQyxFQUNoQyw4R0FBOEcsRUFDOUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxpQ0FBdUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQy9GLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FDaEw7K0RBZUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGNwVG9vbCB9IGZyb20gJy4uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgSUluc3RhbmNlUmVmZXJlbmNlLCBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSB9IGZyb20gJy4uL3NjaGVtYXMnO1xuaW1wb3J0IHsgVG9vbHNVdGlscyB9IGZyb20gJy4uL3V0aWxzL3Rvb2xzLXV0aWxzJztcblxuZXhwb3J0IGNsYXNzIEdldFByb3BlcnRpZXNUb29sIHtcblxuICAgIEB1dGNwVG9vbChcbiAgICAgICAgXCJpbnNwZWN0b3JHZXRTZXR0aW5nc1Byb3BlcnRpZXNcIixcbiAgICAgICAgXCJHZXRzIHBsYWluIG9iamVjdCBvZiBwcm9wZXJ0aWVzIGZvciB0aGUgc3BlY2lmaWMgc2V0dGluZ3MuXCIsXG4gICAgICAgIHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgc2V0dGluZ3NUeXBlOiB7IHR5cGU6ICdzdHJpbmcnLCBlbnVtOiBbJ0N1cnJlbnRTY2VuZUdsb2JhbHMnLCAnUHJvamVjdFNldHRpbmdzJ10gfSB9LCByZXF1aXJlZDogWydzZXR0aW5nc1R5cGUnXSB9LFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IGR1bXA6IHsgdHlwZTogJ29iamVjdCcgfSB9LCByZXF1aXJlZDogWydkdW1wJ10gfSwgXCJHRVRcIiwgIFsnaW5zcGVjdCcsICdzY2VuZScsICdwcm9wZXJ0aWVzJywgJ3NldHRpbmdzJywgJ2NvbmZpZycsICdkdW1wJ11cbiAgICApXG4gICAgYXN5bmMgaW5zcGVjdG9yR2V0U2V0dGluZ3NQcm9wZXJ0aWVzKHBhcmFtczogeyBzZXR0aW5nc1R5cGU6IHN0cmluZyB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5zcGVjdG9yR2V0UHJvcGVydGllcyh7IHJlZmVyZW5jZTogeyBpZDogcGFyYW1zLnNldHRpbmdzVHlwZSB9IH0pO1xuICAgIH1cblxuICAgIEB1dGNwVG9vbChcbiAgICAgICAgXCJpbnNwZWN0b3JHZXRJbnN0YW5jZVByb3BlcnRpZXNcIixcbiAgICAgICAgXCJHZXRzIHBsYWluIG9iamVjdCBvZiBwcm9wZXJ0aWVzLCB3aXRoIG5vIHNlcmlhbGl6YXRpb24gaW5mbyBmb3IgYW55IGluc3RhbmNlIChzY2VuZSBub2RlLCBjb21wb25lbnQsIGFzc2V0KS5cIixcbiAgICAgICAgeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyByZWZlcmVuY2U6IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hIH0sIHJlcXVpcmVkOiBbJ3JlZmVyZW5jZSddIH0sXG4gICAgICAgIHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgZHVtcDogeyB0eXBlOiAnb2JqZWN0JyB9IH0sIHJlcXVpcmVkOiBbJ2R1bXAnXSB9LCBcIkdFVFwiLCAgWydpbnNwZWN0JywgJ3Byb3BlcnRpZXMnLCAnZHVtcCcsICdpbnN0YW5jZScsICdub2RlJywgJ2NvbXBvbmVudCcsICdhc3NldCcsICdkYXRhJ11cbiAgICApXG4gICAgYXN5bmMgaW5zcGVjdG9yR2V0UHJvcGVydGllcyhhcmdzOiB7IHJlZmVyZW5jZTogSUluc3RhbmNlUmVmZXJlbmNlIH0pOiBQcm9taXNlPHsgZHVtcDogYW55IH0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IFRvb2xzVXRpbHMuaW5zcGVjdEluc3RhbmNlKGFyZ3MucmVmZXJlbmNlLmlkKTtcbiAgICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhcmdldCAke2FyZ3MucmVmZXJlbmNlLmlkfSBub3QgZm91bmQgb3Igbm90IHN1cHBvcnRlZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgcHJvcHMsIHR5cGUsIGFzc2V0SW5mbyB9ID0gaW5mbztcbiAgICAgICAgaWYgKCFwcm9wcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmV0cmlldmUgcHJvcGVydGllcyBmb3IgJHt0eXBlfSAoJHthcmdzLnJlZmVyZW5jZS5pZH0pLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkUHJvcHMgPSBUb29sc1V0aWxzLnVud3JhcFByb3BlcnRpZXMocHJvcHMpO1xuXG4gICAgICAgIHJldHVybiB7IGR1bXA6IHBhcnNlZFByb3BzIH07XG4gICAgfVxufVxuXG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/tools/scene-tools.js b/extensions/cocos-code-mode/dist/utcp/tools/scene-tools.js new file mode 100644 index 0000000..b5a45d7 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/tools/scene-tools.js @@ -0,0 +1,411 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SceneTools = void 0; +const package_json_1 = __importDefault(require("../../../package.json")); +const decorators_1 = require("../decorators"); +const schemas_1 = require("../schemas"); +class SceneTools { + async nodeGetTree(args) { + var _a; + let treeBase; + if (args.reference) { + treeBase = await Editor.Message.request('scene', 'query-node-tree', args.reference.id); + } + else { + // Default queries the whole scene + treeBase = await Editor.Message.request('scene', 'query-node-tree'); + } + if (!treeBase) { + throw new Error(`Node tree not found for ${((_a = args.reference) === null || _a === void 0 ? void 0 : _a.id) || 'entire scene'}`); + } + const formatNode = (node) => { + const comps = node.components ? node.components.map((c) => ({ + reference: { id: c.value, type: c.type } + })) : []; + let children = []; + children = node.children ? node.children.map(formatNode).filter((c) => c !== null) : []; + return { + reference: { id: node.uuid, type: 'cc.Node' }, + name: node.name, + active: node.active, + components: comps, + children: children + }; + }; + const result = formatNode(treeBase); + result.path = treeBase.path || undefined; + return result; + } + async nodeGetAtPath(args) { + const nodeTree = await Editor.Message.request('scene', 'query-node-tree'); + if (!nodeTree) { + throw new Error(`Scene is empty or could not retrieve scene tree.`); + } + const sceneRootName = nodeTree.name; + if (args.hierarchyPath.startsWith('/')) { + args.hierarchyPath = args.hierarchyPath.slice(1); + } + if (args.hierarchyPath.startsWith(`${sceneRootName}`)) { + args.hierarchyPath = args.hierarchyPath.slice(sceneRootName.length); + } + if (args.hierarchyPath === '') { + return { references: [{ id: nodeTree.uuid }] }; + } + const pathParts = args.hierarchyPath.split('/').filter(p => p.length > 0); + let currentNodes = [nodeTree]; + for (const part of pathParts) { + const nextNodes = []; + for (const node of currentNodes) { + const matchingChildren = (node.children || []).filter((child) => child.name === part); + nextNodes.push(...matchingChildren); + } + currentNodes = nextNodes; + if (currentNodes.length === 0) { + break; + } + } + return { references: currentNodes.map((node) => ({ id: node.uuid, type: 'cc.Node' })) }; + } + async sceneCreatePrimitiveNode(args) { + const primitiveMap = { + 'Capsule': "db://internal/default_prefab/3d/Capsule.prefab", + 'Cone': "db://internal/default_prefab/3d/Cone.prefab", + 'Cube': "db://internal/default_prefab/3d/Cube.prefab", + 'Cylinder': "db://internal/default_prefab/3d/Cylinder.prefab", + 'Plane': "db://internal/default_prefab/3d/Plane.prefab", + 'Quad': "db://internal/default_prefab/3d/Quad.prefab", + 'Sphere': "db://internal/default_prefab/3d/Sphere.prefab", + 'Torus': "db://internal/default_prefab/3d/Torus.prefab", + }; + if (!primitiveMap[args.primitiveType]) { + throw new Error(`Unsupported primitive type: ${args.primitiveType}`); + } + const prefabUrl = primitiveMap[args.primitiveType]; + const assetUuid = await Editor.Message.request('asset-db', 'query-uuid', prefabUrl); + if (!assetUuid) { + throw new Error(`Failed to find asset for primitive type ${args.primitiveType} at ${prefabUrl}`); + } + return await this.sceneCreateNode({ + name: args.name, + parentReference: args.parentReference, + assetReference: { id: assetUuid, type: 'cc.Prefab' }, + unwrapPrefab: true + }); + } + async sceneCreateNode(args) { + const options = { + name: args.name + }; + if (args.parentReference) { + options.parent = args.parentReference.id; + } + else { + // Force root if no parent provided + options.parent = (await Editor.Message.request('scene', 'query-node-tree')).uuid; + } + let assetUuid = null; + // 1. Determine Asset UUID + if ((args.assetReference && 'id' in args.assetReference)) { + const assetInfo = await Editor.Message.request('asset-db', 'query-asset-info', args.assetReference.id); + if (!assetInfo) { + throw new Error(`Asset reference not found: ${args.assetReference.id}`); + } + let prefabFound = assetInfo.type === 'cc.Prefab'; + // If not a prefab, check if it has a prefab sub-asset (like in case of FBX) + if (!prefabFound) { + for (let subAsset of Object.values(assetInfo.subAssets)) { + if (subAsset.type === 'cc.Prefab') { + assetUuid = subAsset.uuid; + prefabFound = true; + break; + } + } + } + else { + assetUuid = assetInfo.uuid; + } + if (!prefabFound) { + throw new Error(`Provided asset reference ${args.assetReference.id} is not a prefab and does not contain a prefab sub-asset.`); + } + else { + if (!args.unwrapPrefab) { + options.unlinkPrefab = false; + options.type = 'cc.Prefab'; + } + } + } + if (assetUuid) { + options.assetUuid = assetUuid; + } + // 2. Create Node + const result = await Editor.Message.request('scene', 'create-node', options); + const newNodeUuid = Array.isArray(result) ? result[0] : result; + if (!newNodeUuid) { + throw new Error(`Failed to create node ${args.name}${args.assetReference ? ` from asset ${args.assetReference.id}` : ''}.`); + } + await Editor.Message.request('scene', 'snapshot'); + return { reference: { id: newNodeUuid, type: 'cc.Node' } }; + } + async nodeOperate(args) { + if (await Editor.Message.request('scene', 'query-node', args.reference.id) === null) { + throw new Error(`Target node ${args.reference.id} not found`); + } + switch (args.operation) { + case 'move': + if (!args.newParentReference) { + throw new Error("newParentReference required for move"); + } + await Editor.Message.request('scene', 'set-parent', { + parent: args.newParentReference.id, + uuids: args.reference.id, + keepWorldTransform: true + }); + if (args.siblingIndex !== undefined) { + await this.setSiblingIndex(args.reference.id, args.siblingIndex); + } + await Editor.Message.request('scene', 'snapshot'); + return { success: true }; + case 'copy': + const duplicateResult = await Editor.Message.request('scene', 'duplicate-node', [args.reference.id]); + if (!duplicateResult || duplicateResult.length === 0) { + throw new Error(`Node ${args.reference.id} duplication failed`); + } + const newNodes = duplicateResult; + const newNodeId = newNodes[0]; + if (args.newParentReference) { + await Editor.Message.request('scene', 'set-parent', { + parent: args.newParentReference.id, + uuids: newNodes, + keepWorldTransform: true + }); + } + if (args.siblingIndex !== undefined) { + await this.setSiblingIndex(newNodeId, args.siblingIndex); + } + await Editor.Message.request('scene', 'snapshot'); + return { success: true, copiedNodeReference: { id: newNodeId, type: 'cc.Node' } }; + case 'delete': + await Editor.Message.request('scene', 'remove-node', { + uuid: args.reference.id + }); + const nodeCheck = await Editor.Message.request('scene', 'query-node', args.reference.id); + if (nodeCheck !== null && nodeCheck !== undefined) { + throw new Error(`Node ${args.reference.id} still exists after removal`); + } + await Editor.Message.request('scene', 'snapshot'); + return { success: true }; + case 'create_prefab': + if (!args.newPrefabPath) { + throw new Error("newPrefabPath required for create_prefab"); + } + const parentInfo = await this.getParentAndSiblingIndex(args.reference.id); + const createdPrefabUuid = await Editor.Message.request('scene', 'execute-scene-script', { + name: package_json_1.default.name, + method: 'createPrefabFromNode', + args: [args.reference.id, args.newPrefabPath] + }); + if (!createdPrefabUuid) { + throw new Error("Failed to create prefab asset."); + } + const updatedNodeId = await this.getUpdatedUuid(parentInfo.parentUuid, parentInfo.siblingIndex); + await Editor.Message.request('scene', 'snapshot'); + return { success: true, createdPrefabAssetReference: { id: createdPrefabUuid, type: 'cc.Prefab' }, updatedNodeReference: { id: updatedNodeId, type: 'cc.Node' } }; + case 'revert_prefab': + const revertSuccess = await Editor.Message.request('scene', 'restore-prefab', { uuid: args.reference.id }); + await Editor.Message.request('scene', 'snapshot'); + return { success: revertSuccess }; + case 'apply_prefab': + const applyError = await Editor.Message.request('scene', 'execute-scene-script', { + name: package_json_1.default.name, + method: 'applyPrefabByNode', + args: [args.reference.id] + }); + if (applyError != null) { + throw new Error(`Failed to apply prefab: ${applyError}`); + } + await Editor.Message.request('scene', 'snapshot'); + return { success: true }; + case 'unwrap_prefab': + const unwrapError = await Editor.Message.request('scene', 'execute-scene-script', { + name: package_json_1.default.name, + method: 'unlinkPrefabByNode', + args: [args.reference.id, false] + }); + if (unwrapError != null) { + throw new Error(`Failed to unwrap prefab: ${unwrapError}`); + } + await Editor.Message.request('scene', 'snapshot'); + return { success: true }; + case 'unwrap_prefab_completely': + const unwrapAllError = await Editor.Message.request('scene', 'execute-scene-script', { + name: package_json_1.default.name, + method: 'unlinkPrefabByNode', + args: [args.reference.id, true] + }); + if (unwrapAllError != null) { + throw new Error(`Failed to unwrap prefab completely: ${unwrapAllError}`); + } + await Editor.Message.request('scene', 'snapshot'); + return { success: true }; + case 'open_prefab': + const nodeForPrefab = await Editor.Message.request('scene', 'query-node', args.reference.id); + if (!nodeForPrefab) { + throw new Error(`Node ${args.reference.id} not found`); + } + const pInfo = nodeForPrefab.__prefab__ || nodeForPrefab._prefab || (nodeForPrefab.value && (nodeForPrefab.value.__prefab__ || nodeForPrefab.value._prefab)); + const pValue = (pInfo === null || pInfo === void 0 ? void 0 : pInfo.value) || pInfo; + const targetUuid = (pValue === null || pValue === void 0 ? void 0 : pValue.assetUuid) || (pValue === null || pValue === void 0 ? void 0 : pValue.uuid); + if (!targetUuid) { + throw new Error(`Node ${args.reference.id} is not linked to a prefab`); + } + try { + await Editor.Message.request('asset-db', 'open-asset', targetUuid); + } + catch (error) { + throw new Error(`Failed to open prefab asset ${targetUuid}. Reason: ${(error === null || error === void 0 ? void 0 : error.message) || error}`); + } + return { success: true }; + default: + throw new Error(`Unknown scene node operation: ${args.operation}`); + } + } + // Helpers + async getParent(nodeUuid) { + var _a, _b, _c; + const node = await Editor.Message.request('scene', 'query-node', nodeUuid); + if ((_b = (_a = node === null || node === void 0 ? void 0 : node.parent) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.uuid) + return node.parent.value.uuid; + if ((_c = node === null || node === void 0 ? void 0 : node.parent) === null || _c === void 0 ? void 0 : _c.uuid) + return node.parent.uuid; + return await Editor.Message.request('scene', 'query-uuid'); + } + // Helper to set sibling index + async setSiblingIndex(uuid, index) { + // Get parent first + const parentUuid = await this.getParent(uuid); + if (!parentUuid) { + throw new Error(`Node ${uuid} has no parent`); + } + // Get children of parent + const parentNode = await Editor.Message.request('scene', 'query-node', parentUuid); + const childrenArray = parentNode.children; + if (!childrenArray || !Array.isArray(childrenArray)) { + throw new Error(`Parent node ${parentUuid} has no children`); + } + const currentIndex = childrenArray.findIndex((child) => child.value.uuid === uuid); + if (currentIndex === -1) { + throw new Error(`Node ${uuid} not found in parent children`); + } + if (currentIndex === index) + return true; + // Calculate offset + // We need to move the element at currentIndex to targetIndex. + // The API move-array-element works with offset from current position. + // Ensure index is within bounds [0, length-1] + const targetIndex = Math.max(0, Math.min(index, childrenArray.length - 1)); + const offset = targetIndex - currentIndex; + if (offset === 0) + return true; + return await Editor.Message.request('scene', 'move-array-element', { + uuid: parentUuid, + path: 'children', + target: currentIndex, + offset: offset, + }); + } + async getParentAndSiblingIndex(uuid) { + const parentUuid = await this.getParent(uuid); + if (!parentUuid) { + throw new Error(`Node ${uuid} has no parent`); + } + const parentNode = await Editor.Message.request('scene', 'query-node', parentUuid); + const childrenArray = parentNode.children; + if (!childrenArray || !Array.isArray(childrenArray)) { + throw new Error(`Parent node ${parentUuid} has no children`); + } + const index = childrenArray.findIndex((child) => child.value.uuid === uuid); + if (index === -1) { + throw new Error(`Node ${uuid} not found in parent children`); + } + return { parentUuid, siblingIndex: index }; + } + async getUpdatedUuid(parentUuid, siblingIndex) { + const parentNodeInfo = await Editor.Message.request('scene', 'query-node', parentUuid); + if (!parentNodeInfo || !parentNodeInfo.children || !Array.isArray(parentNodeInfo.children) || !parentNodeInfo.children[siblingIndex]) { + throw new Error(`Failed to retrieve updated node info after prefab creation.`); + } + return parentNodeInfo.children[siblingIndex].value.uuid; + } +} +exports.SceneTools = SceneTools; +__decorate([ + (0, decorators_1.utcpTool)('nodeGetTree', 'Get the hierarchy tree of specific node or scene root if no reference is provided. Children have recursive structure.', { + type: 'object', + properties: { + reference: schemas_1.InstanceReferenceSchema + } + }, schemas_1.SceneTreeItemSchema, "GET", ['scene', 'graph', 'node', 'hierarchy', 'tree']) +], SceneTools.prototype, "nodeGetTree", null); +__decorate([ + (0, decorators_1.utcpTool)('nodeGetAtPath', 'Get nodes at specific path in the scene hierarchy. Usually returns one node, but can return multiple nodes with the same name.', { + type: 'object', + properties: { + hierarchyPath: { type: 'string', description: 'Path to the node in the scene hierarchy"' }, + }, + required: ['hierarchyPath'] + }, { type: 'object', properties: { references: { type: 'array', items: schemas_1.InstanceReferenceSchema } } }, "GET", ['scene', 'node', 'get', 'path', 'find', 'look', 'instance', 'hierarchy']) +], SceneTools.prototype, "nodeGetAtPath", null); +__decorate([ + (0, decorators_1.utcpTool)('nodeCreatePrimitive', 'Create a new node with predefined primitive geometry MeshRenderer. If no parent is specified, root node is used. Returns reference to the new node.', { type: 'object', + properties: { + name: { type: 'string' }, + primitiveType: { type: 'string', enum: [ + 'Capsule', 'Cone', 'Cube', 'Cylinder', 'Plane', 'Quad', 'Sphere', 'Torus', + ] }, + parentReference: schemas_1.InstanceReferenceSchema + }, + required: ['name', 'primitiveType'] + }, { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, "POST", ['scene', 'node', 'create', 'add']) +], SceneTools.prototype, "sceneCreatePrimitiveNode", null); +__decorate([ + (0, decorators_1.utcpTool)('nodeCreate', 'Create a new node in the scene. If no parent is specified, root node is used. Returns reference to the new node.', { + type: 'object', + properties: { + name: { type: 'string' }, + parentReference: schemas_1.InstanceReferenceSchema, + assetReference: schemas_1.InstanceReferenceSchema, + unwrapPrefab: { type: 'boolean', default: false } + }, + required: ['name'] + }, { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, "POST", ['scene', 'node', 'create', 'add']) +], SceneTools.prototype, "sceneCreateNode", null); +__decorate([ + (0, decorators_1.utcpTool)('nodeOperate', 'Perform operation on referenced node, including prefab operations.', { + type: 'object', + properties: { + operation: { type: 'string', enum: ['move', 'copy', 'delete', 'create_prefab', 'revert_prefab', 'apply_prefab', 'unwrap_prefab', 'unwrap_prefab_completely', 'open_prefab'] }, + reference: schemas_1.InstanceReferenceSchema, + newParentReference: schemas_1.InstanceReferenceSchema, + newPrefabPath: { type: 'string', description: 'For create_prefab: target db:// path', nullable: true }, + siblingIndex: { type: 'integer', description: 'For move/copy: target index in parent children array', nullable: true } + }, + required: ['operation', 'reference'] + }, { type: 'object', + properties: { + success: { type: 'boolean' }, + createdPrefabAssetReference: schemas_1.InstanceReferenceSchema, + updatedNodeReference: schemas_1.InstanceReferenceSchema, + copiedNodeReference: schemas_1.InstanceReferenceSchema + } + }, "POST", ['scene', 'node', 'remove', 'move', 'copy', 'delete', 'prefab', 'apply', 'revert', 'unwrap', 'create']) +], SceneTools.prototype, "nodeOperate", null); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvdXRjcC90b29scy9zY2VuZS10b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSx5RUFBZ0Q7QUFDaEQsOENBQXlDO0FBQ3pDLHdDQUErSTtBQUUvSSxNQUFhLFVBQVU7SUFhYixBQUFOLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBd0M7O1FBQ3RELElBQUksUUFBUSxDQUFDO1FBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDaEIsUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUYsQ0FBQzthQUFNLENBQUM7WUFDSCxrQ0FBa0M7WUFDbEMsUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUEsTUFBQSxJQUFJLENBQUMsU0FBUywwQ0FBRSxFQUFFLEtBQUksY0FBYyxFQUFFLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFTLEVBQWtCLEVBQUU7WUFFOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzdELFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFO2FBQzNDLENBQUMs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LFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFDdEcsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsc0RBQXNELEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtTQUN6SDtRQUNELFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7S0FDdkMsRUFDRCxFQUFFLElBQUksRUFBRSxRQUFRO1FBQ1osVUFBVSxFQUFFO1lBQ1IsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUM1QiwyQkFBMkIsRUFBRSxpQ0FBdUI7WUFDcEQsb0JBQW9CLEVBQUUsaUNBQXVCO1lBQzdDLG1CQUFtQixFQUFFLGlDQUF1QjtTQUMvQztLQUNKLEVBQUUsTUFBTSxFQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUNySDs2Q0FvS0EiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGFja2FnZUpTT04gZnJvbSAnLi4vLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7IHV0Y3BUb29sIH0gZnJvbSAnLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJU2NlbmVUcmVlSXRlbSwgU2NlbmVUcmVlSXRlbVNjaGVtYSwgQmFzZTY0SW1hZ2VTY2hlbWEsIElCYXNlNjRJbWFnZSwgSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEsIElJbnN0YW5jZVJlZmVyZW5jZSB9IGZyb20gJy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgY2xhc3MgU2NlbmVUb29scyB7XG5cbiAgICBAdXRjcFRvb2woXG4gICAgICAgICdub2RlR2V0VHJlZScsXG4gICAgICAgICdHZXQgdGhlIGhpZXJhcmNoeSB0cmVlIG9mIHNwZWNpZmljIG5vZGUgb3Igc2NlbmUgcm9vdCBpZiBubyByZWZlcmVuY2UgaXMgcHJvdmlkZWQuIENoaWxkcmVuIGhhdmUgcmVjdXJzaXZlIHN0cnVjdHVyZS4nLFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2U6IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFNjZW5lVHJlZUl0ZW1TY2hlbWEsIFwiR0VUXCIsICBbJ3NjZW5lJywgJ2dyYXBoJywgJ25vZGUnLCAnaGllcmFyY2h5JywgJ3RyZWUnXVxuICAgIClcbiAgICBhc3luYyBub2RlR2V0VHJlZShhcmdzOiB7IHJlZmVyZW5jZT86IElJbnN0YW5jZVJlZmVyZW5jZSB9KTogUHJvbWlzZTxJU2NlbmVUcmVlSXRlbT4ge1xuICAgICAgICBsZXQgdHJlZUJhc2U7XG4gICAgICAgIGlmIChhcmdzLnJlZmVyZW5jZSkge1xuICAgICAgICAgICAgIHRyZWVCYXNlID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktbm9kZS10cmVlJywgYXJncy5yZWZlcmVuY2UuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgIC8vIERlZmF1bHQgcXVlcmllcyB0aGUgd2hvbGUgc2NlbmVcbiAgICAgICAgICAgICB0cmVlQmFzZSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3F1ZXJ5LW5vZGUtdHJlZScpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIXRyZWVCYXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgdHJlZSBub3QgZm91bmQgZm9yICR7YXJncy5yZWZlcmVuY2U/LmlkIHx8ICdlbnRpcmUgc2NlbmUnfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybWF0Tm9kZSA9IChub2RlOiBhbnkpOiBJU2NlbmVUcmVlSXRlbSA9PiB7XG5cbiAgICAgICAgICAgY29uc3QgY29tcHMgPSBub2RlLmNvbXBvbmVudHMgPyBub2RlLmNvbXBvbmVudHMubWFwKChjOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICByZWZlcmVuY2U6IHsgaWQ6IGMudmFsdWUsIHR5cGU6IGMudHlwZSB9XG4gICAgICAgICAgIH0pKSA6IFtdO1xuXG4gICAgICAgICAgIGxldCBjaGlsZHJlbjogSVNjZW5lVHJlZUl0ZW1bXSA9IFtdO1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuID8gbm9kZS5jaGlsZHJlbi5tYXAoZm9ybWF0Tm9kZSkuZmlsdGVyKChjOiBhbnkpID0+IGMgIT09IG51bGwpIDogW107XG5cbiAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2U6IHsgaWQ6IG5vZGUudXVpZCwgdHlwZTogJ2NjLk5vZGUnIH0sXG4gICAgICAgICAgICAgICAgbmFtZTogbm9kZS5uYW1lLFxuICAgICAgICAgICAgICAgIGFjdGl2ZTogbm9kZS5hY3RpdmUsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50czogY29tcHMsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBjb25zdCByZXN1bHQ6IElTY2VuZVRyZWVJdGVtID0gZm9ybWF0Tm9kZSh0cmVlQmFzZSk7XG4gICAgICAgIHJlc3VsdC5wYXRoID0gKHRyZWVCYXNlIGFzIGFueSkucGF0aCB8fCB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnbm9kZUdldEF0UGF0aCcsXG4gICAgICAgICdHZXQgbm9kZXMgYXQgc3BlY2lmaWMgcGF0aCBpbiB0aGUgc2NlbmUgaGllcmFyY2h5LiBVc3VhbGx5IHJldHVybnMgb25lIG5vZGUsIGJ1dCBjYW4gcmV0dXJuIG11bHRpcGxlIG5vZGVzIHdpdGggdGhlIHNhbWUgbmFtZS4nLFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBoaWVyYXJjaHlQYXRoOiB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1BhdGggdG8gdGhlIG5vZGUgaW4gdGhlIHNjZW5lIGhpZXJhcmNoeVwiJyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBbJ2hpZXJhcmNoeVBhdGgnXVxuICAgICAgICB9LCB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IHJlZmVyZW5jZXM6IHsgdHlwZTogJ2FycmF5JywgaXRlbXM6IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hIH0gfSB9LCBcIkdFVFwiLCAgWydzY2VuZScsICdub2RlJywgJ2dldCcsICdwYXRoJywgJ2ZpbmQnLCAnbG9vaycsICdpbnN0YW5jZScsICdoaWVyYXJjaHknXVxuICAgIClcbiAgICBhc3luYyBub2RlR2V0QXRQYXRoKGFyZ3M6IHsgaGllcmFyY2h5UGF0aDogc3RyaW5nIH0pOiBQcm9taXNlPHsgcmVmZXJlbmNlczogSUluc3RhbmNlUmVmZXJlbmNlW10gfT4ge1xuICAgICAgICBjb25zdCBub2RlVHJlZSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3F1ZXJ5LW5vZGUtdHJlZScpO1xuICAgICAgICBpZiAoIW5vZGVUcmVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjZW5lIGlzIGVtcHR5IG9yIGNvdWxkIG5vdCByZXRyaWV2ZSBzY2VuZSB0cmVlLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NlbmVSb290TmFtZSA9IChub2RlVHJlZS5uYW1lIGFzIHVua25vd24gYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKGFyZ3MuaGllcmFyY2h5UGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIGFyZ3MuaGllcmFyY2h5UGF0aCA9IGFyZ3MuaGllcmFyY2h5UGF0aC5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5oaWVyYXJjaHlQYXRoLnN0YXJ0c1dpdGgoYCR7c2NlbmVSb290TmFtZX1gKSkge1xuICAgICAgICAgICAgYXJncy5oaWVyYXJjaHlQYXRoID0gYXJncy5oaWVyYXJjaHlQYXRoLnNsaWNlKHNjZW5lUm9vdE5hbWUubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5oaWVyYXJjaHlQYXRoID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVmZXJlbmNlczogW3sgaWQ6IChub2RlVHJlZS51dWlkIGFzIHVua25vd24gYXMgc3RyaW5nKSB9XSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gYXJncy5oaWVyYXJjaHlQYXRoLnNwbGl0KCcvJykuZmlsdGVyKHAgPT4gcC5sZW5ndGggPiAwKTtcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlcyA9IFtub2RlVHJlZV07XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoUGFydHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHROb2RlczogYW55W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjdXJyZW50Tm9kZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGluZ0NoaWxkcmVuID0gKG5vZGUuY2hpbGRyZW4gfHwgW10pLmZpbHRlcigoY2hpbGQ6IGFueSkgPT4gY2hpbGQubmFtZSA9PT0gcGFydCk7XG4gICAgICAgICAgICAgICAgbmV4dE5vZGVzLnB1c2goLi4ubWF0Y2hpbmdDaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50Tm9kZXMgPSBuZXh0Tm9kZXM7XG4gICAgICAgICAgICBpZiAoY3VycmVudE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgcmVmZXJlbmNlczogY3VycmVudE5vZGVzLm1hcCgobm9kZTogYW55KSA9PiAoeyBpZDogbm9kZS51dWlkLCB0eXBlOiAnY2MuTm9kZScgfSkpIH07XG4gICAgfVxuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnbm9kZUNyZWF0ZVByaW1pdGl2ZScsXG4gICAgICAgICdDcmVhdGUgYSBuZXcgbm9kZSB3aXRoIHByZWRlZmluZWQgcHJpbWl0aXZlIGdlb21ldHJ5IE1lc2hSZW5kZXJlci4gSWYgbm8gcGFyZW50IGlzIHNwZWNpZmllZCwgcm9vdCBub2RlIGlzIHVzZWQuIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBuZXcgbm9kZS4nLFxuICAgICAgICAgeyAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZVR5cGU6IHsgdHlwZTogJ3N0cmluZycsIGVudW06IFtcbiAgICAgICAgICAgICAgICAgICAgJ0NhcHN1bGUnLCAnQ29uZScsICdDdWJlJywgJ0N5bGluZGVyJywgJ1BsYW5lJywgJ1F1YWQnLCAnU3BoZXJlJywgJ1RvcnVzJyxcbiAgICAgICAgICAgICAgICBdIH0sXG4gICAgICAgICAgICAgICAgcGFyZW50UmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBbJ25hbWUnLCAncHJpbWl0aXZlVHlwZSddXG4gICAgICAgICB9LCBcbiAgICAgICAgIHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgcmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSB9LCByZXF1aXJlZDogWydyZWZlcmVuY2UnXSB9LCBcIlBPU1RcIiwgIFsnc2NlbmUnLCAnbm9kZScsICdjcmVhdGUnLCAnYWRkJ11cbiAgICApXG4gICAgYXN5bmMgc2NlbmVDcmVhdGVQcmltaXRpdmVOb2RlKGFyZ3M6IHsgbmFtZTogc3RyaW5nLCBwcmltaXRpdmVUeXBlOiBzdHJpbmcsIHBhcmVudFJlZmVyZW5jZT86IElJbnN0YW5jZVJlZmVyZW5jZSB9KTogUHJvbWlzZTx7IHJlZmVyZW5jZTogSUluc3RhbmNlUmVmZXJlbmNlIH0+IHtcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgJ0NhcHN1bGUnOiBcImRiOi8vaW50ZXJuYWwvZGVmYXVsdF9wcmVmYWIvM2QvQ2Fwc3VsZS5wcmVmYWJcIixcbiAgICAgICAgICAgICdDb25lJzogXCJkYjovL2ludGVybmFsL2RlZmF1bHRfcHJlZmFiLzNkL0NvbmUucHJlZmFiXCIsXG4gICAgICAgICAgICAnQ3ViZSc6IFwiZGI6Ly9pbnRlcm5hbC9kZWZhdWx0X3ByZWZhYi8zZC9DdWJlLnByZWZhYlwiLFxuICAgICAgICAgICAgJ0N5bGluZGVyJzogXCJkYjovL2ludGVybmFsL2RlZmF1bHRfcHJlZmFiLzNkL0N5bGluZGVyLnByZWZhYlwiLFxuICAgICAgICAgICAgJ1BsYW5lJzogXCJkYjovL2ludGVybmFsL2RlZmF1bHRfcHJlZmFiLzNkL1BsYW5lLnByZWZhYlwiLFxuICAgICAgICAgICAgJ1F1YWQnOiBcImRiOi8vaW50ZXJuYWwvZGVmYXVsdF9wcmVmYWIvM2QvUXVhZC5wcmVmYWJcIixcbiAgICAgICAgICAgICdTcGhlcmUnOiBcImRiOi8vaW50ZXJuYWwvZGVmYXVsdF9wcmVmYWIvM2QvU3BoZXJlLnByZWZhYlwiLFxuICAgICAgICAgICAgJ1RvcnVzJzogXCJkYjovL2ludGVybmFsL2RlZmF1bHRfcHJlZmFiLzNkL1RvcnVzLnByZWZhYlwiLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghcHJpbWl0aXZlTWFwW2FyZ3MucHJpbWl0aXZlVHlwZV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcHJpbWl0aXZlIHR5cGU6ICR7YXJncy5wcmltaXRpdmVUeXBlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlZmFiVXJsID0gcHJpbWl0aXZlTWFwW2FyZ3MucHJpbWl0aXZlVHlwZV07XG4gICAgICAgIGNvbnN0IGFzc2V0VXVpZCA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LXV1aWQnLCBwcmVmYWJVcmwpO1xuICAgICAgICBpZiAoIWFzc2V0VXVpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBhc3NldCBmb3IgcHJpbWl0aXZlIHR5cGUgJHthcmdzLnByaW1pdGl2ZVR5cGV9IGF0ICR7cHJlZmFiVXJsfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNjZW5lQ3JlYXRlTm9kZSh7XG4gICAgICAgICAgICBuYW1lOiBhcmdzLm5hbWUsXG4gICAgICAgICAgICBwYXJlbnRSZWZlcmVuY2U6IGFyZ3MucGFyZW50UmVmZXJlbmNlLFxuICAgICAgICAgICAgYXNzZXRSZWZlcmVuY2U6IHsgaWQ6IGFzc2V0VXVpZCwgdHlwZTogJ2NjLlByZWZhYicgfSxcbiAgICAgICAgICAgIHVud3JhcFByZWZhYjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBAdXRjcFRvb2woXG4gICAgICAgICdub2RlQ3JlYXRlJyxcbiAgICAgICAgJ0NyZWF0ZSBhIG5ldyBub2RlIGluIHRoZSBzY2VuZS4gSWYgbm8gcGFyZW50IGlzIHNwZWNpZmllZCwgcm9vdCBub2RlIGlzIHVzZWQuIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBuZXcgbm9kZS4nLFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICAgICAgcGFyZW50UmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSxcbiAgICAgICAgICAgICAgICBhc3NldFJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEsXG4gICAgICAgICAgICAgICAgdW53cmFwUHJlZmFiOiB7IHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogZmFsc2UgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBbJ25hbWUnXVxuICAgICAgICB9LFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IHJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEgfSwgcmVxdWlyZWQ6IFsncmVmZXJlbmNlJ10gfSwgXCJQT1NUXCIsICBbJ3NjZW5lJywgJ25vZGUnLCAnY3JlYXRlJywgJ2FkZCddXG4gICAgKVxuICAgIGFzeW5jIHNjZW5lQ3JlYXRlTm9kZShhcmdzOiB7IG5hbWU6IHN0cmluZywgcGFyZW50UmVmZXJlbmNlPzogSUluc3RhbmNlUmVmZXJlbmNlLCBhc3NldFJlZmVyZW5jZT86IElJbnN0YW5jZVJlZmVyZW5jZSwgdW53cmFwUHJlZmFiPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IHJlZmVyZW5jZTogSUluc3RhbmNlUmVmZXJlbmNlIH0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogYXJncy5uYW1lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhcmdzLnBhcmVudFJlZmVyZW5jZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5wYXJlbnQgPSBhcmdzLnBhcmVudFJlZmVyZW5jZS5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvcmNlIHJvb3QgaWYgbm8gcGFyZW50IHByb3ZpZGVkXG4gICAgICAgICAgICBvcHRpb25zLnBhcmVudCA9IChhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1ub2RlLXRyZWUnKSkudXVpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhc3NldFV1aWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIC8vIDEuIERldGVybWluZSBBc3NldCBVVUlEXG4gICAgICAgIGlmICgoYXJncy5hc3NldFJlZmVyZW5jZSAmJiAnaWQnIGluIGFyZ3MuYXNzZXRSZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICBjb25zdCBhc3NldEluZm8gPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1pbmZvJywgYXJncy5hc3NldFJlZmVyZW5jZS5pZCk7XG4gICAgICAgICAgICBpZiAoIWFzc2V0SW5mbykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXQgcmVmZXJlbmNlIG5vdCBmb3VuZDogJHthcmdzLmFzc2V0UmVmZXJlbmNlLmlkfWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcHJlZmFiRm91bmQgPSBhc3NldEluZm8udHlwZSA9PT0gJ2NjLlByZWZhYic7XG4gICAgICAgICAgICAvLyBJZiBub3QgYSBwcmVmYWIsIGNoZWNrIGlmIGl0IGhhcyBhIHByZWZhYiBzdWItYXNzZXQgKGxpa2UgaW4gY2FzZSBvZiBGQlgpXG4gICAgICAgICAgICBpZiAoIXByZWZhYkZvdW5kKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViQXNzZXQgb2YgT2JqZWN0LnZhbHVlcyhhc3NldEluZm8uc3ViQXNzZXRzKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3ViQXNzZXQudHlwZSA9PT0gJ2NjLlByZWZhYicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2V0VXVpZCA9IHN1YkFzc2V0LnV1aWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmYWJGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXRVdWlkID0gYXNzZXRJbmZvLnV1aWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcHJlZmFiRm91bmQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGVkIGFzc2V0IHJlZmVyZW5jZSAke2FyZ3MuYXNzZXRSZWZlcmVuY2UuaWR9IGlzIG5vdCBhIHByZWZhYiBhbmQgZG9lcyBub3QgY29udGFpbiBhIHByZWZhYiBzdWItYXNzZXQuYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghYXJncy51bndyYXBQcmVmYWIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51bmxpbmtQcmVmYWIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ2NjLlByZWZhYic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzc2V0VXVpZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5hc3NldFV1aWQgPSBhc3NldFV1aWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBDcmVhdGUgTm9kZVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdjcmVhdGUtbm9kZScsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBuZXdOb2RlVXVpZCA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcblxuICAgICAgICBpZiAoIW5ld05vZGVVdWlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbm9kZSAke2FyZ3MubmFtZX0ke2FyZ3MuYXNzZXRSZWZlcmVuY2UgPyBgIGZyb20gYXNzZXQgJHthcmdzLmFzc2V0UmVmZXJlbmNlLmlkfWAgOiAnJ30uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdzbmFwc2hvdCcpO1xuXG4gICAgICAgIHJldHVybiB7IHJlZmVyZW5jZTogeyBpZDogbmV3Tm9kZVV1aWQsIHR5cGU6ICdjYy5Ob2RlJyB9IH07XG4gICAgfVxuXG4gICAgQHV0Y3BUb29sKFxuICAgICAgICAnbm9kZU9wZXJhdGUnLFxuICAgICAgICAnUGVyZm9ybSBvcGVyYXRpb24gb24gcmVmZXJlbmNlZCBub2RlLCBpbmNsdWRpbmcgcHJlZmFiIG9wZXJhdGlvbnMuJyxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiB7IHR5cGU6ICdzdHJpbmcnLCBlbnVtOiBbJ21vdmUnLCAnY29weScsICdkZWxldGUnLCAnY3JlYXRlX3ByZWZhYicsICdyZXZlcnRfcHJlZmFiJywgJ2FwcGx5X3ByZWZhYicsICd1bndyYXBfcHJlZmFiJywgJ3Vud3JhcF9wcmVmYWJfY29tcGxldGVseScsICdvcGVuX3ByZWZhYiddIH0sXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSxcbiAgICAgICAgICAgICAgICBuZXdQYXJlbnRSZWZlcmVuY2U6IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hLFxuICAgICAgICAgICAgICAgIG5ld1ByZWZhYlBhdGg6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnRm9yIGNyZWF0ZV9wcmVmYWI6IHRhcmdldCBkYjovLyBwYXRoJywgbnVsbGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBzaWJsaW5nSW5kZXg6IHsgdHlwZTogJ2ludGVnZXInLCBkZXNjcmlwdGlvbjogJ0ZvciBtb3ZlL2NvcHk6IHRhcmdldCBpbmRleCBpbiBwYXJlbnQgY2hpbGRyZW4gYXJyYXknLCBudWxsYWJsZTogdHJ1ZSB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFsnb3BlcmF0aW9uJywgJ3JlZmVyZW5jZSddXG4gICAgICAgIH0sXG4gICAgICAgIHsgdHlwZTogJ29iamVjdCcsIFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgICAgICAgICAgY3JlYXRlZFByZWZhYkFzc2V0UmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSxcbiAgICAgICAgICAgICAgICB1cGRhdGVkTm9kZVJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEsXG4gICAgICAgICAgICAgICAgY29waWVkTm9kZVJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgXCJQT1NUXCIsICBbJ3NjZW5lJywgJ25vZGUnLCAncmVtb3ZlJywgJ21vdmUnLCAnY29weScsICdkZWxldGUnLCAncHJlZmFiJywgJ2FwcGx5JywgJ3JldmVydCcsICd1bndyYXAnLCAnY3JlYXRlJ11cbiAgICApXG4gICAgYXN5bmMgbm9kZU9wZXJhdGUoYXJnczogeyBvcGVyYXRpb246IHN0cmluZywgcmVmZXJlbmNlOiBJSW5zdGFuY2VSZWZlcmVuY2UsIG5ld1BhcmVudFJlZmVyZW5jZT86IElJbnN0YW5jZVJlZmVyZW5jZSwgbmV3UHJlZmFiUGF0aD86IHN0cmluZywgc2libGluZ0luZGV4PzogbnVtYmVyIH0pOiBcbiAgICAgICAgUHJvbWlzZTx7IHN1Y2Nlc3M/OiBib29sZWFuLCBjcmVhdGVkUHJlZmFiQXNzZXRSZWZlcmVuY2U/OiBJSW5zdGFuY2VSZWZlcmVuY2UsIHVwZGF0ZWROb2RlUmVmZXJlbmNlPzogSUluc3RhbmNlUmVmZXJlbmNlLCBjb3BpZWROb2RlUmVmZXJlbmNlPzogSUluc3RhbmNlUmVmZXJlbmNlIH0+IHtcbiAgICAgICAgaWYgKGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3F1ZXJ5LW5vZGUnLCBhcmdzLnJlZmVyZW5jZS5pZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFyZ2V0IG5vZGUgJHthcmdzLnJlZmVyZW5jZS5pZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGFyZ3Mub3BlcmF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgICAgICAgICBpZiAoIWFyZ3MubmV3UGFyZW50UmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5ld1BhcmVudFJlZmVyZW5jZSByZXF1aXJlZCBmb3IgbW92ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdzZXQtcGFyZW50Jywge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGFyZ3MubmV3UGFyZW50UmVmZXJlbmNlLmlkLFxuICAgICAgICAgICAgICAgICAgICB1dWlkczogYXJncy5yZWZlcmVuY2UuaWQsXG4gICAgICAgICAgICAgICAgICAgIGtlZXBXb3JsZFRyYW5zZm9ybTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3Muc2libGluZ0luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRTaWJsaW5nSW5kZXgoYXJncy5yZWZlcmVuY2UuaWQsIGFyZ3Muc2libGluZ0luZGV4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdzbmFwc2hvdCcpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcblxuICAgICAgICAgICAgY2FzZSAnY29weSc6XG4gICAgICAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZVJlc3VsdCA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2R1cGxpY2F0ZS1ub2RlJywgW2FyZ3MucmVmZXJlbmNlLmlkXSk7XG4gICAgICAgICAgICAgICAgIGlmICghZHVwbGljYXRlUmVzdWx0IHx8IGR1cGxpY2F0ZVJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlICR7YXJncy5yZWZlcmVuY2UuaWR9IGR1cGxpY2F0aW9uIGZhaWxlZGApO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBjb25zdCBuZXdOb2RlcyA9IGR1cGxpY2F0ZVJlc3VsdCBhcyBzdHJpbmdbXTtcbiAgICAgICAgICAgICAgICAgY29uc3QgbmV3Tm9kZUlkID0gbmV3Tm9kZXNbMF07IFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubmV3UGFyZW50UmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdzZXQtcGFyZW50Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBhcmdzLm5ld1BhcmVudFJlZmVyZW5jZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHV1aWRzOiBuZXdOb2RlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBXb3JsZFRyYW5zZm9ybTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICBpZiAoYXJncy5zaWJsaW5nSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRTaWJsaW5nSW5kZXgobmV3Tm9kZUlkLCBhcmdzLnNpYmxpbmdJbmRleCk7XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdzbmFwc2hvdCcpO1xuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgY29waWVkTm9kZVJlZmVyZW5jZTogeyBpZDogbmV3Tm9kZUlkLCB0eXBlOiAnY2MuTm9kZScgfSB9O1xuXG4gICAgICAgICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3JlbW92ZS1ub2RlJywge1xuICAgICAgICAgICAgICAgICAgICB1dWlkOiBhcmdzLnJlZmVyZW5jZS5pZFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZUNoZWNrID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktbm9kZScsIGFyZ3MucmVmZXJlbmNlLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUNoZWNrICE9PSBudWxsICYmIG5vZGVDaGVjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSAke2FyZ3MucmVmZXJlbmNlLmlkfSBzdGlsbCBleGlzdHMgYWZ0ZXIgcmVtb3ZhbGApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3NuYXBzaG90Jyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG5cbiAgICAgICAgICAgIGNhc2UgJ2NyZWF0ZV9wcmVmYWInOlxuICAgICAgICAgICAgICAgIGlmICghYXJncy5uZXdQcmVmYWJQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5ld1ByZWZhYlBhdGggcmVxdWlyZWQgZm9yIGNyZWF0ZV9wcmVmYWJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEluZm8gPSBhd2FpdCB0aGlzLmdldFBhcmVudEFuZFNpYmxpbmdJbmRleChhcmdzLnJlZmVyZW5jZS5pZCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkUHJlZmFiVXVpZCA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2V4ZWN1dGUtc2NlbmUtc2NyaXB0Jywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYWNrYWdlSlNPTi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdjcmVhdGVQcmVmYWJGcm9tTm9kZScsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IFthcmdzLnJlZmVyZW5jZS5pZCwgYXJncy5uZXdQcmVmYWJQYXRoXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghY3JlYXRlZFByZWZhYlV1aWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBwcmVmYWIgYXNzZXQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkTm9kZUlkID0gYXdhaXQgdGhpcy5nZXRVcGRhdGVkVXVpZChwYXJlbnRJbmZvLnBhcmVudFV1aWQsIHBhcmVudEluZm8uc2libGluZ0luZGV4KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3NuYXBzaG90Jyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBjcmVhdGVkUHJlZmFiQXNzZXRSZWZlcmVuY2U6IHsgaWQ6IGNyZWF0ZWRQcmVmYWJVdWlkLCB0eXBlOiAnY2MuUHJlZmFiJyB9LCB1cGRhdGVkTm9kZVJlZmVyZW5jZTogeyBpZDogdXBkYXRlZE5vZGVJZCwgdHlwZTogJ2NjLk5vZGUnIH0gfTtcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBjYXNlICdyZXZlcnRfcHJlZmFiJzpcbiAgICAgICAgICAgICAgICBjb25zdCByZXZlcnRTdWNjZXNzID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncmVzdG9yZS1wcmVmYWInLCB7IHV1aWQ6IGFyZ3MucmVmZXJlbmNlLmlkIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAnc25hcHNob3QnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHJldmVydFN1Y2Nlc3MgfTtcblxuICAgICAgICAgICAgY2FzZSAnYXBwbHlfcHJlZmFiJzpcbiAgICAgICAgICAgICAgICBjb25zdCBhcHBseUVycm9yID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAnZXhlY3V0ZS1zY2VuZS1zY3JpcHQnLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhY2thZ2VKU09OLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ2FwcGx5UHJlZmFiQnlOb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW2FyZ3MucmVmZXJlbmNlLmlkXVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFwcGx5RXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBhcHBseSBwcmVmYWI6ICR7YXBwbHlFcnJvcn1gKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdzbmFwc2hvdCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuXG4gICAgICAgICAgICBjYXNlICd1bndyYXBfcHJlZmFiJzpcbiAgICAgICAgICAgICAgICBjb25zdCB1bndyYXBFcnJvciA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2V4ZWN1dGUtc2NlbmUtc2NyaXB0Jywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYWNrYWdlSlNPTi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICd1bmxpbmtQcmVmYWJCeU5vZGUnLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbYXJncy5yZWZlcmVuY2UuaWQsIGZhbHNlXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICh1bndyYXBFcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHVud3JhcCBwcmVmYWI6ICR7dW53cmFwRXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAnc25hcHNob3QnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcblxuICAgICAgICAgICAgY2FzZSAndW53cmFwX3ByZWZhYl9jb21wbGV0ZWx5JzpcbiAgICAgICAgICAgICAgICBjb25zdCB1bndyYXBBbGxFcnJvciA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2V4ZWN1dGUtc2NlbmUtc2NyaXB0Jywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYWNrYWdlSlNPTi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICd1bmxpbmtQcmVmYWJCeU5vZGUnLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbYXJncy5yZWZlcmVuY2UuaWQsIHRydWVdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKHVud3JhcEFsbEVycm9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdW53cmFwIHByZWZhYiBjb21wbGV0ZWx5OiAke3Vud3JhcEFsbEVycm9yfWApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3NuYXBzaG90Jyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG5cbiAgICAgICAgICAgIGNhc2UgJ29wZW5fcHJlZmFiJzpcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRm9yUHJlZmFiOiBhbnkgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1ub2RlJywgYXJncy5yZWZlcmVuY2UuaWQpO1xuICAgICAgICAgICAgICAgIGlmICghbm9kZUZvclByZWZhYikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgJHthcmdzLnJlZmVyZW5jZS5pZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBwSW5mbyA9IG5vZGVGb3JQcmVmYWIuX19wcmVmYWJfXyB8fCBub2RlRm9yUHJlZmFiLl9wcmVmYWIgfHwgKG5vZGVGb3JQcmVmYWIudmFsdWUgJiYgKG5vZGVGb3JQcmVmYWIudmFsdWUuX19wcmVmYWJfXyB8fCBub2RlRm9yUHJlZmFiLnZhbHVlLl9wcmVmYWIpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwVmFsdWUgPSBwSW5mbz8udmFsdWUgfHwgcEluZm87XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0VXVpZCA9IHBWYWx1ZT8uYXNzZXRVdWlkIHx8IHBWYWx1ZT8udXVpZDtcblxuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0VXVpZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgJHthcmdzLnJlZmVyZW5jZS5pZH0gaXMgbm90IGxpbmtlZCB0byBhIHByZWZhYmApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7IFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdvcGVuLWFzc2V0JywgdGFyZ2V0VXVpZCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBvcGVuIHByZWZhYiBhc3NldCAke3RhcmdldFV1aWR9LiBSZWFzb246ICR7ZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzY2VuZSBub2RlIG9wZXJhdGlvbjogJHthcmdzLm9wZXJhdGlvbn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhlbHBlcnNcblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0UGFyZW50KG5vZGVVdWlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBub2RlID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktbm9kZScsIG5vZGVVdWlkKTtcbiAgICAgICAgaWYgKG5vZGU/LnBhcmVudD8udmFsdWU/LnV1aWQpIHJldHVybiBub2RlLnBhcmVudC52YWx1ZS51dWlkO1xuICAgICAgICBpZiAobm9kZT8ucGFyZW50Py51dWlkKSByZXR1cm4gbm9kZS5wYXJlbnQudXVpZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3F1ZXJ5LXV1aWQnKTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgdG8gc2V0IHNpYmxpbmcgaW5kZXhcbiAgICBwcml2YXRlIGFzeW5jIHNldFNpYmxpbmdJbmRleCh1dWlkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgLy8gR2V0IHBhcmVudCBmaXJzdFxuICAgICAgICBjb25zdCBwYXJlbnRVdWlkID0gYXdhaXQgdGhpcy5nZXRQYXJlbnQodXVpZCk7XG4gICAgICAgIGlmICghcGFyZW50VXVpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlICR7dXVpZH0gaGFzIG5vIHBhcmVudGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGNoaWxkcmVuIG9mIHBhcmVudFxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktbm9kZScsIHBhcmVudFV1aWQpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbkFycmF5ID0gcGFyZW50Tm9kZS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKCFjaGlsZHJlbkFycmF5IHx8ICFBcnJheS5pc0FycmF5KGNoaWxkcmVuQXJyYXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmVudCBub2RlICR7cGFyZW50VXVpZH0gaGFzIG5vIGNoaWxkcmVuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBjaGlsZHJlbkFycmF5LmZpbmRJbmRleCgoY2hpbGQ6IGFueSkgPT4gY2hpbGQudmFsdWUudXVpZCA9PT0gdXVpZCk7XG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgJHt1dWlkfSBub3QgZm91bmQgaW4gcGFyZW50IGNoaWxkcmVuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBpbmRleCkgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9mZnNldFxuICAgICAgICAvLyBXZSBuZWVkIHRvIG1vdmUgdGhlIGVsZW1lbnQgYXQgY3VycmVudEluZGV4IHRvIHRhcmdldEluZGV4LlxuICAgICAgICAvLyBUaGUgQVBJIG1vdmUtYXJyYXktZWxlbWVudCB3b3JrcyB3aXRoIG9mZnNldCBmcm9tIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgaW5kZXggaXMgd2l0aGluIGJvdW5kcyBbMCwgbGVuZ3RoLTFdXG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIGNoaWxkcmVuQXJyYXkubGVuZ3RoIC0gMSkpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0YXJnZXRJbmRleCAtIGN1cnJlbnRJbmRleDtcbiAgICAgICAgXG4gICAgICAgIGlmIChvZmZzZXQgPT09IDApIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdtb3ZlLWFycmF5LWVsZW1lbnQnLCB7XG4gICAgICAgICAgICB1dWlkOiBwYXJlbnRVdWlkLFxuICAgICAgICAgICAgcGF0aDogJ2NoaWxkcmVuJyxcbiAgICAgICAgICAgIHRhcmdldDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0UGFyZW50QW5kU2libGluZ0luZGV4KHV1aWQ6IHN0cmluZyk6IFByb21pc2U8eyBwYXJlbnRVdWlkOiBzdHJpbmcsIHNpYmxpbmdJbmRleDogbnVtYmVyIH0+IHtcbiAgICAgICAgY29uc3QgcGFyZW50VXVpZCA9IGF3YWl0IHRoaXMuZ2V0UGFyZW50KHV1aWQpO1xuICAgICAgICBpZiAoIXBhcmVudFV1aWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSAke3V1aWR9IGhhcyBubyBwYXJlbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1ub2RlJywgcGFyZW50VXVpZCk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuQXJyYXkgPSBwYXJlbnROb2RlLmNoaWxkcmVuO1xuICAgICAgICBpZiAoIWNoaWxkcmVuQXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoY2hpbGRyZW5BcnJheSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyZW50IG5vZGUgJHtwYXJlbnRVdWlkfSBoYXMgbm8gY2hpbGRyZW5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IGNoaWxkcmVuQXJyYXkuZmluZEluZGV4KChjaGlsZDogYW55KSA9PiBjaGlsZC52YWx1ZS51dWlkID09PSB1dWlkKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlICR7dXVpZH0gbm90IGZvdW5kIGluIHBhcmVudCBjaGlsZHJlbmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHBhcmVudFV1aWQsIHNpYmxpbmdJbmRleDogaW5kZXggfTtcbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRVcGRhdGVkVXVpZChwYXJlbnRVdWlkOiBzdHJpbmcsIHNpYmxpbmdJbmRleDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZUluZm8gPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1ub2RlJywgcGFyZW50VXVpZCk7XG4gICAgICAgIGlmICghcGFyZW50Tm9kZUluZm8gfHwgIXBhcmVudE5vZGVJbmZvLmNoaWxkcmVuIHx8ICFBcnJheS5pc0FycmF5KHBhcmVudE5vZGVJbmZvLmNoaWxkcmVuKSB8fCAhcGFyZW50Tm9kZUluZm8uY2hpbGRyZW5bc2libGluZ0luZGV4XSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgdXBkYXRlZCBub2RlIGluZm8gYWZ0ZXIgcHJlZmFiIGNyZWF0aW9uLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJlbnROb2RlSW5mby5jaGlsZHJlbltzaWJsaW5nSW5kZXhdLnZhbHVlLnV1aWQ7XG4gICAgfVxufSJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/tools/set-properties-tool.js b/extensions/cocos-code-mode/dist/utcp/tools/set-properties-tool.js new file mode 100644 index 0000000..92169a8 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/tools/set-properties-tool.js @@ -0,0 +1,272 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SetPropertyTool = void 0; +const decorators_1 = require("../decorators"); +const tools_utils_1 = require("../utils/tools-utils"); +const asset_importers_1 = require("../utils/asset-importers"); +const schemas_1 = require("../schemas"); +class SetPropertyTool { + async setCurrentSceneProperties(params) { + return await this.setInstanceProperties({ + reference: { id: params.settingsType }, propertyPaths: params.propertyPaths, values: params.values + }); + } + async setInstanceProperties(params) { + let { reference: { id: uuid }, propertyPaths, values } = params; + if (!propertyPaths || !values) { + throw new Error(`Property paths and values are required.`); + } + if (propertyPaths.length !== values.length) { + throw new Error(`Property paths count (${propertyPaths.length}) does not match values count (${values.length}).`); + } + let info = await tools_utils_1.ToolsUtils.inspectInstance(uuid, false); + if (!info) { + throw new Error(`Target ${uuid} not found or not supported.`); + } + uuid = info.uuid; + const { type, props, assetInfo } = info; + if (!props) { + throw new Error(`Could not retrieve properties for ${type} of instance ${uuid}.`); + } + for (let i = 0; i < propertyPaths.length; i++) { + await this.setProperty(info, propertyPaths[i], values[i]); + } + return { success: true }; + } + async setProperty({ uuid, type, props, assetInfo }, propertyPath, value) { + var _a; + // Find property definition in the dump + let targetProp = null; + try { + targetProp = this.findPropertyInDump(props, propertyPath); + } + catch (e) { + throw new Error(`Property '${propertyPath}' resolution failed: ${e.message}. Please recheck TypescriptDefinition of ${uuid}. Arrays are reached by indexes.`); + } + if (!targetProp) { + throw new Error(`Property '${propertyPath}' not found on ${type} of instance ${uuid}.`); + } + // Normalize value based on property definition + value = this.normalizeValue(value, targetProp); + if (assetInfo) { + try { + const success = await ((_a = asset_importers_1.ImporterManager.getInstance().getImporter(assetInfo.importer)) === null || _a === void 0 ? void 0 : _a.setProperty(assetInfo, propertyPath, value)); + if (!success) { + throw new Error(`Importer failed to set property.`); + } + } + catch (e) { + throw new Error(`Failed to set property on Asset ${uuid}: ${e}`); + } + return; + } + if (type === 'cc.SceneGlobals') { + // Scene Globals are part of the scene node but under _globals + propertyPath = `_globals.${propertyPath}`; + // uuid is already set to the Scene UUID from inspectInstance + } + else if (type !== 'cc.Node') { + const nodeUuid = props.node.value.uuid; + const nodeInfo = await Editor.Message.request('scene', 'query-node', nodeUuid); + if (!nodeInfo) { + throw new Error(`Parent Node ${nodeUuid} for Component ${uuid} not found.`); + } + const componentIndex = nodeInfo.__comps__.findIndex((comp) => comp.value.uuid.value === uuid); + propertyPath = `__comps__.${componentIndex}.${propertyPath}`; + uuid = nodeUuid; + } + await this.applyValue(uuid, propertyPath, targetProp, value); + } + normalizeValue(value, prop) { + // Try to parse string values into proper types + if (typeof value === 'string') { + const isStringProp = prop.type === 'String'; + if (!isStringProp) { + const t = value.trim(); + if (t === 'true') + return true; + if (t === 'false') + return false; + if (!isNaN(Number(t)) && t !== '') { + return Number(t); + } + if ((t.startsWith('{') || t.startsWith('[')) && (t.endsWith('}') || t.endsWith(']'))) { + try { + return JSON.parse(t); + } + catch (e) { } + } + } + } + return value; + } + findPropertyInDump(root, path) { + if (!path) + return null; + if (!root) + return null; + const parts = path.split('.'); + let current = { value: root }; // Wrap to unify traversal + // Helper to check if object looks like a property definition + const isProperty = (obj) => obj && typeof obj === 'object' && ('type' in obj || 'extends' in obj); + for (let i = 0; i < parts.length; i++) { + const part = parts[i]; + // Current is expected to be an IProperty or object containing IProperty data + let val = current.value; + // If current is just the dictionary (root), use it directly + if (current === root || (typeof current === 'object' && !('value' in current))) { + val = current; + } + if (val === undefined || val === null) + return null; + // 1. Array Index + if (Array.isArray(val)) { + const idx = parseInt(part); + if (!isNaN(idx)) { + // Existing index + if (val[idx] !== undefined) { + const elem = val[idx]; + if (isProperty(elem)) { + current = elem; + } + else if (current.elementTypeData) { + // Hydrate from schema + current = Object.assign(Object.assign({}, current.elementTypeData), { value: elem }); + } + else { + // Fallback for primitive arrays without schema + current = { value: elem, type: 'Unknown' }; + } + continue; + } + // Extending array support: Allow index == length if schema exists. + // Don't allow gaps (idx > length). + if (idx === val.length) { + if (current.elementTypeData) { + current = current.elementTypeData; + continue; + } + else { + throw new Error(`Array extension at '${part}' failed: No elementTypeData.`); + } + } + throw new Error(`Array index '${idx}' out of bounds (length: ${val.length}) at '${part}'.`); + } + throw new Error(`Invalid array index '${part}' at '${path}'.`); + } + // 2. Object Key + if (typeof val === 'object') { + if (part in val) { + const propCandidate = val[part]; + if (isProperty(propCandidate)) { + current = propCandidate; + } + else { + // Not a property, probably a raw value in a struct (like position.x = 0) + // Try to find schema in default value if available + let schema = null; + if (current.default && current.default.value && typeof current.default.value === 'object' && part in current.default.value) { + schema = current.default.value[part]; + } + if (schema) { + current = Object.assign(Object.assign({}, schema), { value: propCandidate }); + } + else { + // No schema found, treat as untyped value + current = { value: propCandidate, type: 'Unknown' }; + } + } + continue; + } + throw new Error(`Key '${part}' not found ${i == 0 ? '' : 'in ' + parts.slice(0, i).join('.')}.`); + } + throw new Error(`Path segment '${part}' '${i == 0 ? '' : 'at ' + parts.slice(0, i).join('.')}' failed resolution.`); + } + return current; + } + async applyValue(uuid, path, prop, value) { + var _a, _b, _c; + // Handle direct references + if ((_a = prop.extends) === null || _a === void 0 ? void 0 : _a.includes('cc.Object')) { + value = await this.convertObjectReferenceToCocos(value, prop); + } + // Handle array of references + if (Array.isArray(value) && ((_c = (_b = prop.elementTypeData) === null || _b === void 0 ? void 0 : _b.extends) === null || _c === void 0 ? void 0 : _c.includes('cc.Object'))) { + const convertedArray = []; + value.forEach(async (item, index) => { + convertedArray[index] = await this.convertObjectReferenceToCocos(item, prop.elementTypeData); + }); + value = convertedArray; + } + const dump = { value, type: prop.type }; + await Editor.Message.request('scene', 'set-property', { + uuid, + path, + dump + }); + await Editor.Message.request('scene', 'snapshot'); + } + async convertObjectReferenceToCocos(value, prop) { + const extendsInfo = prop.extends || []; + // Accept plain UUID string or { uuid: string } structure + if (typeof value === 'string') { + value = { uuid: value }; + } + // Reference object with id is sent + if (typeof value === 'object' && value !== null && 'id' in value) { + value = { uuid: value.id }; + } + // Special case for asset subtype check + if (extendsInfo.includes('cc.Asset')) { + const assetInfo = await Editor.Message.request('asset-db', 'query-asset-info', value.uuid); + if (!assetInfo) { + throw new Error(`Asset with id ${value.uuid} not found.`); + } + let foundSubAsset = false; + if (assetInfo.type !== prop.type) { + Object.values(assetInfo.subAssets || {}).forEach(subAsset => { + if (subAsset.type === prop.type) { + value = { uuid: subAsset.uuid }; + foundSubAsset = true; + } + }); + } + else { + foundSubAsset = true; + } + if (!foundSubAsset && assetInfo.type !== prop.type) { + throw new Error(`Reference type mismatch: expected ${prop.type}, got ${assetInfo.type}.`); + } + } + return value; + } +} +exports.SetPropertyTool = SetPropertyTool; +__decorate([ + (0, decorators_1.utcpTool)("inspectorSetSettingsProperties", "Sets a property on the specific settings. If a property path or type is not confirmed via inspectorGet* tools, you MUST NOT call any setter.", { type: 'object', + properties: { + settingsType: { type: 'string', enum: ['CurrentSceneGlobals', 'ProjectSettings'] }, + propertyPath: { type: 'string', description: "Plain path to the property (e.g., 'ambient.skyLightingColor.r'). Don't support code execution." }, + value: { type: ['array', 'object', 'string', 'number', 'boolean', 'null'], additionalProperties: true } + }, + required: ['settingsType', 'propertyPath', 'value'] + }, schemas_1.SuccessIndicatorSchema, "POST", ['property', 'set', 'scene', 'settings', 'project', 'modify', 'config']) +], SetPropertyTool.prototype, "setCurrentSceneProperties", null); +__decorate([ + (0, decorators_1.utcpTool)("inspectorSetInstanceProperties", "Sets a property on instance of Node, Component or Asset. If a property path or type is not confirmed via inspectorGet* tools, you MUST NOT call any setter.", { + type: 'object', + properties: { + reference: schemas_1.InstanceReferenceSchema, + propertyPaths: { type: 'array', items: { type: 'string' }, description: "Plain paths to the properties (e.g., ['position.x', 'rotation.y']). Don't support code execution. Arrays are reached by indexes. (e.g. 'sharedMaterials.0')" }, + values: { type: 'array', items: { type: ['array', 'object', 'string', 'number', 'boolean', 'null'], additionalProperties: true } } + }, + required: ['reference', 'propertyPaths', 'values'] + }, schemas_1.SuccessIndicatorSchema, "POST", ['property', 'set', 'instance', 'node', 'component', 'asset', 'modify', 'meta']) +], SetPropertyTool.prototype, "setInstanceProperties", null); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LXByb3BlcnRpZXMtdG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS91dGNwL3Rvb2xzL3NldC1wcm9wZXJ0aWVzLXRvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsOENBQXlDO0FBRXpDLHNEQUFrRDtBQUNsRCw4REFBMkQ7QUFFM0Qsd0NBQW9IO0FBSXBILE1BQWEsZUFBZTtJQWNsQixBQUFOLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxNQUF3RTtRQUNwRyxPQUFPLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDO1lBQ3BDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1NBQ3JHLENBQUMsQ0FBQztJQUNQLENBQUM7SUFpQkssQUFBTixLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBaUY7UUFDekcsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRWhFLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsYUFBYSxDQUFDLE1BQU0sa0NBQWtDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3RILENBQUM7UUFFRCxJQUFJLElBQUksR0FBRyxNQUFNLHdCQUFVLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJ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QUUsZUFBZSxFQUFFLFFBQVEsQ0FBQztLQUNyRCxFQUNELGdDQUFzQixFQUFFLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FDbEg7NERBOEJBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRjcFRvb2wgfSBmcm9tICcuLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IElQcm9wZXJ0eSwgSVByb3BlcnR5VmFsdWVUeXBlIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL3NjZW5lL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0IHsgVG9vbHNVdGlscyB9IGZyb20gJy4uL3V0aWxzL3Rvb2xzLXV0aWxzJztcbmltcG9ydCB7IEltcG9ydGVyTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL2Fzc2V0LWltcG9ydGVycyc7XG5pbXBvcnQgeyBBc3NldEluZm8gfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvYXNzZXQtZGIvQHR5cGVzL3B1YmxpYyc7XG5pbXBvcnQgeyBJSW5zdGFuY2VSZWZlcmVuY2UsIEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hLCBJU3VjY2Vzc0luZGljYXRvciwgU3VjY2Vzc0luZGljYXRvclNjaGVtYSB9IGZyb20gJy4uL3NjaGVtYXMnO1xuXG5kZWNsYXJlIGNvbnN0IEVkaXRvcjogYW55O1xuXG5leHBvcnQgY2xhc3MgU2V0UHJvcGVydHlUb29sIHtcbiAgICBAdXRjcFRvb2woXG4gICAgICAgIFwiaW5zcGVjdG9yU2V0U2V0dGluZ3NQcm9wZXJ0aWVzXCIsXG4gICAgICAgIFwiU2V0cyBhIHByb3BlcnR5IG9uIHRoZSBzcGVjaWZpYyBzZXR0aW5ncy4gSWYgYSBwcm9wZXJ0eSBwYXRoIG9yIHR5cGUgaXMgbm90IGNvbmZpcm1lZCB2aWEgaW5zcGVjdG9yR2V0KiB0b29scywgeW91IE1VU1QgTk9UIGNhbGwgYW55IHNldHRlci5cIixcbiAgICAgICAgeyB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBzZXR0aW5nc1R5cGU6IHsgdHlwZTogJ3N0cmluZycsIGVudW06IFsnQ3VycmVudFNjZW5lR2xvYmFscycsICdQcm9qZWN0U2V0dGluZ3MnXSB9LFxuICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aDogeyB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246IFwiUGxhaW4gcGF0aCB0byB0aGUgcHJvcGVydHkgKGUuZy4sICdhbWJpZW50LnNreUxpZ2h0aW5nQ29sb3IucicpLiBEb24ndCBzdXBwb3J0IGNvZGUgZXhlY3V0aW9uLlwiIH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogWydhcnJheScsICdvYmplY3QnLCAnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJywgJ251bGwnXSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBbJ3NldHRpbmdzVHlwZScsICdwcm9wZXJ0eVBhdGgnLCAndmFsdWUnXVxuICAgICAgICB9LFxuICAgICAgICBTdWNjZXNzSW5kaWNhdG9yU2NoZW1hLCBcIlBPU1RcIiwgWydwcm9wZXJ0eScsICdzZXQnLCAnc2NlbmUnLCAnc2V0dGluZ3MnLCAncHJvamVjdCcsICdtb2RpZnknLCAnY29uZmlnJ11cbiAgICApXG4gICAgYXN5bmMgc2V0Q3VycmVudFNjZW5lUHJvcGVydGllcyhwYXJhbXM6IHsgc2V0dGluZ3NUeXBlOiBzdHJpbmcsIHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdLCB2YWx1ZXM6IGFueVtdIH0pOiBQcm9taXNlPElTdWNjZXNzSW5kaWNhdG9yPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldEluc3RhbmNlUHJvcGVydGllcyh7XG4gICAgICAgICAgICByZWZlcmVuY2U6IHsgaWQ6IHBhcmFtcy5zZXR0aW5nc1R5cGUgfSwgcHJvcGVydHlQYXRoczogcGFyYW1zLnByb3BlcnR5UGF0aHMsIHZhbHVlczogcGFyYW1zLnZhbHVlc1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIEB1dGNwVG9vbChcbiAgICAgICAgXCJpbnNwZWN0b3JTZXRJbnN0YW5jZVByb3BlcnRpZXNcIixcbiAgICAgICAgXCJTZXRzIGEgcHJvcGVydHkgb24gaW5zdGFuY2Ugb2YgTm9kZSwgQ29tcG9uZW50IG9yIEFzc2V0LiBJZiBhIHByb3BlcnR5IHBhdGggb3IgdHlwZSBpcyBub3QgY29uZmlybWVkIHZpYSBpbnNwZWN0b3JHZXQqIHRvb2xzLCB5b3UgTVVTVCBOT1QgY2FsbCBhbnkgc2V0dGVyLlwiLFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2U6IEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aHM6IHsgdHlwZTogJ2FycmF5JywgaXRlbXM6IHsgdHlwZTogJ3N0cmluZycgfSwgZGVzY3JpcHRpb246IFwiUGxhaW4gcGF0aHMgdG8gdGhlIHByb3BlcnRpZXMgKGUuZy4sIFsncG9zaXRpb24ueCcsICdyb3RhdGlvbi55J10pLiBEb24ndCBzdXBwb3J0IGNvZGUgZXhlY3V0aW9uLiBBcnJheXMgYXJlIHJlYWNoZWQgYnkgaW5kZXhlcy4gKGUuZy4gJ3NoYXJlZE1hdGVyaWFscy4wJylcIiB9LFxuICAgICAgICAgICAgICAgIHZhbHVlczogeyB0eXBlOiAnYXJyYXknLCBpdGVtczogeyB0eXBlOiBbJ2FycmF5JywgJ29iamVjdCcsICdzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nLCAnbnVsbCddLCBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSB9IH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogWydyZWZlcmVuY2UnLCAncHJvcGVydHlQYXRocycsICd2YWx1ZXMnXVxuICAgICAgICB9LFxuICAgICAgICBTdWNjZXNzSW5kaWNhdG9yU2NoZW1hLCBcIlBPU1RcIiwgWydwcm9wZXJ0eScsICdzZXQnLCAnaW5zdGFuY2UnLCAnbm9kZScsICdjb21wb25lbnQnLCAnYXNzZXQnLCAnbW9kaWZ5JywgJ21ldGEnXVxuICAgIClcbiAgICBhc3luYyBzZXRJbnN0YW5jZVByb3BlcnRpZXMocGFyYW1zOiB7IHJlZmVyZW5jZTogSUluc3RhbmNlUmVmZXJlbmNlLCBwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSwgdmFsdWVzOiBhbnlbXSB9KTogUHJvbWlzZTxJU3VjY2Vzc0luZGljYXRvcj4ge1xuICAgICAgICBsZXQgeyByZWZlcmVuY2U6IHsgaWQ6IHV1aWQgfSwgcHJvcGVydHlQYXRocywgdmFsdWVzIH0gPSBwYXJhbXM7XG5cbiAgICAgICAgaWYgKCFwcm9wZXJ0eVBhdGhzIHx8ICF2YWx1ZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgcGF0aHMgYW5kIHZhbHVlcyBhcmUgcmVxdWlyZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlQYXRocy5sZW5ndGggIT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgcGF0aHMgY291bnQgKCR7cHJvcGVydHlQYXRocy5sZW5ndGh9KSBkb2VzIG5vdCBtYXRjaCB2YWx1ZXMgY291bnQgKCR7dmFsdWVzLmxlbmd0aH0pLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBUb29sc1V0aWxzLmluc3BlY3RJbnN0YW5jZSh1dWlkLCBmYWxzZSk7XG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYXJnZXQgJHt1dWlkfSBub3QgZm91bmQgb3Igbm90IHN1cHBvcnRlZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHV1aWQgPSBpbmZvLnV1aWQ7XG5cbiAgICAgICAgY29uc3QgeyB0eXBlLCBwcm9wcywgYXNzZXRJbmZvIH0gPSBpbmZvO1xuXG4gICAgICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHJldHJpZXZlIHByb3BlcnRpZXMgZm9yICR7dHlwZX0gb2YgaW5zdGFuY2UgJHt1dWlkfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydHlQYXRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRQcm9wZXJ0eShpbmZvLCBwcm9wZXJ0eVBhdGhzW2ldLCB2YWx1ZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0UHJvcGVydHkoeyB1dWlkLCB0eXBlLCBwcm9wcywgYXNzZXRJbmZvIH06IHsgdXVpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIHByb3BzOiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9IHwgbnVsbCwgYXNzZXRJbmZvOiBBc3NldEluZm8gfCBudWxsIH0sIHByb3BlcnR5UGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIEZpbmQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiB0aGUgZHVtcFxuICAgICAgICBsZXQgdGFyZ2V0UHJvcDogSVByb3BlcnR5IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0YXJnZXRQcm9wID0gdGhpcy5maW5kUHJvcGVydHlJbkR1bXAocHJvcHMsIHByb3BlcnR5UGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAnJHtwcm9wZXJ0eVBhdGh9JyByZXNvbHV0aW9uIGZhaWxlZDogJHtlLm1lc3NhZ2V9LiBQbGVhc2UgcmVjaGVjayBUeXBlc2NyaXB0RGVmaW5pdGlvbiBvZiAke3V1aWR9LiBBcnJheXMgYXJlIHJlYWNoZWQgYnkgaW5kZXhlcy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGFyZ2V0UHJvcCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAnJHtwcm9wZXJ0eVBhdGh9JyBub3QgZm91bmQgb24gJHt0eXBlfSBvZiBpbnN0YW5jZSAke3V1aWR9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm9ybWFsaXplIHZhbHVlIGJhc2VkIG9uIHByb3BlcnR5IGRlZmluaXRpb25cbiAgICAgICAgdmFsdWUgPSB0aGlzLm5vcm1hbGl6ZVZhbHVlKHZhbHVlLCB0YXJnZXRQcm9wKTtcblxuICAgICAgICBpZiAoYXNzZXRJbmZvKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3M6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBhd2FpdCBJbXBvcnRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbXBvcnRlcihhc3NldEluZm8uaW1wb3J0ZXIpPy5zZXRQcm9wZXJ0eShhc3NldEluZm8sIHByb3BlcnR5UGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydGVyIGZhaWxlZCB0byBzZXQgcHJvcGVydHkuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSBvbiBBc3NldCAke3V1aWR9OiAke2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2NjLlNjZW5lR2xvYmFscycpIHtcbiAgICAgICAgICAgIC8vIFNjZW5lIEdsb2JhbHMgYXJlIHBhcnQgb2YgdGhlIHNjZW5lIG5vZGUgYnV0IHVuZGVyIF9nbG9iYWxzXG4gICAgICAgICAgICBwcm9wZXJ0eVBhdGggPSBgX2dsb2JhbHMuJHtwcm9wZXJ0eVBhdGh9YDtcbiAgICAgICAgICAgIC8vIHV1aWQgaXMgYWxyZWFkeSBzZXQgdG8gdGhlIFNjZW5lIFVVSUQgZnJvbSBpbnNwZWN0SW5zdGFuY2VcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSAnY2MuTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVVdWlkID0gKHByb3BzIGFzIGFueSkubm9kZS52YWx1ZS51dWlkO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUluZm8gPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1ub2RlJywgbm9kZVV1aWQpO1xuICAgICAgICAgICAgaWYgKCFub2RlSW5mbykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyZW50IE5vZGUgJHtub2RlVXVpZH0gZm9yIENvbXBvbmVudCAke3V1aWR9IG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEluZGV4ID0gbm9kZUluZm8uX19jb21wc19fLmZpbmRJbmRleCgoY29tcDogYW55KSA9PiBjb21wLnZhbHVlLnV1aWQudmFsdWUgPT09IHV1aWQpO1xuICAgICAgICAgICAgcHJvcGVydHlQYXRoID0gYF9fY29tcHNfXy4ke2NvbXBvbmVudEluZGV4fS4ke3Byb3BlcnR5UGF0aH1gO1xuICAgICAgICAgICAgdXVpZCA9IG5vZGVVdWlkO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hcHBseVZhbHVlKHV1aWQsIHByb3BlcnR5UGF0aCwgdGFyZ2V0UHJvcCwgdmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm9ybWFsaXplVmFsdWUodmFsdWU6IGFueSwgcHJvcDogSVByb3BlcnR5KTogYW55IHtcbiAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHN0cmluZyB2YWx1ZXMgaW50byBwcm9wZXIgdHlwZXNcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nUHJvcCA9IHByb3AudHlwZSA9PT0gJ1N0cmluZyc7XG4gICAgICAgICAgICBpZiAoIWlzU3RyaW5nUHJvcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHQgPT09ICd0cnVlJykgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHQgPT09ICdmYWxzZScpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4oTnVtYmVyKHQpKSAmJiB0ICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICgodC5zdGFydHNXaXRoKCd7JykgfHwgdC5zdGFydHNXaXRoKCdbJykpICYmICh0LmVuZHNXaXRoKCd9JykgfHwgdC5lbmRzV2l0aCgnXScpKSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyByZXR1cm4gSlNPTi5wYXJzZSh0KTsgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRQcm9wZXJ0eUluRHVtcChyb290OiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9IHwgQXNzZXRJbmZvIHwgbnVsbCwgcGF0aDogc3RyaW5nKTogSVByb3BlcnR5IHwgbnVsbCB7XG4gICAgICAgIGlmICghcGF0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcm9vdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnQ6IGFueSA9IHsgdmFsdWU6IHJvb3QgfTsgLy8gV3JhcCB0byB1bmlmeSB0cmF2ZXJzYWxcblxuICAgICAgICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgb2JqZWN0IGxvb2tzIGxpa2UgYSBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gICAgICAgIGNvbnN0IGlzUHJvcGVydHkgPSAob2JqOiBhbnkpID0+IG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAoJ3R5cGUnIGluIG9iaiB8fCAnZXh0ZW5kcycgaW4gb2JqKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG5cbiAgICAgICAgICAgIC8vIEN1cnJlbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gSVByb3BlcnR5IG9yIG9iamVjdCBjb250YWluaW5nIElQcm9wZXJ0eSBkYXRhXG4gICAgICAgICAgICBsZXQgdmFsID0gY3VycmVudC52YWx1ZTtcbiAgICAgICAgICAgIC8vIElmIGN1cnJlbnQgaXMganVzdCB0aGUgZGljdGlvbmFyeSAocm9vdCksIHVzZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHJvb3QgfHwgKHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0JyAmJiAhKCd2YWx1ZScgaW4gY3VycmVudCkpKSB7XG4gICAgICAgICAgICAgICAgdmFsID0gY3VycmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIC8vIDEuIEFycmF5IEluZGV4XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gcGFyc2VJbnQocGFydCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihpZHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4aXN0aW5nIGluZGV4XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxbaWR4XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gdmFsW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9wZXJ0eShlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50LmVsZW1lbnRUeXBlRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEh5ZHJhdGUgZnJvbSBzY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0geyAuLi5jdXJyZW50LmVsZW1lbnRUeXBlRGF0YSwgdmFsdWU6IGVsZW0gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgZm9yIHByaW1pdGl2ZSBhcnJheXMgd2l0aG91dCBzY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0geyB2YWx1ZTogZWxlbSwgdHlwZTogJ1Vua25vd24nIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBFeHRlbmRpbmcgYXJyYXkgc3VwcG9ydDogQWxsb3cgaW5kZXggPT0gbGVuZ3RoIGlmIHNjaGVtYSBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IGdhcHMgKGlkeCA+IGxlbmd0aCkuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IHZhbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmVsZW1lbnRUeXBlRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmVsZW1lbnRUeXBlRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheSBleHRlbnNpb24gYXQgJyR7cGFydH0nIGZhaWxlZDogTm8gZWxlbWVudFR5cGVEYXRhLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXkgaW5kZXggJyR7aWR4fScgb3V0IG9mIGJvdW5kcyAobGVuZ3RoOiAke3ZhbC5sZW5ndGh9KSBhdCAnJHtwYXJ0fScuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcnJheSBpbmRleCAnJHtwYXJ0fScgYXQgJyR7cGF0aH0nLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAyLiBPYmplY3QgS2V5XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydCBpbiB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcENhbmRpZGF0ZSA9IHZhbFtwYXJ0IGFzIGtleW9mIHR5cGVvZiB2YWxdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9wZXJ0eShwcm9wQ2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHByb3BDYW5kaWRhdGU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgYSBwcm9wZXJ0eSwgcHJvYmFibHkgYSByYXcgdmFsdWUgaW4gYSBzdHJ1Y3QgKGxpa2UgcG9zaXRpb24ueCA9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZmluZCBzY2hlbWEgaW4gZGVmYXVsdCB2YWx1ZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzY2hlbWEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuZGVmYXVsdCAmJiBjdXJyZW50LmRlZmF1bHQudmFsdWUgJiYgdHlwZW9mIGN1cnJlbnQuZGVmYXVsdC52YWx1ZSA9PT0gJ29iamVjdCcgJiYgcGFydCBpbiBjdXJyZW50LmRlZmF1bHQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSBjdXJyZW50LmRlZmF1bHQudmFsdWVbcGFydF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0geyAuLi5zY2hlbWEsIHZhbHVlOiBwcm9wQ2FuZGlkYXRlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHNjaGVtYSBmb3VuZCwgdHJlYXQgYXMgdW50eXBlZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB7IHZhbHVlOiBwcm9wQ2FuZGlkYXRlLCB0eXBlOiAnVW5rbm93bicgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBLZXkgJyR7cGFydH0nIG5vdCBmb3VuZCAke2kgPT0gMCA/ICcnIDogJ2luICcgKyBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcuJyl9LmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggc2VnbWVudCAnJHtwYXJ0fScgJyR7aSA9PSAwID8gJycgOiAnYXQgJyArIHBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy4nKX0nIGZhaWxlZCByZXNvbHV0aW9uLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgYXMgSVByb3BlcnR5O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXBwbHlWYWx1ZSh1dWlkOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgcHJvcDogSVByb3BlcnR5LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIC8vIEhhbmRsZSBkaXJlY3QgcmVmZXJlbmNlc1xuICAgICAgICBpZiAocHJvcC5leHRlbmRzPy5pbmNsdWRlcygnY2MuT2JqZWN0JykpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYXdhaXQgdGhpcy5jb252ZXJ0T2JqZWN0UmVmZXJlbmNlVG9Db2Nvcyh2YWx1ZSwgcHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgb2YgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgcHJvcC5lbGVtZW50VHlwZURhdGE/LmV4dGVuZHM/LmluY2x1ZGVzKCdjYy5PYmplY3QnKSkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkQXJyYXk6IGFueVtdID0gW107XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGFzeW5jIChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnZlcnRlZEFycmF5W2luZGV4XSA9IGF3YWl0IHRoaXMuY29udmVydE9iamVjdFJlZmVyZW5jZVRvQ29jb3MoaXRlbSwgcHJvcC5lbGVtZW50VHlwZURhdGEhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0ZWRBcnJheTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGR1bXAgPSB7IHZhbHVlLCB0eXBlOiBwcm9wLnR5cGUgfTtcblxuICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdzZXQtcHJvcGVydHknLCB7XG4gICAgICAgICAgICB1dWlkLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGR1bXBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAnc25hcHNob3QnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvbnZlcnRPYmplY3RSZWZlcmVuY2VUb0NvY29zKHZhbHVlOiBhbnksIHByb3A6IElQcm9wZXJ0eSk6IFByb21pc2U8eyB1dWlkOiBzdHJpbmcgfT4ge1xuICAgICAgICBjb25zdCBleHRlbmRzSW5mbyA9IHByb3AuZXh0ZW5kcyB8fCBbXTtcblxuICAgICAgICAvLyBBY2NlcHQgcGxhaW4gVVVJRCBzdHJpbmcgb3IgeyB1dWlkOiBzdHJpbmcgfSBzdHJ1Y3R1cmVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0geyB1dWlkOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZWZlcmVuY2Ugb2JqZWN0IHdpdGggaWQgaXMgc2VudFxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnaWQnIGluIHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHsgdXVpZDogdmFsdWUuaWQgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYXNzZXQgc3VidHlwZSBjaGVja1xuICAgICAgICBpZiAoZXh0ZW5kc0luZm8uaW5jbHVkZXMoJ2NjLkFzc2V0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0SW5mbzogQXNzZXRJbmZvIHwgbnVsbCA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LWluZm8nLCB2YWx1ZS51dWlkKTtcbiAgICAgICAgICAgIGlmICghYXNzZXRJbmZvKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NldCB3aXRoIGlkICR7dmFsdWUudXVpZH0gbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZvdW5kU3ViQXNzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhc3NldEluZm8udHlwZSAhPT0gcHJvcC50eXBlKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhhc3NldEluZm8uc3ViQXNzZXRzIHx8IHt9KS5mb3JFYWNoKHN1YkFzc2V0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkFzc2V0LnR5cGUgPT09IHByb3AudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7IHV1aWQ6IHN1YkFzc2V0LnV1aWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU3ViQXNzZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvdW5kU3ViQXNzZXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWZvdW5kU3ViQXNzZXQgJiYgYXNzZXRJbmZvLnR5cGUgIT09IHByb3AudHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVmZXJlbmNlIHR5cGUgbWlzbWF0Y2g6IGV4cGVjdGVkICR7cHJvcC50eXBlfSwgZ290ICR7YXNzZXRJbmZvLnR5cGV9LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/tools/set-property-tool.js b/extensions/cocos-code-mode/dist/utcp/tools/set-property-tool.js new file mode 100644 index 0000000..f88ee8e --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/tools/set-property-tool.js @@ -0,0 +1,266 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SetPropertyTool = void 0; +const decorators_1 = require("../decorators"); +const tools_utils_1 = require("../utils/tools-utils"); +const asset_importers_1 = require("../utils/asset-importers"); +const schemas_1 = require("../schemas"); +class SetPropertyTool { + async setCurrentSceneProperties(params) { + return await this.setInstanceProperties({ + reference: { id: params.settingsType }, propertyPaths: params.propertyPaths, values: params.values + }); + } + async setInstanceProperties(params) { + let { reference: { id: uuid }, propertyPaths, values } = params; + let info = await tools_utils_1.ToolsUtils.inspectInstance(uuid, false); + if (!info) { + throw new Error(`Target ${uuid} not found or not supported.`); + } + uuid = info.uuid; + const { type, props, assetInfo } = info; + if (!props) { + throw new Error(`Could not retrieve properties for ${type} of instance ${uuid}.`); + } + for (let i = 0; i < propertyPaths.length; i++) { + await this.setProperty(info, propertyPaths[i], values[i]); + } + return { success: true }; + } + async setProperty({ uuid, type, props, assetInfo }, propertyPath, value) { + var _a; + // Find property definition in the dump + let targetProp = null; + try { + targetProp = this.findPropertyInDump(props, propertyPath); + } + catch (e) { + throw new Error(`Property '${propertyPath}' resolution failed: ${e.message}. Please recheck TypescriptDefinition of ${uuid}. Arrays are reached by indexes.`); + } + if (!targetProp) { + throw new Error(`Property '${propertyPath}' not found on ${type} of instance ${uuid}.`); + } + // Normalize value based on property definition + value = this.normalizeValue(value, targetProp); + if (assetInfo) { + try { + const success = await ((_a = asset_importers_1.ImporterManager.getInstance().getImporter(assetInfo.importer)) === null || _a === void 0 ? void 0 : _a.setProperty(assetInfo, propertyPath, value)); + if (!success) { + throw new Error(`Importer failed to set property.`); + } + } + catch (e) { + throw new Error(`Failed to set property on Asset ${uuid}: ${e}`); + } + return; + } + if (type === 'cc.SceneGlobals') { + // Scene Globals are part of the scene node but under _globals + propertyPath = `_globals.${propertyPath}`; + // uuid is already set to the Scene UUID from inspectInstance + } + else if (type !== 'cc.Node') { + const nodeUuid = props.node.value.uuid; + const nodeInfo = await Editor.Message.request('scene', 'query-node', nodeUuid); + if (!nodeInfo) { + throw new Error(`Parent Node ${nodeUuid} for Component ${uuid} not found.`); + } + const componentIndex = nodeInfo.__comps__.findIndex((comp) => comp.value.uuid.value === uuid); + propertyPath = `__comps__.${componentIndex}.${propertyPath}`; + uuid = nodeUuid; + } + await this.applyValue(uuid, propertyPath, targetProp, value); + } + normalizeValue(value, prop) { + // Try to parse string values into proper types + if (typeof value === 'string') { + const isStringProp = prop.type === 'String'; + if (!isStringProp) { + const t = value.trim(); + if (t === 'true') + return true; + if (t === 'false') + return false; + if (!isNaN(Number(t)) && t !== '') { + return Number(t); + } + if ((t.startsWith('{') || t.startsWith('[')) && (t.endsWith('}') || t.endsWith(']'))) { + try { + return JSON.parse(t); + } + catch (e) { } + } + } + } + return value; + } + findPropertyInDump(root, path) { + if (!path) + return null; + if (!root) + return null; + const parts = path.split('.'); + let current = { value: root }; // Wrap to unify traversal + // Helper to check if object looks like a property definition + const isProperty = (obj) => obj && typeof obj === 'object' && ('type' in obj || 'extends' in obj); + for (let i = 0; i < parts.length; i++) { + const part = parts[i]; + // Current is expected to be an IProperty or object containing IProperty data + let val = current.value; + // If current is just the dictionary (root), use it directly + if (current === root || (typeof current === 'object' && !('value' in current))) { + val = current; + } + if (val === undefined || val === null) + return null; + // 1. Array Index + if (Array.isArray(val)) { + const idx = parseInt(part); + if (!isNaN(idx)) { + // Existing index + if (val[idx] !== undefined) { + const elem = val[idx]; + if (isProperty(elem)) { + current = elem; + } + else if (current.elementTypeData) { + // Hydrate from schema + current = Object.assign(Object.assign({}, current.elementTypeData), { value: elem }); + } + else { + // Fallback for primitive arrays without schema + current = { value: elem, type: 'Unknown' }; + } + continue; + } + // Extending array support: Allow index == length if schema exists. + // Don't allow gaps (idx > length). + if (idx === val.length) { + if (current.elementTypeData) { + current = current.elementTypeData; + continue; + } + else { + throw new Error(`Array extension at '${part}' failed: No elementTypeData.`); + } + } + throw new Error(`Array index '${idx}' out of bounds (length: ${val.length}) at '${part}'.`); + } + throw new Error(`Invalid array index '${part}' at '${path}'.`); + } + // 2. Object Key + if (typeof val === 'object') { + if (part in val) { + const propCandidate = val[part]; + if (isProperty(propCandidate)) { + current = propCandidate; + } + else { + // Not a property, probably a raw value in a struct (like position.x = 0) + // Try to find schema in default value if available + let schema = null; + if (current.default && current.default.value && typeof current.default.value === 'object' && part in current.default.value) { + schema = current.default.value[part]; + } + if (schema) { + current = Object.assign(Object.assign({}, schema), { value: propCandidate }); + } + else { + // No schema found, treat as untyped value + current = { value: propCandidate, type: 'Unknown' }; + } + } + continue; + } + throw new Error(`Key '${part}' not found ${i == 0 ? '' : 'in ' + parts.slice(0, i).join('.')}.`); + } + throw new Error(`Path segment '${part}' '${i == 0 ? '' : 'at ' + parts.slice(0, i).join('.')}' failed resolution.`); + } + return current; + } + async applyValue(uuid, path, prop, value) { + var _a, _b, _c; + // Handle direct references + if ((_a = prop.extends) === null || _a === void 0 ? void 0 : _a.includes('cc.Object')) { + value = await this.convertObjectReferenceToCocos(value, prop); + } + // Handle array of references + if (Array.isArray(value) && ((_c = (_b = prop.elementTypeData) === null || _b === void 0 ? void 0 : _b.extends) === null || _c === void 0 ? void 0 : _c.includes('cc.Object'))) { + const convertedArray = []; + value.forEach(async (item, index) => { + convertedArray[index] = await this.convertObjectReferenceToCocos(item, prop.elementTypeData); + }); + value = convertedArray; + } + const dump = { value, type: prop.type }; + await Editor.Message.request('scene', 'set-property', { + uuid, + path, + dump + }); + await Editor.Message.request('scene', 'snapshot'); + } + async convertObjectReferenceToCocos(value, prop) { + const extendsInfo = prop.extends || []; + // Accept plain UUID string or { uuid: string } structure + if (typeof value === 'string') { + value = { uuid: value }; + } + // Reference object with id is sent + if (typeof value === 'object' && value !== null && 'id' in value) { + value = { uuid: value.id }; + } + // Special case for asset subtype check + if (extendsInfo.includes('cc.Asset')) { + const assetInfo = await Editor.Message.request('asset-db', 'query-asset-info', value.uuid); + if (!assetInfo) { + throw new Error(`Asset with id ${value.uuid} not found.`); + } + let foundSubAsset = false; + if (assetInfo.type !== prop.type) { + Object.values(assetInfo.subAssets || {}).forEach(subAsset => { + if (subAsset.type === prop.type) { + value = { uuid: subAsset.uuid }; + foundSubAsset = true; + } + }); + } + else { + foundSubAsset = true; + } + if (!foundSubAsset && assetInfo.type !== prop.type) { + throw new Error(`Reference type mismatch: expected ${prop.type}, got ${assetInfo.type}.`); + } + } + return value; + } +} +exports.SetPropertyTool = SetPropertyTool; +__decorate([ + (0, decorators_1.utcpTool)("inspectorSetSettingsProperties", "Sets a property on the specific settings. If a property path or type is not confirmed via inspectorGet* tools, you MUST NOT call any setter.", { type: 'object', + properties: { + settingsType: { type: 'string', enum: ['CurrentSceneGlobals', 'ProjectSettings'] }, + propertyPath: { type: 'string', description: "Plain path to the property (e.g., 'ambient.skyLightingColor.r'). Don't support code execution." }, + value: { type: ['array', 'object', 'string', 'number', 'boolean', 'null'], additionalProperties: true } + }, + required: ['settingsType', 'propertyPath', 'value'] + }, schemas_1.SuccessIndicatorSchema, "POST", ['property', 'set', 'scene', 'settings', 'project', 'modify', 'config']) +], SetPropertyTool.prototype, "setCurrentSceneProperties", null); +__decorate([ + (0, decorators_1.utcpTool)("inspectorSetInstanceProperties", "Sets a property on instance of Node, Component or Asset. If a property path or type is not confirmed via inspectorGet* tools, you MUST NOT call any setter.", { + type: 'object', + properties: { + reference: schemas_1.InstanceReferenceSchema, + propertyPaths: { type: 'array', items: { type: 'string' }, description: "Plain paths to the properties (e.g., ['position.x', 'rotation.y']). Don't support code execution. Arrays are reached by indexes. (e.g. 'sharedMaterials.0')" }, + values: { type: 'array', items: { type: ['array', 'object', 'string', 'number', 'boolean', 'null'], additionalProperties: true } } + }, + required: ['reference', 'propertyPaths', 'values'] + }, schemas_1.SuccessIndicatorSchema, "POST", ['property', 'set', 'instance', 'node', 'component', 'asset', 'modify', 'meta']) +], SetPropertyTool.prototype, "setInstanceProperties", null); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LXByb3BlcnR5LXRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvdXRjcC90b29scy9zZXQtcHJvcGVydHktdG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSw4Q0FBeUM7QUFFekMsc0RBQWtEO0FBQ2xELDhEQUEyRDtBQUUzRCx3Q0FBb0g7QUFJcEgsTUFBYSxlQUFlO0lBY2xCLEFBQU4sS0FBSyxDQUFDLHlCQUF5QixDQUFDLE1BQXdFO1FBQ3BHLE9BQU8sTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUM7WUFDcEMsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07U0FDckcsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQWlCSyxBQUFOLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFpRjtRQUN6RyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFFaEUsSUFBSSxJQUFJLEdBQUcsTUFBTSx3QkFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksOEJBQThCLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFakIsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRXhDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLElBQUksZ0JBQWdC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QUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFO1NBQzFHO1FBQ0QsUUFBUSxFQUFFLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUM7S0FDdEQsRUFDRCxnQ0FBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FDMUc7Z0VBS0E7QUFpQks7SUFkTCxJQUFBLHFCQUFRLEVBQ0wsZ0NBQWdDLEVBQ2hDLDZKQUE2SixFQUM3SjtRQUNJLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLGlDQUF1QjtZQUNsQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsNkpBQTZKLEVBQUU7WUFDdk8sTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxFQUFFO1NBQ3JJO1FBQ0QsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUM7S0FDckQsRUFDRCxnQ0FBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQ2xIOzREQXNCQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0Y3BUb29sIH0gZnJvbSAnLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJUHJvcGVydHksIElQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcbmltcG9ydCB7IFRvb2xzVXRpbHMgfSBmcm9tICcuLi91dGlscy90b29scy11dGlscyc7XG5pbXBvcnQgeyBJbXBvcnRlck1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9hc3NldC1pbXBvcnRlcnMnO1xuaW1wb3J0IHsgQXNzZXRJbmZvIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL2Fzc2V0LWRiL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0IHsgSUluc3RhbmNlUmVmZXJlbmNlLCBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSwgSVN1Y2Nlc3NJbmRpY2F0b3IsIFN1Y2Nlc3NJbmRpY2F0b3JTY2hlbWEgfSBmcm9tICcuLi9zY2hlbWFzJztcblxuZGVjbGFyZSBjb25zdCBFZGl0b3I6IGFueTtcblxuZXhwb3J0IGNsYXNzIFNldFByb3BlcnR5VG9vbCB7XG4gICAgQHV0Y3BUb29sKFxuICAgICAgICBcImluc3BlY3RvclNldFNldHRpbmdzUHJvcGVydGllc1wiLFxuICAgICAgICBcIlNldHMgYSBwcm9wZXJ0eSBvbiB0aGUgc3BlY2lmaWMgc2V0dGluZ3MuIElmIGEgcHJvcGVydHkgcGF0aCBvciB0eXBlIGlzIG5vdCBjb25maXJtZWQgdmlhIGluc3BlY3RvckdldCogdG9vbHMsIHlvdSBNVVNUIE5PVCBjYWxsIGFueSBzZXR0ZXIuXCIsXG4gICAgICAgIHsgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgc2V0dGluZ3NUeXBlOiB7IHR5cGU6ICdzdHJpbmcnLCBlbnVtOiBbJ0N1cnJlbnRTY2VuZUdsb2JhbHMnLCAnUHJvamVjdFNldHRpbmdzJ10gfSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGg6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiBcIlBsYWluIHBhdGggdG8gdGhlIHByb3BlcnR5IChlLmcuLCAnYW1iaWVudC5za3lMaWdodGluZ0NvbG9yLnInKS4gRG9uJ3Qgc3VwcG9ydCBjb2RlIGV4ZWN1dGlvbi5cIiB9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IFsnYXJyYXknLCAnb2JqZWN0JywgJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbicsICdudWxsJ10sIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogWydzZXR0aW5nc1R5cGUnLCAncHJvcGVydHlQYXRoJywgJ3ZhbHVlJ11cbiAgICAgICAgfSxcbiAgICAgICAgU3VjY2Vzc0luZGljYXRvclNjaGVtYSwgXCJQT1NUXCIsIFsncHJvcGVydHknLCAnc2V0JywgJ3NjZW5lJywgJ3NldHRpbmdzJywgJ3Byb2plY3QnLCAnbW9kaWZ5JywgJ2NvbmZpZyddXG4gICAgKVxuICAgIGFzeW5jIHNldEN1cnJlbnRTY2VuZVByb3BlcnRpZXMocGFyYW1zOiB7IHNldHRpbmdzVHlwZTogc3RyaW5nLCBwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSwgdmFsdWVzOiBhbnlbXSB9KTogUHJvbWlzZTxJU3VjY2Vzc0luZGljYXRvcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRJbnN0YW5jZVByb3BlcnRpZXMoe1xuICAgICAgICAgICAgcmVmZXJlbmNlOiB7IGlkOiBwYXJhbXMuc2V0dGluZ3NUeXBlIH0sIHByb3BlcnR5UGF0aHM6IHBhcmFtcy5wcm9wZXJ0eVBhdGhzLCB2YWx1ZXM6IHBhcmFtcy52YWx1ZXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBAdXRjcFRvb2woXG4gICAgICAgIFwiaW5zcGVjdG9yU2V0SW5zdGFuY2VQcm9wZXJ0aWVzXCIsXG4gICAgICAgIFwiU2V0cyBhIHByb3BlcnR5IG9uIGluc3RhbmNlIG9mIE5vZGUsIENvbXBvbmVudCBvciBBc3NldC4gSWYgYSBwcm9wZXJ0eSBwYXRoIG9yIHR5cGUgaXMgbm90IGNvbmZpcm1lZCB2aWEgaW5zcGVjdG9yR2V0KiB0b29scywgeW91IE1VU1QgTk9UIGNhbGwgYW55IHNldHRlci5cIixcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlOiBJbnN0YW5jZVJlZmVyZW5jZVNjaGVtYSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhzOiB7IHR5cGU6ICdhcnJheScsIGl0ZW1zOiB7IHR5cGU6ICdzdHJpbmcnIH0sIGRlc2NyaXB0aW9uOiBcIlBsYWluIHBhdGhzIHRvIHRoZSBwcm9wZXJ0aWVzIChlLmcuLCBbJ3Bvc2l0aW9uLngnLCAncm90YXRpb24ueSddKS4gRG9uJ3Qgc3VwcG9ydCBjb2RlIGV4ZWN1dGlvbi4gQXJyYXlzIGFyZSByZWFjaGVkIGJ5IGluZGV4ZXMuIChlLmcuICdzaGFyZWRNYXRlcmlhbHMuMCcpXCIgfSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHsgdHlwZTogJ2FycmF5JywgaXRlbXM6IHsgdHlwZTogWydhcnJheScsICdvYmplY3QnLCAnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJywgJ251bGwnXSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUgfSB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFsncmVmZXJlbmNlJywgJ3Byb3BlcnR5UGF0aHMnLCAndmFsdWVzJ11cbiAgICAgICAgfSxcbiAgICAgICAgU3VjY2Vzc0luZGljYXRvclNjaGVtYSwgXCJQT1NUXCIsIFsncHJvcGVydHknLCAnc2V0JywgJ2luc3RhbmNlJywgJ25vZGUnLCAnY29tcG9uZW50JywgJ2Fzc2V0JywgJ21vZGlmeScsICdtZXRhJ11cbiAgICApXG4gICAgYXN5bmMgc2V0SW5zdGFuY2VQcm9wZXJ0aWVzKHBhcmFtczogeyByZWZlcmVuY2U6IElJbnN0YW5jZVJlZmVyZW5jZSwgcHJvcGVydHlQYXRoczogc3RyaW5nW10sIHZhbHVlczogYW55W10gfSk6IFByb21pc2U8SVN1Y2Nlc3NJbmRpY2F0b3I+IHtcbiAgICAgICAgbGV0IHsgcmVmZXJlbmNlOiB7IGlkOiB1dWlkIH0sIHByb3BlcnR5UGF0aHMsIHZhbHVlcyB9ID0gcGFyYW1zO1xuXG4gICAgICAgIGxldCBpbmZvID0gYXdhaXQgVG9vbHNVdGlscy5pbnNwZWN0SW5zdGFuY2UodXVpZCwgZmFsc2UpO1xuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFyZ2V0ICR7dXVpZH0gbm90IGZvdW5kIG9yIG5vdCBzdXBwb3J0ZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICB1dWlkID0gaW5mby51dWlkO1xuXG4gICAgICAgIGNvbnN0IHsgdHlwZSwgcHJvcHMsIGFzc2V0SW5mbyB9ID0gaW5mbztcblxuICAgICAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZXRyaWV2ZSBwcm9wZXJ0aWVzIGZvciAke3R5cGV9IG9mIGluc3RhbmNlICR7dXVpZH0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0UHJvcGVydHkoaW5mbywgcHJvcGVydHlQYXRoc1tpXSwgdmFsdWVzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldFByb3BlcnR5KHsgdXVpZCwgdHlwZSwgcHJvcHMsIGFzc2V0SW5mbyB9OiB7IHV1aWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB8IG51bGwsIGFzc2V0SW5mbzogQXNzZXRJbmZvIHwgbnVsbCB9LCBwcm9wZXJ0eVBhdGg6IHN0cmluZywgdmFsdWU6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBGaW5kIHByb3BlcnR5IGRlZmluaXRpb24gaW4gdGhlIGR1bXBcbiAgICAgICAgbGV0IHRhcmdldFByb3A6IElQcm9wZXJ0eSB8IG51bGwgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGFyZ2V0UHJvcCA9IHRoaXMuZmluZFByb3BlcnR5SW5EdW1wKHByb3BzLCBwcm9wZXJ0eVBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJyR7cHJvcGVydHlQYXRofScgcmVzb2x1dGlvbiBmYWlsZWQ6ICR7ZS5tZXNzYWdlfS4gUGxlYXNlIHJlY2hlY2sgVHlwZXNjcmlwdERlZmluaXRpb24gb2YgJHt1dWlkfS4gQXJyYXlzIGFyZSByZWFjaGVkIGJ5IGluZGV4ZXMuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldFByb3ApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJyR7cHJvcGVydHlQYXRofScgbm90IGZvdW5kIG9uICR7dHlwZX0gb2YgaW5zdGFuY2UgJHt1dWlkfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZSBiYXNlZCBvbiBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gICAgICAgIHZhbHVlID0gdGhpcy5ub3JtYWxpemVWYWx1ZSh2YWx1ZSwgdGFyZ2V0UHJvcCk7XG5cbiAgICAgICAgaWYgKGFzc2V0SW5mbykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuIHwgdW5kZWZpbmVkID0gYXdhaXQgSW1wb3J0ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW1wb3J0ZXIoYXNzZXRJbmZvLmltcG9ydGVyKT8uc2V0UHJvcGVydHkoYXNzZXRJbmZvLCBwcm9wZXJ0eVBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnRlciBmYWlsZWQgdG8gc2V0IHByb3BlcnR5LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzZXQgcHJvcGVydHkgb24gQXNzZXQgJHt1dWlkfTogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdjYy5TY2VuZUdsb2JhbHMnKSB7XG4gICAgICAgICAgICAvLyBTY2VuZSBHbG9iYWxzIGFyZSBwYXJ0IG9mIHRoZSBzY2VuZSBub2RlIGJ1dCB1bmRlciBfZ2xvYmFsc1xuICAgICAgICAgICAgcHJvcGVydHlQYXRoID0gYF9nbG9iYWxzLiR7cHJvcGVydHlQYXRofWA7XG4gICAgICAgICAgICAvLyB1dWlkIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBTY2VuZSBVVUlEIGZyb20gaW5zcGVjdEluc3RhbmNlXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ2NjLk5vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlVXVpZCA9IChwcm9wcyBhcyBhbnkpLm5vZGUudmFsdWUudXVpZDtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJbmZvID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktbm9kZScsIG5vZGVVdWlkKTtcbiAgICAgICAgICAgIGlmICghbm9kZUluZm8pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmVudCBOb2RlICR7bm9kZVV1aWR9IGZvciBDb21wb25lbnQgJHt1dWlkfSBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRJbmRleCA9IG5vZGVJbmZvLl9fY29tcHNfXy5maW5kSW5kZXgoKGNvbXA6IGFueSkgPT4gY29tcC52YWx1ZS51dWlkLnZhbHVlID09PSB1dWlkKTtcbiAgICAgICAgICAgIHByb3BlcnR5UGF0aCA9IGBfX2NvbXBzX18uJHtjb21wb25lbnRJbmRleH0uJHtwcm9wZXJ0eVBhdGh9YDtcbiAgICAgICAgICAgIHV1aWQgPSBub2RlVXVpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYXBwbHlWYWx1ZSh1dWlkLCBwcm9wZXJ0eVBhdGgsIHRhcmdldFByb3AsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6ZVZhbHVlKHZhbHVlOiBhbnksIHByb3A6IElQcm9wZXJ0eSk6IGFueSB7XG4gICAgICAgIC8vIFRyeSB0byBwYXJzZSBzdHJpbmcgdmFsdWVzIGludG8gcHJvcGVyIHR5cGVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBpc1N0cmluZ1Byb3AgPSBwcm9wLnR5cGUgPT09ICdTdHJpbmcnO1xuICAgICAgICAgICAgaWYgKCFpc1N0cmluZ1Byb3ApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh0ID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0ID09PSAnZmFsc2UnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKE51bWJlcih0KSkgJiYgdCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcih0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoKHQuc3RhcnRzV2l0aCgneycpIHx8IHQuc3RhcnRzV2l0aCgnWycpKSAmJiAodC5lbmRzV2l0aCgnfScpIHx8IHQuZW5kc1dpdGgoJ10nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UodCk7IH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kUHJvcGVydHlJbkR1bXAocm9vdDogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB8IEFzc2V0SW5mbyB8IG51bGwsIHBhdGg6IHN0cmluZyk6IElQcm9wZXJ0eSB8IG51bGwge1xuICAgICAgICBpZiAoIXBhdGgpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuXG4gICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSB7IHZhbHVlOiByb290IH07IC8vIFdyYXAgdG8gdW5pZnkgdHJhdmVyc2FsXG5cbiAgICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIG9iamVjdCBsb29rcyBsaWtlIGEgcHJvcGVydHkgZGVmaW5pdGlvblxuICAgICAgICBjb25zdCBpc1Byb3BlcnR5ID0gKG9iajogYW55KSA9PiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgKCd0eXBlJyBpbiBvYmogfHwgJ2V4dGVuZHMnIGluIG9iaik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgICAgICAvLyBDdXJyZW50IGlzIGV4cGVjdGVkIHRvIGJlIGFuIElQcm9wZXJ0eSBvciBvYmplY3QgY29udGFpbmluZyBJUHJvcGVydHkgZGF0YVxuICAgICAgICAgICAgbGV0IHZhbCA9IGN1cnJlbnQudmFsdWU7XG4gICAgICAgICAgICAvLyBJZiBjdXJyZW50IGlzIGp1c3QgdGhlIGRpY3Rpb25hcnkgKHJvb3QpLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSByb290IHx8ICh0eXBlb2YgY3VycmVudCA9PT0gJ29iamVjdCcgJiYgISgndmFsdWUnIGluIGN1cnJlbnQpKSkge1xuICAgICAgICAgICAgICAgIHZhbCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAvLyAxLiBBcnJheSBJbmRleFxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KHBhcnQpO1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4oaWR4KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFeGlzdGluZyBpbmRleFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsW2lkeF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IHZhbFtpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvcGVydHkoZWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5lbGVtZW50VHlwZURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIeWRyYXRlIGZyb20gc2NoZW1hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHsgLi4uY3VycmVudC5lbGVtZW50VHlwZURhdGEsIHZhbHVlOiBlbGVtIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrIGZvciBwcmltaXRpdmUgYXJyYXlzIHdpdGhvdXQgc2NoZW1hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHsgdmFsdWU6IGVsZW0sIHR5cGU6ICdVbmtub3duJyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kaW5nIGFycmF5IHN1cHBvcnQ6IEFsbG93IGluZGV4ID09IGxlbmd0aCBpZiBzY2hlbWEgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyBnYXBzIChpZHggPiBsZW5ndGgpLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSB2YWwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5lbGVtZW50VHlwZURhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXkgZXh0ZW5zaW9uIGF0ICcke3BhcnR9JyBmYWlsZWQ6IE5vIGVsZW1lbnRUeXBlRGF0YS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5IGluZGV4ICcke2lkeH0nIG91dCBvZiBib3VuZHMgKGxlbmd0aDogJHt2YWwubGVuZ3RofSkgYXQgJyR7cGFydH0nLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJyYXkgaW5kZXggJyR7cGFydH0nIGF0ICcke3BhdGh9Jy5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMi4gT2JqZWN0IEtleVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQgaW4gdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BDYW5kaWRhdGUgPSB2YWxbcGFydCBhcyBrZXlvZiB0eXBlb2YgdmFsXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvcGVydHkocHJvcENhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwcm9wQ2FuZGlkYXRlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGEgcHJvcGVydHksIHByb2JhYmx5IGEgcmF3IHZhbHVlIGluIGEgc3RydWN0IChsaWtlIHBvc2l0aW9uLnggPSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgc2NoZW1hIGluIGRlZmF1bHQgdmFsdWUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2NoZW1hID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmRlZmF1bHQgJiYgY3VycmVudC5kZWZhdWx0LnZhbHVlICYmIHR5cGVvZiBjdXJyZW50LmRlZmF1bHQudmFsdWUgPT09ICdvYmplY3QnICYmIHBhcnQgaW4gY3VycmVudC5kZWZhdWx0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gY3VycmVudC5kZWZhdWx0LnZhbHVlW3BhcnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHsgLi4uc2NoZW1hLCB2YWx1ZTogcHJvcENhbmRpZGF0ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzY2hlbWEgZm91bmQsIHRyZWF0IGFzIHVudHlwZWQgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0geyB2YWx1ZTogcHJvcENhbmRpZGF0ZSwgdHlwZTogJ1Vua25vd24nIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgS2V5ICcke3BhcnR9JyBub3QgZm91bmQgJHtpID09IDAgPyAnJyA6ICdpbiAnICsgcGFydHMuc2xpY2UoMCwgaSkuam9pbignLicpfS5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHNlZ21lbnQgJyR7cGFydH0nICcke2kgPT0gMCA/ICcnIDogJ2F0ICcgKyBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcuJyl9JyBmYWlsZWQgcmVzb2x1dGlvbi5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJyZW50IGFzIElQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFwcGx5VmFsdWUodXVpZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIHByb3A6IElQcm9wZXJ0eSwgdmFsdWU6IGFueSkge1xuICAgICAgICAvLyBIYW5kbGUgZGlyZWN0IHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHByb3AuZXh0ZW5kcz8uaW5jbHVkZXMoJ2NjLk9iamVjdCcpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGF3YWl0IHRoaXMuY29udmVydE9iamVjdFJlZmVyZW5jZVRvQ29jb3ModmFsdWUsIHByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFycmF5IG9mIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHByb3AuZWxlbWVudFR5cGVEYXRhPy5leHRlbmRzPy5pbmNsdWRlcygnY2MuT2JqZWN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZEFycmF5OiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChhc3luYyAoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWRBcnJheVtpbmRleF0gPSBhd2FpdCB0aGlzLmNvbnZlcnRPYmplY3RSZWZlcmVuY2VUb0NvY29zKGl0ZW0sIHByb3AuZWxlbWVudFR5cGVEYXRhISk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhbHVlID0gY29udmVydGVkQXJyYXk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdW1wID0geyB2YWx1ZSwgdHlwZTogcHJvcC50eXBlIH07XG5cbiAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAnc2V0LXByb3BlcnR5Jywge1xuICAgICAgICAgICAgdXVpZCxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBkdW1wXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3NuYXBzaG90Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb252ZXJ0T2JqZWN0UmVmZXJlbmNlVG9Db2Nvcyh2YWx1ZTogYW55LCBwcm9wOiBJUHJvcGVydHkpOiBQcm9taXNlPHsgdXVpZDogc3RyaW5nIH0+IHtcbiAgICAgICAgY29uc3QgZXh0ZW5kc0luZm8gPSBwcm9wLmV4dGVuZHMgfHwgW107XG5cbiAgICAgICAgLy8gQWNjZXB0IHBsYWluIFVVSUQgc3RyaW5nIG9yIHsgdXVpZDogc3RyaW5nIH0gc3RydWN0dXJlXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHsgdXVpZDogdmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUmVmZXJlbmNlIG9iamVjdCB3aXRoIGlkIGlzIHNlbnRcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2lkJyBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSB7IHV1aWQ6IHZhbHVlLmlkIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGFzc2V0IHN1YnR5cGUgY2hlY2tcbiAgICAgICAgaWYgKGV4dGVuZHNJbmZvLmluY2x1ZGVzKCdjYy5Bc3NldCcpKSB7XG4gICAgICAgICAgICBjb25zdCBhc3NldEluZm86IEFzc2V0SW5mbyB8IG51bGwgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1pbmZvJywgdmFsdWUudXVpZCk7XG4gICAgICAgICAgICBpZiAoIWFzc2V0SW5mbykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXQgd2l0aCBpZCAke3ZhbHVlLnV1aWR9IG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmb3VuZFN1YkFzc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYXNzZXRJbmZvLnR5cGUgIT09IHByb3AudHlwZSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoYXNzZXRJbmZvLnN1YkFzc2V0cyB8fCB7fSkuZm9yRWFjaChzdWJBc3NldCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJBc3NldC50eXBlID09PSBwcm9wLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0geyB1dWlkOiBzdWJBc3NldC51dWlkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFN1YkFzc2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3VuZFN1YkFzc2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFmb3VuZFN1YkFzc2V0ICYmIGFzc2V0SW5mby50eXBlICE9PSBwcm9wLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZmVyZW5jZSB0eXBlIG1pc21hdGNoOiBleHBlY3RlZCAke3Byb3AudHlwZX0sIGdvdCAke2Fzc2V0SW5mby50eXBlfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/tools/typescript-defenition.js b/extensions/cocos-code-mode/dist/utcp/tools/typescript-defenition.js new file mode 100644 index 0000000..1b215f5 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/tools/typescript-defenition.js @@ -0,0 +1,308 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GetClassInfoTool = void 0; +const decorators_1 = require("../decorators"); +const tools_utils_1 = require("../utils/tools-utils"); +const schemas_1 = require("../schemas"); +class GetClassInfoTool { + constructor() { + this._definitions = []; + this._definedNames = new Set(); + this._commonTypesDefinition = 'interface IExposedAttributes { type?: string, visible?: boolean, multiline?: boolean, min?: number, max?: number, step?: number, unit?: string, radian?: boolean }\n' + + 'function property(options: IExposedAttributes) {}\n' + + 'type InstanceReference = { id: string; type: string };\n' + + 'class Vec2 { x: number; y: number; }\n' + + 'class Vec3 { x: number; y: number; z: number; }\n' + + 'class Vec4 { x: number; y: number; z: number; w: number; }\n' + + 'class Color { r: number; g: number; b: number; a: number; }\n' + + 'class Rect { x: number; y: number; width: number; height: number; }\n' + + 'class Size { width: number; height: number; }\n' + + 'class Quat { x: number; y: number; z: number; w: number; }\n' + + 'class Mat3 { m00: number; m01: number; m02: number;\n' + + '\tm03: number; m04: number; m05: number;\n' + + '\tm06: number; m07: number; m08: number; }\n' + + 'class Mat4 { m00: number; m01: number; m02: number; m03: number;\n' + + '\tm04: number; m05: number; m06: number; m07: number;\n' + + '\tm08: number; m09: number; m10: number; m11: number;\n' + + '\tm12: number; m13: number; m14: number; m15: number; }\n' + + 'class Gradient { alphaKeys: Array<{ alpha: number, time: number }>, colorKeys: Array<{ /* always 3 elements: r, g and b values */color: Array, time: number }>, mode: number }'; + } + async inspectorGetSettingsDefinition(params) { + switch (params.settingsType) { + case 'CommonTypes': + return { definition: this._commonTypesDefinition }; + case 'CurrentSceneGlobals': + return this.inspectorGetInstanceDefinition({ reference: { id: 'CurrentSceneGlobals' } }); + case 'ProjectSettings': + return this.inspectorGetInstanceDefinition({ reference: { id: 'ProjectSettings' } }); + default: + throw new Error(`Unknown settings type: '${params.settingsType}'.`); + } + } + async inspectorGetInstanceDefinition(params) { + this._definitions = []; + this._definedNames.clear(); + let props = undefined; + let className = params.reference.id; + const instanceInfo = await tools_utils_1.ToolsUtils.inspectInstance(params.reference.id); + if (instanceInfo) { + className = instanceInfo.type; + if (instanceInfo.assetInfo) { + className += 'Importer'; + } + if (instanceInfo.props) { + props = instanceInfo.props; + } + this.processClass(className, props); + } + else { + throw new Error(`Class, Instance or special keyword not found: '${params.reference.id}'.`); + } + return { definition: this._definitions.join('\n') }; + } + processClass(className, providedProps, extendsClass) { + if (this._definedNames.has(className)) { + return; + } + this._definedNames.add(className); + if (!providedProps) + return; + // Don't let AI mess out with UUID + if ('uuid' in providedProps && this.isProperty(providedProps.uuid)) { + providedProps.uuid.readonly = true; + } + // Collect fields first to potentially hoist nested definitions + const fields = []; + for (const propName of Object.keys(providedProps)) { + const prop = providedProps[propName]; + // Filter out primitive properties which can't be inspected or invisible ones + if (prop === undefined || prop === null || + (this.isProperty(prop) && 'visible' in prop && !prop.visible)) + continue; + // IProperty Handling (Complex types, Metadata) + if (this.isProperty(prop)) { + const p = prop; + const decoratorParts = []; + const isArray = !!p.isArray; + // Determine item definition for Arrays + let itemDef = p; + if (isArray) { + if (p.elementTypeData) { + itemDef = p.elementTypeData; + } + else if (Array.isArray(p.value) && p.value.length > 0) { + // Try to infer from first element + itemDef = p.value[0]; + } + else { + // Cannot infer structure for empty array without schema + // Fallback to basic type handling + itemDef = null; + } + } + // Analyze Identity (based on itemDef if array, or p if single) + const defToAnalyze = itemDef || p; + const itemExtends = defToAnalyze.extends || []; + const rawType = defToAnalyze.type || 'any'; + const isValueType = itemExtends.includes('cc.ValueType'); + const isReference = itemExtends.includes('cc.Object') || + (!isValueType && (rawType === 'Node' || rawType === 'Component' || rawType === 'cc.Node' || rawType === 'cc.Component')); + let tsType = this.resolveTsType(rawType).replace(/^cc\./, ''); + // Process Enum/BitMask + const targetList = defToAnalyze.enumList || defToAnalyze.bitmaskList; + if ((rawType === 'Enum' || rawType === 'BitMask') && targetList) { + const cleanClassName = className.replace(/^cc\./, '').replace(/[^a-zA-Z0-9_]/g, '_'); + if (p.displayName && typeof p.displayName === 'string') { + if (p.displayName.startsWith('i18n:')) { + p.displayName = Editor.I18n.t(p.displayName.slice(5)); // Remove 'i18n:' prefix + } + if (p.displayName.trim().length === 0) { + p.displayName = propName; + } + } + else { + p.displayName = propName.charAt(0).toUpperCase() + propName.slice(1); + } + let enumName = `${cleanClassName}${p.displayName.replace(/[^a-zA-Z0-9_]/g, '')}${rawType}`; + if (defToAnalyze.userData && typeof defToAnalyze.userData === 'object' && 'enumName' in defToAnalyze.userData) { + enumName = defToAnalyze.userData['enumName']; + } + this.generateEnumDefinition(enumName, targetList); + tsType = enumName; + } + // Process Struct or Standard Type + else { + // Recursion: Only recurse if we have a valid item definition (itemDef) + // If isArray is true but itemDef is undefined, we skip recursion (treat as Array or Array) + if (itemDef && !isReference && !isValueType && !this.isPrimitiveType(rawType) && itemDef.value && typeof itemDef.value === 'object') { + let nestedName = tsType; + if (!nestedName || nestedName === 'Object' || nestedName === 'any') { + const suffix = isArray ? 'Item' : 'Type'; + nestedName = `${className}${propName.charAt(0).toUpperCase() + propName.slice(1)}${suffix}`; + } + const extendsForNested = itemDef.extends && itemDef.extends.length > 0 ? itemDef.extends[0].replace(/^cc\./, '') : undefined; + this.processClass(nestedName, itemDef.value, extendsForNested !== nestedName ? extendsForNested : undefined); + tsType = nestedName; + } + } + // Wrap reference type + if (isReference) { + if (tsType === 'any') + tsType = 'Object'; + tsType = `InstanceReference<${tsType}>`; + } + // Wrap array type + if (isArray) { + tsType = `Array<${tsType}>`; + } + // Decorators & Attributes + let decoratorType = null; + // Valuable types for decorators is only CCInteger and CCFloat + if (p.type === 'Integer') + decoratorType = 'CCInteger'; + else if (p.type === 'Float' || p.type === 'Number') + decoratorType = 'CCFloat'; + if (decoratorType) { + decoratorParts.push(isArray ? `type: [${decoratorType}]` : `type: ${decoratorType}`); + } + // Attributes that can help AI get more context + const attrs = ['min', 'max', 'step', 'unit', 'radian', 'multiline']; + attrs.forEach(attr => { + const val = p[attr]; + if (val !== undefined && val !== null) + decoratorParts.push(`${attr}: ${val}`); + }); + if (p.tooltip) { + let tooltip = p.tooltip; + if (tooltip.startsWith('i18n:')) { + tooltip = Editor.I18n.t(tooltip.slice(5)); // Remove 'i18n:' prefix + } + if (tooltip.trim().length > 0) { + if (tooltip.match(//i) || tooltip.includes('\n')) { + const lines = tooltip.split(/|\n/i).map(l => l.trim()).filter(l => l.length > 0); + if (lines.length > 0) { + fields.push(`\t/**`); + lines.forEach(line => fields.push(`\t * ${line}`)); + fields.push(`\t */`); + } + } + else { + fields.push(`\t/** ${tooltip} */`); + } + } + } + if (decoratorParts.length > 0) { + fields.push(`\t@property({ ${decoratorParts.join(', ')} })`); + } + const prefix = !!p.readonly ? 'readonly ' : ''; + fields.push(`\t${prefix}${propName}: ${tsType};`); + continue; + } + // Raw Value Handling (Primitives and simple objects) + if (this.isPrimitive(prop)) { + fields.push(`\t${propName}: ${typeof prop};`); + continue; + } + // Array Handling + if (Array.isArray(prop)) { + if (prop.length === 0) { + fields.push(`\t${propName}: Array;`); + } + else { + const firstItem = prop[0]; + if (this.isPrimitive(firstItem)) { + fields.push(`\t${propName}: Array<${typeof firstItem}>;`); + } + else if (typeof firstItem === 'object') { + // Raw object in array -> Recursion + const nestedClassName = `${className}${propName.charAt(0).toUpperCase() + propName.slice(1)}Item`; + this.processClass(nestedClassName, firstItem); + fields.push(`\t${propName}: Array<${nestedClassName}>;`); + } + else { + fields.push(`\t${propName}: Array;`); + } + } + continue; + } + // Fallback for raw object (struct) + if (typeof prop === 'object') { + const cleanClassName = className.replace(/^cc\./, '').replace(/[^a-zA-Z0-9_]/g, '_'); + const nestedClassName = `${cleanClassName}${propName.charAt(0).toUpperCase() + propName.slice(1)}Type`; + this.processClass(nestedClassName, prop); + fields.push(`\t${propName}: ${nestedClassName};`); + } + } + const shortName = className.includes('.') ? className.split('.').pop() : className; + const classDef = [ + `export class ${shortName} ${extendsClass ? `extends ${extendsClass}` : ''} {`, + ...fields, + `}` + ].join('\n'); + this._definitions.push(classDef); + } + // Type Guard for IProperty + isProperty(val) { + return val && typeof val === 'object' && 'value' in val; + } + // Based on info from CCClass + isPrimitiveType(type) { + return ['Integer', 'Float', 'Number', 'String', 'Boolean'].includes(type); + } + // Check if value is primitive + isPrimitive(value) { + return value === null || (typeof value !== "object" && typeof value !== "function"); + } + // Helper for Enum or BitMask generation + generateEnumDefinition(name, items) { + if (this._definedNames.has(name)) + return; + this._definedNames.add(name); + const lines = []; + lines.push(`export enum ${name} {`); + items.forEach((item) => { + let cleanName = item.name.replace(/[^a-zA-Z0-9_]/g, '_'); + if (/^[0-9]/.test(cleanName)) { + cleanName = `_${cleanName}`; + } + if (typeof item.value === 'string') { + lines.push(`\t${cleanName} = '${item.value}',`); + } + else { + lines.push(`\t${cleanName} = ${item.value},`); + } + }); + lines.push(`}`); + this._definitions.unshift(lines.join('\n')); + } + resolveTsType(type) { + switch (type) { + case 'Integer': + case 'Float': + case 'Number': + case 'Enum': // Enums handled specifically, but fallback for safety + case 'BitMask': + return 'number'; + case 'String': + return 'string'; + case 'Boolean': + return 'boolean'; + default: + return type; // e.g. Vec3, Color, Node + } + } +} +exports.GetClassInfoTool = GetClassInfoTool; +__decorate([ + (0, decorators_1.utcpTool)("inspectorGetSettingsDefinition", "Generates TypeScript definition for specific settings.", { type: 'object', properties: { settingsType: { type: 'string', enum: ['CommonTypes', 'CurrentSceneGlobals', 'ProjectSettings'] } }, required: ['settingsType'] }, { type: 'object', properties: { definition: { type: 'string' } }, required: ['definition'] }, "GET", ['code', 'typescript', 'inspection', 'definition', 'common', 'types', 'settings', 'scene', 'globals', 'project']) +], GetClassInfoTool.prototype, "inspectorGetSettingsDefinition", null); +__decorate([ + (0, decorators_1.utcpTool)("inspectorGetInstanceDefinition", "Generates TypeScript definition based on properties and descriptions of instance (Node, Component, Asset).", { type: 'object', properties: { reference: schemas_1.InstanceReferenceSchema }, required: ['reference'] }, { type: 'object', properties: { definition: { type: 'string' } }, required: ['definition'] }, "GET", ['code', 'typescript', 'inspection', 'definition', 'class', 'info', 'meta', 'instance', 'node', 'component', 'asset', 'data']) +], GetClassInfoTool.prototype, "inspectorGetInstanceDefinition", null); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC1kZWZlbml0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc291cmNlL3V0Y3AvdG9vbHMvdHlwZXNjcmlwdC1kZWZlbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLDhDQUF5QztBQUV6QyxzREFBa0Q7QUFDbEQsd0NBQXlFO0FBRXpFLE1BQWEsZ0JBQWdCO0lBQTdCO1FBRVksaUJBQVksR0FBYSxFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN2QywyQkFBc0IsR0FDMUIsc0tBQXNLO1lBQ3RLLHFEQUFxRDtZQUNyRCw2REFBNkQ7WUFDN0Qsd0NBQXdDO1lBQ3hDLG1EQUFtRDtZQUNuRCw4REFBOEQ7WUFDOUQsK0RBQStEO1lBQy9ELHVFQUF1RTtZQUN2RSxpREFBaUQ7WUFDakQsOERBQThEO1lBQzlELHVEQUF1RDtZQUN2RCw0Q0FBNEM7WUFDNUMsOENBQThDO1lBQzlDLG9FQUFvRTtZQUNwRSx5REFBeUQ7WUFDekQseURBQXlEO1lBQ3pELDJEQUEyRDtZQUMzRCx3TEFBd0wsQ0FBQztJQW9Uak0sQ0FBQztJQTNTUyxBQUFOLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxNQUFnQztRQUNqRSxRQUFRLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQixLQUFLLGFBQWE7Z0JBQ2QsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2RCxLQUFLLHFCQUFxQjtnQkFDdEIsT0FBTyxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0YsS0FBSyxpQkFBaUI7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEVB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QUssRUFBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQ3hJO3NFQXNCQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0Y3BUb29sIH0gZnJvbSAnLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJUHJvcGVydHksIElQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcbmltcG9ydCB7IFRvb2xzVXRpbHMgfSBmcm9tICcuLi91dGlscy90b29scy11dGlscyc7XG5pbXBvcnQgeyBJSW5zdGFuY2VSZWZlcmVuY2UsIEluc3RhbmNlUmVmZXJlbmNlU2NoZW1hIH0gZnJvbSAnLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBjbGFzcyBHZXRDbGFzc0luZm9Ub29sIHtcblxuICAgIHByaXZhdGUgX2RlZmluaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX2RlZmluZWROYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gICAgcHJpdmF0ZSBfY29tbW9uVHlwZXNEZWZpbml0aW9uOiBzdHJpbmcgPSBcbiAgICAgICAgJ2ludGVyZmFjZSBJRXhwb3NlZEF0dHJpYnV0ZXMgeyB0eXBlPzogc3RyaW5nLCB2aXNpYmxlPzogYm9vbGVhbiwgbXVsdGlsaW5lPzogYm9vbGVhbiwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIsIHN0ZXA/OiBudW1iZXIsIHVuaXQ/OiBzdHJpbmcsIHJhZGlhbj86IGJvb2xlYW4gfVxcbicgK1xuICAgICAgICAnZnVuY3Rpb24gcHJvcGVydHkob3B0aW9uczogSUV4cG9zZWRBdHRyaWJ1dGVzKSB7fVxcbicgK1xuICAgICAgICAndHlwZSBJbnN0YW5jZVJlZmVyZW5jZTxUPiA9IHsgaWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nIH07XFxuJyArXG4gICAgICAgICdjbGFzcyBWZWMyIHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH1cXG4nICtcbiAgICAgICAgJ2NsYXNzIFZlYzMgeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyOyB9XFxuJyArXG4gICAgICAgICdjbGFzcyBWZWM0IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcjsgdzogbnVtYmVyOyB9XFxuJyArXG4gICAgICAgICdjbGFzcyBDb2xvciB7IHI6IG51bWJlcjsgZzogbnVtYmVyOyBiOiBudW1iZXI7IGE6IG51bWJlcjsgfVxcbicgK1xuICAgICAgICAnY2xhc3MgUmVjdCB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgfVxcbicgK1xuICAgICAgICAnY2xhc3MgU2l6ZSB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyB9XFxuJyArXG4gICAgICAgICdjbGFzcyBRdWF0IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcjsgdzogbnVtYmVyOyB9XFxuJyArXG4gICAgICAgICdjbGFzcyBNYXQzIHsgbTAwOiBudW1iZXI7IG0wMTogbnVtYmVyOyBtMDI6IG51bWJlcjtcXG4nICtcbiAgICAgICAgJ1xcdG0wMzogbnVtYmVyOyBtMDQ6IG51bWJlcjsgbTA1OiBudW1iZXI7XFxuJyArXG4gICAgICAgICdcXHRtMDY6IG51bWJlcjsgbTA3OiBudW1iZXI7IG0wODogbnVtYmVyOyB9XFxuJyArXG4gICAgICAgICdjbGFzcyBNYXQ0IHsgbTAwOiBudW1iZXI7IG0wMTogbnVtYmVyOyBtMDI6IG51bWJlcjsgbTAzOiBudW1iZXI7XFxuJyArXG4gICAgICAgICdcXHRtMDQ6IG51bWJlcjsgbTA1OiBudW1iZXI7IG0wNjogbnVtYmVyOyBtMDc6IG51bWJlcjtcXG4nICtcbiAgICAgICAgJ1xcdG0wODogbnVtYmVyOyBtMDk6IG51bWJlcjsgbTEwOiBudW1iZXI7IG0xMTogbnVtYmVyO1xcbicgK1xuICAgICAgICAnXFx0bTEyOiBudW1iZXI7IG0xMzogbnVtYmVyOyBtMTQ6IG51bWJlcjsgbTE1OiBudW1iZXI7IH1cXG4nICtcbiAgICAgICAgJ2NsYXNzIEdyYWRpZW50IHsgYWxwaGFLZXlzOiBBcnJheTx7IGFscGhhOiBudW1iZXIsIHRpbWU6IG51bWJlciB9PiwgY29sb3JLZXlzOiBBcnJheTx7IC8qIGFsd2F5cyAzIGVsZW1lbnRzOiByLCBnIGFuZCBiIHZhbHVlcyAqL2NvbG9yOiBBcnJheTxudW1iZXI+LCB0aW1lOiBudW1iZXIgfT4sIG1vZGU6IG51bWJlciB9JztcblxuICAgIEB1dGNwVG9vbChcbiAgICAgICAgXCJpbnNwZWN0b3JHZXRTZXR0aW5nc0RlZmluaXRpb25cIixcbiAgICAgICAgXCJHZW5lcmF0ZXMgVHlwZVNjcmlwdCBkZWZpbml0aW9uIGZvciBzcGVjaWZpYyBzZXR0aW5ncy5cIixcbiAgICAgICAgeyB0eXBlOiAnb2JqZWN0JyAsIHByb3BlcnRpZXM6IHsgc2V0dGluZ3NUeXBlOiB7IHR5cGU6ICdzdHJpbmcnLCBlbnVtOiBbJ0NvbW1vblR5cGVzJywgJ0N1cnJlbnRTY2VuZUdsb2JhbHMnLCAnUHJvamVjdFNldHRpbmdzJ10gfSB9LCByZXF1aXJlZDogWydzZXR0aW5nc1R5cGUnXSB9LFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IGRlZmluaXRpb246IHsgdHlwZTogJ3N0cmluZycgfSB9LCByZXF1aXJlZDogWydkZWZpbml0aW9uJ10gfSwgXG4gICAgICAgIFwiR0VUXCIsICBbJ2NvZGUnLCAndHlwZXNjcmlwdCcsICdpbnNwZWN0aW9uJywgJ2RlZmluaXRpb24nLCAnY29tbW9uJywgJ3R5cGVzJywgJ3NldHRpbmdzJywgJ3NjZW5lJywgJ2dsb2JhbHMnLCAncHJvamVjdCddXG4gICAgKVxuICAgIGFzeW5jIGluc3BlY3RvckdldFNldHRpbmdzRGVmaW5pdGlvbihwYXJhbXM6IHsgc2V0dGluZ3NUeXBlOiBzdHJpbmcgfSk6IFByb21pc2U8eyBkZWZpbml0aW9uOiBzdHJpbmcgfT4ge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtcy5zZXR0aW5nc1R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0NvbW1vblR5cGVzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkZWZpbml0aW9uOiB0aGlzLl9jb21tb25UeXBlc0RlZmluaXRpb24gfTtcbiAgICAgICAgICAgIGNhc2UgJ0N1cnJlbnRTY2VuZUdsb2JhbHMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3BlY3RvckdldEluc3RhbmNlRGVmaW5pdGlvbih7IHJlZmVyZW5jZTogeyBpZDogJ0N1cnJlbnRTY2VuZUdsb2JhbHMnIH0gfSk7XG4gICAgICAgICAgICBjYXNlICdQcm9qZWN0U2V0dGluZ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3BlY3RvckdldEluc3RhbmNlRGVmaW5pdGlvbih7IHJlZmVyZW5jZTogeyBpZDogJ1Byb2plY3RTZXR0aW5ncycgfSB9KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNldHRpbmdzIHR5cGU6ICcke3BhcmFtcy5zZXR0aW5nc1R5cGV9Jy5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBAdXRjcFRvb2woXG4gICAgICAgIFwiaW5zcGVjdG9yR2V0SW5zdGFuY2VEZWZpbml0aW9uXCIsXG4gICAgICAgIFwiR2VuZXJhdGVzIFR5cGVTY3JpcHQgZGVmaW5pdGlvbiBiYXNlZCBvbiBwcm9wZXJ0aWVzIGFuZCBkZXNjcmlwdGlvbnMgb2YgaW5zdGFuY2UgKE5vZGUsIENvbXBvbmVudCwgQXNzZXQpLlwiLFxuICAgICAgICB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IHJlZmVyZW5jZTogSW5zdGFuY2VSZWZlcmVuY2VTY2hlbWEgfSwgcmVxdWlyZWQ6IFsncmVmZXJlbmNlJ10gfSxcbiAgICAgICAgeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyBkZWZpbml0aW9uOiB7IHR5cGU6ICdzdHJpbmcnIH0gfSwgcmVxdWlyZWQ6IFsnZGVmaW5pdGlvbiddIH0sIFxuICAgICAgICBcIkdFVFwiLCAgWydjb2RlJywgJ3R5cGVzY3JpcHQnLCAnaW5zcGVjdGlvbicsICdkZWZpbml0aW9uJywgJ2NsYXNzJywgJ2luZm8nLCAnbWV0YScsICdpbnN0YW5jZScsICdub2RlJywgJ2NvbXBvbmVudCcsICdhc3NldCcsICdkYXRhJ11cbiAgICApXG4gICAgYXN5bmMgaW5zcGVjdG9yR2V0SW5zdGFuY2VEZWZpbml0aW9uKHBhcmFtczogeyByZWZlcmVuY2U6IElJbnN0YW5jZVJlZmVyZW5jZSB9KTogUHJvbWlzZTx7IGRlZmluaXRpb246IHN0cmluZyB9PiB7XG4gICAgICAgIHRoaXMuX2RlZmluaXRpb25zID0gW107XG4gICAgICAgIHRoaXMuX2RlZmluZWROYW1lcy5jbGVhcigpO1xuXG4gICAgICAgIGxldCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHBhcmFtcy5yZWZlcmVuY2UuaWQ7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlSW5mbyA9IGF3YWl0IFRvb2xzVXRpbHMuaW5zcGVjdEluc3RhbmNlKHBhcmFtcy5yZWZlcmVuY2UuaWQpO1xuICAgICAgICBpZiAoaW5zdGFuY2VJbmZvKSB7XG4gICAgICAgICAgICBjbGFzc05hbWUgPSBpbnN0YW5jZUluZm8udHlwZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZUluZm8uYXNzZXRJbmZvKSB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lICs9ICdJbXBvcnRlcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VJbmZvLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMgPSBpbnN0YW5jZUluZm8ucHJvcHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDbGFzcyhjbGFzc05hbWUsIHByb3BzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xhc3MsIEluc3RhbmNlIG9yIHNwZWNpYWwga2V5d29yZCBub3QgZm91bmQ6ICcke3BhcmFtcy5yZWZlcmVuY2UuaWR9Jy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGRlZmluaXRpb246IHRoaXMuX2RlZmluaXRpb25zLmpvaW4oJ1xcbicpIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3ZpZGVkUHJvcHM/OiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9LCBleHRlbmRzQ2xhc3M/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZmluZWROYW1lcy5oYXMoY2xhc3NOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGVmaW5lZE5hbWVzLmFkZChjbGFzc05hbWUpO1xuXG4gICAgICAgIGlmICghcHJvdmlkZWRQcm9wcykgcmV0dXJuO1xuXG4gICAgICAgIC8vIERvbid0IGxldCBBSSBtZXNzIG91dCB3aXRoIFVVSURcbiAgICAgICAgaWYgKCd1dWlkJyBpbiBwcm92aWRlZFByb3BzICYmIHRoaXMuaXNQcm9wZXJ0eShwcm92aWRlZFByb3BzLnV1aWQpKSB7XG4gICAgICAgICAgICBwcm92aWRlZFByb3BzLnV1aWQucmVhZG9ubHkgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29sbGVjdCBmaWVsZHMgZmlyc3QgdG8gcG90ZW50aWFsbHkgaG9pc3QgbmVzdGVkIGRlZmluaXRpb25zXG4gICAgICAgIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKHByb3ZpZGVkUHJvcHMpKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wID0gcHJvdmlkZWRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgcHJpbWl0aXZlIHByb3BlcnRpZXMgd2hpY2ggY2FuJ3QgYmUgaW5zcGVjdGVkIG9yIGludmlzaWJsZSBvbmVzXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgfHwgXG4gICAgICAgICAgICAgICAgKHRoaXMuaXNQcm9wZXJ0eShwcm9wKSAmJiAndmlzaWJsZScgaW4gcHJvcCAmJiAhcHJvcC52aXNpYmxlKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIElQcm9wZXJ0eSBIYW5kbGluZyAoQ29tcGxleCB0eXBlcywgTWV0YWRhdGEpXG4gICAgICAgICAgICBpZiAodGhpcy5pc1Byb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHByb3AgYXMgSVByb3BlcnR5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvclBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQXJyYXkgPSAhIXAuaXNBcnJheTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgaXRlbSBkZWZpbml0aW9uIGZvciBBcnJheXNcbiAgICAgICAgICAgICAgICBsZXQgaXRlbURlZjogYW55ID0gcDtcbiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocC5lbGVtZW50VHlwZURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1EZWYgPSBwLmVsZW1lbnRUeXBlRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHAudmFsdWUpICYmIHAudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBpbmZlciBmcm9tIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtRGVmID0gcC52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbm5vdCBpbmZlciBzdHJ1Y3R1cmUgZm9yIGVtcHR5IGFycmF5IHdpdGhvdXQgc2NoZW1hXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBiYXNpYyB0eXBlIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtRGVmID0gbnVsbDsgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQW5hbHl6ZSBJZGVudGl0eSAoYmFzZWQgb24gaXRlbURlZiBpZiBhcnJheSwgb3IgcCBpZiBzaW5nbGUpXG4gICAgICAgICAgICAgICAgY29uc3QgZGVmVG9BbmFseXplID0gaXRlbURlZiB8fCBwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1FeHRlbmRzID0gZGVmVG9BbmFseXplLmV4dGVuZHMgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgcmF3VHlwZSA9IGRlZlRvQW5hbHl6ZS50eXBlIHx8ICdhbnknO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGlzVmFsdWVUeXBlID0gaXRlbUV4dGVuZHMuaW5jbHVkZXMoJ2NjLlZhbHVlVHlwZScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVmZXJlbmNlID0gaXRlbUV4dGVuZHMuaW5jbHVkZXMoJ2NjLk9iamVjdCcpIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFpc1ZhbHVlVHlwZSAmJiAocmF3VHlwZSA9PT0gJ05vZGUnIHx8IHJhd1R5cGUgPT09ICdDb21wb25lbnQnIHx8IHJhd1R5cGUgPT09ICdjYy5Ob2RlJyB8fCByYXdUeXBlID09PSAnY2MuQ29tcG9uZW50JykpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCB0c1R5cGUgPSB0aGlzLnJlc29sdmVUc1R5cGUocmF3VHlwZSkucmVwbGFjZSgvXmNjXFwuLywgJycpO1xuXG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBFbnVtL0JpdE1hc2tcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRMaXN0ID0gZGVmVG9BbmFseXplLmVudW1MaXN0IHx8IGRlZlRvQW5hbHl6ZS5iaXRtYXNrTGlzdDtcbiAgICAgICAgICAgICAgICBpZiAoKHJhd1R5cGUgPT09ICdFbnVtJyB8fCByYXdUeXBlID09PSAnQml0TWFzaycpICYmIHRhcmdldExpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuQ2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoL15jY1xcLi8sICcnKS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csICdfJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgIGlmIChwLmRpc3BsYXlOYW1lICYmIHR5cGVvZiBwLmRpc3BsYXlOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuZGlzcGxheU5hbWUuc3RhcnRzV2l0aCgnaTE4bjonKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmRpc3BsYXlOYW1lID0gRWRpdG9yLkkxOG4udChwLmRpc3BsYXlOYW1lLnNsaWNlKDUpKTsgLy8gUmVtb3ZlICdpMThuOicgcHJlZml4XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5kaXNwbGF5TmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5kaXNwbGF5TmFtZSA9IHByb3BOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAuZGlzcGxheU5hbWUgPSBwcm9wTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHByb3BOYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBsZXQgZW51bU5hbWUgPSBgJHtjbGVhbkNsYXNzTmFtZX0ke3AuZGlzcGxheU5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnJyl9JHtyYXdUeXBlfWA7XG5cbiAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZUb0FuYWx5emUudXNlckRhdGEgJiYgdHlwZW9mIGRlZlRvQW5hbHl6ZS51c2VyRGF0YSA9PT0gJ29iamVjdCcgJiYgJ2VudW1OYW1lJyBpbiBkZWZUb0FuYWx5emUudXNlckRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTmFtZSA9IGRlZlRvQW5hbHl6ZS51c2VyRGF0YVsnZW51bU5hbWUnXTtcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUVudW1EZWZpbml0aW9uKGVudW1OYW1lLCB0YXJnZXRMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgIHRzVHlwZSA9IGVudW1OYW1lO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBTdHJ1Y3Qgb3IgU3RhbmRhcmQgVHlwZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWN1cnNpb246IE9ubHkgcmVjdXJzZSBpZiB3ZSBoYXZlIGEgdmFsaWQgaXRlbSBkZWZpbml0aW9uIChpdGVtRGVmKVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBpc0FycmF5IGlzIHRydWUgYnV0IGl0ZW1EZWYgaXMgdW5kZWZpbmVkLCB3ZSBza2lwIHJlY3Vyc2lvbiAodHJlYXQgYXMgQXJyYXk8YW55PiBvciBBcnJheTxwLnR5cGU+KVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbURlZiAmJiAhaXNSZWZlcmVuY2UgJiYgIWlzVmFsdWVUeXBlICYmICF0aGlzLmlzUHJpbWl0aXZlVHlwZShyYXdUeXBlKSAmJiBpdGVtRGVmLnZhbHVlICYmIHR5cGVvZiBpdGVtRGVmLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXN0ZWROYW1lID0gdHNUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmVzdGVkTmFtZSB8fCBuZXN0ZWROYW1lID09PSAnT2JqZWN0JyB8fCBuZXN0ZWROYW1lID09PSAnYW55Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWZmaXggPSBpc0FycmF5ID8gJ0l0ZW0nIDogJ1R5cGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWROYW1lID0gYCR7Y2xhc3NOYW1lfSR7cHJvcE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wTmFtZS5zbGljZSgxKX0ke3N1ZmZpeH1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlbmRzRm9yTmVzdGVkID0gaXRlbURlZi5leHRlbmRzICYmIGl0ZW1EZWYuZXh0ZW5kcy5sZW5ndGggPiAwID8gaXRlbURlZi5leHRlbmRzWzBdLnJlcGxhY2UoL15jY1xcLi8sICcnKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDbGFzcyhuZXN0ZWROYW1lLCBpdGVtRGVmLnZhbHVlIGFzIGFueSwgZXh0ZW5kc0Zvck5lc3RlZCAhPT0gbmVzdGVkTmFtZSA/IGV4dGVuZHNGb3JOZXN0ZWQgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHRzVHlwZSA9IG5lc3RlZE5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gV3JhcCByZWZlcmVuY2UgdHlwZVxuICAgICAgICAgICAgICAgIGlmIChpc1JlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHNUeXBlID09PSAnYW55JykgdHNUeXBlID0gJ09iamVjdCc7XG4gICAgICAgICAgICAgICAgICAgIHRzVHlwZSA9IGBJbnN0YW5jZVJlZmVyZW5jZTwke3RzVHlwZX0+YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gV3JhcCBhcnJheSB0eXBlXG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgIHRzVHlwZSA9IGBBcnJheTwke3RzVHlwZX0+YDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBEZWNvcmF0b3JzICYgQXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIGxldCBkZWNvcmF0b3JUeXBlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIFZhbHVhYmxlIHR5cGVzIGZvciBkZWNvcmF0b3JzIGlzIG9ubHkgQ0NJbnRlZ2VyIGFuZCBDQ0Zsb2F0XG4gICAgICAgICAgICAgICAgaWYgKHAudHlwZSA9PT0gJ0ludGVnZXInKSBkZWNvcmF0b3JUeXBlID0gJ0NDSW50ZWdlcic7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocC50eXBlID09PSAnRmxvYXQnIHx8IHAudHlwZSA9PT0gJ051bWJlcicpIGRlY29yYXRvclR5cGUgPSAnQ0NGbG9hdCc7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgIGRlY29yYXRvclBhcnRzLnB1c2goaXNBcnJheSA/IGB0eXBlOiBbJHtkZWNvcmF0b3JUeXBlfV1gIDogYHR5cGU6ICR7ZGVjb3JhdG9yVHlwZX1gKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGhlbHAgQUkgZ2V0IG1vcmUgY29udGV4dFxuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJzID0gWydtaW4nLCAnbWF4JywgJ3N0ZXAnLCAndW5pdCcsICdyYWRpYW4nLCAnbXVsdGlsaW5lJ107XG4gICAgICAgICAgICAgICAgYXR0cnMuZm9yRWFjaChhdHRyID0+IHsgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChwIGFzIGFueSlbYXR0cl07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwpIGRlY29yYXRvclBhcnRzLnB1c2goYCR7YXR0cn06ICR7dmFsfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHAudG9vbHRpcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG9vbHRpcCA9IHAudG9vbHRpcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2x0aXAuc3RhcnRzV2l0aCgnaTE4bjonKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCA9IEVkaXRvci5JMThuLnQodG9vbHRpcC5zbGljZSg1KSk7IC8vIFJlbW92ZSAnaTE4bjonIHByZWZpeFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAodG9vbHRpcC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2x0aXAubWF0Y2goLzxiclxccypcXC8/Pi9pKSB8fCB0b29sdGlwLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gdG9vbHRpcC5zcGxpdCgvPGJyXFxzKlxcLz8+fFxcbi9pKS5tYXAobCA9PiBsLnRyaW0oKSkuZmlsdGVyKGwgPT4gbC5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChgXFx0LyoqYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmZvckVhY2gobGluZSA9PiBmaWVsZHMucHVzaChgXFx0ICogJHtsaW5lfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLnB1c2goYFxcdCAqL2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLnB1c2goYFxcdC8qKiAke3Rvb2x0aXB9ICovYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChgXFx0QHByb3BlcnR5KHsgJHtkZWNvcmF0b3JQYXJ0cy5qb2luKCcsICcpfSB9KWApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9ICEhcC5yZWFkb25seSA/ICdyZWFkb25seSAnIDogJyc7XG4gICAgICAgICAgICAgICAgZmllbGRzLnB1c2goYFxcdCR7cHJlZml4fSR7cHJvcE5hbWV9OiAke3RzVHlwZX07YCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJhdyBWYWx1ZSBIYW5kbGluZyAoUHJpbWl0aXZlcyBhbmQgc2ltcGxlIG9iamVjdHMpXG4gICAgICAgICAgICBpZiAodGhpcy5pc1ByaW1pdGl2ZShwcm9wKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGBcXHQke3Byb3BOYW1lfTogJHt0eXBlb2YgcHJvcH07YCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFycmF5IEhhbmRsaW5nXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChgXFx0JHtwcm9wTmFtZX06IEFycmF5PGFueT47YCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RJdGVtID0gcHJvcFswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQcmltaXRpdmUoZmlyc3RJdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGBcXHQke3Byb3BOYW1lfTogQXJyYXk8JHt0eXBlb2YgZmlyc3RJdGVtfT47YCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0SXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYXcgb2JqZWN0IGluIGFycmF5IC0+IFJlY3Vyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENsYXNzTmFtZSA9IGAke2NsYXNzTmFtZX0ke3Byb3BOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcE5hbWUuc2xpY2UoMSl9SXRlbWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3MobmVzdGVkQ2xhc3NOYW1lLCBmaXJzdEl0ZW0gYXMgdW5rbm93biBhcyB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChgXFx0JHtwcm9wTmFtZX06IEFycmF5PCR7bmVzdGVkQ2xhc3NOYW1lfT47YCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLnB1c2goYFxcdCR7cHJvcE5hbWV9OiBBcnJheTxhbnk+O2ApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRmFsbGJhY2sgZm9yIHJhdyBvYmplY3QgKHN0cnVjdClcbiAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xlYW5DbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgvXmNjXFwuLywgJycpLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywgJ18nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDbGFzc05hbWUgPSBgJHtjbGVhbkNsYXNzTmFtZX0ke3Byb3BOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcE5hbWUuc2xpY2UoMSl9VHlwZWA7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3MobmVzdGVkQ2xhc3NOYW1lLCBwcm9wIGFzIHVua25vd24gYXMgeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSk7ICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChgXFx0JHtwcm9wTmFtZX06ICR7bmVzdGVkQ2xhc3NOYW1lfTtgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNob3J0TmFtZSA9IGNsYXNzTmFtZS5pbmNsdWRlcygnLicpID8gY2xhc3NOYW1lLnNwbGl0KCcuJykucG9wKCkhIDogY2xhc3NOYW1lO1xuICAgICAgICBjb25zdCBjbGFzc0RlZiA9IFtcbiAgICAgICAgICAgIGBleHBvcnQgY2xhc3MgJHtzaG9ydE5hbWV9ICR7ZXh0ZW5kc0NsYXNzID8gYGV4dGVuZHMgJHtleHRlbmRzQ2xhc3N9YCA6ICcnfSB7YCxcbiAgICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICAgIGB9YFxuICAgICAgICBdLmpvaW4oJ1xcbicpO1xuXG4gICAgICAgIHRoaXMuX2RlZmluaXRpb25zLnB1c2goY2xhc3NEZWYpO1xuICAgIH1cblxuICAgIC8vIFR5cGUgR3VhcmQgZm9yIElQcm9wZXJ0eVxuICAgIHByaXZhdGUgaXNQcm9wZXJ0eSh2YWw6IGFueSk6IHZhbCBpcyBJUHJvcGVydHkge1xuICAgICAgICAgcmV0dXJuIHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAndmFsdWUnIGluIHZhbDtcbiAgICB9XG5cbiAgICAvLyBCYXNlZCBvbiBpbmZvIGZyb20gQ0NDbGFzc1xuICAgIHByaXZhdGUgaXNQcmltaXRpdmVUeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gWydJbnRlZ2VyJywgJ0Zsb2F0JywgJ051bWJlcicsICdTdHJpbmcnLCAnQm9vbGVhbiddLmluY2x1ZGVzKHR5cGUpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZVxuICAgIHByaXZhdGUgaXNQcmltaXRpdmUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIEhlbHBlciBmb3IgRW51bSBvciBCaXRNYXNrIGdlbmVyYXRpb25cbiAgICBwcml2YXRlIGdlbmVyYXRlRW51bURlZmluaXRpb24obmFtZTogc3RyaW5nLCBpdGVtczogYW55W10pIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZmluZWROYW1lcy5oYXMobmFtZSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZGVmaW5lZE5hbWVzLmFkZChuYW1lKTtcblxuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGluZXMucHVzaChgZXhwb3J0IGVudW0gJHtuYW1lfSB7YCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGxldCBjbGVhbk5hbWUgPSBpdGVtLm5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnXycpO1xuICAgICAgICAgICAgaWYgKC9eWzAtOV0vLnRlc3QoY2xlYW5OYW1lKSkge1xuICAgICAgICAgICAgICAgIGNsZWFuTmFtZSA9IGBfJHtjbGVhbk5hbWV9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goYFxcdCR7Y2xlYW5OYW1lfSA9ICcke2l0ZW0udmFsdWV9JyxgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChgXFx0JHtjbGVhbk5hbWV9ID0gJHtpdGVtLnZhbHVlfSxgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxpbmVzLnB1c2goYH1gKTtcbiAgICAgICAgdGhpcy5fZGVmaW5pdGlvbnMudW5zaGlmdChsaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIFxuICAgIHByaXZhdGUgcmVzb2x2ZVRzVHlwZSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0ludGVnZXInOlxuICAgICAgICAgICAgY2FzZSAnRmxvYXQnOlxuICAgICAgICAgICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgICAgICAgIGNhc2UgJ0VudW0nOiAvLyBFbnVtcyBoYW5kbGVkIHNwZWNpZmljYWxseSwgYnV0IGZhbGxiYWNrIGZvciBzYWZldHlcbiAgICAgICAgICAgIGNhc2UgJ0JpdE1hc2snOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICAgICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7IC8vIGUuZy4gVmVjMywgQ29sb3IsIE5vZGVcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utcp-server.js b/extensions/cocos-code-mode/dist/utcp/utcp-server.js new file mode 100644 index 0000000..bcd5e9a --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utcp-server.js @@ -0,0 +1,129 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UtcpServerManager = void 0; +const express_1 = __importDefault(require("express")); +const cors_1 = __importDefault(require("cors")); +const decorators_1 = require("./decorators"); +require("./tools/typescript-defenition"); +require("./tools/get-properties-tool"); +require("./tools/set-property-tool"); +require("./tools/asset-tools"); +require("./tools/component-tools"); +require("./tools/scene-tools"); +require("./tools/editor-tools"); +const asset_importers_1 = require("./utils/asset-importers"); +const qs_1 = require("qs"); +class UtcpServerManager { + constructor() { + this.app = (0, express_1.default)(); + (0, asset_importers_1.registerAllImporters)(); + } + async start(port = 3000) { + this.app.use((0, cors_1.default)()); + this.app.use(express_1.default.json()); + this.app.set("query parser", (queryString) => (0, qs_1.parse)(queryString, { + decoder(value, defaultDecoder, charset, type) { + const decoded = defaultDecoder(value); + if (decoded === "true") + return true; + if (decoded === "false") + return false; + if (typeof decoded === "string" && + decoded !== "" && + !Number.isNaN(Number(decoded))) { + return Number(decoded); + } + if (decoded === "__null__") + return null; + return decoded; + } + })); + const tools = decorators_1.ToolRegistry.getTools(); + const toolInstances = new Map(); + const utcpTools = []; + let currentPort = port; + // Let's listen first to get the port if it's 0 + return new Promise((resolve, reject) => { + this.server = this.app.listen(port, "127.0.0.1", () => { + const addr = this.server.address(); + if (addr && typeof addr === 'object') { + currentPort = addr.port; + } + // Now register tools with the correct port + this.registerTools(currentPort, tools, toolInstances, utcpTools); + resolve(currentPort); + }); + this.server.on('error', (err) => { + reject(err); + }); + }); + } + registerTools(port, tools, toolInstances, utcpTools) { + const baseUrl = `http://localhost:${port}`; + // Initialize tool instances and build UTCP definitions + for (const toolMeta of tools) { + const ToolClass = toolMeta.target.constructor; + let instance = toolInstances.get(ToolClass); + if (!instance) { + instance = new ToolClass(); + toolInstances.set(ToolClass, instance); + } + const toolDef = JSON.parse(JSON.stringify(toolMeta.tool)); + const toolUrlPath = toolDef.tool_call_template.url; + toolDef.tool_call_template.url = `${baseUrl}${toolUrlPath}`; + utcpTools.push(toolDef); + // Register specific endpoint + const handler = async (req, res) => { + try { + const args = req.query; + let result = await toolMeta.method.apply(instance, [args]); + if (result === undefined || result === null) { + res.json(null); + return; + } + res.json(result); + } + catch (err) { + console.error(`Error in tool ${toolDef.name}:`, err); + res.status(500).json({ error: err.message }); + } + }; + switch (toolDef.tool_call_template.http_method) { + case 'POST': + this.app.post(toolUrlPath, handler); + break; + case 'GET': + this.app.get(toolUrlPath, handler); + break; + case 'DELETE': + this.app.delete(toolUrlPath, handler); + break; + case 'PUT': + this.app.put(toolUrlPath, handler); + break; + default: + // throw new Error(`Unsupported HTTP method: ${toolDef.tool_call_template.http_method}`); + } + } + // Serve UTCP Manual + this.app.get('/utcp', (req, res) => { + const manual = { + utcp_version: "1.0.1", + manual_version: "1.0.0", + tools: utcpTools + }; + res.json(manual); + }); + } + stop() { + if (this.server) { + this.server.close(); + console.log("UTCP Server stopped"); + } + } +} +exports.UtcpServerManager = UtcpServerManager; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRjcC1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvdXRjcC91dGNwLXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBcUQ7QUFDckQsZ0RBQXdCO0FBQ3hCLDZDQUE0QztBQUM1Qyx5Q0FBdUM7QUFDdkMsdUNBQXFDO0FBQ3JDLHFDQUFtQztBQUNuQywrQkFBNkI7QUFDN0IsbUNBQWlDO0FBQ2pDLCtCQUE2QjtBQUM3QixnQ0FBOEI7QUFDOUIsNkRBQStEO0FBRS9ELDJCQUEyQjtBQUUzQixNQUFhLGlCQUFpQjtJQUkxQjtRQUNJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBQSxpQkFBTyxHQUFFLENBQUM7UUFDckIsSUFBQSxzQ0FBb0IsR0FBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQWUsSUFBSTtRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFBLGNBQUksR0FBRSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLFdBQW1CLEVBQUUsRUFBRSxDQUNqRCxJQUFBLFVBQUssRUFBQyxXQUFXLEVBQUU7WUFDZixPQUFPLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSTtnQkFDeEMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUV0QyxJQUFJLE9BQU8sS0FBSyxNQUFNO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNwQyxJQUFJLE9BQU8sS0FBSyxPQUFPO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUV0QyxJQUNJLE9BQU8sT0FBTyxLQUFLLFFBQVE7b0JBQzNCLE9BQU8sS0FBSyxFQUFF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RyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDL0IsTUFBTSxNQUFNLEdBQWU7Z0JBQ3ZCLFlBQVksRUFBRSxPQUFPO2dCQUNyQixjQUFjLEVBQUUsT0FBTztnQkFDdkIsS0FBSyxFQUFFLFNBQVM7YUFDbkIsQ0FBQztZQUNGLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSTtRQUNBLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNMLENBQUM7Q0FDSjtBQXRJRCw4Q0FzSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXhwcmVzcywgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGNvcnMgZnJvbSAnY29ycyc7XG5pbXBvcnQgeyBUb29sUmVnaXN0cnkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0ICcuL3Rvb2xzL3R5cGVzY3JpcHQtZGVmZW5pdGlvbic7XG5pbXBvcnQgJy4vdG9vbHMvZ2V0LXByb3BlcnRpZXMtdG9vbCc7XG5pbXBvcnQgJy4vdG9vbHMvc2V0LXByb3BlcnR5LXRvb2wnO1xuaW1wb3J0ICcuL3Rvb2xzL2Fzc2V0LXRvb2xzJztcbmltcG9ydCAnLi90b29scy9jb21wb25lbnQtdG9vbHMnO1xuaW1wb3J0ICcuL3Rvb2xzL3NjZW5lLXRvb2xzJztcbmltcG9ydCAnLi90b29scy9lZGl0b3ItdG9vbHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBbGxJbXBvcnRlcnMgfSBmcm9tICcuL3V0aWxzL2Fzc2V0LWltcG9ydGVycyc7XG5pbXBvcnQgeyBUb29sLCBVdGNwTWFudWFsIH0gZnJvbSAnQHV0Y3Avc2RrJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAncXMnO1xuXG5leHBvcnQgY2xhc3MgVXRjcFNlcnZlck1hbmFnZXIge1xuICAgIHByaXZhdGUgYXBwOiBleHByZXNzLkFwcGxpY2F0aW9uO1xuICAgIHByaXZhdGUgc2VydmVyOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hcHAgPSBleHByZXNzKCk7XG4gICAgICAgIHJlZ2lzdGVyQWxsSW1wb3J0ZXJzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3RhcnQocG9ydDogbnVtYmVyID0gMzAwMCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHRoaXMuYXBwLnVzZShjb3JzKCkpO1xuICAgICAgICB0aGlzLmFwcC51c2UoZXhwcmVzcy5qc29uKCkpO1xuICAgICAgICB0aGlzLmFwcC5zZXQoXCJxdWVyeSBwYXJzZXJcIiwgKHF1ZXJ5U3RyaW5nOiBzdHJpbmcpID0+XG4gICAgICAgICAgICBwYXJzZShxdWVyeVN0cmluZywge1xuICAgICAgICAgICAgICAgIGRlY29kZXIodmFsdWUsIGRlZmF1bHREZWNvZGVyLCBjaGFyc2V0LCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWZhdWx0RGVjb2Rlcih2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZWQgPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZWQgPT09IFwiZmFsc2VcIikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkZWNvZGVkID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkICE9PSBcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhTnVtYmVyLmlzTmFOKE51bWJlcihkZWNvZGVkKSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKGRlY29kZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZWQgPT09IFwiX19udWxsX19cIikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0b29scyA9IFRvb2xSZWdpc3RyeS5nZXRUb29scygpO1xuICAgICAgICBjb25zdCB0b29sSW5zdGFuY2VzID0gbmV3IE1hcDxGdW5jdGlvbiwgYW55PigpO1xuICAgICAgICBjb25zdCB1dGNwVG9vbHM6IFRvb2xbXSA9IFtdO1xuXG4gICAgICAgIGxldCBjdXJyZW50UG9ydCA9IHBvcnQ7XG5cbiAgICAgICAgLy8gTGV0J3MgbGlzdGVuIGZpcnN0IHRvIGdldCB0aGUgcG9ydCBpZiBpdCdzIDBcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyID0gdGhpcy5hcHAubGlzdGVuKHBvcnQsIFwiMTI3LjAuMC4xXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRyID0gdGhpcy5zZXJ2ZXIuYWRkcmVzcygpO1xuICAgICAgICAgICAgICAgIGlmIChhZGRyICYmIHR5cGVvZiBhZGRyID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9ydCA9IGFkZHIucG9ydDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOb3cgcmVnaXN0ZXIgdG9vbHMgd2l0aCB0aGUgY29ycmVjdCBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlclRvb2xzKGN1cnJlbnRQb3J0LCB0b29scywgdG9vbEluc3RhbmNlcywgdXRjcFRvb2xzKTtcblxuICAgICAgICAgICAgICAgIHJlc29sdmUoY3VycmVudFBvcnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5vbignZXJyb3InLCAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyVG9vbHMocG9ydDogbnVtYmVyLCB0b29sczogYW55W10sIHRvb2xJbnN0YW5jZXM6IE1hcDxGdW5jdGlvbiwgYW55PiwgdXRjcFRvb2xzOiBUb29sW10pIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdG9vbCBpbnN0YW5jZXMgYW5kIGJ1aWxkIFVUQ1AgZGVmaW5pdGlvbnNcbiAgICAgICAgZm9yIChjb25zdCB0b29sTWV0YSBvZiB0b29scykge1xuICAgICAgICAgICAgY29uc3QgVG9vbENsYXNzID0gdG9vbE1ldGEudGFyZ2V0LmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gdG9vbEluc3RhbmNlcy5nZXQoVG9vbENsYXNzKTtcbiAgICAgICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBUb29sQ2xhc3MoKTtcbiAgICAgICAgICAgICAgICB0b29sSW5zdGFuY2VzLnNldChUb29sQ2xhc3MsIGluc3RhbmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdG9vbERlZiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodG9vbE1ldGEudG9vbCkpO1xuICAgICAgICAgICAgY29uc3QgdG9vbFVybFBhdGggPSB0b29sRGVmLnRvb2xfY2FsbF90ZW1wbGF0ZS51cmw7XG5cbiAgICAgICAgICAgIHRvb2xEZWYudG9vbF9jYWxsX3RlbXBsYXRlLnVybCA9IGAke2Jhc2VVcmx9JHt0b29sVXJsUGF0aH1gO1xuXG4gICAgICAgICAgICB1dGNwVG9vbHMucHVzaCh0b29sRGVmKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgc3BlY2lmaWMgZW5kcG9pbnRcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IHJlcS5xdWVyeTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdG9vbE1ldGEubWV0aG9kLmFwcGx5KGluc3RhbmNlLCBbYXJnc10pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5qc29uKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcblxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluIHRvb2wgJHt0b29sRGVmLm5hbWV9OmAsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHN3aXRjaCAodG9vbERlZi50b29sX2NhbGxfdGVtcGxhdGUuaHR0cF9tZXRob2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdQT1NUJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAucG9zdCh0b29sVXJsUGF0aCwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0dFVCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLmdldCh0b29sVXJsUGF0aCwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0RFTEVURSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLmRlbGV0ZSh0b29sVXJsUGF0aCwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1BVVCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnB1dCh0b29sVXJsUGF0aCwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBIVFRQIG1ldGhvZDogJHt0b29sRGVmLnRvb2xfY2FsbF90ZW1wbGF0ZS5odHRwX21ldGhvZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlcnZlIFVUQ1AgTWFudWFsXG4gICAgICAgIHRoaXMuYXBwLmdldCgnL3V0Y3AnLCAocmVxLCByZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hbnVhbDogVXRjcE1hbnVhbCA9IHtcbiAgICAgICAgICAgICAgICB1dGNwX3ZlcnNpb246IFwiMS4wLjFcIixcbiAgICAgICAgICAgICAgICBtYW51YWxfdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgICAgICAgICAgICAgIHRvb2xzOiB1dGNwVG9vbHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMuanNvbihtYW51YWwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5zZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmNsb3NlKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVUQ1AgU2VydmVyIHN0b3BwZWRcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/auto-atlas-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/auto-atlas-importer.js new file mode 100644 index 0000000..a7c368b --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/auto-atlas-importer.js @@ -0,0 +1,98 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AutoAtlasImporter = void 0; +const base_importer_1 = require("./base-importer"); +const texture_importer_1 = require("./texture-importer"); +class AutoAtlasImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'auto-atlas'; + this.textureImporter = new texture_importer_1.TextureImporter(); + } + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta || !meta.userData) + return false; + const userData = meta.userData; + let handled = false; + if (path.includes('.')) { + const parts = path.split('.'); + let current = userData; + for (let i = 0; i < parts.length - 1; i++) { + if (!current[parts[i]]) + return false; + current = current[parts[i]]; + } + if (current) { + current[parts[parts.length - 1]] = value; + handled = true; + } + } + else { + userData[path] = value; + handled = true; + } + if (handled) { + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + return false; + } + async getProperties(assetInfo) { + const assetMeta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!assetMeta) { + throw new Error(`Asset meta not found for ${assetInfo.uuid}`); + } + const userData = assetMeta.userData; + if (!userData) { + throw new Error(`UserData not found for asset ${assetInfo.uuid}`); + } + return this.parseUserData(userData); + } + parseUserData(userData) { + const propertyContainer = {}; + // Atlas Settings + propertyContainer.maxWidth = { value: userData.maxWidth, type: 'Integer', displayName: 'Max Width' }; + propertyContainer.maxHeight = { value: userData.maxHeight, type: 'Integer', displayName: 'Max Height' }; + propertyContainer.padding = { value: userData.padding, type: 'Integer', displayName: 'Padding' }; + propertyContainer.allowRotation = { value: !!userData.allowRotation, type: 'Boolean', displayName: 'Allow Rotation' }; + propertyContainer.forceSquared = { value: !!userData.forceSquared, type: 'Boolean', displayName: 'Force Squared' }; + propertyContainer.powerOfTwo = { value: !!userData.powerOfTwo, type: 'Boolean', displayName: 'Power of Two' }; + propertyContainer.algorithm = { + value: userData.algorithm, + type: 'Enum', + enumList: [ + { name: 'MaxRects', value: 'MaxRects' }, + { name: 'Basic', value: 'Basic' } + ], + displayName: 'Algorithm' + }; + propertyContainer.format = { + value: userData.format, + type: 'Enum', + enumList: [ + { name: 'png', value: 'png' }, + { name: 'jpg', value: 'jpg' }, + { name: 'webp', value: 'webp' } + ], + displayName: 'Format' + }; + propertyContainer.quality = { + value: userData.quality, + type: 'Number', + displayName: 'Quality', + visible: userData.format === 'jpg' + }; + propertyContainer.contourBleed = { value: !!userData.contourBleed, type: 'Boolean', displayName: 'Contour Bleed' }; + propertyContainer.paddingBleed = { value: !!userData.paddingBleed, type: 'Boolean', displayName: 'Padding Bleed' }; + propertyContainer.filterUnused = { value: !!userData.filterUnused, type: 'Boolean', displayName: 'Filter Unused Resources' }; + // Texture Settings + if (userData.textureSetting) { + const textureProps = this.textureImporter.parseUserData(userData.textureSetting); + Object.assign(propertyContainer, textureProps); + } + return propertyContainer; + } +} +exports.AutoAtlasImporter = AutoAtlasImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1hdGxhcy1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy9hdXRvLWF0bGFzLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFvRDtBQUVwRCx5REFBcUQ7QUFHckQsTUFBYSxpQkFBa0IsU0FBUSxpQ0FBaUI7SUFBeEQ7O1FBQ0ksU0FBSSxHQUFHLFlBQVksQ0FBQztRQUNaLG9CQUFlLEdBQUcsSUFBSSxrQ0FBZSxFQUFFLENBQUM7SUFrR3BELENBQUM7SUFoR0csS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFxQixFQUFFLElBQVksRUFBRSxLQUFVO1FBQzdELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQztZQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQUUsT0FBTyxLQUFL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RUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUUsQ0FBQztRQUU3SCxtQkFBbUI7UUFDbkIsSUFBSSxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELE9BQU8saUJBQWlCLENBQUM7SUFDN0IsQ0FBQztDQUNKO0FBcEdELDhDQW9HQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VBc3NldEltcG9ydGVyIH0gZnJvbSAnLi9iYXNlLWltcG9ydGVyJztcbmltcG9ydCB7IElBc3NldEluZm8gfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvYXNzZXQtZGIvQHR5cGVzL3B1YmxpYyc7XG5pbXBvcnQgeyBUZXh0dXJlSW1wb3J0ZXIgfSBmcm9tICcuL3RleHR1cmUtaW1wb3J0ZXInO1xuaW1wb3J0IHsgSVByb3BlcnR5LCBJUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5cbmV4cG9ydCBjbGFzcyBBdXRvQXRsYXNJbXBvcnRlciBleHRlbmRzIEJhc2VBc3NldEltcG9ydGVyIHtcbiAgICBuYW1lID0gJ2F1dG8tYXRsYXMnO1xuICAgIHByaXZhdGUgdGV4dHVyZUltcG9ydGVyID0gbmV3IFRleHR1cmVJbXBvcnRlcigpO1xuXG4gICAgYXN5bmMgc2V0UHJvcGVydHkoYXNzZXRJbmZvOiBJQXNzZXRJbmZvLCBwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LW1ldGEnLCBhc3NldEluZm8udXVpZCk7XG4gICAgICAgIGlmICghbWV0YSB8fCAhbWV0YS51c2VyRGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSBtZXRhLnVzZXJEYXRhO1xuICAgICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IHVzZXJEYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRbcGFydHNbaV1dKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydHNbaV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50W3BhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXNlckRhdGFbcGF0aF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAnc2F2ZS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQsIEpTT04uc3RyaW5naWZ5KG1ldGEpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKGFzc2V0SW5mbzogSUFzc2V0SW5mbyk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfT4ge1xuICAgICAgICBjb25zdCBhc3NldE1ldGEgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFhc3NldE1ldGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXQgbWV0YSBub3QgZm91bmQgZm9yICR7YXNzZXRJbmZvLnV1aWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1c2VyRGF0YSA9IGFzc2V0TWV0YS51c2VyRGF0YTtcbiAgICAgICAgaWYgKCF1c2VyRGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVc2VyRGF0YSBub3QgZm91bmQgZm9yIGFzc2V0ICR7YXNzZXRJbmZvLnV1aWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVVzZXJEYXRhKHVzZXJEYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlVXNlckRhdGEodXNlckRhdGE6IGFueSk6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUNvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuXG4gICAgICAgIC8vIEF0bGFzIFNldHRpbmdzXG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLm1heFdpZHRoID0geyB2YWx1ZTogdXNlckRhdGEubWF4V2lkdGgsIHR5cGU6ICdJbnRlZ2VyJywgZGlzcGxheU5hbWU6ICdNYXggV2lkdGgnIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLm1heEhlaWdodCA9IHsgdmFsdWU6IHVzZXJEYXRhLm1heEhlaWdodCwgdHlwZTogJ0ludGVnZXInLCBkaXNwbGF5TmFtZTogJ01heCBIZWlnaHQnIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnBhZGRpbmcgPSB7IHZhbHVlOiB1c2VyRGF0YS5wYWRkaW5nLCB0eXBlOiAnSW50ZWdlcicsIGRpc3BsYXlOYW1lOiAnUGFkZGluZycgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuYWxsb3dSb3RhdGlvbiA9IHsgdmFsdWU6ICEhdXNlckRhdGEuYWxsb3dSb3RhdGlvbiwgdHlwZTogJ0Jvb2xlYW4nLCBkaXNwbGF5TmFtZTogJ0FsbG93IFJvdGF0aW9uJyB9O1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5mb3JjZVNxdWFyZWQgPSB7IHZhbHVlOiAhIXVzZXJEYXRhLmZvcmNlU3F1YXJlZCwgdHlwZTogJ0Jvb2xlYW4nLCBkaXNwbGF5TmFtZTogJ0ZvcmNlIFNxdWFyZWQnIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnBvd2VyT2ZUd28gPSB7IHZhbHVlOiAhIXVzZXJEYXRhLnBvd2VyT2ZUd28sIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdQb3dlciBvZiBUd28nIH07XG4gICAgICAgIFxuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5hbGdvcml0aG0gPSB7IFxuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLmFsZ29yaXRobSwgXG4gICAgICAgICAgICB0eXBlOiAnRW51bScsIFxuICAgICAgICAgICAgZW51bUxpc3Q6IFtcbiAgICAgICAgICAgICAgICB7IG5hbWU6ICdNYXhSZWN0cycsIHZhbHVlOiAnTWF4UmVjdHMnIH0sXG4gICAgICAgICAgICAgICAgeyBuYW1lOiAnQmFzaWMnLCB2YWx1ZTogJ0Jhc2ljJyB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdBbGdvcml0aG0nIFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuZm9ybWF0ID0geyBcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5mb3JtYXQsIFxuICAgICAgICAgICAgdHlwZTogJ0VudW0nLCBcbiAgICAgICAgICAgIGVudW1MaXN0OiBbXG4gICAgICAgICAgICAgICAgeyBuYW1lOiAncG5nJywgdmFsdWU6ICdwbmcnIH0sXG4gICAgICAgICAgICAgICAgeyBuYW1lOiAnanBnJywgdmFsdWU6ICdqcGcnIH0sXG4gICAgICAgICAgICAgICAgeyBuYW1lOiAnd2VicCcsIHZhbHVlOiAnd2VicCcgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnRm9ybWF0JyBcbiAgICAgICAgfTtcblxuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5xdWFsaXR5ID0geyBcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5xdWFsaXR5LCBcbiAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLCBcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnUXVhbGl0eScsXG4gICAgICAgICAgICB2aXNpYmxlOiB1c2VyRGF0YS5mb3JtYXQgPT09ICdqcGcnXG4gICAgICAgIH07XG5cbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuY29udG91ckJsZWVkID0geyB2YWx1ZTogISF1c2VyRGF0YS5jb250b3VyQmxlZWQsIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdDb250b3VyIEJsZWVkJyB9O1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5wYWRkaW5nQmxlZWQgPSB7IHZhbHVlOiAhIXVzZXJEYXRhLnBhZGRpbmdCbGVlZCwgdHlwZTogJ0Jvb2xlYW4nLCBkaXNwbGF5TmFtZTogJ1BhZGRpbmcgQmxlZWQnIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmZpbHRlclVudXNlZCA9IHsgdmFsdWU6ICEhdXNlckRhdGEuZmlsdGVyVW51c2VkLCB0eXBlOiAnQm9vbGVhbicsIGRpc3BsYXlOYW1lOiAnRmlsdGVyIFVudXNlZCBSZXNvdXJjZXMnIH07XG5cbiAgICAgICAgLy8gVGV4dHVyZSBTZXR0aW5nc1xuICAgICAgICBpZiAodXNlckRhdGEudGV4dHVyZVNldHRpbmcpIHtcbiAgICAgICAgICAgICBjb25zdCB0ZXh0dXJlUHJvcHMgPSB0aGlzLnRleHR1cmVJbXBvcnRlci5wYXJzZVVzZXJEYXRhKHVzZXJEYXRhLnRleHR1cmVTZXR0aW5nKTtcbiAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnR5Q29udGFpbmVyLCB0ZXh0dXJlUHJvcHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb3BlcnR5Q29udGFpbmVyO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/base-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/base-importer.js new file mode 100644 index 0000000..d737aef --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/base-importer.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BaseAssetImporter = void 0; +class BaseAssetImporter { + get className() { + // Default: Capitalize name + AssetImporter (e.g. image -> ImageAssetImporter) + return this.name.charAt(0).toUpperCase() + this.name.slice(1) + 'AssetImporter'; + } + async setProperty(assetInfo, path, value) { + console.warn(`[BaseAssetImporter] setProperty not implemented for ${this.name}`); + return false; + } +} +exports.BaseAssetImporter = BaseAssetImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy9iYXNlLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZCQSxNQUFzQixpQkFBaUI7SUFHbkMsSUFBSSxTQUFTO1FBQ1QsOEVBQThFO1FBQzlFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO0lBQ3BGLENBQUM7SUFJRCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQXFCLEVBQUUsSUFBWSxFQUFFLEtBQVU7UUFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQyx1REFBdUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakYsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBZEQsOENBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQXNzZXRJbmZvIH0gZnJvbSBcIkBjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9hc3NldC1kYi9AdHlwZXMvcHVibGljXCI7XG5pbXBvcnQgeyBJUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFzc2V0SW1wb3J0ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbXBvcnRlciBuYW1lIHRoaXMgaGFuZGxlciBzdXBwb3J0cyAoZS5nLiAnbWF0ZXJpYWwnLCAndGV4dHVyZScsICd0eXBlc2NyaXB0JylcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgXCJGYWtlXCIgQ2xhc3MgTmFtZSBmb3IgdGhpcyBpbXBvcnRlciAoZS5nLiAnTWF0ZXJpYWxBc3NldEltcG9ydGVyJylcbiAgICAgKi9cbiAgICBjbGFzc05hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFjdHVhbCBwcm9wZXJ0aWVzIG9mIHRoZSBhc3NldCwgY29uZm9ybWluZyB0byB0aGUgZGVmaW5pdGlvblxuICAgICAqIEBwYXJhbSBhc3NldEluZm8gVGhlIGFzc2V0IGluZm8gb2JqZWN0IGZyb20gYXNzZXQtZGJcbiAgICAgKi9cbiAgICBnZXRQcm9wZXJ0aWVzKGFzc2V0SW5mbzogSUFzc2V0SW5mbyk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfT47XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgcHJvcGVydHkgb24gdGhlIGFzc2V0XG4gICAgICogQHBhcmFtIGFzc2V0SW5mbyBUaGUgYXNzZXQgaW5mbyBvYmplY3QgZnJvbSBhc3NldC1kYlxuICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXRcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldFxuICAgICAqL1xuICAgIHNldFByb3BlcnR5KGFzc2V0SW5mbzogSUFzc2V0SW5mbywgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VBc3NldEltcG9ydGVyIGltcGxlbWVudHMgSUFzc2V0SW1wb3J0ZXIge1xuICAgIGFic3RyYWN0IG5hbWU6IHN0cmluZztcbiAgICBcbiAgICBnZXQgY2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIC8vIERlZmF1bHQ6IENhcGl0YWxpemUgbmFtZSArIEFzc2V0SW1wb3J0ZXIgKGUuZy4gaW1hZ2UgLT4gSW1hZ2VBc3NldEltcG9ydGVyKVxuICAgICAgICByZXR1cm4gdGhpcy5uYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5uYW1lLnNsaWNlKDEpICsgJ0Fzc2V0SW1wb3J0ZXInO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGdldFByb3BlcnRpZXMoYXNzZXRJbmZvOiBJQXNzZXRJbmZvKTogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9PjtcblxuICAgIGFzeW5jIHNldFByb3BlcnR5KGFzc2V0SW5mbzogSUFzc2V0SW5mbywgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW0Jhc2VBc3NldEltcG9ydGVyXSBzZXRQcm9wZXJ0eSBub3QgaW1wbGVtZW50ZWQgZm9yICR7dGhpcy5uYW1lfWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/directory-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/directory-importer.js new file mode 100644 index 0000000..43e4be8 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/directory-importer.js @@ -0,0 +1,96 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DirectoryImporter = void 0; +const base_importer_1 = require("./base-importer"); +class DirectoryImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'directory'; + } + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta) + return false; + // Ensure userData exists + if (!meta.userData) + meta.userData = {}; + const userData = meta.userData; + let handled = false; + if (path.includes('.')) { + const parts = path.split('.'); + let current = userData; + for (let i = 0; i < parts.length - 1; i++) { + if (!current[parts[i]]) + current[parts[i]] = {}; // Create object if missing + current = current[parts[i]]; + } + if (current) { + current[parts[parts.length - 1]] = value; + handled = true; + } + } + else { + userData[path] = value; + handled = true; + } + if (handled) { + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + return false; + } + async getProperties(assetInfo) { + const assetMeta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!assetMeta) { + throw new Error(`Asset meta not found for ${assetInfo.uuid}`); + } + const userData = assetMeta.userData; + // Directory might not have userData if it's not a bundle, but let's handle it gracefully + return this.parseUserData(userData || {}); + } + parseUserData(userData) { + const propertyContainer = {}; + propertyContainer.isBundle = { + value: !!userData.isBundle, + type: 'Boolean', + displayName: 'Is Bundle' + }; + if (userData.isBundle) { + propertyContainer.bundleName = { + value: userData.bundleName, + type: 'String', + displayName: 'Bundle Name' + }; + propertyContainer.priority = { + value: userData.priority, + type: 'Integer', + displayName: 'Priority' + }; + // Some bundles might have compression settings, but we only saw these in the sample + if (userData.compressionType !== undefined) { + propertyContainer.compressionType = { + value: userData.compressionType, + type: 'Enum', // Assuming enum + enumList: [ + { name: 'None', value: 'none' }, + { name: 'Merge Depend', value: 'merge_dep' }, + { name: 'Zip', value: 'zip' }, + { name: 'Zip High Compression', value: 'zip_high' }, + { name: 'Zip Store', value: 'zip_store' } + ], + displayName: 'Compression Type' + }; + } + if (userData.target !== undefined) { + propertyContainer.target = { + value: userData.target, + type: 'String', // Could be array of strings (platforms) + displayName: 'Target Platform' + }; + } + } + return propertyContainer; + } +} +exports.DirectoryImporter = DirectoryImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0b3J5LWltcG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc291cmNlL3V0Y3AvdXRpbHMvYXNzZXQtaW1wb3J0ZXJzL2RpcmVjdG9yeS1pbXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBb0Q7QUFJcEQsTUFBYSxpQkFBa0IsU0FBUSxpQ0FBaUI7SUFBeEQ7O1FBQ0ksU0FBSSxHQUFHLFdBQVcsQ0FBQztJQWdHdkIsQ0FBQztJQTlGRyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQXFCLEVBQUUsSUFBWSxFQUFFLEtBQVU7UUFDN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEIseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFL0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXBCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFBRSxPQUFPLENB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QztvQkFDRCxXQUFXLEVBQUUsa0JBQWtCO2lCQUNsQyxDQUFDO1lBQ04sQ0FBQztZQUVELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDL0IsaUJBQWlCLENBQUMsTUFBTSxHQUFHO29CQUN4QixLQUFLLEVBQUUsUUFBUSxDQUFDLE1BQU07b0JBQ3RCLElBQUksRUFBRSxRQUFRLEVBQUUsd0NBQXdDO29CQUN4RCxXQUFXLEVBQUUsaUJBQWlCO2lCQUNqQyxDQUFDO1lBQ04sQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLGlCQUFpQixDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQWpHRCw4Q0FpR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQXNzZXRJbXBvcnRlciB9IGZyb20gJy4vYmFzZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBJQXNzZXRJbmZvIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL2Fzc2V0LWRiL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0IHsgSVByb3BlcnR5LCBJUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5cbmV4cG9ydCBjbGFzcyBEaXJlY3RvcnlJbXBvcnRlciBleHRlbmRzIEJhc2VBc3NldEltcG9ydGVyIHtcbiAgICBuYW1lID0gJ2RpcmVjdG9yeSc7XG5cbiAgICBhc3luYyBzZXRQcm9wZXJ0eShhc3NldEluZm86IElBc3NldEluZm8sIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgaWYgKCFtZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgdXNlckRhdGEgZXhpc3RzXG4gICAgICAgIGlmICghbWV0YS51c2VyRGF0YSkgbWV0YS51c2VyRGF0YSA9IHt9O1xuICAgICAgICBjb25zdCB1c2VyRGF0YSA9IG1ldGEudXNlckRhdGE7XG4gICAgICAgIFxuICAgICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IHVzZXJEYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRbcGFydHNbaV1dKSBjdXJyZW50W3BhcnRzW2ldXSA9IHt9OyAvLyBDcmVhdGUgb2JqZWN0IGlmIG1pc3NpbmdcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0c1tpXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1c2VyRGF0YVtwYXRoXSA9IHZhbHVlO1xuICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdzYXZlLWFzc2V0LW1ldGEnLCBhc3NldEluZm8udXVpZCwgSlNPTi5zdHJpbmdpZnkobWV0YSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFByb3BlcnRpZXMoYXNzZXRJbmZvOiBJQXNzZXRJbmZvKTogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9PiB7XG4gICAgICAgIGNvbnN0IGFzc2V0TWV0YSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LW1ldGEnLCBhc3NldEluZm8udXVpZCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWFzc2V0TWV0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NldCBtZXRhIG5vdCBmb3VuZCBmb3IgJHthc3NldEluZm8udXVpZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZXJEYXRhID0gYXNzZXRNZXRhLnVzZXJEYXRhO1xuICAgICAgICAvLyBEaXJlY3RvcnkgbWlnaHQgbm90IGhhdmUgdXNlckRhdGEgaWYgaXQncyBub3QgYSBidW5kbGUsIGJ1dCBsZXQncyBoYW5kbGUgaXQgZ3JhY2VmdWxseVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVVzZXJEYXRhKHVzZXJEYXRhIHx8IHt9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlVXNlckRhdGEodXNlckRhdGE6IGFueSk6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUNvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuXG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmlzQnVuZGxlID0ge1xuICAgICAgICAgICAgdmFsdWU6ICEhdXNlckRhdGEuaXNCdW5kbGUsXG4gICAgICAgICAgICB0eXBlOiAnQm9vbGVhbicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0lzIEJ1bmRsZSdcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodXNlckRhdGEuaXNCdW5kbGUpIHtcbiAgICAgICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmJ1bmRsZU5hbWUgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLmJ1bmRsZU5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdCdW5kbGUgTmFtZSdcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnByaW9yaXR5ID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5wcmlvcml0eSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnSW50ZWdlcicsXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdQcmlvcml0eSdcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNvbWUgYnVuZGxlcyBtaWdodCBoYXZlIGNvbXByZXNzaW9uIHNldHRpbmdzLCBidXQgd2Ugb25seSBzYXcgdGhlc2UgaW4gdGhlIHNhbXBsZVxuICAgICAgICAgICAgaWYgKHVzZXJEYXRhLmNvbXByZXNzaW9uVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmNvbXByZXNzaW9uVHlwZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLmNvbXByZXNzaW9uVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0VudW0nLCAvLyBBc3N1bWluZyBlbnVtXG4gICAgICAgICAgICAgICAgICAgIGVudW1MaXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdOb25lJywgdmFsdWU6ICdub25lJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnTWVyZ2UgRGVwZW5kJywgdmFsdWU6ICdtZXJnZV9kZXAnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdaaXAnLCB2YWx1ZTogJ3ppcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ1ppcCBIaWdoIENvbXByZXNzaW9uJywgdmFsdWU6ICd6aXBfaGlnaCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ1ppcCBTdG9yZScsIHZhbHVlOiAnemlwX3N0b3JlJyB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQ29tcHJlc3Npb24gVHlwZSdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodXNlckRhdGEudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgcHJvcGVydHlDb250YWluZXIudGFyZ2V0ID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJywgLy8gQ291bGQgYmUgYXJyYXkgb2Ygc3RyaW5ncyAocGxhdGZvcm1zKVxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1RhcmdldCBQbGF0Zm9ybSdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb3BlcnR5Q29udGFpbmVyO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/erp-texture-cube-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/erp-texture-cube-importer.js new file mode 100644 index 0000000..d25d4df --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/erp-texture-cube-importer.js @@ -0,0 +1,81 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ErpTextureCubeImporter = void 0; +const base_importer_1 = require("./base-importer"); +const texture_utils_1 = require("../texture-utils"); +class ErpTextureCubeImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'erp-texture-cube'; + } + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta || !meta.userData) + return false; + const userData = meta.userData; + let handled = false; + if (texture_utils_1.TextureUtils.applyProperties(userData, path, value)) { + handled = true; + } + if (!handled) { + if (path.includes('.')) { + const parts = path.split('.'); + let current = userData; + for (let i = 0; i < parts.length - 1; i++) { + if (!current[parts[i]]) + return false; + current = current[parts[i]]; + } + if (current) { + current[parts[parts.length - 1]] = value; + handled = true; + } + } + else { + userData[path] = value; + handled = true; + } + } + if (handled) { + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + return false; + } + async getProperties(assetInfo) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + const userData = meta === null || meta === void 0 ? void 0 : meta.userData; + if (!userData) { + throw new Error(`UserData not found for asset ${assetInfo.uuid}`); + } + return this.parseUserData(userData); + } + parseUserData(userData) { + const propertyContainer = {}; + propertyContainer.anisotropy = { + value: userData.anisotropy, + type: 'Number', + displayName: 'Anisotropy' + }; + propertyContainer.faceSize = { + value: userData.faceSize, + type: 'Number', + displayName: 'Face Size' + }; + // Texture Utils (Filter/Wrap) + texture_utils_1.TextureUtils.injectTextureProperties(userData, propertyContainer); + propertyContainer.generateMipmaps = { + value: userData.mipfilter !== 'none', + type: 'Boolean', + displayName: 'Generate Mipmaps' + }; + propertyContainer.mipBakeMode = { + value: userData.mipBakeMode, + type: 'Boolean', + displayName: 'Mip Bake Mode' + }; + return propertyContainer; + } +} +exports.ErpTextureCubeImporter = ErpTextureCubeImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJwLXRleHR1cmUtY3ViZS1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy9lcnAtdGV4dHVyZS1jdWJlLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFvRDtBQUNwRCxvREFBZ0Q7QUFJaEQsTUFBYSxzQkFBdUIsU0FBUSxpQ0FBaUI7SUFBN0Q7O1FBQ0ksU0FBSSxHQUFHLGtCQUFrQixDQUFDO0lBZ0Y5QixDQUFDO0lBOUVHLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBcUIsRUFBRSxJQUFZLEVBQUUsS0FBVTtRQUM3RCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSw0QkFBWSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEQsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ1gsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQztnQkFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUFFLE9BQU8sS0FBSyxDQUFDO29CQUNyQyxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO2dCQUNELElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUN6QyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbkIsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEcsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQXFCO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixNQUFNLFFBQVEsR0FBRyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxDQUFDO1FBRWhDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVNLGFBQWEsQ0FBQyxRQUFtQztRQUNwRCxNQUFNLGlCQUFpQixHQUFpQyxFQUFFLENBQUM7UUFFM0QsaUJBQWlCLENBQUMsVUFBVSxHQUFHO1lBQzNCLEtBQUssRUFBRSxRQUFRLENBQUMsVUFBVTtZQUMxQixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSxZQUFZO1NBQzVCLENBQUM7UUFDRixpQkFBaUIsQ0FBQyxRQUFRLEdBQUc7WUFDekIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRO1lBQ3hCLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLFdBQVc7U0FDM0IsQ0FBQztRQUVGLDhCQUE4QjtRQUM5Qiw0QkFBWSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRWxFLGlCQUFpQixDQUFDLGVBQWUsR0FBRztZQUNoQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFNBQVMsS0FBSyxNQUFNO1lBQ3BDLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUFFLGtCQUFrQjtTQUNsQyxDQUFDO1FBRUYsaUJBQWlCLENBQUMsV0FBVyxHQUFHO1lBQzVCLEtBQUssRUFBRSxRQUFRLENBQUMsV0FBVztZQUMzQixJQUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFBRSxlQUFlO1NBQy9CLENBQUM7UUFFRixPQUFPLGlCQUFpQixDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQWpGRCx3REFpRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQXNzZXRJbXBvcnRlciB9IGZyb20gJy4vYmFzZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBUZXh0dXJlVXRpbHMgfSBmcm9tICcuLi90ZXh0dXJlLXV0aWxzJztcbmltcG9ydCB7IElBc3NldEluZm8gfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvYXNzZXQtZGIvQHR5cGVzL3B1YmxpYyc7XG5pbXBvcnQgeyBJUHJvcGVydHksIElQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcblxuZXhwb3J0IGNsYXNzIEVycFRleHR1cmVDdWJlSW1wb3J0ZXIgZXh0ZW5kcyBCYXNlQXNzZXRJbXBvcnRlciB7XG4gICAgbmFtZSA9ICdlcnAtdGV4dHVyZS1jdWJlJztcblxuICAgIGFzeW5jIHNldFByb3BlcnR5KGFzc2V0SW5mbzogSUFzc2V0SW5mbywgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQpO1xuICAgICAgICBpZiAoIW1ldGEgfHwgIW1ldGEudXNlckRhdGEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHVzZXJEYXRhID0gbWV0YS51c2VyRGF0YTtcbiAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoVGV4dHVyZVV0aWxzLmFwcGx5UHJvcGVydGllcyh1c2VyRGF0YSwgcGF0aCwgdmFsdWUpKSB7XG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFoYW5kbGVkKSB7XG4gICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB1c2VyRGF0YTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRbcGFydHNbaV1dKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRzW2ldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1c2VyRGF0YVtwYXRoXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAnc2F2ZS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQsIEpTT04uc3RyaW5naWZ5KG1ldGEpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKGFzc2V0SW5mbzogSUFzc2V0SW5mbyk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfT4ge1xuICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSBtZXRhPy51c2VyRGF0YTtcblxuICAgICAgICBpZiAoIXVzZXJEYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVzZXJEYXRhIG5vdCBmb3VuZCBmb3IgYXNzZXQgJHthc3NldEluZm8udXVpZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVXNlckRhdGEodXNlckRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZVVzZXJEYXRhKHVzZXJEYXRhOiB7IFtpbmRleDogc3RyaW5nXTogYW55OyB9KTogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5Q29udGFpbmVyOiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eSB9ID0ge307XG5cbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuYW5pc290cm9weSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5hbmlzb3Ryb3B5LFxuICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0FuaXNvdHJvcHknXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmZhY2VTaXplID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLmZhY2VTaXplLFxuICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0ZhY2UgU2l6ZSdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUZXh0dXJlIFV0aWxzIChGaWx0ZXIvV3JhcClcbiAgICAgICAgVGV4dHVyZVV0aWxzLmluamVjdFRleHR1cmVQcm9wZXJ0aWVzKHVzZXJEYXRhLCBwcm9wZXJ0eUNvbnRhaW5lcik7XG5cbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuZ2VuZXJhdGVNaXBtYXBzID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLm1pcGZpbHRlciAhPT0gJ25vbmUnLFxuICAgICAgICAgICAgdHlwZTogJ0Jvb2xlYW4nLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdHZW5lcmF0ZSBNaXBtYXBzJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLm1pcEJha2VNb2RlID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLm1pcEJha2VNb2RlLFxuICAgICAgICAgICAgdHlwZTogJ0Jvb2xlYW4nLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdNaXAgQmFrZSBNb2RlJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUNvbnRhaW5lcjtcbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/fbx-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/fbx-importer.js new file mode 100644 index 0000000..cd3e24e --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/fbx-importer.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FbxImporter = void 0; +const model_base_importer_1 = require("./model-base-importer"); +class FbxImporter extends model_base_importer_1.ModelBaseImporter { + constructor() { + super(...arguments); + this.name = 'fbx'; + } + addSpecificUserData(userData, container) { + const fbx = userData.fbx || {}; + container.animationBakeRate = { + value: fbx.animationBakeRate, + type: 'Enum', + enumList: [ + { name: 'Auto', value: 0 }, + { name: 'BakeRate24', value: 24 }, + { name: 'BakeRate25', value: 25 }, + { name: 'BakeRate30', value: 30 }, + { name: 'BakeRate60', value: 60 } + ], + tooltip: 'Specify the animation bake sample rate in frames per second (fps).' + }; + container.preferLocalTimeSpan = { + value: !!fbx.preferLocalTimeSpan, + type: 'Boolean', + tooltip: 'When exporting FBX animations, whether prefer to use the time range recorded in FBX file.
If one is not preferred, or one is invalid for use, the time range is robustly calculated.
Some FBX generators may not export this information.' + }; + container.smartMaterialEnabled = { + value: !!fbx.smartMaterialEnabled, + type: 'Boolean', + tooltip: 'Convert DCC materials to engine builtin materials which match the internal lighting model.' + }; + container.legacyFbxImporter = { + value: !!userData.legacyFbxImporter, + type: 'Boolean', + }; + } +} +exports.FbxImporter = FbxImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmJ4LWltcG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc291cmNlL3V0Y3AvdXRpbHMvYXNzZXQtaW1wb3J0ZXJzL2ZieC1pbXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrREFBMEQ7QUFHMUQsTUFBYSxXQUFZLFNBQVEsdUNBQWlCO0lBQWxEOztRQUNJLFNBQUksR0FBRyxLQUFLLENBQUM7SUFtQ2pCLENBQUM7SUFqQ2EsbUJBQW1CLENBQUMsUUFBYSxFQUFFLFNBQXVDO1FBQ2hGLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO1FBRS9CLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRztZQUMxQixLQUFLLEVBQUUsR0FBRyxDQUFDLGlCQUFpQjtZQUM1QixJQUFJLEVBQUUsTUFBTTtZQUNaLFFBQVEsRUFBRTtnQkFDTixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtnQkFDMUIsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7Z0JBQ2pDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO2dCQUNqQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtnQkFDakMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7YUFDcEM7WUFDRCxPQUFPLEVBQUUsb0VBQW9FO1NBQ2hGLENBQUM7UUFFRixTQUFTLENBQUMsbUJBQW1CLEdBQUc7WUFDNUIsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CO1lBQ2hDLElBQUksRUFBRSxTQUFTO1lBQ2YsT0FBTyxFQUFFLGlQQUFpUDtTQUM3UCxDQUFDO1FBRUYsU0FBUyxDQUFDLG9CQUFvQixHQUFHO1lBQzVCLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLG9CQUFvQjtZQUNqQyxJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSw0RkFBNEY7U0FDekcsQ0FBQztRQUVGLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRztZQUN6QixLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUI7WUFDbkMsSUFBSSxFQUFFLFNBQVM7U0FDbkIsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQXBDRCxrQ0FvQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2RlbEJhc2VJbXBvcnRlciB9IGZyb20gJy4vbW9kZWwtYmFzZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBJUHJvcGVydHkgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5cbmV4cG9ydCBjbGFzcyBGYnhJbXBvcnRlciBleHRlbmRzIE1vZGVsQmFzZUltcG9ydGVyIHtcbiAgICBuYW1lID0gJ2ZieCc7XG5cbiAgICBwcm90ZWN0ZWQgYWRkU3BlY2lmaWNVc2VyRGF0YSh1c2VyRGF0YTogYW55LCBjb250YWluZXI6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmJ4ID0gdXNlckRhdGEuZmJ4IHx8IHt9O1xuICAgICAgICBcbiAgICAgICAgY29udGFpbmVyLmFuaW1hdGlvbkJha2VSYXRlID0ge1xuICAgICAgICAgICAgdmFsdWU6IGZieC5hbmltYXRpb25CYWtlUmF0ZSxcbiAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgIGVudW1MaXN0OiBbXG4gICAgICAgICAgICAgICAgeyBuYW1lOiAnQXV0bycsIHZhbHVlOiAwIH0sXG4gICAgICAgICAgICAgICAgeyBuYW1lOiAnQmFrZVJhdGUyNCcsIHZhbHVlOiAyNCB9LFxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ0Jha2VSYXRlMjUnLCB2YWx1ZTogMjUgfSxcbiAgICAgICAgICAgICAgICB7IG5hbWU6ICdCYWtlUmF0ZTMwJywgdmFsdWU6IDMwIH0sXG4gICAgICAgICAgICAgICAgeyBuYW1lOiAnQmFrZVJhdGU2MCcsIHZhbHVlOiA2MCB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdG9vbHRpcDogJ1NwZWNpZnkgdGhlIGFuaW1hdGlvbiBiYWtlIHNhbXBsZSByYXRlIGluIGZyYW1lcyBwZXIgc2Vjb25kIChmcHMpLidcbiAgICAgICAgfTtcblxuICAgICAgICBjb250YWluZXIucHJlZmVyTG9jYWxUaW1lU3BhbiA9IHtcbiAgICAgICAgICAgIHZhbHVlOiAhIWZieC5wcmVmZXJMb2NhbFRpbWVTcGFuLFxuICAgICAgICAgICAgdHlwZTogJ0Jvb2xlYW4nLFxuICAgICAgICAgICAgdG9vbHRpcDogJ1doZW4gZXhwb3J0aW5nIEZCWCBhbmltYXRpb25zLCB3aGV0aGVyIHByZWZlciB0byB1c2UgdGhlIHRpbWUgcmFuZ2UgcmVjb3JkZWQgaW4gRkJYIGZpbGUuPGJyPklmIG9uZSBpcyBub3QgcHJlZmVycmVkLCBvciBvbmUgaXMgaW52YWxpZCBmb3IgdXNlLCB0aGUgdGltZSByYW5nZSBpcyByb2J1c3RseSBjYWxjdWxhdGVkLjxicj5Tb21lIEZCWCBnZW5lcmF0b3JzIG1heSBub3QgZXhwb3J0IHRoaXMgaW5mb3JtYXRpb24uJ1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnRhaW5lci5zbWFydE1hdGVyaWFsRW5hYmxlZCA9IHtcbiAgICAgICAgICAgICB2YWx1ZTogISFmYnguc21hcnRNYXRlcmlhbEVuYWJsZWQsXG4gICAgICAgICAgICAgdHlwZTogJ0Jvb2xlYW4nLFxuICAgICAgICAgICAgIHRvb2x0aXA6ICdDb252ZXJ0IERDQyBtYXRlcmlhbHMgdG8gZW5naW5lIGJ1aWx0aW4gbWF0ZXJpYWxzIHdoaWNoIG1hdGNoIHRoZSBpbnRlcm5hbCBsaWdodGluZyBtb2RlbC4nXG4gICAgICAgIH07XG5cbiAgICAgICAgY29udGFpbmVyLmxlZ2FjeUZieEltcG9ydGVyID0ge1xuICAgICAgICAgICAgIHZhbHVlOiAhIXVzZXJEYXRhLmxlZ2FjeUZieEltcG9ydGVyLFxuICAgICAgICAgICAgIHR5cGU6ICdCb29sZWFuJyxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/gltf-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/gltf-importer.js new file mode 100644 index 0000000..132b808 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/gltf-importer.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GltfImporter = void 0; +const model_base_importer_1 = require("./model-base-importer"); +class GltfImporter extends model_base_importer_1.ModelBaseImporter { + constructor() { + super(...arguments); + this.name = 'gltf'; + } + addSpecificUserData(userData, container) { + // GLTF specific properties if any + } +} +exports.GltfImporter = GltfImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2x0Zi1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy9nbHRmLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQUEwRDtBQUcxRCxNQUFhLFlBQWEsU0FBUSx1Q0FBaUI7SUFBbkQ7O1FBQ0ksU0FBSSxHQUFHLE1BQU0sQ0FBQztJQUtsQixDQUFDO0lBSGEsbUJBQW1CLENBQUMsUUFBYSxFQUFFLFNBQXVDO1FBQ2hGLGtDQUFrQztJQUN0QyxDQUFDO0NBQ0o7QUFORCxvQ0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsQmFzZUltcG9ydGVyIH0gZnJvbSAnLi9tb2RlbC1iYXNlLWltcG9ydGVyJztcbmltcG9ydCB7IElQcm9wZXJ0eSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcblxuZXhwb3J0IGNsYXNzIEdsdGZJbXBvcnRlciBleHRlbmRzIE1vZGVsQmFzZUltcG9ydGVyIHtcbiAgICBuYW1lID0gJ2dsdGYnO1xuXG4gICAgcHJvdGVjdGVkIGFkZFNwZWNpZmljVXNlckRhdGEodXNlckRhdGE6IGFueSwgY29udGFpbmVyOiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eSB9KTogdm9pZCB7XG4gICAgICAgIC8vIEdMVEYgc3BlY2lmaWMgcHJvcGVydGllcyBpZiBhbnlcbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/image-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/image-importer.js new file mode 100644 index 0000000..ed05e84 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/image-importer.js @@ -0,0 +1,158 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ImageImporter = void 0; +const base_importer_1 = require("./base-importer"); +const texture_importer_1 = require("./texture-importer"); +const sprite_frame_importer_1 = require("./sprite-frame-importer"); +const erp_texture_cube_importer_1 = require("./erp-texture-cube-importer"); +const texture_utils_1 = require("../texture-utils"); +class ImageImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'image'; + this.textureImporter = new texture_importer_1.TextureImporter(); + this.spriteFrameImporter = new sprite_frame_importer_1.SpriteFrameImporter(); + this.erpTextureCubeImporter = new erp_texture_cube_importer_1.ErpTextureCubeImporter(); + } + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta) + return false; + const userData = meta.userData; + let handled = false; + // Top level properties + if (['type', 'flipVertical', 'fixAlphaTransparencyArtifacts', 'flipGreenChannel', 'isRGBE'].includes(path)) { + userData[path] = value; + handled = true; + } + // Sub-asset delegation + else if (path.startsWith('texture.') || path.startsWith('spriteFrame.')) { + const [prefix, ...rest] = path.split('.'); + const subPath = rest.join('.'); + let targetImporter = ''; + switch (prefix) { + case 'texture': + targetImporter = 'texture'; + break; + case 'spriteFrame': + targetImporter = 'sprite-frame'; + break; + case 'textureCube': + targetImporter = 'erp-texture-cube'; + break; + } + if (targetImporter && meta.subMetas) { + const subMetaKey = Object.keys(meta.subMetas).find(key => meta.subMetas[key].importer === targetImporter); + if (subMetaKey) { + const subUserData = meta.subMetas[subMetaKey].userData; + let syntheticHandled = false; + if (targetImporter === 'texture') { + syntheticHandled = texture_utils_1.TextureUtils.applyProperties(subUserData, subPath, value); + } + if (!syntheticHandled) { + if (subPath.includes('.')) { + // deep set + const parts = subPath.split('.'); + let current = subUserData; + for (let i = 0; i < parts.length - 1; i++) { + current = current[parts[i]]; + } + if (current) + current[parts[parts.length - 1]] = value; + } + else { + subUserData[subPath] = value; + } + } + handled = true; + } + } + } + if (handled) { + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + return false; + } + async getProperties(assetInfo) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta) { + throw new Error('Asset meta not found'); + } + return await this.inspectImageAsset(meta); + } + async inspectImageAsset(meta) { + var _a, _b, _c; + const propertyContainer = {}; + // Type + propertyContainer['type'] = { + type: 'Enum', + value: meta.userData.type || 'texture', + enumList: [ + { name: 'raw', value: 'raw' }, + { name: 'texture', value: 'texture' }, + { name: 'normal-map', value: 'normal map' }, + { name: 'sprite-frame', value: 'sprite-frame' }, + { name: 'texture-cube', value: 'texture cube' } + ], + displayName: 'Type', + visible: true + }; + // Flip Vertical + propertyContainer['flipVertical'] = { + type: 'Boolean', + value: !!meta.userData.flipVertical, + displayName: 'Flip Vertical', + visible: true + }; + // Fix Alpha Transparency Artifacts + propertyContainer['fixAlphaTransparencyArtifacts'] = { + type: 'Boolean', + value: !!meta.userData.fixAlphaTransparencyArtifacts, + displayName: 'Fix Alpha Transparency Artifacts', + visible: meta.userData.type !== 'normal map' + }; + // Flip Green Channel + propertyContainer['flipGreenChannel'] = { + type: 'Boolean', + value: !!meta.userData.flipGreenChannel, + displayName: 'Flip Green Channel', + visible: true + }; + // Is RGBE + propertyContainer['isRGBE'] = { + type: 'Boolean', + value: !!meta.userData.isRGBE, + displayName: 'Is RGBE', + visible: meta.userData.type === 'texture cube' + }; + // Sub-assets inspection + const subMetas = meta.subMetas || {}; + // Determine which importers to use based on type + const type = meta.userData.type || 'texture'; + if (type === 'texture' || type === 'normal map' || type === 'sprite-frame') { + propertyContainer['texture'] = { + value: this.textureImporter.parseUserData(((_a = Object.values(subMetas).find(sm => sm.importer === 'texture')) === null || _a === void 0 ? void 0 : _a.userData) || {}), + type: 'cc.Object', + displayName: 'Texture Properties' + }; + if (type === 'sprite-frame') { + propertyContainer['spriteFrame'] = { + value: this.spriteFrameImporter.parseUserData(((_b = Object.values(subMetas).find(sm => sm.importer === 'sprite-frame')) === null || _b === void 0 ? void 0 : _b.userData) || {}), + type: 'cc.Object', + displayName: 'Sprite Frame Properties' + }; + } + } + else if (type === 'texture cube') { + propertyContainer['textureCube'] = { + value: this.erpTextureCubeImporter.parseUserData(((_c = Object.values(subMetas).find(sm => sm.importer === 'erp-texture-cube')) === null || _c === void 0 ? void 0 : _c.userData) || {}), + type: 'cc.Object', + displayName: 'Texture Cube Properties' + }; + } + return propertyContainer; + } +} +exports.ImageImporter = ImageImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtaW1wb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zb3VyY2UvdXRjcC91dGlscy9hc3NldC1pbXBvcnRlcnMvaW1hZ2UtaW1wb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQW9EO0FBQ3BELHlEQUFxRDtBQUNyRCxtRUFBOEQ7QUFDOUQsMkVBQXFFO0FBR3JFLG9EQUFnRDtBQUVoRCxNQUFhLGFBQWMsU0FBUSxpQ0FBaUI7SUFBcEQ7O1FBQ0ksU0FBSSxHQUFHLE9BQU8sQ0FBQztRQUVQLG9CQUFlLEdBQUcsSUFBSSxrQ0FBZSxFQUFFLENBQUM7UUFDeEMsd0JBQW1CLEdBQUcsSUFBSSwyQ0FBbUIsRUFBRSxDQUFDO1FBQ2hELDJCQUFzQixHQUFHLElBQUksa0RBQXNCLEVBQUUsQ0FBQztJQThKbEUsQ0FBQztJQTVKRyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQXFCLEVBQUUsSUFBWSxFQUFFLEtBQVU7UUFDN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFcEIsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLCtCQUErQixFQUFFLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDdkIsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNuQixDQUFDO1FBQ0QsdUJBQXVCO2FBQ2xCLElBQUks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QUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsMENBQUUsUUFBUSxLQUFJLEVBQUUsQ0FBQztnQkFDeEgsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFdBQVcsRUFBRSxvQkFBb0I7YUFDcEMsQ0FBQztZQUVGLElBQUksSUFBSSxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUMxQixpQkFBaUIsQ0FBQyxhQUFhLENBQUMsR0FBRztvQkFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQSxNQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxjQUFjLENBQUMsMENBQUUsUUFBUSxLQUFJLEVBQUUsQ0FBQztvQkFDakksSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLFdBQVcsRUFBRSx5QkFBeUI7aUJBQ3pDLENBQUM7WUFDTixDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksSUFBSSxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ2pDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxHQUFHO2dCQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFBLE1BQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxLQUFLLGtCQUFrQixDQUFDLDBDQUFFLFFBQVEsS0FBSSxFQUFFLENBQUM7Z0JBQ3hJLElBQUksRUFBRSxXQUFXO2dCQUNqQixXQUFXLEVBQUUseUJBQXlCO2FBQ3pDLENBQUM7UUFDTixDQUFDO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0NBQ0o7QUFuS0Qsc0NBbUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUFzc2V0SW1wb3J0ZXIgfSBmcm9tICcuL2Jhc2UtaW1wb3J0ZXInO1xuaW1wb3J0IHsgVGV4dHVyZUltcG9ydGVyIH0gZnJvbSAnLi90ZXh0dXJlLWltcG9ydGVyJztcbmltcG9ydCB7IFNwcml0ZUZyYW1lSW1wb3J0ZXIgfSBmcm9tICcuL3Nwcml0ZS1mcmFtZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBFcnBUZXh0dXJlQ3ViZUltcG9ydGVyIH0gZnJvbSAnLi9lcnAtdGV4dHVyZS1jdWJlLWltcG9ydGVyJztcbmltcG9ydCB7IElBc3NldEluZm8sIElBc3NldE1ldGEgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvYXNzZXQtZGIvQHR5cGVzL3B1YmxpYyc7XG5pbXBvcnQgeyBJUHJvcGVydHksIElQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcbmltcG9ydCB7IFRleHR1cmVVdGlscyB9IGZyb20gJy4uL3RleHR1cmUtdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VJbXBvcnRlciBleHRlbmRzIEJhc2VBc3NldEltcG9ydGVyIHtcbiAgICBuYW1lID0gJ2ltYWdlJztcblxuICAgIHByaXZhdGUgdGV4dHVyZUltcG9ydGVyID0gbmV3IFRleHR1cmVJbXBvcnRlcigpO1xuICAgIHByaXZhdGUgc3ByaXRlRnJhbWVJbXBvcnRlciA9IG5ldyBTcHJpdGVGcmFtZUltcG9ydGVyKCk7XG4gICAgcHJpdmF0ZSBlcnBUZXh0dXJlQ3ViZUltcG9ydGVyID0gbmV3IEVycFRleHR1cmVDdWJlSW1wb3J0ZXIoKTtcblxuICAgIGFzeW5jIHNldFByb3BlcnR5KGFzc2V0SW5mbzogSUFzc2V0SW5mbywgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQpO1xuICAgICAgICBpZiAoIW1ldGEpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB1c2VyRGF0YSA9IG1ldGEudXNlckRhdGE7XG4gICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gVG9wIGxldmVsIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKFsndHlwZScsICdmbGlwVmVydGljYWwnLCAnZml4QWxwaGFUcmFuc3BhcmVuY3lBcnRpZmFjdHMnLCAnZmxpcEdyZWVuQ2hhbm5lbCcsICdpc1JHQkUnXS5pbmNsdWRlcyhwYXRoKSkge1xuICAgICAgICAgICAgdXNlckRhdGFbcGF0aF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9IFxuICAgICAgICAvLyBTdWItYXNzZXQgZGVsZWdhdGlvblxuICAgICAgICBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoJ3RleHR1cmUuJykgfHwgcGF0aC5zdGFydHNXaXRoKCdzcHJpdGVGcmFtZS4nKSkge1xuICAgICAgICAgICAgY29uc3QgW3ByZWZpeCwgLi4ucmVzdF0gPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBjb25zdCBzdWJQYXRoID0gcmVzdC5qb2luKCcuJyk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0SW1wb3J0ZXIgPSAnJztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0dXJlJzpcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW1wb3J0ZXIgPSAndGV4dHVyZSc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3Nwcml0ZUZyYW1lJzpcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW1wb3J0ZXIgPSAnc3ByaXRlLWZyYW1lJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndGV4dHVyZUN1YmUnOlxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbXBvcnRlciA9ICdlcnAtdGV4dHVyZS1jdWJlJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXRJbXBvcnRlciAmJiBtZXRhLnN1Yk1ldGFzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTWV0YUtleSA9IE9iamVjdC5rZXlzKG1ldGEuc3ViTWV0YXMpLmZpbmQoa2V5ID0+IG1ldGEuc3ViTWV0YXNba2V5XS5pbXBvcnRlciA9PT0gdGFyZ2V0SW1wb3J0ZXIpO1xuICAgICAgICAgICAgICAgIGlmIChzdWJNZXRhS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YlVzZXJEYXRhID0gbWV0YS5zdWJNZXRhc1tzdWJNZXRhS2V5XS51c2VyRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCBzeW50aGV0aWNIYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRJbXBvcnRlciA9PT0gJ3RleHR1cmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzeW50aGV0aWNIYW5kbGVkID0gVGV4dHVyZVV0aWxzLmFwcGx5UHJvcGVydGllcyhzdWJVc2VyRGF0YSwgc3ViUGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzeW50aGV0aWNIYW5kbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViUGF0aC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVlcCBzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHN1YlBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudCA9IHN1YlVzZXJEYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRzW2ldXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlVzZXJEYXRhW3N1YlBhdGhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3NhdmUtYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkLCBKU09OLnN0cmluZ2lmeShtZXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKGFzc2V0SW5mbzogSUFzc2V0SW5mbyk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfT4ge1xuICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghbWV0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NldCBtZXRhIG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5zcGVjdEltYWdlQXNzZXQobWV0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbnNwZWN0SW1hZ2VBc3NldChtZXRhOiBJQXNzZXRNZXRhKTogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eSB9PiB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5Q29udGFpbmVyOiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eSB9ID0ge307XG5cbiAgICAgICAgLy8gVHlwZVxuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lclsndHlwZSddID0ge1xuICAgICAgICAgICAgdHlwZTogJ0VudW0nLFxuICAgICAgICAgICAgdmFsdWU6IG1ldGEudXNlckRhdGEudHlwZSB8fCAndGV4dHVyZScsXG4gICAgICAgICAgICBlbnVtTGlzdDogW1xuICAgICAgICAgICAgICAgIHsgbmFtZTogJ3JhdycsIHZhbHVlOiAncmF3JyB9LFxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ3RleHR1cmUnLCB2YWx1ZTogJ3RleHR1cmUnIH0sXG4gICAgICAgICAgICAgICAgeyBuYW1lOiAnbm9ybWFsLW1hcCcsIHZhbHVlOiAnbm9ybWFsIG1hcCcgfSxcbiAgICAgICAgICAgICAgICB7IG5hbWU6ICdzcHJpdGUtZnJhbWUnLCB2YWx1ZTogJ3Nwcml0ZS1mcmFtZScgfSxcbiAgICAgICAgICAgICAgICB7IG5hbWU6ICd0ZXh0dXJlLWN1YmUnLCB2YWx1ZTogJ3RleHR1cmUgY3ViZScgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnVHlwZScsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRmxpcCBWZXJ0aWNhbFxuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lclsnZmxpcFZlcnRpY2FsJ10gPSB7XG4gICAgICAgICAgICB0eXBlOiAnQm9vbGVhbicsXG4gICAgICAgICAgICB2YWx1ZTogISFtZXRhLnVzZXJEYXRhLmZsaXBWZXJ0aWNhbCxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnRmxpcCBWZXJ0aWNhbCcsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRml4IEFscGhhIFRyYW5zcGFyZW5jeSBBcnRpZmFjdHNcbiAgICAgICAgcHJvcGVydHlDb250YWluZXJbJ2ZpeEFscGhhVHJhbnNwYXJlbmN5QXJ0aWZhY3RzJ10gPSB7XG4gICAgICAgICAgICB0eXBlOiAnQm9vbGVhbicsXG4gICAgICAgICAgICB2YWx1ZTogISFtZXRhLnVzZXJEYXRhLmZpeEFscGhhVHJhbnNwYXJlbmN5QXJ0aWZhY3RzLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdGaXggQWxwaGEgVHJhbnNwYXJlbmN5IEFydGlmYWN0cycsXG4gICAgICAgICAgICB2aXNpYmxlOiBtZXRhLnVzZXJEYXRhLnR5cGUgIT09ICdub3JtYWwgbWFwJ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEZsaXAgR3JlZW4gQ2hhbm5lbFxuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lclsnZmxpcEdyZWVuQ2hhbm5lbCddID0ge1xuICAgICAgICAgICAgdHlwZTogJ0Jvb2xlYW4nLFxuICAgICAgICAgICAgdmFsdWU6ICEhbWV0YS51c2VyRGF0YS5mbGlwR3JlZW5DaGFubmVsLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdGbGlwIEdyZWVuIENoYW5uZWwnLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElzIFJHQkVcbiAgICAgICAgcHJvcGVydHlDb250YWluZXJbJ2lzUkdCRSddID0ge1xuICAgICAgICAgICAgdHlwZTogJ0Jvb2xlYW4nLFxuICAgICAgICAgICAgdmFsdWU6ICEhbWV0YS51c2VyRGF0YS5pc1JHQkUsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0lzIFJHQkUnLFxuICAgICAgICAgICAgdmlzaWJsZTogbWV0YS51c2VyRGF0YS50eXBlID09PSAndGV4dHVyZSBjdWJlJ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFN1Yi1hc3NldHMgaW5zcGVjdGlvblxuICAgICAgICBjb25zdCBzdWJNZXRhcyA9IG1ldGEuc3ViTWV0YXMgfHwge307XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggaW1wb3J0ZXJzIHRvIHVzZSBiYXNlZCBvbiB0eXBlXG4gICAgICAgIGNvbnN0IHR5cGUgPSBtZXRhLnVzZXJEYXRhLnR5cGUgfHwgJ3RleHR1cmUnO1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGUgPT09ICd0ZXh0dXJlJyB8fCB0eXBlID09PSAnbm9ybWFsIG1hcCcgfHwgdHlwZSA9PT0gJ3Nwcml0ZS1mcmFtZScpIHtcbiAgICAgICAgICAgIHByb3BlcnR5Q29udGFpbmVyWyd0ZXh0dXJlJ10gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudGV4dHVyZUltcG9ydGVyLnBhcnNlVXNlckRhdGEoT2JqZWN0LnZhbHVlcyhzdWJNZXRhcykuZmluZChzbSA9PiBzbS5pbXBvcnRlciA9PT0gJ3RleHR1cmUnKT8udXNlckRhdGEgfHwge30pLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdjYy5PYmplY3QnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnVGV4dHVyZSBQcm9wZXJ0aWVzJ1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzcHJpdGUtZnJhbWUnKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlDb250YWluZXJbJ3Nwcml0ZUZyYW1lJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNwcml0ZUZyYW1lSW1wb3J0ZXIucGFyc2VVc2VyRGF0YShPYmplY3QudmFsdWVzKHN1Yk1ldGFzKS5maW5kKHNtID0+IHNtLmltcG9ydGVyID09PSAnc3ByaXRlLWZyYW1lJyk/LnVzZXJEYXRhIHx8IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NjLk9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnU3ByaXRlIEZyYW1lIFByb3BlcnRpZXMnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndGV4dHVyZSBjdWJlJykge1xuICAgICAgICAgICAgcHJvcGVydHlDb250YWluZXJbJ3RleHR1cmVDdWJlJ10gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZXJwVGV4dHVyZUN1YmVJbXBvcnRlci5wYXJzZVVzZXJEYXRhKE9iamVjdC52YWx1ZXMoc3ViTWV0YXMpLmZpbmQoc20gPT4gc20uaW1wb3J0ZXIgPT09ICdlcnAtdGV4dHVyZS1jdWJlJyk/LnVzZXJEYXRhIHx8IHt9KSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2MuT2JqZWN0JyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1RleHR1cmUgQ3ViZSBQcm9wZXJ0aWVzJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUNvbnRhaW5lcjtcbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/importer-manager.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/importer-manager.js new file mode 100644 index 0000000..eccd6a5 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/importer-manager.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ImporterManager = void 0; +class ImporterManager { + static getInstance() { + if (!this._instance) { + this._instance = new ImporterManager(); + } + return this._instance; + } + constructor() { + this._importers = new Map(); + } + registerImporter(importer) { + this._importers.set(importer.name, importer); + } + getImporter(name) { + return this._importers.get(name); + } + hasImporter(name) { + return this._importers.has(name); + } +} +exports.ImporterManager = ImporterManager; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0ZXItbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy9pbXBvcnRlci1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsZUFBZTtJQUlqQixNQUFNLENBQUMsV0FBVztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRDtRQVRRLGVBQVUsR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQVNyQyxDQUFDO0lBRWpCLGdCQUFnQixDQUFDLFFBQXdCO1FBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxJQUFZO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFdBQVcsQ0FBQyxJQUFZO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNKO0FBeEJELDBDQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElBc3NldEltcG9ydGVyIH0gZnJvbSAnLi9iYXNlLWltcG9ydGVyJztcblxuZXhwb3J0IGNsYXNzIEltcG9ydGVyTWFuYWdlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBJbXBvcnRlck1hbmFnZXI7XG4gICAgcHJpdmF0ZSBfaW1wb3J0ZXJzOiBNYXA8c3RyaW5nLCBJQXNzZXRJbXBvcnRlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEltcG9ydGVyTWFuYWdlciB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEltcG9ydGVyTWFuYWdlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyByZWdpc3RlckltcG9ydGVyKGltcG9ydGVyOiBJQXNzZXRJbXBvcnRlcikge1xuICAgICAgICB0aGlzLl9pbXBvcnRlcnMuc2V0KGltcG9ydGVyLm5hbWUsIGltcG9ydGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SW1wb3J0ZXIobmFtZTogc3RyaW5nKTogSUFzc2V0SW1wb3J0ZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1wb3J0ZXJzLmdldChuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzSW1wb3J0ZXIobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbXBvcnRlcnMuaGFzKG5hbWUpO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/index.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/index.js new file mode 100644 index 0000000..9bce30f --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/index.js @@ -0,0 +1,75 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.registerAllImporters = registerAllImporters; +const importer_manager_1 = require("./importer-manager"); +const material_importer_1 = require("./material-importer"); +const texture_importer_1 = require("./texture-importer"); +const script_importer_1 = require("./script-importer"); +const physics_material_importer_1 = require("./physics-material-importer"); +const fbx_importer_1 = require("./fbx-importer"); +const gltf_importer_1 = require("./gltf-importer"); +const directory_importer_1 = require("./directory-importer"); +const auto_atlas_importer_1 = require("./auto-atlas-importer"); +const prefab_importer_1 = require("./prefab-importer"); +const image_importer_1 = require("./image-importer"); +const sprite_frame_importer_1 = require("./sprite-frame-importer"); +const texture_cube_importer_1 = require("./texture-cube-importer"); +const erp_texture_cube_importer_1 = require("./erp-texture-cube-importer"); +const render_texture_importer_1 = require("./render-texture-importer"); +const project_settings_importer_1 = require("./project-settings-importer"); +__exportStar(require("./base-importer"), exports); +__exportStar(require("./importer-manager"), exports); +__exportStar(require("./material-importer"), exports); +__exportStar(require("./texture-importer"), exports); +__exportStar(require("./script-importer"), exports); +__exportStar(require("./physics-material-importer"), exports); +__exportStar(require("./fbx-importer"), exports); +__exportStar(require("./gltf-importer"), exports); +__exportStar(require("./directory-importer"), exports); +__exportStar(require("./auto-atlas-importer"), exports); +__exportStar(require("./prefab-importer"), exports); +__exportStar(require("./image-importer"), exports); +__exportStar(require("./sprite-frame-importer"), exports); +__exportStar(require("./texture-cube-importer"), exports); +__exportStar(require("./erp-texture-cube-importer"), exports); +__exportStar(require("./render-texture-importer"), exports); +__exportStar(require("./project-settings-importer"), exports); +function registerAllImporters() { + const manager = importer_manager_1.ImporterManager.getInstance(); + // Project Settings + manager.registerImporter(new project_settings_importer_1.ProjectSettingsImporter()); + // Material + manager.registerImporter(new material_importer_1.MaterialImporter()); + // Scripts + manager.registerImporter(new script_importer_1.ScriptImporter()); // typescript + // Prefab + manager.registerImporter(new prefab_importer_1.PrefabImporter()); + // Textures & Images + manager.registerImporter(new image_importer_1.ImageImporter()); + manager.registerImporter(new texture_importer_1.TextureImporter()); + manager.registerImporter(new sprite_frame_importer_1.SpriteFrameImporter()); + manager.registerImporter(new texture_cube_importer_1.TextureCubeImporter()); + manager.registerImporter(new erp_texture_cube_importer_1.ErpTextureCubeImporter()); + manager.registerImporter(new render_texture_importer_1.RenderTextureImporter()); + // Other + manager.registerImporter(new physics_material_importer_1.PhysicsMaterialImporter()); + manager.registerImporter(new fbx_importer_1.FbxImporter()); + manager.registerImporter(new gltf_importer_1.GltfImporter()); + manager.registerImporter(new directory_importer_1.DirectoryImporter()); + manager.registerImporter(new auto_atlas_importer_1.AutoAtlasImporter()); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zb3VyY2UvdXRjcC91dGlscy9hc3NldC1pbXBvcnRlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQW1DQSxvREE2QkM7QUFoRUQseURBQXFEO0FBQ3JELDJEQUF1RDtBQUN2RCx5REFBcUQ7QUFDckQsdURBQW1EO0FBQ25ELDJFQUFzRTtBQUN0RSxpREFBNkM7QUFDN0MsbURBQStDO0FBQy9DLDZEQUF5RDtBQUN6RCwrREFBMEQ7QUFDMUQsdURBQW1EO0FBQ25ELHFEQUFpRDtBQUNqRCxtRUFBOEQ7QUFDOUQsbUVBQThEO0FBQzlELDJFQUFxRTtBQUNyRSx1RUFBa0U7QUFDbEUsMkVBQXNFO0FBRXRFLGtEQUFnQztBQUNoQyxxREFBbUM7QUFDbkMsc0RBQW9DO0FBQ3BDLHFEQUFtQztBQUNuQyxvREFBa0M7QUFDbEMsOERBQTRDO0FBQzVDLGlEQUErQjtBQUMvQixrREFBZ0M7QUFDaEMsdURBQXFDO0FBQ3JDLHdEQUFzQztBQUN0QyxvREFBa0M7QUFDbEMsbURBQWlDO0FBQ2pDLDBEQUF3QztBQUN4QywwREFBd0M7QUFDeEMsOERBQTRDO0FBQzVDLDREQUEwQztBQUMxQyw4REFBNEM7QUFFNUMsU0FBZ0Isb0JBQW9CO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLGtDQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFOUMsbUJBQW1CO0lBQ25CLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLG1EQUF1QixFQUFFLENBQUMsQ0FBQztJQUV4RCxXQUFXO0lBQ1gsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksb0NBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBRWpELFVBQVU7SUFDVixPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxnQ0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWE7SUFFN0QsU0FBUztJQUNULE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLGdDQUFjLEVBQUUsQ0FBQyxDQUFDO0lBRS9DLG9CQUFvQjtJQUNwQixPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSw4QkFBYSxFQUFFLENBQUMsQ0FBQztJQUM5QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxrQ0FBZSxFQUFFLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSwyQ0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDcEQsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksMkNBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLGtEQUFzQixFQUFFLENBQUMsQ0FBQztJQUN2RCxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSwrQ0FBcUIsRUFBRSxDQUFDLENBQUM7SUFFdEQsUUFBUTtJQUNSLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLG1EQUF1QixFQUFFLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSwwQkFBVyxFQUFFLENBQUMsQ0FBQztJQUM1QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSw0QkFBWSxFQUFFLENBQUMsQ0FBQztJQUM3QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxzQ0FBaUIsRUFBRSxDQUFDLENBQUM7SUFDbEQsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksdUNBQWlCLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbXBvcnRlck1hbmFnZXIgfSBmcm9tICcuL2ltcG9ydGVyLW1hbmFnZXInO1xuaW1wb3J0IHsgTWF0ZXJpYWxJbXBvcnRlciB9IGZyb20gJy4vbWF0ZXJpYWwtaW1wb3J0ZXInO1xuaW1wb3J0IHsgVGV4dHVyZUltcG9ydGVyIH0gZnJvbSAnLi90ZXh0dXJlLWltcG9ydGVyJztcbmltcG9ydCB7IFNjcmlwdEltcG9ydGVyIH0gZnJvbSAnLi9zY3JpcHQtaW1wb3J0ZXInO1xuaW1wb3J0IHsgUGh5c2ljc01hdGVyaWFsSW1wb3J0ZXIgfSBmcm9tICcuL3BoeXNpY3MtbWF0ZXJpYWwtaW1wb3J0ZXInO1xuaW1wb3J0IHsgRmJ4SW1wb3J0ZXIgfSBmcm9tICcuL2ZieC1pbXBvcnRlcic7XG5pbXBvcnQgeyBHbHRmSW1wb3J0ZXIgfSBmcm9tICcuL2dsdGYtaW1wb3J0ZXInO1xuaW1wb3J0IHsgRGlyZWN0b3J5SW1wb3J0ZXIgfSBmcm9tICcuL2RpcmVjdG9yeS1pbXBvcnRlcic7XG5pbXBvcnQgeyBBdXRvQXRsYXNJbXBvcnRlciB9IGZyb20gJy4vYXV0by1hdGxhcy1pbXBvcnRlcic7XG5pbXBvcnQgeyBQcmVmYWJJbXBvcnRlciB9IGZyb20gJy4vcHJlZmFiLWltcG9ydGVyJztcbmltcG9ydCB7IEltYWdlSW1wb3J0ZXIgfSBmcm9tICcuL2ltYWdlLWltcG9ydGVyJztcbmltcG9ydCB7IFNwcml0ZUZyYW1lSW1wb3J0ZXIgfSBmcm9tICcuL3Nwcml0ZS1mcmFtZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBUZXh0dXJlQ3ViZUltcG9ydGVyIH0gZnJvbSAnLi90ZXh0dXJlLWN1YmUtaW1wb3J0ZXInO1xuaW1wb3J0IHsgRXJwVGV4dHVyZUN1YmVJbXBvcnRlciB9IGZyb20gJy4vZXJwLXRleHR1cmUtY3ViZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBSZW5kZXJUZXh0dXJlSW1wb3J0ZXIgfSBmcm9tICcuL3JlbmRlci10ZXh0dXJlLWltcG9ydGVyJztcbmltcG9ydCB7IFByb2plY3RTZXR0aW5nc0ltcG9ydGVyIH0gZnJvbSAnLi9wcm9qZWN0LXNldHRpbmdzLWltcG9ydGVyJztcblxuZXhwb3J0ICogZnJvbSAnLi9iYXNlLWltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW1wb3J0ZXItbWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICcuL21hdGVyaWFsLWltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdGV4dHVyZS1pbXBvcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3NjcmlwdC1pbXBvcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3BoeXNpY3MtbWF0ZXJpYWwtaW1wb3J0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9mYngtaW1wb3J0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9nbHRmLWltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vZGlyZWN0b3J5LWltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vYXV0by1hdGxhcy1pbXBvcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ByZWZhYi1pbXBvcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2ltYWdlLWltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3ByaXRlLWZyYW1lLWltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdGV4dHVyZS1jdWJlLWltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vZXJwLXRleHR1cmUtY3ViZS1pbXBvcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3JlbmRlci10ZXh0dXJlLWltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvamVjdC1zZXR0aW5ncy1pbXBvcnRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbEltcG9ydGVycygpIHtcbiAgICBjb25zdCBtYW5hZ2VyID0gSW1wb3J0ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgXG4gICAgLy8gUHJvamVjdCBTZXR0aW5nc1xuICAgIG1hbmFnZXIucmVnaXN0ZXJJbXBvcnRlcihuZXcgUHJvamVjdFNldHRpbmdzSW1wb3J0ZXIoKSk7XG5cbiAgICAvLyBNYXRlcmlhbFxuICAgIG1hbmFnZXIucmVnaXN0ZXJJbXBvcnRlcihuZXcgTWF0ZXJpYWxJbXBvcnRlcigpKTtcbiAgICBcbiAgICAvLyBTY3JpcHRzXG4gICAgbWFuYWdlci5yZWdpc3RlckltcG9ydGVyKG5ldyBTY3JpcHRJbXBvcnRlcigpKTsgLy8gdHlwZXNjcmlwdFxuXG4gICAgLy8gUHJlZmFiXG4gICAgbWFuYWdlci5yZWdpc3RlckltcG9ydGVyKG5ldyBQcmVmYWJJbXBvcnRlcigpKTtcbiAgICBcbiAgICAvLyBUZXh0dXJlcyAmIEltYWdlc1xuICAgIG1hbmFnZXIucmVnaXN0ZXJJbXBvcnRlcihuZXcgSW1hZ2VJbXBvcnRlcigpKTtcbiAgICBtYW5hZ2VyLnJlZ2lzdGVySW1wb3J0ZXIobmV3IFRleHR1cmVJbXBvcnRlcigpKTtcbiAgICBtYW5hZ2VyLnJlZ2lzdGVySW1wb3J0ZXIobmV3IFNwcml0ZUZyYW1lSW1wb3J0ZXIoKSk7XG4gICAgbWFuYWdlci5yZWdpc3RlckltcG9ydGVyKG5ldyBUZXh0dXJlQ3ViZUltcG9ydGVyKCkpO1xuICAgIG1hbmFnZXIucmVnaXN0ZXJJbXBvcnRlcihuZXcgRXJwVGV4dHVyZUN1YmVJbXBvcnRlcigpKTtcbiAgICBtYW5hZ2VyLnJlZ2lzdGVySW1wb3J0ZXIobmV3IFJlbmRlclRleHR1cmVJbXBvcnRlcigpKTtcbiAgICBcbiAgICAvLyBPdGhlclxuICAgIG1hbmFnZXIucmVnaXN0ZXJJbXBvcnRlcihuZXcgUGh5c2ljc01hdGVyaWFsSW1wb3J0ZXIoKSk7XG4gICAgbWFuYWdlci5yZWdpc3RlckltcG9ydGVyKG5ldyBGYnhJbXBvcnRlcigpKTtcbiAgICBtYW5hZ2VyLnJlZ2lzdGVySW1wb3J0ZXIobmV3IEdsdGZJbXBvcnRlcigpKTtcbiAgICBtYW5hZ2VyLnJlZ2lzdGVySW1wb3J0ZXIobmV3IERpcmVjdG9yeUltcG9ydGVyKCkpO1xuICAgIG1hbmFnZXIucmVnaXN0ZXJJbXBvcnRlcihuZXcgQXV0b0F0bGFzSW1wb3J0ZXIoKSk7XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/material-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/material-importer.js new file mode 100644 index 0000000..6cb3894 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/material-importer.js @@ -0,0 +1,322 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaterialImporter = void 0; +const base_importer_1 = require("./base-importer"); +class MaterialImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'material'; + } + async getProperties(assetInfo) { + var _a; + const materialDump = await Editor.Message.request('scene', 'query-material', assetInfo.uuid); + if (!materialDump) { + throw new Error('Material dump not found'); + } + const propertyContainer = {}; + // Get Effect Info + const collator = new Intl.Collator(undefined, { numeric: true }); + const effects = Object.values(await Editor.Message.request('scene', 'query-all-effects')) + .filter((effect) => !effect.hideInEditor) + .sort((a, b) => collator.compare(a.name, b.name)); + let effectName = (_a = materialDump.effect) !== null && _a !== void 0 ? _a : 'builtin-standard'; + propertyContainer['effect'] = { + value: effectName, + type: 'Enum', + userData: { enumName: 'MaterialEffectAssetName' }, + enumList: effects.map((effect) => ({ name: effect.name.replace('../', ''), value: effect.name })), + visible: true, + readonly: false + }; + if (materialDump.data) { + const techniqueOptions = materialDump.data.map((t, i) => ({ name: t.name || i.toString(), value: i })); + propertyContainer['technique'] = { + value: materialDump.technique, + type: 'Enum', + enumList: techniqueOptions, + visible: true, + readonly: false + }; + const currentTechniqueIndex = materialDump.technique || 0; + const currentTechnique = materialDump.data[currentTechniqueIndex]; + if (currentTechnique && currentTechnique.passes) { + const passes = []; + function checkDefineVisibility(defines, defineMap) { + for (const def of defines) { + if (def.startsWith('!')) { + if (defineMap[def.substring(1)]) { + return false; + } + } + else { + if (!defineMap[def]) { + return false; + } + } + } + return true; + } + currentTechnique.passes.forEach((pass, passIndex) => { + const passProps = {}; + // Create a map of defines for quick lookup + const defineMap = {}; + if (pass.defines) { + // Prepare define map + pass.defines.forEach((def) => { + defineMap[def.name] = def.value; + }); + // Process defines + pass.defines.forEach((def) => { + // Transform define type based on logic + let type = def.type; + let enumList = def.enumList; + switch (def.type) { + case 'Number': + type = 'Enum'; + enumList = []; + if (def.range && def.range.length >= 2) { + for (let i = def.range[0]; i <= def.range[1]; i++) { + enumList.push({ name: `Variant${i}`, value: i }); + } + } + break; + case 'String': + type = 'Enum'; + enumList = []; + if (def.options) { + enumList = def.options.map((str) => ({ name: str, value: str })); + } + break; + case 'Enum': + break; + default: + type = 'Boolean'; + break; + } + const defProp = { + type: type, + extends: [], + value: def.value, + tooltip: def.tooltip, + enumList: enumList, + visible: checkDefineVisibility(def.defines || [], defineMap) + }; + passProps[def.name] = defProp; + }); + } + // Process properties + if (pass.props) { + pass.props.forEach((prop) => { + // Inject extends: ['cc.ValueType'] for known value types to prevent custom class generation + let extendsData = prop.extends || []; + if (['Vec2', 'Vec3', 'Vec4', 'Color', 'Rect', 'Size', 'Quat', 'Mat3', 'Mat4'].includes(prop.type)) { + if (!extendsData.includes('cc.ValueType')) { + extendsData = [...extendsData, 'cc.ValueType']; + } + } + const valProp = Object.assign(Object.assign({}, prop), { displayName: prop.displayName || prop.name, visible: checkDefineVisibility(prop.defines || [], defineMap), extends: extendsData }); + passProps[prop.name] = valProp; + }); + } + const passHasProps = Object.keys(passProps).length > 0; + passProps['phase'] = { + extends: [], + type: 'String', + value: pass.phase || '', + visible: true, + readonly: true + }; + passes.push({ + extends: ['cc.MaterialPass'], + value: passProps, + type: `cc.MaterialPass${passHasProps ? passIndex : ''}` + }); + }); + const passesProp = { + value: passes, + type: 'cc.MaterialPasses', + visible: true + }; + propertyContainer['passes'] = passesProp; + } + } + return propertyContainer; + } + async setProperty(assetInfo, path, value) { + // 1. Get the current material dump + const materialDump = await Editor.Message.request('scene', 'query-material', assetInfo.uuid); + if (!materialDump) { + return false; + } + let handled = false; + // 2. Handle simple root properties + if (path === 'effectAsset' || path === 'effect') { + const effects = await Editor.Message.request('scene', 'query-all-effects'); + if (value && value.name) { + value = value.name; + } + if (typeof value === 'object' && 'uuid' in value) { + value = value.uuid; + } + if (effects[value]) { + value = effects[value].name; + handled = true; + } + else { + const effect = effects.find((eff) => eff.name === value); + if (effect) { + value = effect.name; + handled = true; + } + else { + // Effect not found + throw new Error(`Effect '${value}' not found`); + } + } + } + else if (path === 'technique') { + materialDump.technique = value; + handled = true; + } + else { + // 3. Handle data/props traversal + const techniqueIndex = materialDump.technique || 0; + const technique = materialDump.data[techniqueIndex]; + if (technique && technique.passes) { + const parts = path.split('.'); + let targetPassIndices = []; + let propPathParts = []; + // Check for explicit pass path "passes.0.propName..." + if (parts[0] === 'passes' && !isNaN(parseInt(parts[1]))) { + targetPassIndices = [parseInt(parts[1])]; + propPathParts = parts.slice(2); + } + else { + // Implicit: Search all passes in current technique + targetPassIndices = technique.passes.map((_, i) => i); + propPathParts = parts; + } + if (propPathParts.length > 0) { + const propName = propPathParts[0]; + const subProps = propPathParts.slice(1); + const setDeepProperty = (target, pathParts, val) => { + let current = target; + // Navigate to the parent of the target property + for (let i = 0; i < pathParts.length - 1; i++) { + const key = pathParts[i]; + // 1. Try to access key directly + if (current[key] !== undefined) { + current = current[key]; + continue; + } + // 2. Try to drill into .value (if current is a wrapper) + if (current.value && typeof current.value === 'object' && current.value[key] !== undefined) { + current = current.value[key]; + continue; + } + // 3. Special case for arrays where we might be accessing by index but current is a wrapper + if (current.value && Array.isArray(current.value) && current.value[key] !== undefined) { + current = current.value[key]; + continue; + } + // Path not found + return false; + } + const lastKey = pathParts[pathParts.length - 1]; + // Helper to set on the final object + const setOnObject = (obj) => { + if (obj[lastKey] === undefined) + return false; + const targetProp = obj[lastKey]; + // Check if the target is a Property Wrapper (Object with .value) + // We avoid Arrays or nulls + if (targetProp && typeof targetProp === 'object' && !Array.isArray(targetProp) && 'value' in targetProp) { + targetProp.value = val; + } + else { + // It's a raw value (primitive or struct without wrapper) + obj[lastKey] = val; + } + return true; + }; + // 1. Try direct set + if (setOnObject(current)) + return true; + // 2. Try set on .value (if wrapper) + if (current.value && typeof current.value === 'object') { + if (setOnObject(current.value)) + return true; + } + return false; + }; + targetPassIndices.forEach(passIndex => { + const pass = technique.passes[passIndex]; + if (!pass) + return; + // 1. Search in props (Array) + if (pass.props) { + const prop = pass.props.find((p) => p.name === propName); + if (prop) { + if (subProps.length === 0) { + if (typeof value === 'string' && prop.type && + (prop.type.toLowerCase().includes('texture') || prop.type.toLowerCase().includes('sampler'))) { + prop.value = { uuid: value }; + } + else { + prop.value = value; + } + handled = true; + } + else { + // Validate if prop.value is object for deep set + if (prop.value && typeof prop.value === 'object') { + if (setDeepProperty(prop, subProps, value)) { + handled = true; + } + } + } + } + } + // 2. Search in defines (Array) + if (pass.defines) { + const define = pass.defines.find((d) => d.name === propName); + if (define) { + if (subProps.length === 0) { + define.value = value; + handled = true; + } + } + } + // 3. Search in states (Object) + if (pass.states && pass.states.value) { + // Check direct state property (e.g., "priority", "primitive") + if (pass.states.value[propName]) { + const stateProp = pass.states.value[propName]; + if (subProps.length === 0) { + stateProp.value = value; + handled = true; + } + else { + if (stateProp.value && typeof stateProp.value === 'object') { + if (setDeepProperty(stateProp, subProps, value)) { + handled = true; + } + } + } + } + } + }); + } + } + } + // 4. Apply changes + if (handled) { + await Editor.Message.request('scene', 'apply-material', assetInfo.uuid, materialDump); + Editor.Message.broadcast('material-inspector:change-dump'); + return true; + } + return false; + } +} +exports.MaterialImporter = MaterialImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwtaW1wb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zb3VyY2UvdXRjcC91dGlscy9hc3NldC1pbXBvcnRlcnMvbWF0ZXJpYWwtaW1wb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQW9EO0FBSXBELE1BQWEsZ0JBQWlCLFNBQVEsaUNBQWlCO0lBQXZEOztRQUNJLFNBQUksR0FBRyxVQUFVLENBQUM7SUErVnRCLENBQUM7SUE3VkcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFjOztRQUM5QixNQUFNLFlBQVksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBaUMsRUFBRSxDQUFDO1FBRTNELGtCQUFrQjtRQUNsQixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2FBQ3BGLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBRSxNQUFjLENBQUMsWUFBWSxDQUFDO2FBQ2pELElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUUsQ0FBUyxDQUFDLElBQUksRUFBRyxDQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztR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b0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLElBQUksT0FBTyxFQUFFLENBQUM7WUFDVCxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3RGLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDM0QsT0FBTyxJQUFJLENBQUM7UUFDakIsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSjtBQWhXRCw0Q0FnV0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQXNzZXRJbXBvcnRlciB9IGZyb20gJy4vYmFzZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBJQXNzZXRJbmZvIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL2Fzc2V0LWRiL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0IHsgSVByb3BlcnR5LCBJUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5cbmV4cG9ydCBjbGFzcyBNYXRlcmlhbEltcG9ydGVyIGV4dGVuZHMgQmFzZUFzc2V0SW1wb3J0ZXIge1xuICAgIG5hbWUgPSAnbWF0ZXJpYWwnO1xuXG4gICAgYXN5bmMgZ2V0UHJvcGVydGllcyhhc3NldEluZm86IGFueSk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfT4ge1xuICAgICAgICBjb25zdCBtYXRlcmlhbER1bXAgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1tYXRlcmlhbCcsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghbWF0ZXJpYWxEdW1wKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdGVyaWFsIGR1bXAgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9wZXJ0eUNvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuXG4gICAgICAgIC8vIEdldCBFZmZlY3QgSW5mb1xuICAgICAgICBjb25zdCBjb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBlZmZlY3RzID0gT2JqZWN0LnZhbHVlcyhhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1hbGwtZWZmZWN0cycpKVxuICAgICAgICAgICAgLmZpbHRlcigoZWZmZWN0KSA9PiAhKGVmZmVjdCBhcyBhbnkpLmhpZGVJbkVkaXRvcilcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBjb2xsYXRvci5jb21wYXJlKChhIGFzIGFueSkubmFtZSwgKGIgYXMgYW55KS5uYW1lKSk7XG5cbiAgICAgICAgbGV0IGVmZmVjdE5hbWUgPSBtYXRlcmlhbER1bXAuZWZmZWN0ID8/ICdidWlsdGluLXN0YW5kYXJkJztcblxuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lclsnZWZmZWN0J10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogZWZmZWN0TmFtZSxcbiAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgIHVzZXJEYXRhOiB7IGVudW1OYW1lOiAnTWF0ZXJpYWxFZmZlY3RBc3NldE5hbWUnIH0sXG4gICAgICAgICAgICBlbnVtTGlzdDogZWZmZWN0cy5tYXAoKGVmZmVjdDogYW55KSA9PiAoeyBuYW1lOiBlZmZlY3QubmFtZS5yZXBsYWNlKCcuLi8nLCAnJyksIHZhbHVlOiBlZmZlY3QubmFtZSB9KSksXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgcmVhZG9ubHk6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hdGVyaWFsRHVtcC5kYXRhKSB7XG4gICAgICAgICAgICBjb25zdCB0ZWNobmlxdWVPcHRpb25zID0gbWF0ZXJpYWxEdW1wLmRhdGEubWFwKCh0OiBhbnksIGk6IG51bWJlcikgPT4gKHsgbmFtZTogdC5uYW1lIHx8IGkudG9TdHJpbmcoKSwgdmFsdWU6IGkgfSkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lclsndGVjaG5pcXVlJ10gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG1hdGVyaWFsRHVtcC50ZWNobmlxdWUsXG4gICAgICAgICAgICAgICAgdHlwZTogJ0VudW0nLFxuICAgICAgICAgICAgICAgIGVudW1MaXN0OiB0ZWNobmlxdWVPcHRpb25zLFxuICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVhZG9ubHk6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VGVjaG5pcXVlSW5kZXggPSBtYXRlcmlhbER1bXAudGVjaG5pcXVlIHx8IDA7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VGVjaG5pcXVlID0gbWF0ZXJpYWxEdW1wLmRhdGFbY3VycmVudFRlY2huaXF1ZUluZGV4XTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGN1cnJlbnRUZWNobmlxdWUgJiYgY3VycmVudFRlY2huaXF1ZS5wYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXNzZXM6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjaGVja0RlZmluZVZpc2liaWxpdHkoZGVmaW5lczogYW55W10sIGRlZmluZU1hcDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZpbmVNYXBbZGVmLnN1YnN0cmluZygxKV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVNYXBbZGVmXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZWNobmlxdWUucGFzc2VzLmZvckVhY2goKHBhc3M6IGFueSwgcGFzc0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc1Byb3BzOiB7IFtrZXk6c3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG1hcCBvZiBkZWZpbmVzIGZvciBxdWljayBsb29rdXBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmaW5lTWFwOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzcy5kZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIGRlZmluZSBtYXBcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MuZGVmaW5lcy5mb3JFYWNoKChkZWY6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZU1hcFtkZWYubmFtZV0gPSBkZWYudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBkZWZpbmVzXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLmRlZmluZXMuZm9yRWFjaCgoZGVmOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gZGVmaW5lIHR5cGUgYmFzZWQgb24gbG9naWNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGRlZi50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnVtTGlzdCA9IGRlZi5lbnVtTGlzdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVmLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnRW51bSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZi5yYW5nZSAmJiBkZWYucmFuZ2UubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gZGVmLnJhbmdlWzBdOyBpIDw9IGRlZi5yYW5nZVsxXTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1MaXN0LnB1c2goeyBuYW1lOiBgVmFyaWFudCR7aX1gLCB2YWx1ZTogaSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnRW51bSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZi5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bUxpc3QgPSBkZWYub3B0aW9ucy5tYXAoKHN0cjogc3RyaW5nKSA9PiAoeyBuYW1lOiBzdHIsIHZhbHVlOiBzdHIgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0VudW0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ0Jvb2xlYW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmUHJvcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkZWYudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6IGRlZi50b29sdGlwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTGlzdDogZW51bUxpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGNoZWNrRGVmaW5lVmlzaWJpbGl0eShkZWYuZGVmaW5lcyB8fCBbXSwgZGVmaW5lTWFwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1Byb3BzW2RlZi5uYW1lXSA9IGRlZlByb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzcy5wcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5wcm9wcy5mb3JFYWNoKChwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmplY3QgZXh0ZW5kczogWydjYy5WYWx1ZVR5cGUnXSBmb3Iga25vd24gdmFsdWUgdHlwZXMgdG8gcHJldmVudCBjdXN0b20gY2xhc3MgZ2VuZXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleHRlbmRzRGF0YSA9IHByb3AuZXh0ZW5kcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWydWZWMyJywgJ1ZlYzMnLCAnVmVjNCcsICdDb2xvcicsICdSZWN0JywgJ1NpemUnLCAnUXVhdCcsICdNYXQzJywgJ01hdDQnXS5pbmNsdWRlcyhwcm9wLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXh0ZW5kc0RhdGEuaW5jbHVkZXMoJ2NjLlZhbHVlVHlwZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzRGF0YSA9IFsuLi5leHRlbmRzRGF0YSwgJ2NjLlZhbHVlVHlwZSddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsUHJvcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IHByb3AuZGlzcGxheU5hbWUgfHwgcHJvcC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBjaGVja0RlZmluZVZpc2liaWxpdHkocHJvcC5kZWZpbmVzIHx8IFtdLCBkZWZpbmVNYXApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1Byb3BzW3Byb3AubmFtZV0gPSB2YWxQcm9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXNzSGFzUHJvcHMgPSBPYmplY3Qua2V5cyhwYXNzUHJvcHMpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFzc1Byb3BzWydwaGFzZSddID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXNzLnBoYXNlIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogWydjYy5NYXRlcmlhbFBhc3MnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXNzUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBgY2MuTWF0ZXJpYWxQYXNzJHtwYXNzSGFzUHJvcHMgPyBwYXNzSW5kZXggOiAnJ31gXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3Nlc1Byb3A6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhc3NlcyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NjLk1hdGVyaWFsUGFzc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcHJvcGVydHlDb250YWluZXJbJ3Bhc3NlcyddID0gcGFzc2VzUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRQcm9wZXJ0eShhc3NldEluZm86IElBc3NldEluZm8sIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICAvLyAxLiBHZXQgdGhlIGN1cnJlbnQgbWF0ZXJpYWwgZHVtcFxuICAgICAgICBjb25zdCBtYXRlcmlhbER1bXAgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1tYXRlcmlhbCcsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgaWYgKCFtYXRlcmlhbER1bXApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gMi4gSGFuZGxlIHNpbXBsZSByb290IHByb3BlcnRpZXNcbiAgICAgICAgaWYgKHBhdGggPT09ICdlZmZlY3RBc3NldCcgfHwgcGF0aCA9PT0gJ2VmZmVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVmZmVjdHMgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1hbGwtZWZmZWN0cycpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLm5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAndXVpZCcgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnV1aWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWZmZWN0c1t2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVmZmVjdHNbdmFsdWVdLm5hbWU7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdCA9IGVmZmVjdHMuZmluZCgoZWZmOiBhbnkpID0+IGVmZi5uYW1lID09PSB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVmZmVjdC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBFZmZlY3Qgbm90IGZvdW5kXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWZmZWN0ICcke3ZhbHVlfScgbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhdGggPT09ICd0ZWNobmlxdWUnKSB7XG4gICAgICAgICAgICBtYXRlcmlhbER1bXAudGVjaG5pcXVlID0gdmFsdWU7XG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIDMuIEhhbmRsZSBkYXRhL3Byb3BzIHRyYXZlcnNhbFxuICAgICAgICAgICAgY29uc3QgdGVjaG5pcXVlSW5kZXggPSBtYXRlcmlhbER1bXAudGVjaG5pcXVlIHx8IDA7XG4gICAgICAgICAgICBjb25zdCB0ZWNobmlxdWUgPSBtYXRlcmlhbER1bXAuZGF0YVt0ZWNobmlxdWVJbmRleF07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0ZWNobmlxdWUgJiYgdGVjaG5pcXVlLnBhc3Nlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRQYXNzSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcFBhdGhQYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHBsaWNpdCBwYXNzIHBhdGggXCJwYXNzZXMuMC5wcm9wTmFtZS4uLlwiXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzWzBdID09PSAncGFzc2VzJyAmJiAhaXNOYU4ocGFyc2VJbnQocGFydHNbMV0pKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRQYXNzSW5kaWNlcyA9IFtwYXJzZUludChwYXJ0c1sxXSldO1xuICAgICAgICAgICAgICAgICAgICBwcm9wUGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGljaXQ6IFNlYXJjaCBhbGwgcGFzc2VzIGluIGN1cnJlbnQgdGVjaG5pcXVlXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFBhc3NJbmRpY2VzID0gdGVjaG5pcXVlLnBhc3Nlcy5tYXAoKF86IGFueSwgaTogbnVtYmVyKSA9PiBpKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcFBhdGhQYXJ0cyA9IHBhcnRzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwcm9wUGF0aFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBwcm9wUGF0aFBhcnRzWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJQcm9wcyA9IHByb3BQYXRoUGFydHMuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0RGVlcFByb3BlcnR5ID0gKHRhcmdldDogYW55LCBwYXRoUGFydHM6IHN0cmluZ1tdLCB2YWw6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBwYXJlbnQgb2YgdGhlIHRhcmdldCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoUGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcGF0aFBhcnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFRyeSB0byBhY2Nlc3Mga2V5IGRpcmVjdGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBUcnkgdG8gZHJpbGwgaW50byAudmFsdWUgKGlmIGN1cnJlbnQgaXMgYSB3cmFwcGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnZhbHVlICYmIHR5cGVvZiBjdXJyZW50LnZhbHVlID09PSAnb2JqZWN0JyAmJiBjdXJyZW50LnZhbHVlW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC52YWx1ZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiBTcGVjaWFsIGNhc2UgZm9yIGFycmF5cyB3aGVyZSB3ZSBtaWdodCBiZSBhY2Nlc3NpbmcgYnkgaW5kZXggYnV0IGN1cnJlbnQgaXMgYSB3cmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQudmFsdWUgJiYgQXJyYXkuaXNBcnJheShjdXJyZW50LnZhbHVlKSAmJiBjdXJyZW50LnZhbHVlW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC52YWx1ZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXRoIG5vdCBmb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEtleSA9IHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciB0byBzZXQgb24gdGhlIGZpbmFsIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0T25PYmplY3QgPSAob2JqOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ialtsYXN0S2V5XSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0UHJvcCA9IG9ialtsYXN0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgaXMgYSBQcm9wZXJ0eSBXcmFwcGVyIChPYmplY3Qgd2l0aCAudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGF2b2lkIEFycmF5cyBvciBudWxsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0UHJvcCAmJiB0eXBlb2YgdGFyZ2V0UHJvcCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodGFyZ2V0UHJvcCkgJiYgJ3ZhbHVlJyBpbiB0YXJnZXRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm9wLnZhbHVlID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBhIHJhdyB2YWx1ZSAocHJpbWl0aXZlIG9yIHN0cnVjdCB3aXRob3V0IHdyYXBwZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbbGFzdEtleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBUcnkgZGlyZWN0IHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldE9uT2JqZWN0KGN1cnJlbnQpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gVHJ5IHNldCBvbiAudmFsdWUgKGlmIHdyYXBwZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC52YWx1ZSAmJiB0eXBlb2YgY3VycmVudC52YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0T25PYmplY3QoY3VycmVudC52YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRQYXNzSW5kaWNlcy5mb3JFYWNoKHBhc3NJbmRleCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXNzID0gdGVjaG5pcXVlLnBhc3Nlc1twYXNzSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFNlYXJjaCBpbiBwcm9wcyAoQXJyYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcy5wcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwYXNzLnByb3BzLmZpbmQoKHA6IGFueSkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgcHJvcC50eXBlICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wLnR5cGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndGV4dHVyZScpIHx8IHByb3AudHlwZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdzYW1wbGVyJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC52YWx1ZSA9IHsgdXVpZDogdmFsdWUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBpZiBwcm9wLnZhbHVlIGlzIG9iamVjdCBmb3IgZGVlcCBzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLnZhbHVlICYmIHR5cGVvZiBwcm9wLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXREZWVwUHJvcGVydHkocHJvcCwgc3ViUHJvcHMsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIFNlYXJjaCBpbiBkZWZpbmVzIChBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZpbmUgPSBwYXNzLmRlZmluZXMuZmluZCgoZDogYW55KSA9PiBkLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJQcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIFNlYXJjaCBpbiBzdGF0ZXMgKE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzLnN0YXRlcyAmJiBwYXNzLnN0YXRlcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBkaXJlY3Qgc3RhdGUgcHJvcGVydHkgKGUuZy4sIFwicHJpb3JpdHlcIiwgXCJwcmltaXRpdmVcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3Muc3RhdGVzLnZhbHVlW3Byb3BOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVQcm9wID0gcGFzcy5zdGF0ZXMudmFsdWVbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVByb3AudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVQcm9wLnZhbHVlICYmIHR5cGVvZiBzdGF0ZVByb3AudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0RGVlcFByb3BlcnR5KHN0YXRlUHJvcCwgc3ViUHJvcHMsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4gQXBwbHkgY2hhbmdlc1xuICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2FwcGx5LW1hdGVyaWFsJywgYXNzZXRJbmZvLnV1aWQsIG1hdGVyaWFsRHVtcCk7XG4gICAgICAgICAgICAgRWRpdG9yLk1lc3NhZ2UuYnJvYWRjYXN0KCdtYXRlcmlhbC1pbnNwZWN0b3I6Y2hhbmdlLWR1bXAnKTtcbiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/model-base-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/model-base-importer.js new file mode 100644 index 0000000..45d6bb7 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/model-base-importer.js @@ -0,0 +1,204 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ModelBaseImporter = void 0; +const base_importer_1 = require("./base-importer"); +class ModelBaseImporter extends base_importer_1.BaseAssetImporter { + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta || !meta.userData) { + return false; + } + const userData = meta.userData; + let handled = false; + // Support for nested paths (e.g. meshOptimize.enable) + if (path.includes('.')) { + const parts = path.split('.'); + let current = userData; + for (let i = 0; i < parts.length - 1; i++) { + // If the path segment doesn't exist, we might need to create it if it's a known object + // But for now, assume structure exists or fail + if (!current[parts[i]]) { + // Try to be smart? No, just fail for now. + return false; + } + current = current[parts[i]]; + } + if (current) { + current[parts[parts.length - 1]] = value; + handled = true; + } + } + else { + userData[path] = value; + handled = true; + } + if (handled) { + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + return false; + } + async getProperties(assetInfo) { + const assetMeta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!assetMeta) { + throw new Error(`Asset meta not found for ${assetInfo.uuid}`); + } + const userData = assetMeta.userData; + if (!userData) { + throw new Error(`UserData not found for asset ${assetInfo.uuid}`); + } + const properties = this.parseUserData(userData); + console.log('ModelBaseImporter properties:', properties); + this.addSpecificUserData(userData, properties); + console.log('ModelBaseImporter properties after specific:', properties); + return properties; + } + parseUserData(userData) { + const propertyContainer = {}; + // Common Normals/Tangents settings + const normalOptions = [ + { name: 'Optional', value: 0 }, + { name: 'Exclude', value: 1 }, + { name: 'Require', value: 2 }, + { name: 'Recalculate', value: 3 } + ]; + propertyContainer.normals = { + value: userData.normals, + userData: { enumName: 'cc.ModelDataIncludeMode' }, + type: 'Enum', + enumList: normalOptions + }; + propertyContainer.tangents = { + value: userData.tangents, + userData: { enumName: 'cc.ModelDataIncludeMode' }, + type: 'Enum', + enumList: normalOptions + }; + propertyContainer.morphNormals = { + value: userData.morphNormals, + userData: { enumName: 'cc.ModelDataIncludeMode' }, + type: 'Enum', + enumList: normalOptions, + tooltip: 'Required if you need to use normal map on morph targets' + }; + // Booleans + propertyContainer.skipValidation = { value: !!userData.skipValidation, type: 'Boolean', displayName: 'Skip Validation' }; + propertyContainer.disableMeshSplit = { value: !!userData.disableMeshSplit, type: 'Boolean', displayName: 'Disable Mesh Split' }; + propertyContainer.allowMeshDataAccess = { value: !!userData.allowMeshDataAccess, type: 'Boolean', displayName: 'Allow Data Access' }; + propertyContainer.addVertexColor = { value: !!userData.addVertexColor, type: 'Boolean', displayName: 'Add Vertex Color' }; + propertyContainer.promoteSingleRootNode = { value: !!userData.promoteSingleRootNode, type: 'Boolean', displayName: 'Promote Single Root Node' }; + // Optimization Sections as Objects + propertyContainer.meshOptimize = this.createMeshOptimizeObject(userData.meshOptimize); + propertyContainer.meshSimplify = this.createMeshSimplifyObject(userData.meshSimplify); + propertyContainer.meshCluster = this.createMeshClusterObject(userData.meshCluster); + propertyContainer.meshCompress = this.createMeshCompressObject(userData.meshCompress); + propertyContainer.lods = this.createLODsObject(userData.lods); + return propertyContainer; + } + createMeshOptimizeObject(data) { + const props = {}; + if (!data) { + data = { + enable: false, + vertexCache: false, + vertexFetch: false, + overdraw: false + }; + } + props.enable = { value: !!data.enable, type: 'Boolean', tooltip: 'It is recommended to enable these options for models with high vertex count.' }; + props.vertexCache = { value: !!data.vertexCache, type: 'Boolean' }; + props.vertexFetch = { value: !!data.vertexFetch, type: 'Boolean' }; + props.overdraw = { value: !!data.overdraw, type: 'Boolean' }; + return { + value: props, + type: 'cc.MeshOptimizeOptions', + displayName: 'Mesh Optimize' + }; + } + createMeshSimplifyObject(data) { + const props = {}; + if (!data) { + data = { + enable: false, + targetRatio: 1, + autoErrorRate: false, + errorRate: 1, + lockBoundary: false + }; + } + props.enable = { value: !!data.enable, type: 'Boolean' }; + props.targetRatio = { value: data.targetRatio, type: 'Float', min: 0, max: 1, step: 0.01, tooltip: 'The target ratio of the simplified mesh data. It is recommended to set this value to 0.5.' }; + props.autoErrorRate = { value: !!data.autoErrorRate, type: 'Boolean' }; + props.errorRate = { value: data.errorRate, type: 'Float', min: 0, max: 1, step: 0.01, tooltip: 'The max error rate of the simplified mesh data. This value also alters the result size. It is recommended to tune until you get a good result.', visible: !data.autoErrorRate }; + props.lockBoundary = { value: !!data.lockBoundary, type: 'Boolean' }; + return { + value: props, + type: 'cc.MeshSimplifyOptions', + displayName: 'Mesh Simplify' + }; + } + createMeshClusterObject(data) { + const props = {}; + if (!data) { + data = { + enable: false, + generateBounding: false + }; + } + props.enable = { value: !!data.enable, type: 'Boolean' }; + props.generateBounding = { value: !!data.generateBounding, type: 'Boolean', tooltip: 'Whether to generate bounding sphere and normal cone for the clustered mesh data.' }; + return { + value: props, + type: 'cc.MeshClusterOptions', + displayName: 'Mesh Cluster' + }; + } + createMeshCompressObject(data) { + const props = {}; + if (!data) { + data = { + enable: false, + encode: false, + compress: false, + quantize: false + }; + } + props.enable = { value: !!data.enable, type: 'Boolean' }; + props.encode = { value: !!data.encode, type: 'Boolean' }; + props.compress = { value: !!data.compress, type: 'Boolean' }; + props.quantize = { value: !!data.quantize, type: 'Boolean' }; + return { + value: props, + type: 'cc.MeshCompressOptions', + displayName: 'Mesh Compress' + }; + } + createLODsObject(data) { + const props = {}; + if (!data) { + data = { + enable: false, + options: [] + }; + } + props.enable = { value: !!data.enable, type: 'Boolean', displayName: 'Enable' }; + if (data.options && Array.isArray(data.options)) { + data.options.forEach((opt, index) => { + const lodProps = {}; + lodProps.screenRatio = { value: opt.screenRatio, type: 'Number', displayName: 'Screen Ratio' }; + lodProps.faceCount = { value: opt.faceCount, type: 'Number', displayName: 'Face Count', readonly: true }; + props[`lod${index}`] = { + value: lodProps, + type: 'cc.LodOptions', + }; + }); + } + return { + value: props, + type: 'cc.LodGroups', + displayName: 'LODs' + }; + } +} +exports.ModelBaseImporter = ModelBaseImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtYmFzZS1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy9tb2RlbC1iYXNlLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFvRDtBQUlwRCxNQUFzQixpQkFBa0IsU0FBUSxpQ0FBaUI7SUFFN0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFxQixFQUFFLElBQVksRUFBRSxLQUFVO1FBQzdELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVwQixzREFBc0Q7UUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3hDLHVGQUF1RjtnQkFDdkYsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3JCLDBDQUEwQztvQkFDMUMsT0FBTyxLQUFLLENBQUM7Z0JBQ2pCLENBQUM7Z0JBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3pDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbkIsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN2QixPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEcsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQXFCO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvRixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RSxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBSVMsYUFBYSxDQUFDLFFBQWE7UUFDakMsTUFBTSxpQkFBaUIsR0FBaUMsRUFBRSxDQUFDO1FBRTNELG1DQUFtQztRQUNuQyxNQUFNLGFBQWEsR0FBRztZQUNsQixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUM5QixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUM3QixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUM3QixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtTQUNwQyxDQUFDO1FBRUYsaUJBQWlCLENBQUMsT0FBTyxHQUFHO1lBQ3hCLEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTztZQUN2QixRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUU7WUFDakQsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsYUFBYTtTQUMxQixDQUFDO1FBQ0YsaUJBQWlCLENBQUMsUUFBUSxHQUFHO1lBQ3pCLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUTtZQUN4QixRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUU7WUFDakQsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsYUFBYTtTQUMxQixDQUFDO1FBQ0YsaUJBQWlCLENBQUMsWUFBWSxHQUFHO1lBQzdCLEtBQUssRUFBRSxRQUFRLENBQUMsWUFBWTtZQUM1QixRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUU7WUFDakQsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsYUFBYTtZQUN2QixPQUFPLEVBQUUseURBQXlEO1NBQ3JFLENBQUM7UUFFRixXQUFXO1FBQ1gsaUJBQWlCLENBQUMsY0FBYyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLENBQUM7UUFDekgsaUJBQWlCLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hJLGlCQUFpQixDQUFDLG1CQUFtQixHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztRQUNySSxpQkFBaUIsQ0FBQyxjQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztRQUMxSCxpQkFBaUIsQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLDBCQUEwQixFQUFFLENBQUM7UUFFaEosbUNBQW1DO1FBQ25DLGlCQUFpQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RGLGlCQUFpQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RGLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25GLGlCQUFpQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RGLGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlELE9BQU8saUJBQWlCLENBQUM7SUFDN0IsQ0FBQztJQUVPLHdCQUF3QixDQUFDLElBQVM7UUFDdEMsTUFBTSxLQUFLLEdBQWlDLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixJQUFJLEdBQUc7Z0JBQ0gsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLFdBQVcsRUFBRSxLQUFLO2dCQUNsQixRQUFRLEVBQUUsS0FBSzthQUNsQixDQUFDO1FBQ04sQ0FBQztRQUVELEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsOEVBQThFLEVBQUMsQ0FBQztRQUNqSixLQUFLLENBQUMsV0FBVyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUNuRSxLQUFLLENBQUMsV0FBVyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsQ0FBQztRQUNsRSxLQUFLLENBQUMsUUFBUSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsQ0FBQztRQUU1RCxPQUFPO1lBQ0gsS0FBSyxFQUFFLEtBQUs7WUFDWixJQUFJLEVBQUUsd0JBQXdCO1lBQzlCLFdBQVcsRUFBRSxlQUFlO1NBQy9CLENBQUM7SUFDTixDQUFDO0lBRU8sd0JBQXdCLENBQUMsSUFBUztRQUN0QyxNQUFNLEtBQUssR0FBaUMsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLElBQUksR0FBRztnQkFDSCxNQUFNLEVBQUUsS0FBSztnQkFDYixXQUFXLEVBQUUsQ0FBQztnQkFDZCxhQUFhLEVBQUUsS0FBSztnQkFDcEIsU0FBUyxFQUFFLENBQUM7Z0JBQ1osWUFBWSxFQUFFLEtBQUs7YUFDdEIsQ0FBQztRQUNOLENBQUM7UUFFRCxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUN6RCxLQUFLLENBQUMsV0FBVyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsMkZBQTJGLEVBQUUsQ0FBQztRQUNqTSxLQUFLLENBQUMsYUFBYSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUN2RSxLQUFLLENBQUMsU0FBUyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsZ0pBQWdKLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hSLEtBQUssQ0FBQyxZQUFZLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBRXJFLE9BQU87WUFDSCxLQUFLLEVBQUUsS0FBSztZQUNaLElBQUksRUFBRSx3QkFBd0I7WUFDOUIsV0FBVyxFQUFFLGVBQWU7U0FDL0IsQ0FBQztJQUNOLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxJQUFTO1FBQ3JDLE1BQU0sS0FBSyxHQUFpQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsSUFBSSxHQUFHO2dCQUNILE1BQU0sRUFBRSxLQUFLO2dCQUNiLGdCQUFnQixFQUFFLEtBQUs7YUFDMUIsQ0FBQztRQUNOLENBQUM7UUFFRCxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUN6RCxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxrRkFBa0YsRUFBRSxDQUFDO1FBRTFLLE9BQU87WUFDSCxLQUFLLEVBQUUsS0FBSztZQUNaLElBQUksRUFBRSx1QkFBdUI7WUFDN0IsV0FBVyxFQUFFLGNBQWM7U0FDOUIsQ0FBQztJQUNOLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxJQUFTO1FBQ3RDLE1BQU0sS0FBSyxHQUFpQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsSUFBSSxHQUFHO2dCQUNILE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFFBQVEsRUFBRSxLQUFLO2FBQ2xCLENBQUM7UUFDTixDQUFDO1FBRUQsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDekQsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDekQsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDN0QsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFFN0QsT0FBTztZQUNILEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLHdCQUF3QjtZQUM5QixXQUFXLEVBQUUsZUFBZTtTQUMvQixDQUFDO0lBQ04sQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQVM7UUFDOUIsTUFBTSxLQUFLLEdBQWlDLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixJQUFJLEdBQUc7Z0JBQ0gsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsT0FBTyxFQUFFLEVBQUU7YUFDZCxDQUFDO1FBQ04sQ0FBQztRQUVELEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFFaEYsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsS0FBYSxFQUFFLEVBQUU7Z0JBQzdDLE1BQU0sUUFBUSxHQUFpQyxFQUFFLENBQUM7Z0JBQ2xELFFBQVEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQztnQkFDL0YsUUFBUSxDQUFDLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBRXpHLEtBQUssQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLEdBQUc7b0JBQ25CLEtBQUssRUFBRSxRQUFRO29CQUNmLElBQUksRUFBRSxlQUFlO2lCQUN4QixDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsT0FBTztZQUNILEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLGNBQWM7WUFDcEIsV0FBVyxFQUFFLE1BQU07U0FDdEIsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQXJPRCw4Q0FxT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQXNzZXRJbXBvcnRlciB9IGZyb20gJy4vYmFzZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBJQXNzZXRJbmZvIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL2Fzc2V0LWRiL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0IHsgSVByb3BlcnR5LCBJUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNb2RlbEJhc2VJbXBvcnRlciBleHRlbmRzIEJhc2VBc3NldEltcG9ydGVyIHtcbiAgICBcbiAgICBhc3luYyBzZXRQcm9wZXJ0eShhc3NldEluZm86IElBc3NldEluZm8sIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgaWYgKCFtZXRhIHx8ICFtZXRhLnVzZXJEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHVzZXJEYXRhID0gbWV0YS51c2VyRGF0YTtcbiAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTdXBwb3J0IGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gbWVzaE9wdGltaXplLmVuYWJsZSlcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IHVzZXJEYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGF0aCBzZWdtZW50IGRvZXNuJ3QgZXhpc3QsIHdlIG1pZ2h0IG5lZWQgdG8gY3JlYXRlIGl0IGlmIGl0J3MgYSBrbm93biBvYmplY3RcbiAgICAgICAgICAgICAgICAvLyBCdXQgZm9yIG5vdywgYXNzdW1lIHN0cnVjdHVyZSBleGlzdHMgb3IgZmFpbFxuICAgICAgICAgICAgICAgIGlmICghY3VycmVudFtwYXJ0c1tpXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGJlIHNtYXJ0PyBObywganVzdCBmYWlsIGZvciBub3cuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydHNbaV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50W3BhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgIHVzZXJEYXRhW3BhdGhdID0gdmFsdWU7XG4gICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAnc2F2ZS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQsIEpTT04uc3RyaW5naWZ5KG1ldGEpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKGFzc2V0SW5mbzogSUFzc2V0SW5mbyk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfT4ge1xuICAgICAgICBjb25zdCBhc3NldE1ldGEgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFhc3NldE1ldGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXQgbWV0YSBub3QgZm91bmQgZm9yICR7YXNzZXRJbmZvLnV1aWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1c2VyRGF0YSA9IGFzc2V0TWV0YS51c2VyRGF0YTtcbiAgICAgICAgaWYgKCF1c2VyRGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVc2VyRGF0YSBub3QgZm91bmQgZm9yIGFzc2V0ICR7YXNzZXRJbmZvLnV1aWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5wYXJzZVVzZXJEYXRhKHVzZXJEYXRhKTtcbiAgICAgICAgY29uc29sZS5sb2coJ01vZGVsQmFzZUltcG9ydGVyIHByb3BlcnRpZXM6JywgcHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuYWRkU3BlY2lmaWNVc2VyRGF0YSh1c2VyRGF0YSwgcHJvcGVydGllcyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEJhc2VJbXBvcnRlciBwcm9wZXJ0aWVzIGFmdGVyIHNwZWNpZmljOicsIHByb3BlcnRpZXMpO1xuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYWRkU3BlY2lmaWNVc2VyRGF0YSh1c2VyRGF0YTogYW55LCBjb250YWluZXI6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0pOiB2b2lkO1xuXG4gICAgcHJvdGVjdGVkIHBhcnNlVXNlckRhdGEodXNlckRhdGE6IGFueSk6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUNvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuXG4gICAgICAgIC8vIENvbW1vbiBOb3JtYWxzL1RhbmdlbnRzIHNldHRpbmdzXG4gICAgICAgIGNvbnN0IG5vcm1hbE9wdGlvbnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdPcHRpb25hbCcsIHZhbHVlOiAwIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdFeGNsdWRlJywgdmFsdWU6IDEgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ1JlcXVpcmUnLCB2YWx1ZTogMiB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnUmVjYWxjdWxhdGUnLCB2YWx1ZTogMyB9XG4gICAgICAgIF07XG5cbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubm9ybWFscyA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5ub3JtYWxzLFxuICAgICAgICAgICAgdXNlckRhdGE6IHsgZW51bU5hbWU6ICdjYy5Nb2RlbERhdGFJbmNsdWRlTW9kZScgfSxcbiAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgIGVudW1MaXN0OiBub3JtYWxPcHRpb25zXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnRhbmdlbnRzID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLnRhbmdlbnRzLFxuICAgICAgICAgICAgdXNlckRhdGE6IHsgZW51bU5hbWU6ICdjYy5Nb2RlbERhdGFJbmNsdWRlTW9kZScgfSxcbiAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgIGVudW1MaXN0OiBub3JtYWxPcHRpb25zXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLm1vcnBoTm9ybWFscyA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5tb3JwaE5vcm1hbHMsXG4gICAgICAgICAgICB1c2VyRGF0YTogeyBlbnVtTmFtZTogJ2NjLk1vZGVsRGF0YUluY2x1ZGVNb2RlJyB9LFxuICAgICAgICAgICAgdHlwZTogJ0VudW0nLFxuICAgICAgICAgICAgZW51bUxpc3Q6IG5vcm1hbE9wdGlvbnMsXG4gICAgICAgICAgICB0b29sdGlwOiAnUmVxdWlyZWQgaWYgeW91IG5lZWQgdG8gdXNlIG5vcm1hbCBtYXAgb24gbW9ycGggdGFyZ2V0cydcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBCb29sZWFuc1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5za2lwVmFsaWRhdGlvbiA9IHsgdmFsdWU6ICEhdXNlckRhdGEuc2tpcFZhbGlkYXRpb24sIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdTa2lwIFZhbGlkYXRpb24nIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmRpc2FibGVNZXNoU3BsaXQgPSB7IHZhbHVlOiAhIXVzZXJEYXRhLmRpc2FibGVNZXNoU3BsaXQsIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdEaXNhYmxlIE1lc2ggU3BsaXQnIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmFsbG93TWVzaERhdGFBY2Nlc3MgPSB7IHZhbHVlOiAhIXVzZXJEYXRhLmFsbG93TWVzaERhdGFBY2Nlc3MsIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdBbGxvdyBEYXRhIEFjY2VzcycgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuYWRkVmVydGV4Q29sb3IgPSB7IHZhbHVlOiAhIXVzZXJEYXRhLmFkZFZlcnRleENvbG9yLCB0eXBlOiAnQm9vbGVhbicsIGRpc3BsYXlOYW1lOiAnQWRkIFZlcnRleCBDb2xvcicgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIucHJvbW90ZVNpbmdsZVJvb3ROb2RlID0geyB2YWx1ZTogISF1c2VyRGF0YS5wcm9tb3RlU2luZ2xlUm9vdE5vZGUsIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdQcm9tb3RlIFNpbmdsZSBSb290IE5vZGUnIH07XG5cbiAgICAgICAgLy8gT3B0aW1pemF0aW9uIFNlY3Rpb25zIGFzIE9iamVjdHNcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubWVzaE9wdGltaXplID0gdGhpcy5jcmVhdGVNZXNoT3B0aW1pemVPYmplY3QodXNlckRhdGEubWVzaE9wdGltaXplKTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubWVzaFNpbXBsaWZ5ID0gdGhpcy5jcmVhdGVNZXNoU2ltcGxpZnlPYmplY3QodXNlckRhdGEubWVzaFNpbXBsaWZ5KTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubWVzaENsdXN0ZXIgPSB0aGlzLmNyZWF0ZU1lc2hDbHVzdGVyT2JqZWN0KHVzZXJEYXRhLm1lc2hDbHVzdGVyKTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubWVzaENvbXByZXNzID0gdGhpcy5jcmVhdGVNZXNoQ29tcHJlc3NPYmplY3QodXNlckRhdGEubWVzaENvbXByZXNzKTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubG9kcyA9IHRoaXMuY3JlYXRlTE9Ec09iamVjdCh1c2VyRGF0YS5sb2RzKTtcblxuICAgICAgICByZXR1cm4gcHJvcGVydHlDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVNZXNoT3B0aW1pemVPYmplY3QoZGF0YTogYW55KTogSVByb3BlcnR5IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0gPSB7fTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmVydGV4Q2FjaGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZlcnRleEZldGNoOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBvdmVyZHJhdzogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHByb3BzLmVuYWJsZSA9IHsgdmFsdWU6ICEhZGF0YS5lbmFibGUsIHR5cGU6ICdCb29sZWFuJywgdG9vbHRpcDogJ0l0IGlzIHJlY29tbWVuZGVkIHRvIGVuYWJsZSB0aGVzZSBvcHRpb25zIGZvciBtb2RlbHMgd2l0aCBoaWdoIHZlcnRleCBjb3VudC4nfTtcbiAgICAgICAgcHJvcHMudmVydGV4Q2FjaGUgPSB7IHZhbHVlOiAhIWRhdGEudmVydGV4Q2FjaGUsIHR5cGU6ICdCb29sZWFuJyB9O1xuICAgICAgICBwcm9wcy52ZXJ0ZXhGZXRjaCA9IHsgdmFsdWU6ICEhZGF0YS52ZXJ0ZXhGZXRjaCwgdHlwZTogJ0Jvb2xlYW4nfTtcbiAgICAgICAgcHJvcHMub3ZlcmRyYXcgPSB7IHZhbHVlOiAhIWRhdGEub3ZlcmRyYXcsIHR5cGU6ICdCb29sZWFuJ307XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcyxcbiAgICAgICAgICAgIHR5cGU6ICdjYy5NZXNoT3B0aW1pemVPcHRpb25zJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTWVzaCBPcHRpbWl6ZSdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1lc2hTaW1wbGlmeU9iamVjdChkYXRhOiBhbnkpOiBJUHJvcGVydHkge1xuICAgICAgICBjb25zdCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0YXJnZXRSYXRpbzogMSxcbiAgICAgICAgICAgICAgICBhdXRvRXJyb3JSYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvclJhdGU6IDEsXG4gICAgICAgICAgICAgICAgbG9ja0JvdW5kYXJ5OiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcHJvcHMuZW5hYmxlID0geyB2YWx1ZTogISFkYXRhLmVuYWJsZSwgdHlwZTogJ0Jvb2xlYW4nIH07XG4gICAgICAgIHByb3BzLnRhcmdldFJhdGlvID0geyB2YWx1ZTogZGF0YS50YXJnZXRSYXRpbywgdHlwZTogJ0Zsb2F0JywgbWluOiAwLCBtYXg6IDEsIHN0ZXA6IDAuMDEsIHRvb2x0aXA6ICdUaGUgdGFyZ2V0IHJhdGlvIG9mIHRoZSBzaW1wbGlmaWVkIG1lc2ggZGF0YS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IHRoaXMgdmFsdWUgdG8gMC41LicgfTtcbiAgICAgICAgcHJvcHMuYXV0b0Vycm9yUmF0ZSA9IHsgdmFsdWU6ICEhZGF0YS5hdXRvRXJyb3JSYXRlLCB0eXBlOiAnQm9vbGVhbicgfTtcbiAgICAgICAgcHJvcHMuZXJyb3JSYXRlID0geyB2YWx1ZTogZGF0YS5lcnJvclJhdGUsIHR5cGU6ICdGbG9hdCcsIG1pbjogMCwgbWF4OiAxLCBzdGVwOiAwLjAxLCB0b29sdGlwOiAnVGhlIG1heCBlcnJvciByYXRlIG9mIHRoZSBzaW1wbGlmaWVkIG1lc2ggZGF0YS4gVGhpcyB2YWx1ZSBhbHNvIGFsdGVycyB0aGUgcmVzdWx0IHNpemUuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHR1bmUgdW50aWwgeW91IGdldCBhIGdvb2QgcmVzdWx0LicsIHZpc2libGU6ICFkYXRhLmF1dG9FcnJvclJhdGUgfTtcbiAgICAgICAgcHJvcHMubG9ja0JvdW5kYXJ5ID0geyB2YWx1ZTogISFkYXRhLmxvY2tCb3VuZGFyeSwgdHlwZTogJ0Jvb2xlYW4nIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcyxcbiAgICAgICAgICAgIHR5cGU6ICdjYy5NZXNoU2ltcGxpZnlPcHRpb25zJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTWVzaCBTaW1wbGlmeSdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1lc2hDbHVzdGVyT2JqZWN0KGRhdGE6IGFueSk6IElQcm9wZXJ0eSB7XG4gICAgICAgIGNvbnN0IHByb3BzOiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eSB9ID0ge307XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICBlbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQm91bmRpbmc6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBwcm9wcy5lbmFibGUgPSB7IHZhbHVlOiAhIWRhdGEuZW5hYmxlLCB0eXBlOiAnQm9vbGVhbicgfTtcbiAgICAgICAgcHJvcHMuZ2VuZXJhdGVCb3VuZGluZyA9IHsgdmFsdWU6ICEhZGF0YS5nZW5lcmF0ZUJvdW5kaW5nLCB0eXBlOiAnQm9vbGVhbicsIHRvb2x0aXA6ICdXaGV0aGVyIHRvIGdlbmVyYXRlIGJvdW5kaW5nIHNwaGVyZSBhbmQgbm9ybWFsIGNvbmUgZm9yIHRoZSBjbHVzdGVyZWQgbWVzaCBkYXRhLicgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHByb3BzLFxuICAgICAgICAgICAgdHlwZTogJ2NjLk1lc2hDbHVzdGVyT3B0aW9ucycsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ01lc2ggQ2x1c3RlcidcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1lc2hDb21wcmVzc09iamVjdChkYXRhOiBhbnkpOiBJUHJvcGVydHkge1xuICAgICAgICBjb25zdCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbmNvZGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbXByZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBxdWFudGl6ZTogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHByb3BzLmVuYWJsZSA9IHsgdmFsdWU6ICEhZGF0YS5lbmFibGUsIHR5cGU6ICdCb29sZWFuJyB9O1xuICAgICAgICBwcm9wcy5lbmNvZGUgPSB7IHZhbHVlOiAhIWRhdGEuZW5jb2RlLCB0eXBlOiAnQm9vbGVhbicgfTtcbiAgICAgICAgcHJvcHMuY29tcHJlc3MgPSB7IHZhbHVlOiAhIWRhdGEuY29tcHJlc3MsIHR5cGU6ICdCb29sZWFuJyB9O1xuICAgICAgICBwcm9wcy5xdWFudGl6ZSA9IHsgdmFsdWU6ICEhZGF0YS5xdWFudGl6ZSwgdHlwZTogJ0Jvb2xlYW4nIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcyxcbiAgICAgICAgICAgIHR5cGU6ICdjYy5NZXNoQ29tcHJlc3NPcHRpb25zJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTWVzaCBDb21wcmVzcydcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUxPRHNPYmplY3QoZGF0YTogYW55KTogSVByb3BlcnR5IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0gPSB7fTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHByb3BzLmVuYWJsZSA9IHsgdmFsdWU6ICEhZGF0YS5lbmFibGUsIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdFbmFibGUnIH07XG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YS5vcHRpb25zICYmIEFycmF5LmlzQXJyYXkoZGF0YS5vcHRpb25zKSkge1xuICAgICAgICAgICAgZGF0YS5vcHRpb25zLmZvckVhY2goKG9wdDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9kUHJvcHM6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0gPSB7fTtcbiAgICAgICAgICAgICAgICBsb2RQcm9wcy5zY3JlZW5SYXRpbyA9IHsgdmFsdWU6IG9wdC5zY3JlZW5SYXRpbywgdHlwZTogJ051bWJlcicsIGRpc3BsYXlOYW1lOiAnU2NyZWVuIFJhdGlvJyB9O1xuICAgICAgICAgICAgICAgIGxvZFByb3BzLmZhY2VDb3VudCA9IHsgdmFsdWU6IG9wdC5mYWNlQ291bnQsIHR5cGU6ICdOdW1iZXInLCBkaXNwbGF5TmFtZTogJ0ZhY2UgQ291bnQnLCByZWFkb25seTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHByb3BzW2Bsb2Qke2luZGV4fWBdID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbG9kUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYy5Mb2RPcHRpb25zJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHByb3BzLFxuICAgICAgICAgICAgdHlwZTogJ2NjLkxvZEdyb3VwcycsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0xPRHMnXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/physics-material-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/physics-material-importer.js new file mode 100644 index 0000000..0a2b8f1 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/physics-material-importer.js @@ -0,0 +1,55 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PhysicsMaterialImporter = void 0; +const base_importer_1 = require("./base-importer"); +class PhysicsMaterialImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'physics-material'; + } + async getProperties(assetInfo) { + const materialMeta = await Editor.Message.request('scene', 'query-physics-material', assetInfo.uuid); + if (!materialMeta) { + throw new Error(`Physics material meta not found for ${assetInfo.uuid}`); + } + return materialMeta; + } + async setProperty(assetInfo, path, value) { + let materialMeta = await Editor.Message.request('scene', 'query-physics-material', assetInfo.uuid); + if (!materialMeta) { + return false; + } + // Apply change + if (path.includes('.')) { + const parts = path.split('.'); + let current = materialMeta; + for (let i = 0; i < parts.length - 1; i++) { + current = current[parts[i]]; + if (current === undefined) + current = current[parts[i]].value; + if (current === undefined) + return false; + } + const lastCurrent = current[parts[parts.length - 1]]; + if (typeof lastCurrent === 'object' && 'value' in lastCurrent) { + current[parts[parts.length - 1]].value = value; + } + else { + current[parts[parts.length - 1]] = value; + } + } + else { + if (typeof materialMeta[path] === 'object' && 'value' in materialMeta[path]) { + materialMeta[path].value = value; + } + else { + materialMeta[path] = value; + } + } + materialMeta = await Editor.Message.request('scene', 'change-physics-material', materialMeta); + await Editor.Message.request('scene', 'apply-physics-material', assetInfo.uuid, materialMeta); + return true; + } +} +exports.PhysicsMaterialImporter = PhysicsMaterialImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy1tYXRlcmlhbC1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy9waHlzaWNzLW1hdGVyaWFsLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFvRDtBQUlwRCxNQUFhLHVCQUF3QixTQUFRLGlDQUFpQjtJQUE5RDs7UUFDSSxTQUFJLEdBQUcsa0JBQWtCLENBQUM7SUE4QzlCLENBQUM7SUE1Q0csS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFxQjtRQUNyQyxNQUFNLFlBQVksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFxQixFQUFFLElBQVksRUFBRSxLQUFVO1FBQzdELElBQUksWUFBWSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEIsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELGVBQWU7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksT0FBTyxHQUFHLFlBQVksQ0FBQztZQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxPQUFPLEtBQUssU0FBUztvQkFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDN0QsSUFBSSxPQUFPLEtBQUssU0FBUztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM1QyxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUM1RCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25ELENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDN0MsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMxRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNyQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUMvQixDQUFDO1FBQ0wsQ0FBQztRQUVELFlBQVksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUU5RixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSjtBQS9DRCwwREErQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQXNzZXRJbXBvcnRlciB9IGZyb20gJy4vYmFzZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBJQXNzZXRJbmZvIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL2Fzc2V0LWRiL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0IHsgSVByb3BlcnR5VmFsdWVUeXBlIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL3NjZW5lL0B0eXBlcy9wdWJsaWMnO1xuXG5leHBvcnQgY2xhc3MgUGh5c2ljc01hdGVyaWFsSW1wb3J0ZXIgZXh0ZW5kcyBCYXNlQXNzZXRJbXBvcnRlciB7XG4gICAgbmFtZSA9ICdwaHlzaWNzLW1hdGVyaWFsJztcblxuICAgIGFzeW5jIGdldFByb3BlcnRpZXMoYXNzZXRJbmZvOiBJQXNzZXRJbmZvKTogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9PiB7XG4gICAgICAgIGNvbnN0IG1hdGVyaWFsTWV0YSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3F1ZXJ5LXBoeXNpY3MtbWF0ZXJpYWwnLCBhc3NldEluZm8udXVpZCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIW1hdGVyaWFsTWV0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQaHlzaWNzIG1hdGVyaWFsIG1ldGEgbm90IGZvdW5kIGZvciAke2Fzc2V0SW5mby51dWlkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGVyaWFsTWV0YTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRQcm9wZXJ0eShhc3NldEluZm86IElBc3NldEluZm8sIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgbWF0ZXJpYWxNZXRhID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktcGh5c2ljcy1tYXRlcmlhbCcsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgaWYgKCFtYXRlcmlhbE1ldGEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGNoYW5nZVxuICAgICAgICBpZiAocGF0aC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gbWF0ZXJpYWxNZXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0c1tpXV07XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkgY3VycmVudCA9IGN1cnJlbnRbcGFydHNbaV1dLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxhc3RDdXJyZW50ID0gY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxhc3RDdXJyZW50ID09PSAnb2JqZWN0JyAmJiAndmFsdWUnIGluIGxhc3RDdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWF0ZXJpYWxNZXRhW3BhdGhdID09PSAnb2JqZWN0JyAmJiAndmFsdWUnIGluIG1hdGVyaWFsTWV0YVtwYXRoXSkge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsTWV0YVtwYXRoXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbE1ldGFbcGF0aF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1hdGVyaWFsTWV0YSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ2NoYW5nZS1waHlzaWNzLW1hdGVyaWFsJywgbWF0ZXJpYWxNZXRhKTtcblxuICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdhcHBseS1waHlzaWNzLW1hdGVyaWFsJywgYXNzZXRJbmZvLnV1aWQsIG1hdGVyaWFsTWV0YSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/prefab-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/prefab-importer.js new file mode 100644 index 0000000..d61d953 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/prefab-importer.js @@ -0,0 +1,66 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PrefabImporter = void 0; +const base_importer_1 = require("./base-importer"); +class PrefabImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'prefab'; + } + async getProperties(assetInfo) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + const userData = meta === null || meta === void 0 ? void 0 : meta.userData; + if (!userData) { + throw new Error(`UserData not found for asset ${assetInfo.uuid}`); + } + return this.parseUserData(userData); + } + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta || !meta.userData) + return false; + const userData = meta.userData; + let handled = false; + // Prefab currently mostly exposes 'persistent' in metadata + if (path === 'persistent') { + userData.persistent = value; + handled = true; + } + else { + // Generic fallback + if (path.includes('.')) { + const parts = path.split('.'); + let current = userData; + for (let i = 0; i < parts.length - 1; i++) { + if (!current[parts[i]]) + return false; + current = current[parts[i]]; + } + if (current) { + current[parts[parts.length - 1]] = value; + handled = true; + } + } + else { + userData[path] = value; + handled = true; + } + } + if (handled) { + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + return false; + } + parseUserData(userData) { + return { + persistent: { + value: !!userData.persistent, + type: 'Boolean', + displayName: 'Persistent' + } + }; + } +} +exports.PrefabImporter = PrefabImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmFiLWltcG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc291cmNlL3V0Y3AvdXRpbHMvYXNzZXQtaW1wb3J0ZXJzL3ByZWZhYi1pbXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBb0Q7QUFJcEQsTUFBYSxjQUFlLFNBQVEsaUNBQWlCO0lBQXJEOztRQUNJLFNBQUksR0FBRyxRQUFRLENBQUM7SUE0RHBCLENBQUM7SUExREcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFxQjtRQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsQ0FBQztRQUVoQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQXFCLEVBQUUsSUFBWSxFQUFFLEtBQVU7UUFDN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXBCLDJEQUEyRDtRQUMzRCxJQUFJLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUN4QixRQUFRLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUM1QixPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ0gsbUJBQW1CO1lBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFBRSxPQUFPLEtBQUssQ0FBQztvQkFDckMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsQ0FBQztnQkFDRCxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDekMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDbkIsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDSixRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ25CLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBR00sYUFBYSxDQUFDLFFBQW1DO1FBQ3BELE9BQU87WUFDSCxVQUFVLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVTtnQkFDNUIsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsV0FBVyxFQUFFLFlBQVk7YUFDNUI7U0FDSixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBN0RELHdDQTZEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VBc3NldEltcG9ydGVyIH0gZnJvbSAnLi9iYXNlLWltcG9ydGVyJztcbmltcG9ydCB7IElBc3NldEluZm8gfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvYXNzZXQtZGIvQHR5cGVzL3B1YmxpYyc7XG5pbXBvcnQgeyBJUHJvcGVydHksIElQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcblxuZXhwb3J0IGNsYXNzIFByZWZhYkltcG9ydGVyIGV4dGVuZHMgQmFzZUFzc2V0SW1wb3J0ZXIge1xuICAgIG5hbWUgPSAncHJlZmFiJztcblxuICAgIGFzeW5jIGdldFByb3BlcnRpZXMoYXNzZXRJbmZvOiBJQXNzZXRJbmZvKTogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9PiB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQpO1xuICAgICAgICBjb25zdCB1c2VyRGF0YSA9IG1ldGE/LnVzZXJEYXRhO1xuXG4gICAgICAgIGlmICghdXNlckRhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVXNlckRhdGEgbm90IGZvdW5kIGZvciBhc3NldCAke2Fzc2V0SW5mby51dWlkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VVc2VyRGF0YSh1c2VyRGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0UHJvcGVydHkoYXNzZXRJbmZvOiBJQXNzZXRJbmZvLCBwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LW1ldGEnLCBhc3NldEluZm8udXVpZCk7XG4gICAgICAgIGlmICghbWV0YSB8fCAhbWV0YS51c2VyRGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSBtZXRhLnVzZXJEYXRhO1xuICAgICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgLy8gUHJlZmFiIGN1cnJlbnRseSBtb3N0bHkgZXhwb3NlcyAncGVyc2lzdGVudCcgaW4gbWV0YWRhdGFcbiAgICAgICAgaWYgKHBhdGggPT09ICdwZXJzaXN0ZW50Jykge1xuICAgICAgICAgICAgdXNlckRhdGEucGVyc2lzdGVudCA9IHZhbHVlO1xuICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgLy8gR2VuZXJpYyBmYWxsYmFja1xuICAgICAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50ID0gdXNlckRhdGE7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50W3BhcnRzW2ldXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0c1tpXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXNlckRhdGFbcGF0aF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3NhdmUtYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkLCBKU09OLnN0cmluZ2lmeShtZXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgcGFyc2VVc2VyRGF0YSh1c2VyRGF0YTogeyBbaW5kZXg6IHN0cmluZ106IGFueTsgfSk6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGVyc2lzdGVudDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAhIXVzZXJEYXRhLnBlcnNpc3RlbnQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ0Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnUGVyc2lzdGVudCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/project-settings-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/project-settings-importer.js new file mode 100644 index 0000000..041cd86 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/project-settings-importer.js @@ -0,0 +1,364 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ProjectSettingsImporter = void 0; +class ProjectSettingsImporter { + get name() { + return 'project-settings'; + } + get className() { + return 'ProjectSettings'; + } + async getProperties(assetInfo) { + try { + // Get actual config + const projectConfig = await Editor.Message.request('project', 'query-config', 'project') || {}; + // Build manual properties + return this.buildProperties(projectConfig); + } + catch (e) { + console.warn('[ProjectSettingsImporter] Failed to query project settings:', e); + return {}; + } + } + async setProperty(assetInfo, path, value) { + try { + // Handle Custom Layers + if (path.startsWith('customLayers')) { + return this.setLayerProperty(path, value); + } + // Handle Sorting Layers + if (path.startsWith('sortingLayers')) { + return this.setSortingLayerProperty(path, value); + } + // Handle Physics Collision Groups + if (path.startsWith('physics.collisionGroups')) { + return this.setCollisionGroupProperty(path, value); + } + // Handle General Settings + if (path.startsWith('general')) { + return this.setGeneralProperty(path, value); + } + // Handle Default Material (Reference Unwrap) + if (path === 'physics.defaultMaterial' && value && typeof value === 'object' && value.uuid) { + value = value.uuid; + } + // Handle Collision Matrix (Object vs Array) + // If path is physics.collisionMatrix.5, it maps to physics.collisionMatrix["5"] which is fine. + await Editor.Message.request('project', 'set-config', 'project', path, value); + return true; + } + catch (e) { + console.warn('[ProjectSettingsImporter] Failed to set project settings:', e); + return false; + } + } + async setGeneralProperty(path, value) { + const config = await Editor.Message.request('project', 'query-config', 'project'); + const general = config.general || {}; + const parts = path.split('.'); + const key = parts[1]; + if (key === 'designResolution') { + // sub-properties: general.designResolution.width + if (parts.length === 3) { + const subKey = parts[2]; + general.designResolution[subKey] = value; + } + else { + // general.designResolution (Replace size values) + if (value && typeof value === 'object') { + if ('width' in value) + general.designResolution.width = value.width; + if ('height' in value) + general.designResolution.height = value.height; + } + } + } + else if (key === 'fitWidth' || key === 'fitHeight') { + general.designResolution[key] = value; + } + else { + general[key] = value; + } + await Editor.Message.request('project', 'set-config', 'project', 'general', general); + return true; + } + async setCollisionGroupProperty(path, value) { + // path: physics.collisionGroups.0.name or physics.collisionGroups.0 + const parts = path.split('.'); + const indexStr = parts[2]; + if (!indexStr) + return false; + const index = parseInt(indexStr); + if (isNaN(index)) + return false; + const config = await Editor.Message.request('project', 'query-config', 'project'); + const physics = config.physics || {}; + const groups = physics.collisionGroups || []; + let newName = ""; + if (typeof value === 'string') + newName = value; + else if (typeof value === 'object' && value.name) + newName = value.name; + // Note: 'index' variable here refers to the ARRAY INDEX in the configuration list, + // NOT the collision group index (1 << groupIndex). + if (index < groups.length) { + // Modification + if (newName) + groups[index].name = newName; + } + else if (index === groups.length) { + // Creation: Find first available group index (0..31) + const usedIndices = new Set(groups.map((g) => g.index)); + // Usually 0 is Default. + if (!usedIndices.has(0)) + usedIndices.add(0); // Treat 0 as used usually + let nextGroupIndex = 1; + while (usedIndices.has(nextGroupIndex)) { + nextGroupIndex++; + } + if (nextGroupIndex > 31) { + console.warn('Max collision groups reached (32).'); + return false; + } + groups.push({ + index: nextGroupIndex, + name: newName || `Group ${nextGroupIndex}` + }); + } + else { + return false; + } + physics.collisionGroups = groups; + await Editor.Message.request('project', 'set-config', 'project', 'physics', physics); + return true; + } + async setSortingLayerProperty(path, value) { + // path: sortingLayers.0 or sortingLayers.0.name + const parts = path.split('.'); + const indexStr = parts[1]; + if (!indexStr) + return false; + const index = parseInt(indexStr); + if (isNaN(index)) + return false; + const config = await Editor.Message.request('project', 'query-config', 'project'); + const sortingInfo = config['sorting-layer'] || { layers: [], increaseId: 0 }; + const layers = sortingInfo.layers || []; + // Determine what we are setting + let patchData = {}; + if (parts.length === 2) { + if (typeof value === 'string') + patchData = { name: value }; + else + patchData = value; + } + else if (parts.length === 3) { + const field = parts[2]; + patchData[field] = value; + } + else { + return false; + } + if (index < layers.length) { + // Modification + layers[index] = Object.assign(Object.assign({}, layers[index]), patchData); + } + else if (index === layers.length) { + // Creation + const newId = (sortingInfo.increaseId || 0) + 1; + sortingInfo.increaseId = newId; + let newValue = patchData.value; + if (newValue === undefined) { + const maxVal = layers.reduce((max, l) => (l.value !== undefined && l.value > max) ? l.value : max, -1); + newValue = maxVal + 1; + } + const newLayer = { + id: newId, + name: patchData.name || `Layer ${newId}`, + value: newValue + }; + layers.push(newLayer); + } + else { + return false; + } + sortingInfo.layers = layers; + // Update the full sorting-layer object to ensure increaseId and set-config sync + await Editor.Message.request('project', 'set-config', 'project', 'sorting-layer', sortingInfo); + return true; + } + async setLayerProperty(path, value) { + // parsing path: customLayers.0.name or customLayers.0 + const parts = path.split('.'); + const indexStr = parts[1]; + if (!indexStr) + return false; + const index = parseInt(indexStr); + if (isNaN(index)) + return false; + let newName = ""; + if (typeof value === 'string') + newName = value; + else if (typeof value === 'object' && value.name) + newName = value.name; + await Editor.Message.request('project', 'set-config', 'project', `layer.${index}`, { name: newName, value: 1 << (index + 1) }); + return true; + } + buildProperties(data) { + const result = {}; + result['sortingLayers'] = { + value: data && data['sorting-layer'] && data['sorting-layer'].layers ? this.buildSortingLayerProperties(data['sorting-layer'].layers) : [], + extends: [], + type: 'SortingLayerItem', + isArray: true, + tooltip: 'Sorting layers for sprites' + }; + result['customLayers'] = { + value: data && data.layer ? this.buildLayerProperties(data.layer) : [], + extends: [], + type: 'LayerItem', + isArray: true, + tooltip: 'User defined rendering layers' + }; + result['physics'] = { + value: data && data.physics ? this.buildPhysicsProperties(data.physics) : {}, + type: 'PhysicsSettings' + }; + result['general'] = { + value: data && data.general ? this.buildGeneralProperties(data.general) : {}, + type: 'GeneralSettings' + }; + return result; + } + buildGeneralProperties(general) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; + const result = {}; + result['designResolution'] = { + value: { width: (_b = (_a = general.designResolution) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 1280, height: (_d = (_c = general.designResolution) === null || _c === void 0 ? void 0 : _c.height) !== null && _d !== void 0 ? _d : 720 }, + type: 'cc.Size', + extends: ['cc.ValueType'] + }; + result['fitWidth'] = { value: (_f = (_e = general.designResolution) === null || _e === void 0 ? void 0 : _e.fitWidth) !== null && _f !== void 0 ? _f : false, type: 'Boolean' }; + result['fitHeight'] = { value: (_h = (_g = general.designResolution) === null || _g === void 0 ? void 0 : _g.fitHeight) !== null && _h !== void 0 ? _h : false, type: 'Boolean' }; + result['downloadMaxConcurrency'] = { value: (_j = general.downloadMaxConcurrency) !== null && _j !== void 0 ? _j : 15, type: 'Integer', min: 1 }; + result['highQuality'] = { value: (_k = general.highQuality) !== null && _k !== void 0 ? _k : false, type: 'Boolean' }; + return result; + } + buildPhysicsProperties(physics) { + const result = {}; + // Simple props + const props = [ + { key: 'allowSleep', type: 'Boolean' }, + { key: 'autoSimulation', type: 'Boolean' }, + { key: 'sleepThreshold', type: 'Float' }, + { key: 'fixedTimeStep', type: 'Float', options: { min: 0 } }, + { key: 'maxSubSteps', type: 'Integer', options: { min: 1 } }, + ]; + for (const p of props) { + if (p.key in physics) { + result[p.key] = Object.assign({ value: physics[p.key], type: p.type }, p.options); + } + } + if (physics.gravity) { + result['gravity'] = { value: physics.gravity, type: 'cc.Vec3', extends: ['cc.ValueType'] }; + } + result['defaultMaterial'] = { + value: physics.defaultMaterial ? { uuid: physics.defaultMaterial } : null, + type: 'cc.PhysicsMaterial', + extends: ['cc.Object'] + }; + // Collision Groups + const groups = physics.collisionGroups || []; + result['collisionGroups'] = { + value: groups.map((g) => ({ + value: { + index: { value: g.index, type: 'Integer', readonly: true }, + name: { value: g.name, type: 'String' } + }, + type: 'CollisionGroupItem' + })), + type: 'CollisionGroupItem', + isArray: true, + elementTypeData: { + type: 'CollisionGroupItem', + value: { + index: { value: 0, type: 'Integer', readonly: true }, + name: { value: '', type: 'String' } + } + } + }; + // Collision Matrix + const bitmaskList = []; + // Default group 0 + const defaultGroup = groups.find((g) => g.index === 0); + bitmaskList.push({ name: defaultGroup ? defaultGroup.name : 'DEFAULT', value: 1 << 0 }); + for (const g of groups) { + if (g.index !== 0) { + bitmaskList.push({ name: g.name, value: 1 << g.index }); + } + } + const matrixObj = physics.collisionMatrix || {}; + const matrixArr = []; + // Calculate max index to display + const indices = [0, ...groups.map((g) => g.index), ...Object.keys(matrixObj).map(k => parseInt(k))]; + const maxIndex = Math.max(...indices); + for (let i = 0; i <= maxIndex; i++) { + matrixArr.push({ + value: matrixObj[i] || 0, + type: 'BitMask', + bitmaskList: bitmaskList + }); + } + result['collisionMatrix'] = { + value: matrixArr, + type: 'BitMask', + isArray: true, + elementTypeData: { + type: 'BitMask', + value: 0, + bitmaskList: bitmaskList + } + }; + return result; + } + buildSortingLayerProperties(layers) { + return layers.map(layer => ({ + extends: [], + value: { + id: { + value: layer.id, + type: 'Integer', + readonly: true + }, + name: { + value: layer.name, + type: 'String' + }, + value: { + value: layer.value, + type: 'Integer' + } + }, + type: 'SortingLayerItem' + })); + } + buildLayerProperties(layers) { + return layers.map(layer => ({ + extends: [], + value: { + name: { + value: layer.name, + type: 'String' + }, + value: { + value: layer.value, + type: 'Integer', + readonly: true + } + }, + type: 'LayerItem' + })); + } +} +exports.ProjectSettingsImporter = ProjectSettingsImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1zZXR0aW5ncy1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy9wcm9qZWN0LXNldHRpbmdzLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLE1BQWEsdUJBQXVCO0lBQ2hDLElBQUksSUFBSTtRQUNKLE9BQU8sa0JBQWtCLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8saUJBQWlCLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBb0I7UUFDcEMsSUFBSSxDQUFDO1lBQ0Qsb0JBQW9CO1lBQ3BCLE1BQU0sYUFBYSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFL0YsMEJBQTBCO1lBQzFCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsNkRBQTZELEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0UsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBb0IsRUFBRSxJQUFZLEVBQUUsS0FBVTtRQUM1RCxJQUFJLENBQUM7WUFDRCx1QkFBdUI7WUFDdkIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBRUQsd0JBQXdCO1lBQ3hCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUVELGtDQUFrQztZQUNsQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkQsQ0FBQztZQUVELDBCQUEwQjtZQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCw2Q0FBNkM7WUFDN0MsSUFBSSxJQUFJLEtBQUsseUJBQXlCLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pGLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLENBQUM7WUFFRCw0Q0FBNEM7WUFDNUMsK0ZBQStGO1lBRS9GLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQywyREFBMkQsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3RSxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0wsQ0FBQztJQUdPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFZLEVBQUUsS0FBVTtRQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEYsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckIsSUFBSSxHQUFHLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixpREFBaUQ7WUFDakQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLGlEQUFpRDtnQkFDakQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3JDLElBQUksT0FBTyxJQUFJLEtBQUs7d0JBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUNuRSxJQUFJLFFBQVEsSUFBSSxLQUFLO3dCQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDMUUsQ0FBQztZQUNMLENBQUM7UUFDTixDQUFDO2FBQU0sSUFBSSxHQUFHLEtBQUssVUFBVSxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNsRCxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDO1FBRUQsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckYsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxJQUFZLEVBQUUsS0FBVTtRQUM1RCxvRUFBb0U7UUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO1FBRTdDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxPQUFPLEdBQUcsS0FBSyxDQUFDO2FBQzFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJO1lBQUUsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFFdkUsbUZBQW1GO1FBQ25GLG1EQUFtRDtRQUVuRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkIsZUFBZTtZQUNmLElBQUksT0FBTztnQkFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUMvQyxDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLHFEQUFxRDtZQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM3RCx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEI7WUFFdkUsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxjQUFjLEVBQUUsQ0FBQztZQUNyQixDQUFDO1lBRUQsSUFBSSxjQUFjLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxLQUFLLENBQUM7WUFDakIsQ0FBQztZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1IsS0FBSyxFQUFFLGNBQWM7Z0JBQ3JCLElBQUksRUFBRSxPQUFPLElBQUksU0FBUyxjQUFjLEVBQUU7YUFDN0MsQ0FBQyxDQUFDO1FBQ1IsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBRUQsT0FBTyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUM7UUFDakMsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckYsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFZLEVBQUUsS0FBVTtRQUMxRCxnREFBZ0Q7UUFDaEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzdFLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1FBRXhDLGdDQUFnQztRQUNoQyxJQUFJLFNBQVMsR0FBUSxFQUFFLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxTQUFTLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O2dCQUN0RCxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBRUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLGVBQWU7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLG1DQUFRLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBSyxTQUFTLENBQUUsQ0FBQztRQUN4RCxDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLFdBQVc7WUFDWCxNQUFNLEtBQUssR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELFdBQVcsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBRS9CLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDL0IsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwSCxRQUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2IsRUFBRSxFQUFFLEtBQUs7Z0JBQ1QsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksU0FBUyxLQUFLLEVBQUU7Z0JBQ3hDLEtBQUssRUFBRSxRQUFRO2FBQ2xCLENBQUM7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ0osT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELFdBQVcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQzVCLGdGQUFnRjtRQUNoRixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMvRixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQVksRUFBRSxLQUFVO1FBQ25ELHNEQUFzRDtRQUN0RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUvQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUMxQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSTtZQUFFLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBRXZFLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0gsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFTO1FBQzdCLE1BQU0sTUFBTSxHQUEwQyxFQUFFLENBQUM7UUFFekQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHO1lBQ3RCLEtBQUssRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDMUksT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsa0JBQWtCO1lBQ3hCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLDRCQUE0QjtTQUN4QyxDQUFDO1FBRUYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHO1lBQ3JCLEtBQUssRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN0RSxPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksRUFBRSxXQUFXO1lBQ2pCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLCtCQUErQjtTQUMzQyxDQUFDO1FBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHO1lBQ2hCLEtBQUssRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1RSxJQUFJLEVBQUUsaUJBQWlCO1NBQzFCLENBQUM7UUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUc7WUFDaEIsS0FBSyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzVFLElBQUksRUFBRSxpQkFBaUI7U0FDMUIsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxPQUFZOztRQUN2QyxNQUFNLE1BQU0sR0FBMEMsRUFBRSxDQUFDO1FBRXpELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHO1lBQ3pCLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFBLE1BQUEsT0FBTyxDQUFDLGdCQUFnQiwwQ0FBRSxLQUFLLG1DQUFJLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBQSxNQUFBLE9BQU8sQ0FBQyxnQkFBZ0IsMENBQUUsTUFBTSxtQ0FBSSxHQUFHLEVBQUU7WUFDMUcsSUFBSSxFQUFFLFNBQVM7WUFDZixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7U0FDNUIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFBLE1BQUEsT0FBTyxDQUFDLGdCQUFnQiwwQ0FBRSxRQUFRLG1DQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDN0YsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQUEsTUFBQSxPQUFPLENBQUMsZ0JBQWdCLDBDQUFFLFNBQVMsbUNBQUksS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUUvRixNQUFNLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFBLE9BQU8sQ0FBQyxzQkFBc0IsbUNBQUksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzVHLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFBLE9BQU8sQ0FBQyxXQUFXLG1DQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFFakYsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQVk7UUFDdkMsTUFBTSxNQUFNLEdBQTBDLEVBQUUsQ0FBQztRQUV6RCxlQUFlO1FBQ2YsTUFBTSxLQUFLLEdBQUc7WUFDVixFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUN0QyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQzFDLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDeEMsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVELEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtTQUMvRCxDQUFDO1FBRUYsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFLLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFLLENBQUMsQ0FBQyxPQUFPLENBQUUsQ0FBQztZQUMzRSxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFFLEVBQUUsQ0FBQztRQUNoRyxDQUFDO1FBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUc7WUFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN6RSxJQUFJLEVBQUUsb0JBQW9CO1lBQzFCLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQztTQUN6QixDQUFDO1FBRUYsbUJBQW1CO1FBQ25CLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHO1lBQ3ZCLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQixLQUFLLEVBQUU7b0JBQ0gsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO29CQUMxRCxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2lCQUMxQztnQkFDRCxJQUFJLEVBQUUsb0JBQW9CO2FBQzdCLENBQUMsQ0FBQztZQUNILElBQUksRUFBRSxvQkFBb0I7WUFDMUIsT0FBTyxFQUFFLElBQUk7WUFDYixlQUFlLEVBQUU7Z0JBQ2QsSUFBSSxFQUFFLG9CQUFvQjtnQkFDMUIsS0FBSyxFQUFFO29CQUNILEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO29CQUNwRCxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7aUJBQ3RDO2FBQ0g7U0FDTCxDQUFDO1FBRUYsbUJBQW1CO1FBQ25CLE1BQU0sV0FBVyxHQUFzQyxFQUFFLENBQUM7UUFDMUQsa0JBQWtCO1FBQ2xCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUQsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFeEYsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDN0QsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDckIsaUNBQWlDO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUV0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakMsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDWCxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLElBQUksRUFBRSxTQUFTO2dCQUNmLFdBQVcsRUFBRSxXQUFXO2FBQzNCLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRztZQUN4QixLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSxJQUFJO1lBQ2IsZUFBZSxFQUFFO2dCQUNiLElBQUksRUFBRSxTQUFTO2dCQUNmLEtBQUssRUFBRSxDQUFDO2dCQUNSLFdBQVcsRUFBRSxXQUFXO2FBQzNCO1NBQ0osQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxNQUEwRDtRQUMxRixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxFQUFFO1lBQ1gsS0FBSyxFQUFFO2dCQUNILEVBQUUsRUFBRTtvQkFDQSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ2YsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsUUFBUSxFQUFFLElBQUk7aUJBQ2pCO2dCQUNELElBQUksRUFBRTtvQkFDRixLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUk7b0JBQ2pCLElBQUksRUFBRSxRQUFRO2lCQUNqQjtnQkFDRCxLQUFLLEVBQUU7b0JBQ0gsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO29CQUNsQixJQUFJLEVBQUUsU0FBUztpQkFDbEI7YUFDSjtZQUNELElBQUksRUFBRSxrQkFBa0I7U0FDM0IsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRU8sb0JBQW9CLENBQUMsTUFBOEM7UUFDdEUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixPQUFPLEVBQUUsRUFBRTtZQUNYLEtBQUssRUFBRTtnQkFDSCxJQUFJLEVBQUU7b0JBQ0YsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUNqQixJQUFJLEVBQUUsUUFBUTtpQkFDakI7Z0JBQ0QsS0FBSyxFQUFFO29CQUNILEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztvQkFDbEIsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsUUFBUSxFQUFFLElBQUk7aUJBQ2pCO2FBQ0o7WUFDRCxJQUFJLEVBQUUsV0FBVztTQUNwQixDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Q0FDSjtBQXBZRCwwREFvWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQXNzZXRJbXBvcnRlciB9IGZyb20gJy4vYmFzZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBBc3NldEluZm8gfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvYXNzZXQtZGIvQHR5cGVzL3B1YmxpYyc7XG5pbXBvcnQgeyBJUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5cbmRlY2xhcmUgY29uc3QgRWRpdG9yOiBhbnk7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0U2V0dGluZ3NJbXBvcnRlciBpbXBsZW1lbnRzIElBc3NldEltcG9ydGVyIHtcbiAgICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3Byb2plY3Qtc2V0dGluZ3MnO1xuICAgIH1cblxuICAgIGdldCBjbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdQcm9qZWN0U2V0dGluZ3MnO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFByb3BlcnRpZXMoYXNzZXRJbmZvOiBBc3NldEluZm8pOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5VmFsdWVUeXBlIH0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdldCBhY3R1YWwgY29uZmlnXG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0Q29uZmlnID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgncHJvamVjdCcsICdxdWVyeS1jb25maWcnLCAncHJvamVjdCcpIHx8IHt9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBCdWlsZCBtYW51YWwgcHJvcGVydGllc1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9wZXJ0aWVzKHByb2plY3RDb25maWcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tQcm9qZWN0U2V0dGluZ3NJbXBvcnRlcl0gRmFpbGVkIHRvIHF1ZXJ5IHByb2plY3Qgc2V0dGluZ3M6JywgZSk7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzZXRQcm9wZXJ0eShhc3NldEluZm86IEFzc2V0SW5mbywgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgQ3VzdG9tIExheWVyc1xuICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnY3VzdG9tTGF5ZXJzJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRMYXllclByb3BlcnR5KHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIFNvcnRpbmcgTGF5ZXJzXG4gICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCdzb3J0aW5nTGF5ZXJzJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTb3J0aW5nTGF5ZXJQcm9wZXJ0eShwYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSBQaHlzaWNzIENvbGxpc2lvbiBHcm91cHNcbiAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJ3BoeXNpY3MuY29sbGlzaW9uR3JvdXBzJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRDb2xsaXNpb25Hcm91cFByb3BlcnR5KHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIEdlbmVyYWwgU2V0dGluZ3NcbiAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJ2dlbmVyYWwnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldEdlbmVyYWxQcm9wZXJ0eShwYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSBEZWZhdWx0IE1hdGVyaWFsIChSZWZlcmVuY2UgVW53cmFwKVxuICAgICAgICAgICAgaWYgKHBhdGggPT09ICdwaHlzaWNzLmRlZmF1bHRNYXRlcmlhbCcgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS51dWlkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS51dWlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYW5kbGUgQ29sbGlzaW9uIE1hdHJpeCAoT2JqZWN0IHZzIEFycmF5KVxuICAgICAgICAgICAgLy8gSWYgcGF0aCBpcyBwaHlzaWNzLmNvbGxpc2lvbk1hdHJpeC41LCBpdCBtYXBzIHRvIHBoeXNpY3MuY29sbGlzaW9uTWF0cml4W1wiNVwiXSB3aGljaCBpcyBmaW5lLlxuXG4gICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdwcm9qZWN0JywgJ3NldC1jb25maWcnLCAncHJvamVjdCcsIHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tQcm9qZWN0U2V0dGluZ3NJbXBvcnRlcl0gRmFpbGVkIHRvIHNldCBwcm9qZWN0IHNldHRpbmdzOicsIGUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFzeW5jIHNldEdlbmVyYWxQcm9wZXJ0eShwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgncHJvamVjdCcsICdxdWVyeS1jb25maWcnLCAncHJvamVjdCcpO1xuICAgICAgICBjb25zdCBnZW5lcmFsID0gY29uZmlnLmdlbmVyYWwgfHwge307XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3Qga2V5ID0gcGFydHNbMV07XG4gICAgICAgIFxuICAgICAgICBpZiAoa2V5ID09PSAnZGVzaWduUmVzb2x1dGlvbicpIHtcbiAgICAgICAgICAgICAvLyBzdWItcHJvcGVydGllczogZ2VuZXJhbC5kZXNpZ25SZXNvbHV0aW9uLndpZHRoXG4gICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgICBjb25zdCBzdWJLZXkgPSBwYXJ0c1syXTtcbiAgICAgICAgICAgICAgICAgZ2VuZXJhbC5kZXNpZ25SZXNvbHV0aW9uW3N1YktleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAvLyBnZW5lcmFsLmRlc2lnblJlc29sdXRpb24gKFJlcGxhY2Ugc2l6ZSB2YWx1ZXMpXG4gICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICBpZiAoJ3dpZHRoJyBpbiB2YWx1ZSkgZ2VuZXJhbC5kZXNpZ25SZXNvbHV0aW9uLndpZHRoID0gdmFsdWUud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICBpZiAoJ2hlaWdodCcgaW4gdmFsdWUpIGdlbmVyYWwuZGVzaWduUmVzb2x1dGlvbi5oZWlnaHQgPSB2YWx1ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZml0V2lkdGgnIHx8IGtleSA9PT0gJ2ZpdEhlaWdodCcpIHtcbiAgICAgICAgICAgICBnZW5lcmFsLmRlc2lnblJlc29sdXRpb25ba2V5XSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgIGdlbmVyYWxba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdwcm9qZWN0JywgJ3NldC1jb25maWcnLCAncHJvamVjdCcsICdnZW5lcmFsJywgZ2VuZXJhbCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0Q29sbGlzaW9uR3JvdXBQcm9wZXJ0eShwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgLy8gcGF0aDogcGh5c2ljcy5jb2xsaXNpb25Hcm91cHMuMC5uYW1lIG9yIHBoeXNpY3MuY29sbGlzaW9uR3JvdXBzLjBcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IGluZGV4U3RyID0gcGFydHNbMl07XG4gICAgICAgIGlmICghaW5kZXhTdHIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChpbmRleFN0cik7XG4gICAgICAgIGlmIChpc05hTihpbmRleCkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdwcm9qZWN0JywgJ3F1ZXJ5LWNvbmZpZycsICdwcm9qZWN0Jyk7XG4gICAgICAgIGNvbnN0IHBoeXNpY3MgPSBjb25maWcucGh5c2ljcyB8fCB7fTtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gcGh5c2ljcy5jb2xsaXNpb25Hcm91cHMgfHwgW107XG5cbiAgICAgICAgbGV0IG5ld05hbWUgPSBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgbmV3TmFtZSA9IHZhbHVlO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLm5hbWUpIG5ld05hbWUgPSB2YWx1ZS5uYW1lO1xuXG4gICAgICAgIC8vIE5vdGU6ICdpbmRleCcgdmFyaWFibGUgaGVyZSByZWZlcnMgdG8gdGhlIEFSUkFZIElOREVYIGluIHRoZSBjb25maWd1cmF0aW9uIGxpc3QsXG4gICAgICAgIC8vIE5PVCB0aGUgY29sbGlzaW9uIGdyb3VwIGluZGV4ICgxIDw8IGdyb3VwSW5kZXgpLlxuICAgICAgICBcbiAgICAgICAgaWYgKGluZGV4IDwgZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgIC8vIE1vZGlmaWNhdGlvblxuICAgICAgICAgICAgIGlmIChuZXdOYW1lKSBncm91cHNbaW5kZXhdLm5hbWUgPSBuZXdOYW1lO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSBncm91cHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgLy8gQ3JlYXRpb246IEZpbmQgZmlyc3QgYXZhaWxhYmxlIGdyb3VwIGluZGV4ICgwLi4zMSlcbiAgICAgICAgICAgICBjb25zdCB1c2VkSW5kaWNlcyA9IG5ldyBTZXQoZ3JvdXBzLm1hcCgoZzogYW55KSA9PiBnLmluZGV4KSk7XG4gICAgICAgICAgICAgLy8gVXN1YWxseSAwIGlzIERlZmF1bHQuXG4gICAgICAgICAgICAgaWYgKCF1c2VkSW5kaWNlcy5oYXMoMCkpIHVzZWRJbmRpY2VzLmFkZCgwKTsgLy8gVHJlYXQgMCBhcyB1c2VkIHVzdWFsbHlcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICBsZXQgbmV4dEdyb3VwSW5kZXggPSAxO1xuICAgICAgICAgICAgIHdoaWxlICh1c2VkSW5kaWNlcy5oYXMobmV4dEdyb3VwSW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgIG5leHRHcm91cEluZGV4Kys7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgIGlmIChuZXh0R3JvdXBJbmRleCA+IDMxKSB7XG4gICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWF4IGNvbGxpc2lvbiBncm91cHMgcmVhY2hlZCAoMzIpLicpO1xuICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICBpbmRleDogbmV4dEdyb3VwSW5kZXgsXG4gICAgICAgICAgICAgICAgIG5hbWU6IG5ld05hbWUgfHwgYEdyb3VwICR7bmV4dEdyb3VwSW5kZXh9YFxuICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGh5c2ljcy5jb2xsaXNpb25Hcm91cHMgPSBncm91cHM7XG4gICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3Byb2plY3QnLCAnc2V0LWNvbmZpZycsICdwcm9qZWN0JywgJ3BoeXNpY3MnLCBwaHlzaWNzKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRTb3J0aW5nTGF5ZXJQcm9wZXJ0eShwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgLy8gcGF0aDogc29ydGluZ0xheWVycy4wIG9yIHNvcnRpbmdMYXllcnMuMC5uYW1lXG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCBpbmRleFN0ciA9IHBhcnRzWzFdO1xuICAgICAgICBpZiAoIWluZGV4U3RyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaW5kZXhTdHIpO1xuICAgICAgICBpZiAoaXNOYU4oaW5kZXgpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgncHJvamVjdCcsICdxdWVyeS1jb25maWcnLCAncHJvamVjdCcpO1xuICAgICAgICBjb25zdCBzb3J0aW5nSW5mbyA9IGNvbmZpZ1snc29ydGluZy1sYXllciddIHx8IHsgbGF5ZXJzOiBbXSwgaW5jcmVhc2VJZDogMCB9O1xuICAgICAgICBjb25zdCBsYXllcnMgPSBzb3J0aW5nSW5mby5sYXllcnMgfHwgW107XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQgd2UgYXJlIHNldHRpbmdcbiAgICAgICAgbGV0IHBhdGNoRGF0YTogYW55ID0ge307XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcGF0Y2hEYXRhID0geyBuYW1lOiB2YWx1ZSB9O1xuICAgICAgICAgICAgIGVsc2UgcGF0Y2hEYXRhID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgY29uc3QgZmllbGQgPSBwYXJ0c1syXTtcbiAgICAgICAgICAgICBwYXRjaERhdGFbZmllbGRdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggPCBsYXllcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgLy8gTW9kaWZpY2F0aW9uXG4gICAgICAgICAgICAgbGF5ZXJzW2luZGV4XSA9IHsgLi4ubGF5ZXJzW2luZGV4XSwgLi4ucGF0Y2hEYXRhIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IGxheWVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAvLyBDcmVhdGlvblxuICAgICAgICAgICAgIGNvbnN0IG5ld0lkID0gKHNvcnRpbmdJbmZvLmluY3JlYXNlSWQgfHwgMCkgKyAxO1xuICAgICAgICAgICAgIHNvcnRpbmdJbmZvLmluY3JlYXNlSWQgPSBuZXdJZDtcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSBwYXRjaERhdGEudmFsdWU7XG4gICAgICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgY29uc3QgbWF4VmFsID0gbGF5ZXJzLnJlZHVjZSgobWF4OiBudW1iZXIsIGw6IGFueSkgPT4gKGwudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBsLnZhbHVlID4gbWF4KSA/IGwudmFsdWUgOiBtYXgsIC0xKTtcbiAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBtYXhWYWwgKyAxO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICBjb25zdCBuZXdMYXllciA9IHtcbiAgICAgICAgICAgICAgICAgaWQ6IG5ld0lkLFxuICAgICAgICAgICAgICAgICBuYW1lOiBwYXRjaERhdGEubmFtZSB8fCBgTGF5ZXIgJHtuZXdJZH1gLFxuICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgIGxheWVycy5wdXNoKG5ld0xheWVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgc29ydGluZ0luZm8ubGF5ZXJzID0gbGF5ZXJzO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGZ1bGwgc29ydGluZy1sYXllciBvYmplY3QgdG8gZW5zdXJlIGluY3JlYXNlSWQgYW5kIHNldC1jb25maWcgc3luY1xuICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdwcm9qZWN0JywgJ3NldC1jb25maWcnLCAncHJvamVjdCcsICdzb3J0aW5nLWxheWVyJywgc29ydGluZ0luZm8pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldExheWVyUHJvcGVydHkocGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIC8vIHBhcnNpbmcgcGF0aDogY3VzdG9tTGF5ZXJzLjAubmFtZSBvciBjdXN0b21MYXllcnMuMFxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3QgaW5kZXhTdHIgPSBwYXJ0c1sxXTtcbiAgICAgICAgaWYgKCFpbmRleFN0cikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGluZGV4U3RyKTtcbiAgICAgICAgaWYgKGlzTmFOKGluZGV4KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IG5ld05hbWUgPSBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgbmV3TmFtZSA9IHZhbHVlO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLm5hbWUpIG5ld05hbWUgPSB2YWx1ZS5uYW1lO1xuXG4gICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3Byb2plY3QnLCAnc2V0LWNvbmZpZycsICdwcm9qZWN0JywgYGxheWVyLiR7aW5kZXh9YCwgeyBuYW1lOiBuZXdOYW1lLCB2YWx1ZTogMSA8PCAoaW5kZXggKyAxKSB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZFByb3BlcnRpZXMoZGF0YTogYW55KTogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSA9IHt9O1xuXG4gICAgICAgIHJlc3VsdFsnc29ydGluZ0xheWVycyddID0ge1xuICAgICAgICAgICAgdmFsdWU6IGRhdGEgJiYgZGF0YVsnc29ydGluZy1sYXllciddICYmIGRhdGFbJ3NvcnRpbmctbGF5ZXInXS5sYXllcnMgPyB0aGlzLmJ1aWxkU29ydGluZ0xheWVyUHJvcGVydGllcyhkYXRhWydzb3J0aW5nLWxheWVyJ10ubGF5ZXJzKSA6IFtdLFxuICAgICAgICAgICAgZXh0ZW5kczogW10sXG4gICAgICAgICAgICB0eXBlOiAnU29ydGluZ0xheWVySXRlbScsXG4gICAgICAgICAgICBpc0FycmF5OiB0cnVlLFxuICAgICAgICAgICAgdG9vbHRpcDogJ1NvcnRpbmcgbGF5ZXJzIGZvciBzcHJpdGVzJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlc3VsdFsnY3VzdG9tTGF5ZXJzJ10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogZGF0YSAmJiBkYXRhLmxheWVyID8gdGhpcy5idWlsZExheWVyUHJvcGVydGllcyhkYXRhLmxheWVyKSA6IFtdLFxuICAgICAgICAgICAgZXh0ZW5kczogW10sXG4gICAgICAgICAgICB0eXBlOiAnTGF5ZXJJdGVtJyxcbiAgICAgICAgICAgIGlzQXJyYXk6IHRydWUsXG4gICAgICAgICAgICB0b29sdGlwOiAnVXNlciBkZWZpbmVkIHJlbmRlcmluZyBsYXllcnMnXG4gICAgICAgIH07XG5cbiAgICAgICAgcmVzdWx0WydwaHlzaWNzJ10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogZGF0YSAmJiBkYXRhLnBoeXNpY3MgPyB0aGlzLmJ1aWxkUGh5c2ljc1Byb3BlcnRpZXMoZGF0YS5waHlzaWNzKSA6IHt9LFxuICAgICAgICAgICAgdHlwZTogJ1BoeXNpY3NTZXR0aW5ncydcbiAgICAgICAgfTtcblxuICAgICAgICByZXN1bHRbJ2dlbmVyYWwnXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhICYmIGRhdGEuZ2VuZXJhbCA/IHRoaXMuYnVpbGRHZW5lcmFsUHJvcGVydGllcyhkYXRhLmdlbmVyYWwpIDoge30sXG4gICAgICAgICAgICB0eXBlOiAnR2VuZXJhbFNldHRpbmdzJ1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkR2VuZXJhbFByb3BlcnRpZXMoZ2VuZXJhbDogYW55KTogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgcmVzdWx0WydkZXNpZ25SZXNvbHV0aW9uJ10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogeyB3aWR0aDogZ2VuZXJhbC5kZXNpZ25SZXNvbHV0aW9uPy53aWR0aCA/PyAxMjgwLCBoZWlnaHQ6IGdlbmVyYWwuZGVzaWduUmVzb2x1dGlvbj8uaGVpZ2h0ID8/IDcyMCB9LFxuICAgICAgICAgICAgdHlwZTogJ2NjLlNpemUnLFxuICAgICAgICAgICAgZXh0ZW5kczogWydjYy5WYWx1ZVR5cGUnXVxuICAgICAgICB9O1xuICAgICAgICByZXN1bHRbJ2ZpdFdpZHRoJ10gPSB7IHZhbHVlOiBnZW5lcmFsLmRlc2lnblJlc29sdXRpb24/LmZpdFdpZHRoID8/IGZhbHNlLCB0eXBlOiAnQm9vbGVhbicgfTtcbiAgICAgICAgcmVzdWx0WydmaXRIZWlnaHQnXSA9IHsgdmFsdWU6IGdlbmVyYWwuZGVzaWduUmVzb2x1dGlvbj8uZml0SGVpZ2h0ID8/IGZhbHNlLCB0eXBlOiAnQm9vbGVhbicgfTtcblxuICAgICAgICByZXN1bHRbJ2Rvd25sb2FkTWF4Q29uY3VycmVuY3knXSA9IHsgdmFsdWU6IGdlbmVyYWwuZG93bmxvYWRNYXhDb25jdXJyZW5jeSA/PyAxNSwgdHlwZTogJ0ludGVnZXInLCBtaW46IDEgfTtcbiAgICAgICAgcmVzdWx0WydoaWdoUXVhbGl0eSddID0geyB2YWx1ZTogZ2VuZXJhbC5oaWdoUXVhbGl0eSA/PyBmYWxzZSwgdHlwZTogJ0Jvb2xlYW4nIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkUGh5c2ljc1Byb3BlcnRpZXMocGh5c2ljczogYW55KTogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgLy8gU2ltcGxlIHByb3BzXG4gICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgeyBrZXk6ICdhbGxvd1NsZWVwJywgdHlwZTogJ0Jvb2xlYW4nIH0sXG4gICAgICAgICAgICB7IGtleTogJ2F1dG9TaW11bGF0aW9uJywgdHlwZTogJ0Jvb2xlYW4nIH0sXG4gICAgICAgICAgICB7IGtleTogJ3NsZWVwVGhyZXNob2xkJywgdHlwZTogJ0Zsb2F0JyB9LFxuICAgICAgICAgICAgeyBrZXk6ICdmaXhlZFRpbWVTdGVwJywgdHlwZTogJ0Zsb2F0Jywgb3B0aW9uczogeyBtaW46IDAgfSB9LFxuICAgICAgICAgICAgeyBrZXk6ICdtYXhTdWJTdGVwcycsIHR5cGU6ICdJbnRlZ2VyJywgb3B0aW9uczogeyBtaW46IDEgfSB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwcm9wcykge1xuICAgICAgICAgICAgaWYgKHAua2V5IGluIHBoeXNpY3MpIHtcbiAgICAgICAgICAgICAgICAgcmVzdWx0W3Aua2V5XSA9IHsgdmFsdWU6IHBoeXNpY3NbcC5rZXldLCB0eXBlOiBwLnR5cGUsIC4uLnAub3B0aW9ucyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGh5c2ljcy5ncmF2aXR5KSB7XG4gICAgICAgICAgICByZXN1bHRbJ2dyYXZpdHknXSA9IHsgdmFsdWU6IHBoeXNpY3MuZ3Jhdml0eSwgdHlwZTogJ2NjLlZlYzMnLCBleHRlbmRzOiBbJ2NjLlZhbHVlVHlwZScgXSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0WydkZWZhdWx0TWF0ZXJpYWwnXSA9IHsgXG4gICAgICAgICAgICB2YWx1ZTogcGh5c2ljcy5kZWZhdWx0TWF0ZXJpYWwgPyB7IHV1aWQ6IHBoeXNpY3MuZGVmYXVsdE1hdGVyaWFsIH0gOiBudWxsLFxuICAgICAgICAgICAgdHlwZTogJ2NjLlBoeXNpY3NNYXRlcmlhbCcsIFxuICAgICAgICAgICAgZXh0ZW5kczogWydjYy5PYmplY3QnXSBcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDb2xsaXNpb24gR3JvdXBzXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHBoeXNpY3MuY29sbGlzaW9uR3JvdXBzIHx8IFtdO1xuICAgICAgICByZXN1bHRbJ2NvbGxpc2lvbkdyb3VwcyddID0ge1xuICAgICAgICAgICAgIHZhbHVlOiBncm91cHMubWFwKChnOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICBpbmRleDogeyB2YWx1ZTogZy5pbmRleCwgdHlwZTogJ0ludGVnZXInLCByZWFkb25seTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogeyB2YWx1ZTogZy5uYW1lLCB0eXBlOiAnU3RyaW5nJyB9XG4gICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgIHR5cGU6ICdDb2xsaXNpb25Hcm91cEl0ZW0nXG4gICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgIHR5cGU6ICdDb2xsaXNpb25Hcm91cEl0ZW0nLFxuICAgICAgICAgICAgIGlzQXJyYXk6IHRydWUsXG4gICAgICAgICAgICAgZWxlbWVudFR5cGVEYXRhOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NvbGxpc2lvbkdyb3VwSXRlbScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHsgdmFsdWU6IDAsIHR5cGU6ICdJbnRlZ2VyJywgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogeyB2YWx1ZTogJycsIHR5cGU6ICdTdHJpbmcnIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENvbGxpc2lvbiBNYXRyaXhcbiAgICAgICAgY29uc3QgYml0bWFza0xpc3Q6IHsgbmFtZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyIH1bXSA9IFtdO1xuICAgICAgICAvLyBEZWZhdWx0IGdyb3VwIDBcbiAgICAgICAgY29uc3QgZGVmYXVsdEdyb3VwID0gZ3JvdXBzLmZpbmQoKGc6IGFueSkgPT4gZy5pbmRleCA9PT0gMCk7XG4gICAgICAgIGJpdG1hc2tMaXN0LnB1c2goeyBuYW1lOiBkZWZhdWx0R3JvdXAgPyBkZWZhdWx0R3JvdXAubmFtZSA6ICdERUZBVUxUJywgdmFsdWU6IDEgPDwgMCB9KTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgZyBvZiBncm91cHMpIHtcbiAgICAgICAgICAgIGlmIChnLmluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgIGJpdG1hc2tMaXN0LnB1c2goeyBuYW1lOiBnLm5hbWUsIHZhbHVlOiAxIDw8IGcuaW5kZXggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRyaXhPYmogPSBwaHlzaWNzLmNvbGxpc2lvbk1hdHJpeCB8fCB7fTtcbiAgICAgICAgY29uc3QgbWF0cml4QXJyID0gW107XG4gICAgICAgIC8vIENhbGN1bGF0ZSBtYXggaW5kZXggdG8gZGlzcGxheVxuICAgICAgICBjb25zdCBpbmRpY2VzID0gWzAsIC4uLmdyb3Vwcy5tYXAoKGc6IGFueSkgPT4gZy5pbmRleCksIC4uLk9iamVjdC5rZXlzKG1hdHJpeE9iaikubWFwKGsgPT4gcGFyc2VJbnQoaykpXTtcbiAgICAgICAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi5pbmRpY2VzKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG1heEluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIG1hdHJpeEFyci5wdXNoKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbWF0cml4T2JqW2ldIHx8IDAsXG4gICAgICAgICAgICAgICAgdHlwZTogJ0JpdE1hc2snLFxuICAgICAgICAgICAgICAgIGJpdG1hc2tMaXN0OiBiaXRtYXNrTGlzdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRbJ2NvbGxpc2lvbk1hdHJpeCddID0ge1xuICAgICAgICAgICAgdmFsdWU6IG1hdHJpeEFycixcbiAgICAgICAgICAgIHR5cGU6ICdCaXRNYXNrJyxcbiAgICAgICAgICAgIGlzQXJyYXk6IHRydWUsXG4gICAgICAgICAgICBlbGVtZW50VHlwZURhdGE6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQml0TWFzaycsXG4gICAgICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICAgICAgYml0bWFza0xpc3Q6IGJpdG1hc2tMaXN0XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkU29ydGluZ0xheWVyUHJvcGVydGllcyhsYXllcnM6IEFycmF5PHsgaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyIH0+KTogQXJyYXk8SVByb3BlcnR5VmFsdWVUeXBlPiB7XG4gICAgICAgIHJldHVybiBsYXllcnMubWFwKGxheWVyID0+ICh7XG4gICAgICAgICAgICBleHRlbmRzOiBbXSxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGxheWVyLmlkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnSW50ZWdlcicsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBsYXllci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGxheWVyLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnSW50ZWdlcidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZTogJ1NvcnRpbmdMYXllckl0ZW0nXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkTGF5ZXJQcm9wZXJ0aWVzKGxheWVyczogQXJyYXk8eyBuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIgfT4pOiBBcnJheTxJUHJvcGVydHlWYWx1ZVR5cGU+IHtcbiAgICAgICAgIHJldHVybiBsYXllcnMubWFwKGxheWVyID0+ICh7XG4gICAgICAgICAgICBleHRlbmRzOiBbXSxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbGF5ZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZydcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBsYXllci52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ludGVnZXInLFxuICAgICAgICAgICAgICAgICAgICByZWFkb25seTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlOiAnTGF5ZXJJdGVtJ1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/render-texture-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/render-texture-importer.js new file mode 100644 index 0000000..d7053ed --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/render-texture-importer.js @@ -0,0 +1,87 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RenderTextureImporter = void 0; +const base_importer_1 = require("./base-importer"); +const texture_importer_1 = require("./texture-importer"); +const texture_utils_1 = require("../texture-utils"); +class RenderTextureImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'render-texture'; + this.textureImporter = new texture_importer_1.TextureImporter(); + } + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta || !meta.userData) + return false; + const userData = meta.userData; + let handled = texture_utils_1.TextureUtils.applyProperties(userData, path, value); + if (!handled) { + if (path.includes('.')) { + const parts = path.split('.'); + let current = userData; + for (let i = 0; i < parts.length - 1; i++) { + if (!current[parts[i]]) + return false; + current = current[parts[i]]; + } + if (current) { + current[parts[parts.length - 1]] = value; + handled = true; + } + } + else { + userData[path] = value; + handled = true; + } + } + if (handled) { + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + return false; + } + async getProperties(assetInfo) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta) { + throw new Error(`Asset meta not found for ${assetInfo.uuid}`); + } + const userData = meta.userData; + if (!userData) { + throw new Error(`UserData not found for asset ${assetInfo.uuid}`); + } + return this.parseUserData(userData, meta.subMetas); + } + parseUserData(userData, subMetas) { + const propertyContainer = {}; + // Width & Height + propertyContainer.width = { + value: userData.width, + type: 'Integer', + displayName: 'Width' + }; + propertyContainer.height = { + value: userData.height, + type: 'Integer', + displayName: 'Height' + }; + // Texture properties + const textureProps = this.textureImporter.parseUserData(userData); + Object.assign(propertyContainer, textureProps); + // SpriteFrame UUID from subMetas + if (subMetas) { + const spriteFrameSubMeta = Object.values(subMetas).find((sm) => sm.importer === 'sprite-frame'); + if (spriteFrameSubMeta) { + propertyContainer.spriteFrame = { + value: { uuid: spriteFrameSubMeta.uuid }, + type: 'cc.SpriteFrame', + displayName: 'Sprite Frame', + readonly: true + }; + } + } + return propertyContainer; + } +} +exports.RenderTextureImporter = RenderTextureImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXRleHR1cmUtaW1wb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zb3VyY2UvdXRjcC91dGlscy9hc3NldC1pbXBvcnRlcnMvcmVuZGVyLXRleHR1cmUtaW1wb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQW9EO0FBRXBELHlEQUFxRDtBQUVyRCxvREFBZ0Q7QUFFaEQsTUFBYSxxQkFBc0IsU0FBUSxpQ0FBaUI7SUFBNUQ7O1FBQ0ksU0FBSSxHQUFHLGdCQUFnQixDQUFDO1FBQ2hCLG9CQUFlLEdBQUcsSUFBSSxrQ0FBZSxFQUFFLENBQUM7SUFtRnBELENBQUM7SUFqRkcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFxQixFQUFFLElBQVksRUFBRSxLQUFVO1FBQzdELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksT0FBTyxHQUFHLDRCQUFZLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ1gsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQztnQkFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFN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QUU7b0JBQ2pELElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFdBQVcsRUFBRSxjQUFjO29CQUMzQixRQUFRLEVBQUUsSUFBSTtpQkFDakIsQ0FBQztZQUNOLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0NBQ0o7QUFyRkQsc0RBcUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUFzc2V0SW1wb3J0ZXIgfSBmcm9tICcuL2Jhc2UtaW1wb3J0ZXInO1xuaW1wb3J0IHsgSUFzc2V0SW5mbyB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9hc3NldC1kYi9AdHlwZXMvcHVibGljJztcbmltcG9ydCB7IFRleHR1cmVJbXBvcnRlciB9IGZyb20gJy4vdGV4dHVyZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBJUHJvcGVydHksIElQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcbmltcG9ydCB7IFRleHR1cmVVdGlscyB9IGZyb20gJy4uL3RleHR1cmUtdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUmVuZGVyVGV4dHVyZUltcG9ydGVyIGV4dGVuZHMgQmFzZUFzc2V0SW1wb3J0ZXIge1xuICAgIG5hbWUgPSAncmVuZGVyLXRleHR1cmUnO1xuICAgIHByaXZhdGUgdGV4dHVyZUltcG9ydGVyID0gbmV3IFRleHR1cmVJbXBvcnRlcigpO1xuXG4gICAgYXN5bmMgc2V0UHJvcGVydHkoYXNzZXRJbmZvOiBJQXNzZXRJbmZvLCBwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LW1ldGEnLCBhc3NldEluZm8udXVpZCk7XG4gICAgICAgIGlmICghbWV0YSB8fCAhbWV0YS51c2VyRGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSBtZXRhLnVzZXJEYXRhO1xuICAgICAgICBsZXQgaGFuZGxlZCA9IFRleHR1cmVVdGlscy5hcHBseVByb3BlcnRpZXModXNlckRhdGEsIHBhdGgsIHZhbHVlKTtcblxuICAgICAgICBpZiAoIWhhbmRsZWQpIHtcbiAgICAgICAgICAgIGlmIChwYXRoLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudCA9IHVzZXJEYXRhO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudFtwYXJ0c1tpXV0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydHNbaV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50W3BhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVzZXJEYXRhW3BhdGhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgICAgICBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdzYXZlLWFzc2V0LW1ldGEnLCBhc3NldEluZm8udXVpZCwgSlNPTi5zdHJpbmdpZnkobWV0YSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFByb3BlcnRpZXMoYXNzZXRJbmZvOiBJQXNzZXRJbmZvKTogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9PiB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzc2V0IG1ldGEgbm90IGZvdW5kIGZvciAke2Fzc2V0SW5mby51dWlkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSBtZXRhLnVzZXJEYXRhO1xuICAgICAgICBpZiAoIXVzZXJEYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVzZXJEYXRhIG5vdCBmb3VuZCBmb3IgYXNzZXQgJHthc3NldEluZm8udXVpZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVXNlckRhdGEodXNlckRhdGEsIG1ldGEuc3ViTWV0YXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VVc2VyRGF0YSh1c2VyRGF0YTogYW55LCBzdWJNZXRhczogYW55KTogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5Q29udGFpbmVyOiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eSB9ID0ge307XG5cbiAgICAgICAgLy8gV2lkdGggJiBIZWlnaHRcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIud2lkdGggPSB7XG4gICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEud2lkdGgsXG4gICAgICAgICAgICB0eXBlOiAnSW50ZWdlcicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1dpZHRoJ1xuICAgICAgICB9O1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5oZWlnaHQgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEuaGVpZ2h0LFxuICAgICAgICAgICAgdHlwZTogJ0ludGVnZXInLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdIZWlnaHQnXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVGV4dHVyZSBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbnN0IHRleHR1cmVQcm9wcyA9IHRoaXMudGV4dHVyZUltcG9ydGVyLnBhcnNlVXNlckRhdGEodXNlckRhdGEpO1xuICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnR5Q29udGFpbmVyLCB0ZXh0dXJlUHJvcHMpO1xuXG4gICAgICAgIC8vIFNwcml0ZUZyYW1lIFVVSUQgZnJvbSBzdWJNZXRhc1xuICAgICAgICBpZiAoc3ViTWV0YXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwcml0ZUZyYW1lU3ViTWV0YSA9IE9iamVjdC52YWx1ZXMoc3ViTWV0YXMpLmZpbmQoKHNtOiBhbnkpID0+IHNtLmltcG9ydGVyID09PSAnc3ByaXRlLWZyYW1lJyk7XG4gICAgICAgICAgICBpZiAoc3ByaXRlRnJhbWVTdWJNZXRhKSB7XG4gICAgICAgICAgICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnNwcml0ZUZyYW1lID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB1dWlkOiAoc3ByaXRlRnJhbWVTdWJNZXRhIGFzIGFueSkudXVpZCB9LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2MuU3ByaXRlRnJhbWUnLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1Nwcml0ZSBGcmFtZScsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUNvbnRhaW5lcjtcbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/script-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/script-importer.js new file mode 100644 index 0000000..44f7eab --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/script-importer.js @@ -0,0 +1,99 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ScriptImporter = void 0; +const base_importer_1 = require("./base-importer"); +const fs = __importStar(require("fs")); +class ScriptImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'typescript'; + } + async getProperties(assetInfo) { + const filePath = assetInfo.file; + if (!filePath || !fs.existsSync(filePath)) { + throw new Error(`File not found for asset ${assetInfo.uuid}`); + } + try { + // Limit to 400 lines or 20000 chars, similar to engine inspector + const content = fs.readFileSync(filePath, 'utf-8'); + const MAX_CHARS = 20000; + const MAX_LINES = 400; + let truncated = false; + let finalContent = content; + if (finalContent.length > MAX_CHARS) { + finalContent = finalContent.substring(0, MAX_CHARS); + truncated = true; + } + const lines = finalContent.split('\n'); + if (lines.length > MAX_LINES) { + finalContent = lines.slice(0, MAX_LINES).join('\n'); + truncated = true; + } + if (truncated) { + finalContent += '\n... (truncated)'; + } + return this.parseUserData(finalContent, this.name); + } + catch (e) { + return { + error: { + type: 'String', + value: 'Failed to read script file: ' + e, + displayName: 'Error', + readonly: true + } + }; + } + } + parseUserData(content, language) { + return { + content: { + value: content, + type: 'String', + displayName: 'Content', + readonly: true + }, + language: { + value: language, + type: 'String', + displayName: 'Language', + readonly: true + } + }; + } +} +exports.ScriptImporter = ScriptImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LWltcG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc291cmNlL3V0Y3AvdXRpbHMvYXNzZXQtaW1wb3J0ZXJzL3NjcmlwdC1pbXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFBb0Q7QUFHcEQsdUNBQXlCO0FBRXpCLE1BQWEsY0FBZSxTQUFRLGlDQUFpQjtJQUFyRDs7UUFDSSxTQUFJLEdBQUcsWUFBWSxDQUFDO0lBNkR4QixDQUFDO0lBM0RHLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBcUI7UUFDckMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDRCxpRUFBaUU7WUFDakUsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUV0QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDO1lBRTNCLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsWUFBWSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNwRCxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztnQkFDM0IsWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNyQixDQUFDO1lBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDWixZQUFZLElBQUksbUJBQW1CLENBQUM7WUFDeEMsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsT0FBTztnQkFDSCxLQUFLLEVBQUU7b0JBQ0gsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsS0FBSyxFQUFFLDhCQUE4QixHQUFHLENBQUM7b0JBQ3pDLFdBQVcsRUFBRSxPQUFPO29CQUNwQixRQUFRLEVBQUUsSUFBSTtpQkFDakI7YUFDSixDQUFDO1FBQ04sQ0FBQztJQUNMLENBQUM7SUFFTSxhQUFhLENBQUMsT0FBZSxFQUFFLFFBQWdCO1FBQ2xELE9BQU87WUFDSCxPQUFPLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLFNBQVM7Z0JBQ3RCLFFBQVEsRUFBRSxJQUFJO2FBQ2pCO1lBQ0QsUUFBUSxFQUFFO2dCQUNOLEtBQUssRUFBRSxRQUFRO2dCQUNmLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxVQUFVO2dCQUN2QixRQUFRLEVBQUUsSUFBSTthQUNqQjtTQUNKLENBQUM7SUFDTixDQUFDO0NBQ0o7QUE5REQsd0NBOERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUFzc2V0SW1wb3J0ZXIgfSBmcm9tICcuL2Jhc2UtaW1wb3J0ZXInO1xuaW1wb3J0IHsgSUFzc2V0SW5mbyB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9hc3NldC1kYi9AdHlwZXMvcHVibGljJztcbmltcG9ydCB7IElQcm9wZXJ0eSwgSVByb3BlcnR5VmFsdWVUeXBlIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL3NjZW5lL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuXG5leHBvcnQgY2xhc3MgU2NyaXB0SW1wb3J0ZXIgZXh0ZW5kcyBCYXNlQXNzZXRJbXBvcnRlciB7XG4gICAgbmFtZSA9ICd0eXBlc2NyaXB0JztcblxuICAgIGFzeW5jIGdldFByb3BlcnRpZXMoYXNzZXRJbmZvOiBJQXNzZXRJbmZvKTogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eVZhbHVlVHlwZSB9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYXNzZXRJbmZvLmZpbGU7XG4gICAgICAgIGlmICghZmlsZVBhdGggfHwgIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kIGZvciBhc3NldCAke2Fzc2V0SW5mby51dWlkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExpbWl0IHRvIDQwMCBsaW5lcyBvciAyMDAwMCBjaGFycywgc2ltaWxhciB0byBlbmdpbmUgaW5zcGVjdG9yXG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICAgIGNvbnN0IE1BWF9DSEFSUyA9IDIwMDAwO1xuICAgICAgICAgICAgY29uc3QgTUFYX0xJTkVTID0gNDAwO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgdHJ1bmNhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgZmluYWxDb250ZW50ID0gY29udGVudDtcblxuICAgICAgICAgICAgaWYgKGZpbmFsQ29udGVudC5sZW5ndGggPiBNQVhfQ0hBUlMpIHtcbiAgICAgICAgICAgICAgICBmaW5hbENvbnRlbnQgPSBmaW5hbENvbnRlbnQuc3Vic3RyaW5nKDAsIE1BWF9DSEFSUyk7XG4gICAgICAgICAgICAgICAgdHJ1bmNhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGluZXMgPSBmaW5hbENvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IE1BWF9MSU5FUykge1xuICAgICAgICAgICAgICAgIGZpbmFsQ29udGVudCA9IGxpbmVzLnNsaWNlKDAsIE1BWF9MSU5FUykuam9pbignXFxuJyk7XG4gICAgICAgICAgICAgICAgdHJ1bmNhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRydW5jYXRlZCkge1xuICAgICAgICAgICAgICAgIGZpbmFsQ29udGVudCArPSAnXFxuLi4uICh0cnVuY2F0ZWQpJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VVc2VyRGF0YShmaW5hbENvbnRlbnQsIHRoaXMubmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnRmFpbGVkIHRvIHJlYWQgc2NyaXB0IGZpbGU6ICcgKyBlLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVXNlckRhdGEoY29udGVudDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdDb250ZW50JyxcbiAgICAgICAgICAgICAgICByZWFkb25seTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhbmd1YWdlOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGxhbmd1YWdlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTGFuZ3VhZ2UnLFxuICAgICAgICAgICAgICAgIHJlYWRvbmx5OiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/sprite-frame-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/sprite-frame-importer.js new file mode 100644 index 0000000..205baa7 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/sprite-frame-importer.js @@ -0,0 +1,145 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SpriteFrameImporter = void 0; +const base_importer_1 = require("./base-importer"); +class SpriteFrameImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'sprite-frame'; + } + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta || !meta.userData) + return false; + const userData = meta.userData; + let handled = false; + if (path.includes('.')) { + const parts = path.split('.'); + let current = userData; + for (let i = 0; i < parts.length - 1; i++) { + if (!current[parts[i]]) + return false; + current = current[parts[i]]; + } + if (current) { + current[parts[parts.length - 1]] = value; + handled = true; + } + } + else { + userData[path] = value; + handled = true; + } + if (handled) { + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + return false; + } + async getProperties(assetInfo) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + const userData = meta === null || meta === void 0 ? void 0 : meta.userData; + if (!userData) { + throw new Error(`UserData not found for asset ${assetInfo.uuid}`); + } + return this.parseUserData(userData); + } + parseUserData(userData) { + const propertyContainer = {}; + // Basic properties + propertyContainer.packable = { + value: userData.packable, + type: 'Boolean', + displayName: 'Packable', + }; + propertyContainer.rotated = { + value: userData.rotated, + type: 'Boolean', + displayName: 'Rotated', + readonly: true + }; + propertyContainer.offsetX = { + value: userData.offsetX, + type: 'Number', + displayName: 'Offset X', + readonly: true + }; + propertyContainer.offsetY = { + value: userData.offsetY, + type: 'Number', + displayName: 'Offset Y', + readonly: true + }; + // Trim + propertyContainer.trimType = { + value: userData.trimType, + type: 'Enum', + enumList: ['auto', 'custom', 'none'].map(k => ({ name: k, value: k })), + displayName: 'Trim Type' + }; + propertyContainer.trimThreshold = { + value: userData.trimThreshold, + type: 'Number', + displayName: 'Trim Threshold' + }; + propertyContainer.trimX = { + value: userData.trimX, + type: 'Number', + displayName: 'Trim X' + }; + propertyContainer.trimY = { + value: userData.trimY, + type: 'Number', + displayName: 'Trim Y' + }; + propertyContainer.width = { + value: userData.width, + type: 'Number', + displayName: 'Width' + }; + propertyContainer.height = { + value: userData.height, + type: 'Number', + displayName: 'Height' + }; + // Borders + propertyContainer.borderTop = { + value: userData.borderTop, + type: 'Number', + displayName: 'Border Top' + }; + propertyContainer.borderBottom = { + value: userData.borderBottom, + type: 'Number', + displayName: 'Border Bottom' + }; + propertyContainer.borderLeft = { + value: userData.borderLeft, + type: 'Number', + displayName: 'Border Left' + }; + propertyContainer.borderRight = { + value: userData.borderRight, + type: 'Number', + displayName: 'Border Right' + }; + propertyContainer.pixelsToUnit = { + value: userData.pixelsToUnit, + type: 'Number', + displayName: 'Pixels To Unit' + }; + propertyContainer.pivotX = { + value: userData.pivotX, + type: 'Number', + displayName: 'Pivot X' + }; + propertyContainer.pivotY = { + value: userData.pivotY, + type: 'Number', + displayName: 'Pivot Y' + }; + return propertyContainer; + } +} +exports.SpriteFrameImporter = SpriteFrameImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByaXRlLWZyYW1lLWltcG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc291cmNlL3V0Y3AvdXRpbHMvYXNzZXQtaW1wb3J0ZXJzL3Nwcml0ZS1mcmFtZS1pbXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBb0Q7QUFJcEQsTUFBYSxtQkFBb0IsU0FBUSxpQ0FBaUI7SUFBMUQ7O1FBQ0ksU0FBSSxHQUFHLGNBQWMsQ0FBQztJQWlKMUIsQ0FBQztJQS9JRyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQXFCLEVBQUUsSUFBWSxFQUFFLEtBQVU7UUFDN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXBCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFBRSxPQUFPLEtBQUssQ0FBQztnQkFDckMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FB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N0IsS0FBSyxFQUFFLFFBQVEsQ0FBQyxZQUFZO1lBQzVCLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLGdCQUFnQjtTQUNoQyxDQUFDO1FBQ0YsaUJBQWlCLENBQUMsTUFBTSxHQUFHO1lBQ3ZCLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTTtZQUN0QixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSxTQUFTO1NBQ3pCLENBQUM7UUFDRixpQkFBaUIsQ0FBQyxNQUFNLEdBQUc7WUFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3RCLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLFNBQVM7U0FDekIsQ0FBQztRQUVGLE9BQU8saUJBQWlCLENBQUM7SUFDN0IsQ0FBQztDQUVKO0FBbEpELGtEQWtKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VBc3NldEltcG9ydGVyIH0gZnJvbSAnLi9iYXNlLWltcG9ydGVyJztcbmltcG9ydCB7IElBc3NldEluZm8gfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvYXNzZXQtZGIvQHR5cGVzL3B1YmxpYyc7XG5pbXBvcnQgeyBJUHJvcGVydHksIElQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcblxuZXhwb3J0IGNsYXNzIFNwcml0ZUZyYW1lSW1wb3J0ZXIgZXh0ZW5kcyBCYXNlQXNzZXRJbXBvcnRlciB7XG4gICAgbmFtZSA9ICdzcHJpdGUtZnJhbWUnO1xuXG4gICAgYXN5bmMgc2V0UHJvcGVydHkoYXNzZXRJbmZvOiBJQXNzZXRJbmZvLCBwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LW1ldGEnLCBhc3NldEluZm8udXVpZCk7XG4gICAgICAgIGlmICghbWV0YSB8fCAhbWV0YS51c2VyRGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSBtZXRhLnVzZXJEYXRhO1xuICAgICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IHVzZXJEYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRbcGFydHNbaV1dKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydHNbaV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50W3BhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXNlckRhdGFbcGF0aF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAnc2F2ZS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQsIEpTT04uc3RyaW5naWZ5KG1ldGEpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKGFzc2V0SW5mbzogSUFzc2V0SW5mbyk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfT4ge1xuICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSBtZXRhPy51c2VyRGF0YTtcblxuICAgICAgICBpZiAoIXVzZXJEYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVzZXJEYXRhIG5vdCBmb3VuZCBmb3IgYXNzZXQgJHthc3NldEluZm8udXVpZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VVc2VyRGF0YSh1c2VyRGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVXNlckRhdGEodXNlckRhdGE6IHsgW2luZGV4OiBzdHJpbmddOiBhbnk7IH0pOiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eSB9IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHlDb250YWluZXI6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0gPSB7fTtcblxuICAgICAgICAvLyBCYXNpYyBwcm9wZXJ0aWVzXG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnBhY2thYmxlID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLnBhY2thYmxlLFxuICAgICAgICAgICAgdHlwZTogJ0Jvb2xlYW4nLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdQYWNrYWJsZScsXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnJvdGF0ZWQgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEucm90YXRlZCxcbiAgICAgICAgICAgIHR5cGU6ICdCb29sZWFuJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnUm90YXRlZCcsXG4gICAgICAgICAgICByZWFkb25seTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5vZmZzZXRYID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLm9mZnNldFgsXG4gICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnT2Zmc2V0IFgnLFxuICAgICAgICAgICAgcmVhZG9ubHk6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIub2Zmc2V0WSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5vZmZzZXRZLFxuICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ09mZnNldCBZJyxcbiAgICAgICAgICAgIHJlYWRvbmx5OiB0cnVlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVHJpbVxuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci50cmltVHlwZSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS50cmltVHlwZSxcbiAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgIGVudW1MaXN0OiBbJ2F1dG8nLCAnY3VzdG9tJywgJ25vbmUnXS5tYXAoayA9PiAoeyBuYW1lOiBrLCB2YWx1ZTogayB9KSksXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1RyaW0gVHlwZSdcbiAgICAgICAgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIudHJpbVRocmVzaG9sZCA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS50cmltVGhyZXNob2xkLFxuICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1RyaW0gVGhyZXNob2xkJ1xuICAgICAgICB9O1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci50cmltWCA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS50cmltWCxcbiAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdUcmltIFgnXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnRyaW1ZID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLnRyaW1ZLFxuICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1RyaW0gWSdcbiAgICAgICAgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIud2lkdGggPSB7XG4gICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEud2lkdGgsXG4gICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnV2lkdGgnXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmhlaWdodCA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5oZWlnaHQsXG4gICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnSGVpZ2h0J1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEJvcmRlcnNcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuYm9yZGVyVG9wID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLmJvcmRlclRvcCxcbiAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdCb3JkZXIgVG9wJ1xuICAgICAgICB9O1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5ib3JkZXJCb3R0b20gPSB7XG4gICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEuYm9yZGVyQm90dG9tLFxuICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0JvcmRlciBCb3R0b20nXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmJvcmRlckxlZnQgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEuYm9yZGVyTGVmdCxcbiAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdCb3JkZXIgTGVmdCdcbiAgICAgICAgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuYm9yZGVyUmlnaHQgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEuYm9yZGVyUmlnaHQsXG4gICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQm9yZGVyIFJpZ2h0J1xuICAgICAgICB9O1xuXG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnBpeGVsc1RvVW5pdCA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5waXhlbHNUb1VuaXQsXG4gICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnUGl4ZWxzIFRvIFVuaXQnXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnBpdm90WCA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5waXZvdFgsXG4gICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnUGl2b3QgWCdcbiAgICAgICAgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIucGl2b3RZID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLnBpdm90WSxcbiAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdQaXZvdCBZJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUNvbnRhaW5lcjtcbiAgICB9XG5cbn1cbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/texture-cube-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/texture-cube-importer.js new file mode 100644 index 0000000..9d40a8a --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/texture-cube-importer.js @@ -0,0 +1,85 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TextureCubeImporter = void 0; +const base_importer_1 = require("./base-importer"); +const texture_utils_1 = require("../texture-utils"); +class TextureCubeImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'texture-cube'; + } + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta || !meta.userData) + return false; + const userData = meta.userData; + let handled = false; + if (texture_utils_1.TextureUtils.applyProperties(userData, path, value)) { + handled = true; + } + if (!handled) { + if (path.includes('.')) { + const parts = path.split('.'); + let current = userData; + for (let i = 0; i < parts.length - 1; i++) { + if (!current[parts[i]]) + return false; + current = current[parts[i]]; + } + if (current) { + current[parts[parts.length - 1]] = value; + handled = true; + } + } + else { + userData[path] = value; + handled = true; + } + } + if (handled) { + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + return false; + } + async getProperties(assetInfo) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + if (!meta) { + return {}; + } + const userData = meta.userData || {}; + return this.parseUserData(userData); + } + parseUserData(userData) { + const propertyContainer = {}; + // Faces + ['front', 'back', 'left', 'right', 'top', 'bottom'].forEach(face => { + propertyContainer[face] = { + value: userData[face] ? { uuid: userData[face] } : null, + type: 'cc.ImageAsset', + displayName: face.charAt(0).toUpperCase() + face.slice(1) + }; + }); + // Texture Settings + propertyContainer.anisotropy = { + value: userData.anisotropy, + type: 'Number', + displayName: 'Anisotropy' + }; + propertyContainer.faceSize = { + value: userData.faceSize, + type: 'Number', + displayName: 'Face Size' + }; + // Texture Utils (Filter/Wrap) + texture_utils_1.TextureUtils.injectTextureProperties(userData, propertyContainer); + propertyContainer.generateMipmaps = { + value: userData.mipfilter !== 'none', + type: 'Boolean', + displayName: 'Generate Mipmaps' + }; + return propertyContainer; + } +} +exports.TextureCubeImporter = TextureCubeImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dHVyZS1jdWJlLWltcG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc291cmNlL3V0Y3AvdXRpbHMvYXNzZXQtaW1wb3J0ZXJzL3RleHR1cmUtY3ViZS1pbXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBb0Q7QUFDcEQsb0RBQWdEO0FBSWhELE1BQWEsbUJBQW9CLFNBQVEsaUNBQWlCO0lBQTFEOztRQUNJLFNBQUksR0FBRyxjQUFjLENBQUM7SUFrRjFCLENBQUM7SUFoRkcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFxQixFQUFFLElBQVksRUFBRSxLQUFVO1FBQzdELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLDRCQUFZLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDO2dCQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFD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Q2YsV0FBVyxFQUFFLGtCQUFrQjtTQUNsQyxDQUFDO1FBRUYsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0NBQ0o7QUFuRkQsa0RBbUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUFzc2V0SW1wb3J0ZXIgfSBmcm9tICcuL2Jhc2UtaW1wb3J0ZXInO1xuaW1wb3J0IHsgVGV4dHVyZVV0aWxzIH0gZnJvbSAnLi4vdGV4dHVyZS11dGlscyc7XG5pbXBvcnQgeyBJQXNzZXRJbmZvIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL2Fzc2V0LWRiL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0IHsgSVByb3BlcnR5LCBJUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0dXJlQ3ViZUltcG9ydGVyIGV4dGVuZHMgQmFzZUFzc2V0SW1wb3J0ZXIge1xuICAgIG5hbWUgPSAndGV4dHVyZS1jdWJlJztcblxuICAgIGFzeW5jIHNldFByb3BlcnR5KGFzc2V0SW5mbzogSUFzc2V0SW5mbywgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQpO1xuICAgICAgICBpZiAoIW1ldGEgfHwgIW1ldGEudXNlckRhdGEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHVzZXJEYXRhID0gbWV0YS51c2VyRGF0YTtcbiAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoVGV4dHVyZVV0aWxzLmFwcGx5UHJvcGVydGllcyh1c2VyRGF0YSwgcGF0aCwgdmFsdWUpKSB7XG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFoYW5kbGVkKSB7XG4gICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB1c2VyRGF0YTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRbcGFydHNbaV1dKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRzW2ldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1c2VyRGF0YVtwYXRoXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAnc2F2ZS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQsIEpTT04uc3RyaW5naWZ5KG1ldGEpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKGFzc2V0SW5mbzogSUFzc2V0SW5mbyk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfT4ge1xuICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSBtZXRhLnVzZXJEYXRhIHx8IHt9O1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVVzZXJEYXRhKHVzZXJEYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VVc2VyRGF0YSh1c2VyRGF0YTogeyBbaW5kZXg6IHN0cmluZ106IGFueTsgfSk6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUNvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuXG4gICAgICAgIC8vIEZhY2VzXG4gICAgICAgIFsnZnJvbnQnLCAnYmFjaycsICdsZWZ0JywgJ3JpZ2h0JywgJ3RvcCcsICdib3R0b20nXS5mb3JFYWNoKGZhY2UgPT4ge1xuICAgICAgICAgICAgcHJvcGVydHlDb250YWluZXJbZmFjZV0gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhW2ZhY2VdID8geyB1dWlkOiB1c2VyRGF0YVtmYWNlXSB9IDogbnVsbCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2MuSW1hZ2VBc3NldCcsXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGZhY2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBmYWNlLnNsaWNlKDEpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUZXh0dXJlIFNldHRpbmdzXG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmFuaXNvdHJvcHkgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEuYW5pc290cm9weSxcbiAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdBbmlzb3Ryb3B5J1xuICAgICAgICB9O1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5mYWNlU2l6ZSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5mYWNlU2l6ZSxcbiAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdGYWNlIFNpemUnXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVGV4dHVyZSBVdGlscyAoRmlsdGVyL1dyYXApXG4gICAgICAgIFRleHR1cmVVdGlscy5pbmplY3RUZXh0dXJlUHJvcGVydGllcyh1c2VyRGF0YSwgcHJvcGVydHlDb250YWluZXIpO1xuXG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmdlbmVyYXRlTWlwbWFwcyA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5taXBmaWx0ZXIgIT09ICdub25lJyxcbiAgICAgICAgICAgIHR5cGU6ICdCb29sZWFuJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnR2VuZXJhdGUgTWlwbWFwcydcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gcHJvcGVydHlDb250YWluZXI7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/texture-importer.js b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/texture-importer.js new file mode 100644 index 0000000..9cf828f --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/asset-importers/texture-importer.js @@ -0,0 +1,60 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TextureImporter = void 0; +const base_importer_1 = require("./base-importer"); +const texture_utils_1 = require("../texture-utils"); +class TextureImporter extends base_importer_1.BaseAssetImporter { + constructor() { + super(...arguments); + this.name = 'texture'; + } + async getProperties(assetInfo) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + const userData = meta === null || meta === void 0 ? void 0 : meta.userData; + if (!userData) { + throw new Error(`UserData not found for asset ${assetInfo.uuid}`); + } + return this.parseUserData(userData); + } + async setProperty(assetInfo, path, value) { + const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid); + const userData = meta === null || meta === void 0 ? void 0 : meta.userData; + if (!userData) { + return false; + } + let handled = texture_utils_1.TextureUtils.applyProperties(userData, path, value); + if (!handled) { + // Default: direct assignment to userData + // TODO: Support nested paths if needed (e.g. 'some.deep.prop') + if (path.includes('.')) { + // Simple dot notation support + const parts = path.split('.'); + let current = userData; + for (let i = 0; i < parts.length - 1; i++) { + current = current[parts[i]]; + if (!current) + return false; // Path doesn't exist + } + current[parts[parts.length - 1]] = value; + } + else { + userData[path] = value; + } + } + await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta)); + return true; + } + parseUserData(userData) { + const propertyContainer = {}; + texture_utils_1.TextureUtils.injectTextureProperties(userData, propertyContainer); + // Generate Mipmaps + propertyContainer.generateMipmaps = { + value: userData.mipfilter !== 'none', + type: 'Boolean', + displayName: 'Generate Mipmaps' + }; + return propertyContainer; + } +} +exports.TextureImporter = TextureImporter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dHVyZS1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy90ZXh0dXJlLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFvRDtBQUdwRCxvREFBZ0Q7QUFFaEQsTUFBYSxlQUFnQixTQUFRLGlDQUFpQjtJQUF0RDs7UUFDSSxTQUFJLEdBQUcsU0FBUyxDQUFDO0lBMkRyQixDQUFDO0lBekRHLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBcUI7UUFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFGLE1BQU0sUUFBUSxHQUFHLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRLENBQUM7UUFFaEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBR0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFxQixFQUFFLElBQVksRUFBRSxLQUFVO1FBQzdELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixNQUFNLFFBQVEsR0FBRyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxDQUFDO1FBRWhDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNaLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxJQUFJLE9BQU8sR0FBRyw0QkFBWSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNYLHlDQUF5QztZQUN6QywrREFBK0Q7WUFDL0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLDhCQUE4QjtnQkFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDO2dCQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDeEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLE9BQU87d0JBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxxQkFBcUI7Z0JBQ3JELENBQUM7Z0JBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzdDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEcsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLGFBQWEsQ0FBQyxRQUFtQztRQUNwRCxNQUFNLGlCQUFpQixHQUFpQyxFQUFFLENBQUM7UUFFM0QsNEJBQVksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUVsRSxtQkFBbUI7UUFDbkIsaUJBQWlCLENBQUMsZUFBZSxHQUFHO1lBQ2hDLEtBQUssRUFBRSxRQUFRLENBQUMsU0FBUyxLQUFLLE1BQU07WUFDcEMsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQUUsa0JBQWtCO1NBQ2xDLENBQUM7UUFFRixPQUFPLGlCQUFpQixDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQTVERCwwQ0E0REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQXNzZXRJbXBvcnRlciB9IGZyb20gJy4vYmFzZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBJQXNzZXRJbmZvIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL2Fzc2V0LWRiL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0IHsgSVByb3BlcnR5LCBJUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5pbXBvcnQgeyBUZXh0dXJlVXRpbHMgfSBmcm9tICcuLi90ZXh0dXJlLXV0aWxzJztcblxuZXhwb3J0IGNsYXNzIFRleHR1cmVJbXBvcnRlciBleHRlbmRzIEJhc2VBc3NldEltcG9ydGVyIHtcbiAgICBuYW1lID0gJ3RleHR1cmUnO1xuXG4gICAgYXN5bmMgZ2V0UHJvcGVydGllcyhhc3NldEluZm86IElBc3NldEluZm8pOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5VmFsdWVUeXBlIH0+IHtcbiAgICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LW1ldGEnLCBhc3NldEluZm8udXVpZCk7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhID0gbWV0YT8udXNlckRhdGE7XG5cbiAgICAgICAgaWYgKCF1c2VyRGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVc2VyRGF0YSBub3QgZm91bmQgZm9yIGFzc2V0ICR7YXNzZXRJbmZvLnV1aWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVVzZXJEYXRhKHVzZXJEYXRhKTtcbiAgICB9XG5cblxuICAgIGFzeW5jIHNldFByb3BlcnR5KGFzc2V0SW5mbzogSUFzc2V0SW5mbywgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQpO1xuICAgICAgICBjb25zdCB1c2VyRGF0YSA9IG1ldGE/LnVzZXJEYXRhO1xuXG4gICAgICAgIGlmICghdXNlckRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYW5kbGVkID0gVGV4dHVyZVV0aWxzLmFwcGx5UHJvcGVydGllcyh1c2VyRGF0YSwgcGF0aCwgdmFsdWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFoYW5kbGVkKSB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0OiBkaXJlY3QgYXNzaWdubWVudCB0byB1c2VyRGF0YVxuICAgICAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBuZXN0ZWQgcGF0aHMgaWYgbmVlZGVkIChlLmcuICdzb21lLmRlZXAucHJvcCcpXG4gICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgLy8gU2ltcGxlIGRvdCBub3RhdGlvbiBzdXBwb3J0XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB1c2VyRGF0YTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0c1tpXV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudCkgcmV0dXJuIGZhbHNlOyAvLyBQYXRoIGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXNlckRhdGFbcGF0aF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3NhdmUtYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkLCBKU09OLnN0cmluZ2lmeShtZXRhKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZVVzZXJEYXRhKHVzZXJEYXRhOiB7IFtpbmRleDogc3RyaW5nXTogYW55OyB9KTogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5Q29udGFpbmVyOiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eSB9ID0ge307XG5cbiAgICAgICAgVGV4dHVyZVV0aWxzLmluamVjdFRleHR1cmVQcm9wZXJ0aWVzKHVzZXJEYXRhLCBwcm9wZXJ0eUNvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgTWlwbWFwc1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5nZW5lcmF0ZU1pcG1hcHMgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEubWlwZmlsdGVyICE9PSAnbm9uZScsXG4gICAgICAgICAgICB0eXBlOiAnQm9vbGVhbicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0dlbmVyYXRlIE1pcG1hcHMnXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHByb3BlcnR5Q29udGFpbmVyO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/inspector-utils.js b/extensions/cocos-code-mode/dist/utcp/utils/inspector-utils.js new file mode 100644 index 0000000..9a896e2 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/inspector-utils.js @@ -0,0 +1,57 @@ +"use strict"; +// Removed IInspectorProperty-related transformation methods. +/* +export class InspectorUtils { + + static localize(text: string | undefined): string | undefined { + if (!text) return text; + if (text.length === 0) return undefined; + if (text.startsWith('i18n:')) { + // @ts-ignore + return Editor.I18n.t(text.replace('i18n:', '')); + } + return text; + } + + static isPrimitiveType(type: string | undefined): boolean { + if (!type) return false; + return ['Number', 'Integer', 'String', 'Boolean', 'Enum', 'BitMask', 'Float', + 'cc.Vec2', 'cc.Vec3', 'cc.Vec4', 'cc.Color', 'cc.Size', 'cc.Rect', 'cc.Quat'].includes(type); + } + + static cleanResult(obj: any): any { + if (Array.isArray(obj)) { + return obj.map(v => this.cleanResult(v)); + } else if (obj !== null && typeof obj === 'object') { + const newObj: any = {}; + for (const key in obj) { + const val = this.cleanResult(obj[key]); + if (val !== undefined) { + newObj[key] = val; + } + } + return newObj; + } + return obj; + } + + static parsePropertySet(container: any, excludeKeys: string[] = [], simple: boolean = false, depth: number = 0): any { + if (!container) return {}; + const props: any = {}; + for (const key in container) { + if (excludeKeys.includes(key)) continue; + + const prop = container[key]; + if ('visible' in prop && !prop.visible) continue; + if (prop && typeof prop === 'object' && 'value' in prop) { + props[key] = prop.value; + } else { + props[key] = prop; + } + } + return props; + } +} + +*/ +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc291cmNlL3V0Y3AvdXRpbHMvaW5zcGVjdG9yLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw2REFBNkQ7QUFDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcURFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gUmVtb3ZlZCBJSW5zcGVjdG9yUHJvcGVydHktcmVsYXRlZCB0cmFuc2Zvcm1hdGlvbiBtZXRob2RzLlxuLypcbmV4cG9ydCBjbGFzcyBJbnNwZWN0b3JVdGlscyB7XG5cbiAgICBzdGF0aWMgbG9jYWxpemUodGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGV4dC5zdGFydHNXaXRoKCdpMThuOicpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yLkkxOG4udCh0ZXh0LnJlcGxhY2UoJ2kxOG46JywgJycpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNQcmltaXRpdmVUeXBlKHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXR5cGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFsnTnVtYmVyJywgJ0ludGVnZXInLCAnU3RyaW5nJywgJ0Jvb2xlYW4nLCAnRW51bScsICdCaXRNYXNrJywgJ0Zsb2F0JyxcbiAgICAgICAgICAgICAgICAnY2MuVmVjMicsICdjYy5WZWMzJywgJ2NjLlZlYzQnLCAnY2MuQ29sb3InLCAnY2MuU2l6ZScsICdjYy5SZWN0JywgJ2NjLlF1YXQnXS5pbmNsdWRlcyh0eXBlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYW5SZXN1bHQob2JqOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLm1hcCh2ID0+IHRoaXMuY2xlYW5SZXN1bHQodikpO1xuICAgICAgICB9IGVsc2UgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgbmV3T2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuY2xlYW5SZXN1bHQob2JqW2tleV0pO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdPYmpba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlUHJvcGVydHlTZXQoY29udGFpbmVyOiBhbnksIGV4Y2x1ZGVLZXlzOiBzdHJpbmdbXSA9IFtdLCBzaW1wbGU6IGJvb2xlYW4gPSBmYWxzZSwgZGVwdGg6IG51bWJlciA9IDApOiBhbnkge1xuICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIHt9O1xuICAgICAgICBjb25zdCBwcm9wczogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVLZXlzLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBwcm9wID0gY29udGFpbmVyW2tleV07XG4gICAgICAgICAgICBpZiAoJ3Zpc2libGUnIGluIHByb3AgJiYgIXByb3AudmlzaWJsZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcCAmJiB0eXBlb2YgcHJvcCA9PT0gJ29iamVjdCcgJiYgJ3ZhbHVlJyBpbiBwcm9wKSB7XG4gICAgICAgICAgICAgICAgcHJvcHNba2V5XSA9IHByb3AudmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb3BzW2tleV0gPSBwcm9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICB9XG59XG5cbiovIl19 \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/texture-utils.js b/extensions/cocos-code-mode/dist/utcp/utils/texture-utils.js new file mode 100644 index 0000000..8003604 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/texture-utils.js @@ -0,0 +1,113 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TextureUtils = void 0; +class TextureUtils { + /** + * Applies synthetic texture properties (filterMode, wrapMode) to the user data. + * Returns true if the property was handled. + */ + static applyProperties(userData, path, value) { + if (path === 'filterMode') { + if (this.FilterModeMap[value]) { + Object.assign(userData, this.FilterModeMap[value]); + return true; + } + } + else if (path === 'wrapMode') { + if (this.WrapModeMap[value]) { + Object.assign(userData, this.WrapModeMap[value]); + return true; + } + } + return false; + } + /** + * Injects synthetic texture properties (filterMode, wrapMode) into the property container. + */ + static injectTextureProperties(userData, propertyContainer) { + // Filter Mode Logic + let filterMode = 'Advanced'; + for (const [mode, settings] of Object.entries(this.FilterModeMap)) { + if (userData.minfilter === settings.minfilter && + userData.magfilter === settings.magfilter && + userData.mipfilter === settings.mipfilter) { + filterMode = mode; + break; + } + } + propertyContainer.filterMode = { + value: filterMode, + type: 'Enum', + enumList: [...Object.keys(this.FilterModeMap), 'Advanced'].map(k => ({ name: k, value: k })), + displayName: 'Filter Mode', + }; + if (filterMode === 'Advanced') { + propertyContainer.minfilter = { + value: userData.minfilter, + type: 'Enum', + enumList: ['nearest', 'linear'].map(k => ({ name: k, value: k })), + displayName: 'Min Filter', + }; + propertyContainer.magfilter = { + value: userData.magfilter, + type: 'Enum', + enumList: ['nearest', 'linear'].map(k => ({ name: k, value: k })), + displayName: 'Mag Filter', + }; + propertyContainer.mipfilter = { + value: userData.mipfilter, + type: 'Enum', + enumList: ['none', 'nearest', 'linear'].map(k => ({ name: k, value: k })), + displayName: 'Mip Filter', + }; + } + // Wrap Mode Logic + let wrapMode = 'Advanced'; + for (const [mode, settings] of Object.entries(this.WrapModeMap)) { + if (userData.wrapModeS === settings.wrapModeS && + userData.wrapModeT === settings.wrapModeT) { + wrapMode = mode; + break; + } + } + propertyContainer.wrapMode = { + value: wrapMode, + type: 'Enum', + enumList: [...Object.keys(this.WrapModeMap), 'Advanced'].map(k => ({ name: k, value: k })), + displayName: 'Wrap Mode', + }; + if (wrapMode === 'Advanced') { + const wrapModes = ['repeat', 'clamp-to-edge', 'mirrored-repeat'].map(k => ({ name: k, value: k })); + propertyContainer.wrapModeS = { + value: userData.wrapModeS, + type: 'Enum', + enumList: wrapModes, + displayName: 'Wrap Mode S', + }; + propertyContainer.wrapModeT = { + value: userData.wrapModeT, + type: 'Enum', + enumList: wrapModes, + displayName: 'Wrap Mode T', + }; + } + propertyContainer.anisotropy = { + value: userData.anisotropy, + type: 'Number', + displayName: 'Anisotropy', + }; + } +} +exports.TextureUtils = TextureUtils; +TextureUtils.FilterModeMap = { + 'Nearest (None)': { minfilter: 'nearest', magfilter: 'nearest', mipfilter: 'none' }, + 'Bilinear': { minfilter: 'linear', magfilter: 'linear', mipfilter: 'none' }, + 'Bilinear with Mipmaps': { minfilter: 'linear', magfilter: 'linear', mipfilter: 'nearest' }, + 'Trilinear with Mipmaps': { minfilter: 'linear', magfilter: 'linear', mipfilter: 'linear' }, +}; +TextureUtils.WrapModeMap = { + 'Repeat': { wrapModeS: 'repeat', wrapModeT: 'repeat' }, + 'Clamp': { wrapModeS: 'clamp-to-edge', wrapModeT: 'clamp-to-edge' }, + 'Mirror': { wrapModeS: 'mirrored-repeat', wrapModeT: 'mirrored-repeat' }, +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dHVyZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL3RleHR1cmUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsTUFBYSxZQUFZO0lBY3JCOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBYSxFQUFFLElBQVksRUFBRSxLQUFVO1FBQzFELElBQUksSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM1QixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDakQsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsdUJBQXVCLENBQUMsUUFBYSxFQUFFLGlCQUErQztRQUN6RixvQkFBb0I7UUFDcEIsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzVCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ2hFLElBQUksUUFBUSxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsU0FB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RUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRTtDQUM5RixDQUFDO0FBRWMsd0JBQVcsR0FBNkQ7SUFDcEYsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFO0lBQ3RELE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtJQUNuRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFO0NBQzNFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IElQcm9wZXJ0eSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcblxuZXhwb3J0IGNsYXNzIFRleHR1cmVVdGlscyB7XG4gICAgc3RhdGljIHJlYWRvbmx5IEZpbHRlck1vZGVNYXA6IFJlY29yZDxzdHJpbmcsIHsgbWluZmlsdGVyOiBzdHJpbmc7IG1hZ2ZpbHRlcjogc3RyaW5nOyBtaXBmaWx0ZXI6IHN0cmluZyB9PiA9IHtcbiAgICAgICAgJ05lYXJlc3QgKE5vbmUpJzogeyBtaW5maWx0ZXI6ICduZWFyZXN0JywgbWFnZmlsdGVyOiAnbmVhcmVzdCcsIG1pcGZpbHRlcjogJ25vbmUnIH0sXG4gICAgICAgICdCaWxpbmVhcic6IHsgbWluZmlsdGVyOiAnbGluZWFyJywgbWFnZmlsdGVyOiAnbGluZWFyJywgbWlwZmlsdGVyOiAnbm9uZScgfSxcbiAgICAgICAgJ0JpbGluZWFyIHdpdGggTWlwbWFwcyc6IHsgbWluZmlsdGVyOiAnbGluZWFyJywgbWFnZmlsdGVyOiAnbGluZWFyJywgbWlwZmlsdGVyOiAnbmVhcmVzdCcgfSxcbiAgICAgICAgJ1RyaWxpbmVhciB3aXRoIE1pcG1hcHMnOiB7IG1pbmZpbHRlcjogJ2xpbmVhcicsIG1hZ2ZpbHRlcjogJ2xpbmVhcicsIG1pcGZpbHRlcjogJ2xpbmVhcicgfSxcbiAgICB9O1xuXG4gICAgc3RhdGljIHJlYWRvbmx5IFdyYXBNb2RlTWFwOiBSZWNvcmQ8c3RyaW5nLCB7IHdyYXBNb2RlUzogc3RyaW5nOyB3cmFwTW9kZVQ6IHN0cmluZyB9PiA9IHtcbiAgICAgICAgJ1JlcGVhdCc6IHsgd3JhcE1vZGVTOiAncmVwZWF0Jywgd3JhcE1vZGVUOiAncmVwZWF0JyB9LFxuICAgICAgICAnQ2xhbXAnOiB7IHdyYXBNb2RlUzogJ2NsYW1wLXRvLWVkZ2UnLCB3cmFwTW9kZVQ6ICdjbGFtcC10by1lZGdlJyB9LFxuICAgICAgICAnTWlycm9yJzogeyB3cmFwTW9kZVM6ICdtaXJyb3JlZC1yZXBlYXQnLCB3cmFwTW9kZVQ6ICdtaXJyb3JlZC1yZXBlYXQnIH0sXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgc3ludGhldGljIHRleHR1cmUgcHJvcGVydGllcyAoZmlsdGVyTW9kZSwgd3JhcE1vZGUpIHRvIHRoZSB1c2VyIGRhdGEuXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSB3YXMgaGFuZGxlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXBwbHlQcm9wZXJ0aWVzKHVzZXJEYXRhOiBhbnksIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocGF0aCA9PT0gJ2ZpbHRlck1vZGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5GaWx0ZXJNb2RlTWFwW3ZhbHVlXSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odXNlckRhdGEsIHRoaXMuRmlsdGVyTW9kZU1hcFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhdGggPT09ICd3cmFwTW9kZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLldyYXBNb2RlTWFwW3ZhbHVlXSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odXNlckRhdGEsIHRoaXMuV3JhcE1vZGVNYXBbdmFsdWVdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5qZWN0cyBzeW50aGV0aWMgdGV4dHVyZSBwcm9wZXJ0aWVzIChmaWx0ZXJNb2RlLCB3cmFwTW9kZSkgaW50byB0aGUgcHJvcGVydHkgY29udGFpbmVyLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbmplY3RUZXh0dXJlUHJvcGVydGllcyh1c2VyRGF0YTogYW55LCBwcm9wZXJ0eUNvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSk6IHZvaWQge1xuICAgICAgICAvLyBGaWx0ZXIgTW9kZSBMb2dpY1xuICAgICAgICBsZXQgZmlsdGVyTW9kZSA9ICdBZHZhbmNlZCc7XG4gICAgICAgIGZvciAoY29uc3QgW21vZGUsIHNldHRpbmdzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLkZpbHRlck1vZGVNYXApKSB7XG4gICAgICAgICAgICBpZiAodXNlckRhdGEubWluZmlsdGVyID09PSBzZXR0aW5ncy5taW5maWx0ZXIgJiZcbiAgICAgICAgICAgICAgICB1c2VyRGF0YS5tYWdmaWx0ZXIgPT09IHNldHRpbmdzLm1hZ2ZpbHRlciAmJlxuICAgICAgICAgICAgICAgIHVzZXJEYXRhLm1pcGZpbHRlciA9PT0gc2V0dGluZ3MubWlwZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyTW9kZSA9IG1vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5maWx0ZXJNb2RlID0ge1xuICAgICAgICAgICAgdmFsdWU6IGZpbHRlck1vZGUsXG4gICAgICAgICAgICB0eXBlOiAnRW51bScsXG4gICAgICAgICAgICBlbnVtTGlzdDogWy4uLk9iamVjdC5rZXlzKHRoaXMuRmlsdGVyTW9kZU1hcCksICdBZHZhbmNlZCddLm1hcChrID0+ICh7IG5hbWU6IGssIHZhbHVlOiBrIH0pKSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnRmlsdGVyIE1vZGUnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChmaWx0ZXJNb2RlID09PSAnQWR2YW5jZWQnKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5taW5maWx0ZXIgPSB7IFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5taW5maWx0ZXIsIFxuICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgICAgICBlbnVtTGlzdDogWyduZWFyZXN0JywgJ2xpbmVhciddLm1hcChrID0+ICh7IG5hbWU6IGssIHZhbHVlOiBrIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ01pbiBGaWx0ZXInLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHByb3BlcnR5Q29udGFpbmVyLm1hZ2ZpbHRlciA9IHsgXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLm1hZ2ZpbHRlciwgXG4gICAgICAgICAgICAgICAgdHlwZTogJ0VudW0nLFxuICAgICAgICAgICAgICAgIGVudW1MaXN0OiBbJ25lYXJlc3QnLCAnbGluZWFyJ10ubWFwKGsgPT4gKHsgbmFtZTogaywgdmFsdWU6IGsgfSkpLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTWFnIEZpbHRlcicsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcHJvcGVydHlDb250YWluZXIubWlwZmlsdGVyID0geyBcbiAgICAgICAgICAgICAgICB2YWx1ZTogdXNlckRhdGEubWlwZmlsdGVyLCBcbiAgICAgICAgICAgICAgICB0eXBlOiAnRW51bScsXG4gICAgICAgICAgICAgICAgZW51bUxpc3Q6IFsnbm9uZScsICduZWFyZXN0JywgJ2xpbmVhciddLm1hcChrID0+ICh7IG5hbWU6IGssIHZhbHVlOiBrIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ01pcCBGaWx0ZXInLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyYXAgTW9kZSBMb2dpY1xuICAgICAgICBsZXQgd3JhcE1vZGUgPSAnQWR2YW5jZWQnO1xuICAgICAgICBmb3IgKGNvbnN0IFttb2RlLCBzZXR0aW5nc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5XcmFwTW9kZU1hcCkpIHtcbiAgICAgICAgICAgIGlmICh1c2VyRGF0YS53cmFwTW9kZVMgPT09IHNldHRpbmdzLndyYXBNb2RlUyAmJlxuICAgICAgICAgICAgICAgIHVzZXJEYXRhLndyYXBNb2RlVCA9PT0gc2V0dGluZ3Mud3JhcE1vZGVUKSB7XG4gICAgICAgICAgICAgICAgd3JhcE1vZGUgPSBtb2RlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHJvcGVydHlDb250YWluZXIud3JhcE1vZGUgPSB7XG4gICAgICAgICAgICB2YWx1ZTogd3JhcE1vZGUsXG4gICAgICAgICAgICB0eXBlOiAnRW51bScsXG4gICAgICAgICAgICBlbnVtTGlzdDogWy4uLk9iamVjdC5rZXlzKHRoaXMuV3JhcE1vZGVNYXApLCAnQWR2YW5jZWQnXS5tYXAoayA9PiAoeyBuYW1lOiBrLCB2YWx1ZTogayB9KSksXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1dyYXAgTW9kZScsXG4gICAgICAgIH07XG5cbiAgICAgICAgIGlmICh3cmFwTW9kZSA9PT0gJ0FkdmFuY2VkJykge1xuICAgICAgICAgICAgY29uc3Qgd3JhcE1vZGVzID0gWydyZXBlYXQnLCAnY2xhbXAtdG8tZWRnZScsICdtaXJyb3JlZC1yZXBlYXQnXS5tYXAoayA9PiAoeyBuYW1lOiBrLCB2YWx1ZTogayB9KSk7XG4gICAgICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci53cmFwTW9kZVMgPSB7IFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS53cmFwTW9kZVMsIFxuICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgICAgICBlbnVtTGlzdDogd3JhcE1vZGVzLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnV3JhcCBNb2RlIFMnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHByb3BlcnR5Q29udGFpbmVyLndyYXBNb2RlVCA9IHsgXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLndyYXBNb2RlVCwgXG4gICAgICAgICAgICAgICAgdHlwZTogJ0VudW0nLFxuICAgICAgICAgICAgICAgIGVudW1MaXN0OiB3cmFwTW9kZXMsXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdXcmFwIE1vZGUgVCcsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuYW5pc290cm9weSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5hbmlzb3Ryb3B5LFxuICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0FuaXNvdHJvcHknLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/extensions/cocos-code-mode/dist/utcp/utils/tools-utils.js b/extensions/cocos-code-mode/dist/utcp/utils/tools-utils.js new file mode 100644 index 0000000..5a20d17 --- /dev/null +++ b/extensions/cocos-code-mode/dist/utcp/utils/tools-utils.js @@ -0,0 +1,220 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ToolsUtils = void 0; +const asset_importers_1 = require("./asset-importers"); +class ToolsUtils { + static async inspectInstance(targetId, adaptNode = true) { + var _a, _b; + if (targetId === 'CurrentSceneGlobals') { + return this.inspectCurrentSceneSettings(); + } + if (targetId === 'ProjectSettings') { + return { + uuid: 'ProjectSettings', + type: 'ProjectSettings', + props: await ((_a = asset_importers_1.ImporterManager.getInstance().getImporter('project-settings')) === null || _a === void 0 ? void 0 : _a.getProperties({})) || null, + assetInfo: { uuid: 'ProjectSettings', type: 'ProjectSettings', importer: 'project-settings' } + }; + } + // Try Node + try { + const nodeDump = await Editor.Message.request('scene', 'query-node', targetId); + const props = this.convertDumpToProperties('node', nodeDump, adaptNode); + if (nodeDump) { + return { + uuid: targetId, + type: nodeDump.__type__ || 'cc.Node', + props: props, + assetInfo: null + }; + } + } + catch (e) { } + // Try Component + try { + const compDump = await Editor.Message.request('scene', 'query-component', targetId); + if (compDump) { + const props = this.convertDumpToProperties('component', compDump.value || compDump); + return { + uuid: targetId, + type: compDump.type || 'cc.Component', + props: props, + assetInfo: null + }; + } + } + catch (e) { } + // Try Asset + try { + const assetInfo = await Editor.Message.request('asset-db', 'query-asset-info', targetId); + const props = assetInfo ? await ((_b = asset_importers_1.ImporterManager.getInstance().getImporter(assetInfo.importer)) === null || _b === void 0 ? void 0 : _b.getProperties(assetInfo)) : null; + if (assetInfo) { + return { + uuid: targetId, + type: assetInfo.type, + props: props || null, + assetInfo: assetInfo + }; + } + } + catch (e) { + console.warn('Failed to inspect asset:', e); + } + return null; + } + static async inspectCurrentSceneSettings() { + try { + const tree = await Editor.Message.request('scene', 'query-node-tree'); + if (!tree || !tree.uuid) { + return null; + } + const sceneDump = await Editor.Message.request('scene', 'query-node', tree.uuid); + if (sceneDump && sceneDump._globals) { + const props = this.convertDumpToProperties('component', sceneDump._globals); + return { + uuid: tree.uuid, + type: 'cc.SceneGlobals', + props: props, + assetInfo: null + }; + } + } + catch (e) { + console.warn('Failed to inspect CurrentSceneGlobals:', e); + } + return null; + } + static convertDumpToProperties(dumpType, dump, adaptNode = true) { + if (!dump) + return {}; + const result = {}; + if (typeof dump === 'object' && dump !== null) { + // Safe iteration for object + for (const key of Object.keys(dump)) { + const val = dump[key]; + if (val) { + result[key] = val; + } + } + } + switch (dumpType) { + // Specific adjustments for Node + case 'node': + if (!adaptNode) { + break; + } + // Adapt __comps__ to show component UUIDs only + if (!('__comps__' in result)) { + throw new Error(`Missing __comps__ property for Node class.`); + } + const compsMap = result.__comps__.map(comp => { return { value: { id: comp.value.uuid.value } }; }); + result['__comps__'] = { value: compsMap, extends: ['cc.Object'], type: 'cc.Component', isArray: true, tooltip: 'cc.Component is a basic type for component. Inspect specific component instance for it\'s definition. You can change actual instances properties via __comps__.i prefix of node' }; + if (!('children' in result)) { + throw new Error(`Missing children property for Node class.`); + } + result['children'] = { value: [], type: 'cc.Node', isArray: true, readonly: true }; + if (!('__type__' in result)) { + throw new Error(`Missing __type__ property for Node class.`); + } + result['__type__'] = { value: 'cc.Node', visible: false }; + break; + case 'component': + // Inspector hides 'enabled' property for Components, but we need it + if ('enabled' in result && result.enabled && + typeof result.enabled === 'object' && 'visible' in result.enabled) { + result.enabled.visible = true; + } + break; + } + return result; + } + static unwrapProperties(properties) { + const result = {}; + for (const [key, prop] of Object.entries(properties)) { + // Check if prop is null/undefined + if (prop === undefined || prop === null) { + result[key] = prop; + continue; + } + // Check if prop is IProperty (has value, type, default, etc) + if (typeof prop !== 'object') { + result[key] = prop; + continue; + } + // It is an object. Check if it looks like IProperty. + const p = prop; + let value = p.value; + // Skip invisible properties + if (p.visible === false) { + continue; + } + // If value is undefined, try default + if (value === undefined) { + value = p.default; + } + const isLikelyIProperty = 'type' in p || 'value' in p || 'default' in p || 'visible' in p; + if (!isLikelyIProperty) { + // It might be a nested object that is NOT wrapped (though rare in dump root) + if (Array.isArray(prop)) { + // Array of values? + result[key] = prop; + } + else { + // Nested object + result[key] = this.unwrapProperties(prop); + } + continue; + } + // Now 'value' holds the unwrapped value (or it's undefined/null). + // Recursive unpack if value is an object (nested IProperties) + if (value && typeof value === 'object') { + if (Array.isArray(value)) { + // Check if it's an array of IProperties + if (value.length > 0 && typeof value[0] === 'object' && value[0] && + ('type' in value[0] || 'value' in value[0] || 'default' in value[0])) { + // Recursively unwrap each element in the array + value = value.map((item) => { + // This item is efficiently an IProperty (or mostly likely). + let val = item.value; + if (val === undefined) + val = item.default; + // If it doesn't have value/default but is object, might be raw object? + if (val === undefined && !('type' in item)) + val = item; + // Verify deeply nested + if (val && typeof val === 'object' && !Array.isArray(val)) { + // We need to verify if 'val' keys point to IProperties. + const keys = Object.keys(val); + if (keys.length > 0) { + // Check first key + const firstChild = val[keys[0]]; + if (firstChild && typeof firstChild === 'object' && + ('type' in firstChild || 'value' in firstChild || 'default' in firstChild)) { + return this.unwrapProperties(val); + } + } + } + return val; + }); + } + } + else { + // Nested object (Struct). Check if it contains IProperties. + const keys = Object.keys(value); + if (keys.length > 0) { + const firstVal = value[keys[0]]; + if (firstVal && typeof firstVal === 'object' && + ('type' in firstVal || 'value' in firstVal || 'default' in firstVal)) { + // It is a struct where values are IProperties + value = this.unwrapProperties(value); + } + } + } + } + result[key] = value; + } + return result; + } +} +exports.ToolsUtils = ToolsUtils; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvdXRjcC91dGlscy90b29scy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBb0Q7QUFJcEQsTUFBYSxVQUFVO0lBRW5CLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQWdCLEVBQUUsWUFBcUIsSUFBSTs7UUFDcEUsSUFBSSxRQUFRLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLFFBQVEsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pDLE9BQU87Z0JBQ0gsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsS0FBSyxFQUFFLE1BQU0sQ0FBQSxNQUFBLGlDQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLDBDQUFFLGFBQWEsQ0FBQyxFQUFTLENBQUMsQ0FBQSxJQUFJLElBQUk7Z0JBQzVHLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFTO2FBQ3ZHLENBQUM7UUFDTixDQUFDO1FBRUQsV0FBVztRQUNYLElBQUksQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUV4RSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE9BQU87b0JBQ0gsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFF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QixDQUFDO0NBZ0NKO0FBelFELGdDQXlRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEltcG9ydGVyTWFuYWdlciB9IGZyb20gJy4vYXNzZXQtaW1wb3J0ZXJzJztcbmltcG9ydCB7IElOb2RlLCBJUHJvcGVydHksIElQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcbmltcG9ydCB7IEFzc2V0SW5mbyB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9hc3NldC1kYi9AdHlwZXMvcHVibGljJztcblxuZXhwb3J0IGNsYXNzIFRvb2xzVXRpbHMge1xuXG4gICAgc3RhdGljIGFzeW5jIGluc3BlY3RJbnN0YW5jZSh0YXJnZXRJZDogc3RyaW5nLCBhZGFwdE5vZGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx7IHV1aWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB8IG51bGwsIGFzc2V0SW5mbzogQXNzZXRJbmZvIHwgbnVsbCB9IHwgbnVsbD4ge1xuICAgICAgICBpZiAodGFyZ2V0SWQgPT09ICdDdXJyZW50U2NlbmVHbG9iYWxzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zcGVjdEN1cnJlbnRTY2VuZVNldHRpbmdzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0SWQgPT09ICdQcm9qZWN0U2V0dGluZ3MnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHV1aWQ6ICdQcm9qZWN0U2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdQcm9qZWN0U2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgIHByb3BzOiBhd2FpdCBJbXBvcnRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbXBvcnRlcigncHJvamVjdC1zZXR0aW5ncycpPy5nZXRQcm9wZXJ0aWVzKHt9IGFzIGFueSkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBhc3NldEluZm86IHsgdXVpZDogJ1Byb2plY3RTZXR0aW5ncycsIHR5cGU6ICdQcm9qZWN0U2V0dGluZ3MnLCBpbXBvcnRlcjogJ3Byb2plY3Qtc2V0dGluZ3MnIH0gYXMgYW55XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVEdW1wID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktbm9kZScsIHRhcmdldElkKTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5jb252ZXJ0RHVtcFRvUHJvcGVydGllcygnbm9kZScsIG5vZGVEdW1wLCBhZGFwdE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAobm9kZUR1bXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1dWlkOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogbm9kZUR1bXAuX190eXBlX18gfHwgJ2NjLk5vZGUnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGFzc2V0SW5mbzogbnVsbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgLy8gVHJ5IENvbXBvbmVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29tcER1bXAgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1jb21wb25lbnQnLCB0YXJnZXRJZCk7XG4gICAgICAgICAgICBpZiAoY29tcER1bXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuY29udmVydER1bXBUb1Byb3BlcnRpZXMoJ2NvbXBvbmVudCcsIGNvbXBEdW1wLnZhbHVlIHx8IGNvbXBEdW1wKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHV1aWQ6IHRhcmdldElkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBjb21wRHVtcC50eXBlIHx8ICdjYy5Db21wb25lbnQnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGFzc2V0SW5mbzogbnVsbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIFxuICAgICAgICAvLyBUcnkgQXNzZXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICBjb25zdCBhc3NldEluZm8gPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1pbmZvJywgdGFyZ2V0SWQpO1xuICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gYXNzZXRJbmZvID8gYXdhaXQgSW1wb3J0ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW1wb3J0ZXIoYXNzZXRJbmZvLmltcG9ydGVyKT8uZ2V0UHJvcGVydGllcyhhc3NldEluZm8pIDogbnVsbDtcbiAgICAgICAgICAgICBpZiAoYXNzZXRJbmZvKSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICB1dWlkOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFzc2V0SW5mby50eXBlLCBcbiAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBwcm9wcyB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgYXNzZXRJbmZvOiBhc3NldEluZm9cbiAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gaW5zcGVjdCBhc3NldDonLCBlKTsgfVxuXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBpbnNwZWN0Q3VycmVudFNjZW5lU2V0dGluZ3MoKTogUHJvbWlzZTx7IHV1aWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB8IG51bGwsIGFzc2V0SW5mbzogQXNzZXRJbmZvIHwgbnVsbCB9IHwgbnVsbD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdHJlZSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3F1ZXJ5LW5vZGUtdHJlZScpIGFzIGFueTtcbiAgICAgICAgICAgIGlmICghdHJlZSB8fCAhdHJlZS51dWlkKSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzY2VuZUR1bXAgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1ub2RlJywgdHJlZS51dWlkKSBhcyBhbnk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzY2VuZUR1bXAgJiYgc2NlbmVEdW1wLl9nbG9iYWxzKSB7XG4gICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5jb252ZXJ0RHVtcFRvUHJvcGVydGllcygnY29tcG9uZW50Jywgc2NlbmVEdW1wLl9nbG9iYWxzKTtcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgIHV1aWQ6IHRyZWUudXVpZCxcbiAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYy5TY2VuZUdsb2JhbHMnLFxuICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgYXNzZXRJbmZvOiBudWxsXG4gICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGluc3BlY3QgQ3VycmVudFNjZW5lR2xvYmFsczonLCBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb252ZXJ0RHVtcFRvUHJvcGVydGllcyhkdW1wVHlwZTogXCJub2RlXCIgfCBcImNvbXBvbmVudFwiLCBkdW1wOiBJTm9kZSB8IElQcm9wZXJ0eVZhbHVlVHlwZSB8IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5VmFsdWVUeXBlOyB9IHwgbnVsbCwgYWRhcHROb2RlOiBib29sZWFuID0gdHJ1ZSk6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5VmFsdWVUeXBlIH0ge1xuICAgICAgICBpZiAoIWR1bXApIHJldHVybiB7fTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGR1bXAgPT09ICdvYmplY3QnICYmIGR1bXAgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAvLyBTYWZlIGl0ZXJhdGlvbiBmb3Igb2JqZWN0XG4gICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZHVtcCkpIHtcbiAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGR1bXAgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZHVtcFR5cGUpIHtcbiAgICAgICAgICAgIC8vIFNwZWNpZmljIGFkanVzdG1lbnRzIGZvciBOb2RlXG4gICAgICAgICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgICAgICAgICBpZiAoIWFkYXB0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRhcHQgX19jb21wc19fIHRvIHNob3cgY29tcG9uZW50IFVVSURzIG9ubHlcbiAgICAgICAgICAgICAgICBpZiAoISgnX19jb21wc19fJyBpbiByZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBfX2NvbXBzX18gcHJvcGVydHkgZm9yIE5vZGUgY2xhc3MuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBzTWFwID0gKHJlc3VsdC5fX2NvbXBzX18gYXMgSVByb3BlcnR5W10pLm1hcChjb21wID0+IHsgcmV0dXJuIHsgdmFsdWU6IHsgaWQ6IChjb21wLnZhbHVlIGFzIGFueSkudXVpZC52YWx1ZSB9IH19KTtcbiAgICAgICAgICAgICAgICByZXN1bHRbJ19fY29tcHNfXyddID0geyB2YWx1ZTogY29tcHNNYXAsIGV4dGVuZHM6IFsnY2MuT2JqZWN0J10sIHR5cGU6ICdjYy5Db21wb25lbnQnLCBpc0FycmF5OiB0cnVlLCB0b29sdGlwOiAnY2MuQ29tcG9uZW50IGlzIGEgYmFzaWMgdHlwZSBmb3IgY29tcG9uZW50LiBJbnNwZWN0IHNwZWNpZmljIGNvbXBvbmVudCBpbnN0YW5jZSBmb3IgaXRcXCdzIGRlZmluaXRpb24uIFlvdSBjYW4gY2hhbmdlIGFjdHVhbCBpbnN0YW5jZXMgcHJvcGVydGllcyB2aWEgX19jb21wc19fLmkgcHJlZml4IG9mIG5vZGUnIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoISgnY2hpbGRyZW4nIGluIHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGNoaWxkcmVuIHByb3BlcnR5IGZvciBOb2RlIGNsYXNzLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRbJ2NoaWxkcmVuJ10gPSB7IHZhbHVlOiBbXSwgdHlwZTogJ2NjLk5vZGUnLCBpc0FycmF5OiB0cnVlLCByZWFkb25seTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghKCdfX3R5cGVfXycgaW4gcmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgX190eXBlX18gcHJvcGVydHkgZm9yIE5vZGUgY2xhc3MuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdFsnX190eXBlX18nXSA9IHsgdmFsdWU6ICdjYy5Ob2RlJywgdmlzaWJsZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6XG4gICAgICAgICAgICAgICAgLy8gSW5zcGVjdG9yIGhpZGVzICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgQ29tcG9uZW50cywgYnV0IHdlIG5lZWQgaXRcbiAgICAgICAgICAgICAgICBpZiAoJ2VuYWJsZWQnIGluIHJlc3VsdCAmJiByZXN1bHQuZW5hYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzdWx0LmVuYWJsZWQgPT09ICdvYmplY3QnICYmICd2aXNpYmxlJyBpbiByZXN1bHQuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZW5hYmxlZC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB1bndyYXBQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5VmFsdWVUeXBlIH0pOiBhbnkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcm9wXSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcHJvcCBpcyBudWxsL3VuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKHByb3AgPT09IHVuZGVmaW5lZCB8fCBwcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBwcm9wIGlzIElQcm9wZXJ0eSAoaGFzIHZhbHVlLCB0eXBlLCBkZWZhdWx0LCBldGMpXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gcHJvcDtcbiAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEl0IGlzIGFuIG9iamVjdC4gQ2hlY2sgaWYgaXQgbG9va3MgbGlrZSBJUHJvcGVydHkuXG4gICAgICAgICAgICBjb25zdCBwID0gcHJvcCBhcyBJUHJvcGVydHk7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwLnZhbHVlO1xuXG4gICAgICAgICAgICAvLyBTa2lwIGludmlzaWJsZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAocC52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB2YWx1ZSBpcyB1bmRlZmluZWQsIHRyeSBkZWZhdWx0XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcC5kZWZhdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpc0xpa2VseUlQcm9wZXJ0eSA9ICd0eXBlJyBpbiBwIHx8ICd2YWx1ZScgaW4gcCB8fCAnZGVmYXVsdCcgaW4gcCB8fCAndmlzaWJsZScgaW4gcDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFpc0xpa2VseUlQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAvLyBJdCBtaWdodCBiZSBhIG5lc3RlZCBvYmplY3QgdGhhdCBpcyBOT1Qgd3JhcHBlZCAodGhvdWdoIHJhcmUgaW4gZHVtcCByb290KVxuICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzP1xuICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwcm9wOyBcbiAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy51bndyYXBQcm9wZXJ0aWVzKHByb3AgYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTm93ICd2YWx1ZScgaG9sZHMgdGhlIHVud3JhcHBlZCB2YWx1ZSAob3IgaXQncyB1bmRlZmluZWQvbnVsbCkuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZSB1bnBhY2sgaWYgdmFsdWUgaXMgYW4gb2JqZWN0IChuZXN0ZWQgSVByb3BlcnRpZXMpXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhcnJheSBvZiBJUHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHZhbHVlWzBdID09PSAnb2JqZWN0JyAmJiB2YWx1ZVswXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICgndHlwZScgaW4gdmFsdWVbMF0gfHwgJ3ZhbHVlJyBpbiB2YWx1ZVswXSB8fCAnZGVmYXVsdCcgaW4gdmFsdWVbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgdW53cmFwIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXRlbSBpcyBlZmZpY2llbnRseSBhbiBJUHJvcGVydHkgKG9yIG1vc3RseSBsaWtlbHkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsID0gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB2YWwgPSBpdGVtLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IGhhdmUgdmFsdWUvZGVmYXVsdCBidXQgaXMgb2JqZWN0LCBtaWdodCBiZSByYXcgb2JqZWN0PyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmICEoJ3R5cGUnIGluIGl0ZW0pKSB2YWwgPSBpdGVtO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBkZWVwbHkgbmVzdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdmVyaWZ5IGlmICd2YWwnIGtleXMgcG9pbnQgdG8gSVByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmaXJzdCBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHZhbFtrZXlzWzBdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q2hpbGQgJiYgdHlwZW9mIGZpcnN0Q2hpbGQgPT09ICdvYmplY3QnICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3R5cGUnIGluIGZpcnN0Q2hpbGQgfHwgJ3ZhbHVlJyBpbiBmaXJzdENoaWxkIHx8ICdkZWZhdWx0JyBpbiBmaXJzdENoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudW53cmFwUHJvcGVydGllcyh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3QgKFN0cnVjdCkuIENoZWNrIGlmIGl0IGNvbnRhaW5zIElQcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFZhbCA9ICh2YWx1ZSBhcyBhbnkpW2tleXNbMF1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbCAmJiB0eXBlb2YgZmlyc3RWYWwgPT09ICdvYmplY3QnICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgndHlwZScgaW4gZmlyc3RWYWwgfHwgJ3ZhbHVlJyBpbiBmaXJzdFZhbCB8fCAnZGVmYXVsdCcgaW4gZmlyc3RWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGEgc3RydWN0IHdoZXJlIHZhbHVlcyBhcmUgSVByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnVud3JhcFByb3BlcnRpZXModmFsdWUgYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuLypcbiAgICBzdGF0aWMgcmVzb2x2ZVByb3BlcnR5UGF0aChkYXRhOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGlmICghcGF0aCB8fCAhZGF0YSkgcmV0dXJuIGRhdGE7XG4gICAgICAgIFxuICAgICAgICBsZXQgY3VycmVudCA9IGRhdGE7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmIGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihpZHgpICYmIGN1cnJlbnRbaWR4XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBpZiAocGFydCBpbiBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgICAgICovXG59XG4iXX0= \ No newline at end of file diff --git a/extensions/cocos-code-mode/i18n/en.js b/extensions/cocos-code-mode/i18n/en.js new file mode 100644 index 0000000..5419b48 --- /dev/null +++ b/extensions/cocos-code-mode/i18n/en.js @@ -0,0 +1 @@ +"use strict"; module.exports = { open_panel: "Configuration", description: "Cocos Creator MCP Integration for AI Code Mode" }; \ No newline at end of file diff --git a/extensions/cocos-code-mode/i18n/zh.js b/extensions/cocos-code-mode/i18n/zh.js new file mode 100644 index 0000000..f6aaa91 --- /dev/null +++ b/extensions/cocos-code-mode/i18n/zh.js @@ -0,0 +1 @@ +"use strict"; module.exports = { open_panel: "配置", description: "Cocos Creator MCP Integration for AI Code Mode" }; \ No newline at end of file diff --git a/extensions/cocos-code-mode/package-lock.json b/extensions/cocos-code-mode/package-lock.json new file mode 100644 index 0000000..7cd0714 --- /dev/null +++ b/extensions/cocos-code-mode/package-lock.json @@ -0,0 +1,1374 @@ +{ + "name": "cocos-code-mode", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cocos-code-mode", + "version": "1.0.0", + "hasInstallScript": true, + "dependencies": { + "@types/sharp": "^0.31.1", + "@utcp/http": "^1.1.0", + "@utcp/sdk": "^1.1.0", + "cors": "^2.8.6", + "express": "^5.2.1", + "fs-extra": "^10.0.0", + "sharp": "^0.34.5", + "zod": "^4.2.1" + }, + "devDependencies": { + "@cocos/creator-types": "^3.8.7", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/fs-extra": "^9.0.5", + "@types/node": "^18.17.1", + "typescript": "^5.8.2" + } + }, + "node_modules/@cocos/creator-types": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/@cocos/creator-types/-/creator-types-3.8.7.tgz", + "integrity": "sha512-QTtuC+w1s1yQ8DPlgFSiIGS+Pko6v2QdrrQRN8/SttEBo53JjyXEWHXpRkg1lGiHq0u/aadm0cN/Y4jtEmis/w==", + "dev": true, + "license": "ISC" + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sharp": { + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.31.1.tgz", + "integrity": "sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@utcp/http": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@utcp/http/-/http-1.1.0.tgz", + "integrity": "sha512-+B1OOxstnC39e3nx8jgaFGoO1KZIwFLjYPfKz1t+OX/tfpE01tsLoErZ5yI3dc4JHdTV3AwK+LTmFnFpspFZBA==", + "license": "MPL-2.0", + "dependencies": { + "@utcp/sdk": "^1.1.0", + "axios": "^1.11.0", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@utcp/sdk": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@utcp/sdk/-/sdk-1.1.0.tgz", + "integrity": "sha512-JyNG+TdtoaZ19K2v+FSmRzi3YR3Ri0XVI7ntiz8pKDA9ZbNqa5+op2EAmmGIHD9sp0IyTI7pMHeUR+mYqd97PA==", + "license": "MPL-2.0", + "dependencies": { + "dotenv": "^17.2.1", + "zod": "^3.23.8" + } + }, + "node_modules/@utcp/sdk/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/extensions/cocos-code-mode/package.json b/extensions/cocos-code-mode/package.json new file mode 100644 index 0000000..4c5661e --- /dev/null +++ b/extensions/cocos-code-mode/package.json @@ -0,0 +1,100 @@ +{ + "$schema": "./@types/schema/package/index.json", + "package_version": 2, + "name": "cocos-code-mode", + "version": "1.0.0", + "author": "Roman Rogov", + "editor": ">=3.8.7", + "scripts": { + "preinstall": "node ./scripts/preinstall.js", + "build": "npx tsc", + "package": "npm run build && node ./scripts/package.js" + }, + "description": "i18n:cocos-code-mode.description", + "main": "./dist/main.js", + "dependencies": { + "@types/sharp": "^0.31.1", + "@utcp/http": "^1.1.0", + "@utcp/sdk": "^1.1.0", + "cors": "^2.8.6", + "express": "^5.2.1", + "fs-extra": "^10.0.0", + "sharp": "^0.34.5", + "zod": "^4.2.1" + }, + "devDependencies": { + "@cocos/creator-types": "^3.8.7", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/fs-extra": "^9.0.5", + "@types/node": "^18.17.1", + "typescript": "^5.8.2" + }, + "panels": { + "configuration": { + "title": "Configuration", + "type": "dockable", + "main": "dist/panels/configuration", + "size": { + "min-width": 400, + "min-height": 300, + "width": 1024, + "height": 600 + } + }, + "preview": { + "title": "Asset Preview", + "type": "dockable", + "main": "dist/panels/preview", + "size": { + "min-width": 200, + "min-height": 200, + "width": 400, + "height": 400 + } + } + }, + "contributions": { + "scene": { + "script": "./dist/scene.js" + }, + "menu": [ + { + "path": "Code Mode", + "label": "i18n:cocos-code-mode.open_panel", + "message": "open-panel" + } + ], + "messages": { + "open-panel": { + "methods": [ + "openPanel" + ] + }, + "open-preview-panel": { + "methods": [ + "openPreviewPanel" + ] + }, + "preview-asset": { + "methods": [ + "preview.previewAsset" + ] + }, + "generate-preview": { + "methods": [ + "preview.generatePreview" + ] + }, + "restart-server": { + "methods": [ + "restartServer" + ] + } + } + }, + "creator": { + "version": "3.8.7" + }, + "uuid": "b401b190-c2a1-4149-9250-a0ed22e1968b" +} \ No newline at end of file diff --git a/extensions/cocos-code-mode/static/style/configuration/index.css b/extensions/cocos-code-mode/static/style/configuration/index.css new file mode 100644 index 0000000..23523dc --- /dev/null +++ b/extensions/cocos-code-mode/static/style/configuration/index.css @@ -0,0 +1,104 @@ +.panel { + display: flex; + flex-direction: column; + height: 100%; + padding: 10px; + gap: 10px; + overflow-y: auto; +} + +ui-prop-split { + --ui-prop-margin-left: 24px; + --ui-prop-label-width-min: 60px; + --ui-prop-label-width-max: 289px; + --left-width: 38.2%; +} + +.section { + margin-bottom: 10px; +} + +.desc-container { + padding: 5px 10px; + color: var(--color-text-normal); + opacity: 0.8; + margin-bottom: 5px; +} + +.code-container { + margin-top: 5px; +} + +.list-container { + padding: 0; + max-height: 400px; + overflow-y: auto; + margin-bottom: 15px; +} + +.bridge-item-section { + margin-bottom: 5px; + border: 1px solid var(--color-normal-border-weak); + border-radius: 4px; + overflow: hidden; +} + +.bridge-item-content { + padding: 10px; + background: var(--color-normal-fill-calmer); +} + +.bridge-actions { + display: flex; + justify-content: flex-end; + margin-top: 5px; +} + +.actions.right { + display: flex; + justify-content: flex-end; + margin-top: 5px; +} + +ui-button.blue { + color: white; +} + +ui-button.green { + color: white; +} + +ui-prop { + margin-top: 10px; +} + +.transparent { + background: transparent; + border: none; +} + +.group-header { + font-weight: bold; + color: var(--color-text-normal); + margin-bottom: 5px; + margin-top: 10px; + padding-left: 5px; +} + +.mt-10 { + margin-top: 10px; +} + +.add-template-container { + padding: 0 5px; +} + +ui-prop ui-button { + margin-left: 10px; +} + +#save-utcp-path-btn { + max-width: 24px; + padding: 0 4px; + height: 24px; +} \ No newline at end of file diff --git a/extensions/cocos-code-mode/static/style/preview/index.css b/extensions/cocos-code-mode/static/style/preview/index.css new file mode 100644 index 0000000..05f32f6 --- /dev/null +++ b/extensions/cocos-code-mode/static/style/preview/index.css @@ -0,0 +1,15 @@ +.panel { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + background-color: #252526; +} + +#preview-container { + flex: 1; + position: relative; + overflow: hidden; + width: 100%; + height: 100%; +} diff --git a/extensions/cocos-code-mode/static/template/configuration/index.html b/extensions/cocos-code-mode/static/template/configuration/index.html new file mode 100644 index 0000000..be588ab --- /dev/null +++ b/extensions/cocos-code-mode/static/template/configuration/index.html @@ -0,0 +1,48 @@ + + + + + + Server Port + + Update + + + + + + + Config Path + + + + +
Bridge Templates
+
+ +
+ +
Add New Template
+
+ +
+ + Add Template + +
+
+
+ + + +
+ Configure your AI agent by adding this server to MCP config + config. Config example: +
+
+ +
+
+ +
\ No newline at end of file diff --git a/extensions/cocos-code-mode/static/template/preview/index.html b/extensions/cocos-code-mode/static/template/preview/index.html new file mode 100644 index 0000000..5d9c71a --- /dev/null +++ b/extensions/cocos-code-mode/static/template/preview/index.html @@ -0,0 +1,3 @@ +
+
+