UNPKG

@ultipa-graph/ultipa-driver

Version:

NodeJS SDK for Ultipa GQL

168 lines 25.1 kB
"use strict"; /** * Admin service handles administrative operations. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.AdminService = void 0; const types_1 = require("../types"); const services_1 = require("../services"); const converters_1 = require("./converters"); /** * Admin service for administrative operations. */ class AdminService { ctx; constructor(ctx) { this.ctx = ctx; } /** * Pre-allocate parser instances. */ async warmupParser(count) { const metadata = this.ctx.getSessionMetadata(); await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'WarmupParser', { count }, metadata); } /** * Return cache statistics. */ async getCacheStats(cacheType = types_1.CacheType.ALL) { const metadata = this.ctx.getSessionMetadata(); const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'GetCacheStats', { cache_type: (0, converters_1.cacheTypeToProto)(cacheType) }, metadata); return { astStats: response.ast_stats ? { hits: parseInt(response.ast_stats.hits || '0', 10), misses: parseInt(response.ast_stats.misses || '0', 10), evictions: parseInt(response.ast_stats.evictions || '0', 10), entries: response.ast_stats.entries || 0, hitRate: response.ast_stats.hit_rate || 0, } : undefined, planStats: response.plan_stats ? { size: response.plan_stats.size || 0, capacity: response.plan_stats.capacity || 0, hits: parseInt(response.plan_stats.hits || '0', 10), misses: parseInt(response.plan_stats.misses || '0', 10), hitRate: response.plan_stats.hit_rate || 0, } : undefined, }; } /** * Clear the specified cache. */ async clearCache(cacheType = types_1.CacheType.ALL) { const metadata = this.ctx.getSessionMetadata(); await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'ClearCache', { cache_type: (0, converters_1.cacheTypeToProto)(cacheType) }, metadata); } /** * Return database statistics. */ async getStatistics(graphName = '') { const metadata = this.ctx.getSessionMetadata(); const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'GetStatistics', { graph_name: graphName }, metadata); const labelCounts = {}; const edgeLabelCounts = {}; if (response.label_counts) { for (const [key, value] of Object.entries(response.label_counts)) { labelCounts[key] = parseInt(value, 10); } } if (response.edge_label_counts) { for (const [key, value] of Object.entries(response.edge_label_counts)) { edgeLabelCounts[key] = parseInt(value, 10); } } return { nodeCount: parseInt(response.node_count || '0', 10), edgeCount: parseInt(response.edge_count || '0', 10), labelCounts, edgeLabelCounts, }; } /** * Invalidate the RBAC permission cache. */ async invalidatePermissionCache(username = '') { const metadata = this.ctx.getSessionMetadata(); await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'InvalidatePermissionCache', { username }, metadata); } /** * Trigger manual compaction of the database storage. */ async compact() { const metadata = this.ctx.getSessionMetadata(); const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'Compact', {}, metadata); return { success: response.success || false, message: response.message || '', }; } /** * Return system-level metrics (CPU, memory, disk I/O, storage, network). */ async getSystemMetrics() { const metadata = this.ctx.getSessionMetadata(); const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'GetSystemMetrics', {}, metadata); return { cpu: response.cpu ? { processPercent: response.cpu.process_percent || 0, systemPercent: response.cpu.system_percent || 0, numCores: response.cpu.num_cores || 0, } : undefined, memory: response.memory ? { processRss: parseInt(response.memory.process_rss || '0', 10), heapAlloc: parseInt(response.memory.heap_alloc || '0', 10), heapSys: parseInt(response.memory.heap_sys || '0', 10), stackInUse: parseInt(response.memory.stack_in_use || '0', 10), systemTotal: parseInt(response.memory.system_total || '0', 10), systemAvailable: parseInt(response.memory.system_available || '0', 10), systemUsed: parseInt(response.memory.system_used || '0', 10), systemUsedPercent: response.memory.system_used_percent || 0, } : undefined, diskIO: response.disk_io ? { readBytes: parseInt(response.disk_io.read_bytes || '0', 10), writeBytes: parseInt(response.disk_io.write_bytes || '0', 10), readCount: parseInt(response.disk_io.read_count || '0', 10), writeCount: parseInt(response.disk_io.write_count || '0', 10), } : undefined, storage: response.storage ? { dbPath: response.storage.db_path || '', dbSizeBytes: parseInt(response.storage.db_size_bytes || '0', 10), volumeTotal: parseInt(response.storage.volume_total || '0', 10), volumeFree: parseInt(response.storage.volume_free || '0', 10), volumeUsed: parseInt(response.storage.volume_used || '0', 10), } : undefined, network: response.network ? { bytesSent: parseInt(response.network.bytes_sent || '0', 10), bytesRecv: parseInt(response.network.bytes_recv || '0', 10), packetsSent: parseInt(response.network.packets_sent || '0', 10), packetsRecv: parseInt(response.network.packets_recv || '0', 10), } : undefined, }; } /** * Wait for the computing engine topology to be ready. */ async waitForComputeTopology(graphName, timeoutMs = 0) { const metadata = this.ctx.getSessionMetadata(); const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'WaitForComputeTopology', { graph_name: graphName, timeout_ms: timeoutMs }, metadata); return { ready: response.ready || false, message: response.message || '', }; } } exports.AdminService = AdminService; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9hZG1pbi1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7O0FBR0gsb0NBQWtIO0FBQ2xILDBDQUE0QztBQUM1Qyw2Q0FBZ0Q7QUFFaEQ7O0dBRUc7QUFDSCxNQUFhLFlBQVk7SUFDSDtJQUFwQixZQUFvQixHQUFtQjtRQUFuQixRQUFHLEdBQUgsR0FBRyxDQUFnQjtJQUFHLENBQUM7SUFFM0M7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWE7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBQSx3QkFBYSxFQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQzdCLGNBQWMsRUFDZCxFQUFFLEtBQUssRUFBRSxFQUNULFFBQVEsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUF1QixpQkFBUyxDQUFDLEdBQUc7UUFDdEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFRLE1BQU0sSUFBQSx3QkFBYSxFQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQzdCLGVBQWUsRUFDZixFQUFFLFVBQVUsRUFBRSxJQUFBLDZCQUFnQixFQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQzNDLFFBQVEsQ0FDVCxDQUFDO1FBRUYsT0FBTztZQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDMUIsQ0FBQyxDQUFDO29CQUNFLElBQUksRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDbEQsTUFBTSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUN0RCxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQzVELE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxDQUFDO29CQUN4QyxPQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksQ0FBQztpQkFDMUM7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVM7WUFDYixTQUFTLEVBQUUsUUFBUSxDQUFDLFVBQVU7Z0JBQzVCLENBQUMsQ0FBQztvQkFDRSxJQUFJLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQztvQkFDbkMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLENBQUM7b0JBQzNDLElBQUksRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDbkQsTUFBTSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUN2RCxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksQ0FBQztpQkFDM0M7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVM7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUF1QixpQkFBUyxDQUFDLEdBQUc7UUFDbkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBQSx3QkFBYSxFQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQzdCLFlBQVksRUFDWixFQUFFLFVBQVUsRUFBRSxJQUFBLDZCQUFnQixFQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQzNDLFFBQVEsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFvQixFQUFFO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFFBQVEsR0FBUSxNQUFNLElBQUEsd0JBQWEsRUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUM3QixlQUFlLEVBQ2YsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQ3pCLFFBQVEsQ0FDVCxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQTJCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLGVBQWUsR0FBMkIsRUFBRSxDQUFDO1FBRW5ELElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDL0IsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztnQkFDdEUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDbkQsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDbkQsV0FBVztZQUNYLGVBQWU7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxXQUFtQixFQUFFO1FBQ25ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLElBQUEsd0JBQWEsRUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUM3QiwyQkFBMkIsRUFDM0IsRUFBRSxRQUFRLEVBQUUsRUFDWixRQUFRLENBQ1QsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFRLE1BQU0sSUFBQSx3QkFBYSxFQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQzdCLFNBQVMsRUFDVCxFQUFFLEVBQ0YsUUFBUSxDQUNULENBQUM7UUFDRixPQUFPO1lBQ0wsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksS0FBSztZQUNsQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFFBQVEsR0FBUSxNQUFNLElBQUEsd0JBQWEsRUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUM3QixrQkFBa0IsRUFDbEIsRUFBRSxFQUNGLFFBQVEsQ0FDVCxDQUFDO1FBRUYsT0FBTztZQUNMLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDZixDQUFDLENBQUM7b0JBQ0UsY0FBYyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUM7b0JBQ2pELGFBQWEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxDQUFDO29CQUMvQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQztpQkFDdEM7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVM7WUFDYixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07Z0JBQ3JCLENBQUMsQ0FBQztvQkFDRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQzVELFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDMUQsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUN0RCxVQUFVLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQzdELFdBQVcsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDOUQsZUFBZSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQ3RFLFVBQVUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDNUQsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxDQUFDO2lCQUM1RDtnQkFDSCxDQUFDLENBQUMsU0FBUztZQUNiLE1BQU0sRUFBRSxRQUFRLENBQUMsT0FBTztnQkFDdEIsQ0FBQyxDQUFDO29CQUNFLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDM0QsVUFBVSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUM3RCxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQzNELFVBQVUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztpQkFDOUQ7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVM7WUFDYixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87Z0JBQ3ZCLENBQUMsQ0FBQztvQkFDRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRTtvQkFDdEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUNoRSxXQUFXLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQy9ELFVBQVUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDN0QsVUFBVSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO2lCQUM5RDtnQkFDSCxDQUFDLENBQUMsU0FBUztZQUNiLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztnQkFDdkIsQ0FBQyxDQUFDO29CQUNFLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDM0QsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUMzRCxXQUFXLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQy9ELFdBQVcsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztpQkFDaEU7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVM7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQWlCLEVBQUUsWUFBb0IsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsTUFBTSxRQUFRLEdBQVEsTUFBTSxJQUFBLHdCQUFhLEVBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFDN0Isd0JBQXdCLEVBQ3hCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQ2hELFFBQVEsQ0FDVCxDQUFDO1FBQ0YsT0FBTztZQUNMLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUs7WUFDOUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRTtTQUNoQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBNU1ELG9DQTRNQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWRtaW4gc2VydmljZSBoYW5kbGVzIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnMuXG4gKi9cblxuaW1wb3J0IHsgU2VydmljZUNvbnRleHQgfSBmcm9tICcuL3NlcnZpY2UtY29udGV4dCc7XG5pbXBvcnQgeyBDYWNoZVN0YXRzLCBDYWNoZVR5cGUsIFN0YXRpc3RpY3MsIENvbXBhY3RSZXN1bHQsIENvbXB1dGVUb3BvbG9neVJlc3VsdCwgU3lzdGVtTWV0cmljcyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHByb21pc2lmeUNhbGwgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBjYWNoZVR5cGVUb1Byb3RvIH0gZnJvbSAnLi9jb252ZXJ0ZXJzJztcblxuLyoqXG4gKiBBZG1pbiBzZXJ2aWNlIGZvciBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgQWRtaW5TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjdHg6IFNlcnZpY2VDb250ZXh0KSB7fVxuXG4gIC8qKlxuICAgKiBQcmUtYWxsb2NhdGUgcGFyc2VyIGluc3RhbmNlcy5cbiAgICovXG4gIGFzeW5jIHdhcm11cFBhcnNlcihjb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcbiAgICBhd2FpdCBwcm9taXNpZnlDYWxsKFxuICAgICAgdGhpcy5jdHguY2xpZW50cy5hZG1pblNlcnZpY2UsXG4gICAgICAnV2FybXVwUGFyc2VyJyxcbiAgICAgIHsgY291bnQgfSxcbiAgICAgIG1ldGFkYXRhXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY2FjaGUgc3RhdGlzdGljcy5cbiAgICovXG4gIGFzeW5jIGdldENhY2hlU3RhdHMoY2FjaGVUeXBlOiBDYWNoZVR5cGUgPSBDYWNoZVR5cGUuQUxMKTogUHJvbWlzZTxDYWNoZVN0YXRzPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgcHJvbWlzaWZ5Q2FsbChcbiAgICAgIHRoaXMuY3R4LmNsaWVudHMuYWRtaW5TZXJ2aWNlLFxuICAgICAgJ0dldENhY2hlU3RhdHMnLFxuICAgICAgeyBjYWNoZV90eXBlOiBjYWNoZVR5cGVUb1Byb3RvKGNhY2hlVHlwZSkgfSxcbiAgICAgIG1ldGFkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhc3RTdGF0czogcmVzcG9uc2UuYXN0X3N0YXRzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGl0czogcGFyc2VJbnQocmVzcG9uc2UuYXN0X3N0YXRzLmhpdHMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBtaXNzZXM6IHBhcnNlSW50KHJlc3BvbnNlLmFzdF9zdGF0cy5taXNzZXMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBldmljdGlvbnM6IHBhcnNlSW50KHJlc3BvbnNlLmFzdF9zdGF0cy5ldmljdGlvbnMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBlbnRyaWVzOiByZXNwb25zZS5hc3Rfc3RhdHMuZW50cmllcyB8fCAwLFxuICAgICAgICAgICAgaGl0UmF0ZTogcmVzcG9uc2UuYXN0X3N0YXRzLmhpdF9yYXRlIHx8IDAsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHBsYW5TdGF0czogcmVzcG9uc2UucGxhbl9zdGF0c1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNpemU6IHJlc3BvbnNlLnBsYW5fc3RhdHMuc2l6ZSB8fCAwLFxuICAgICAgICAgICAgY2FwYWNpdHk6IHJlc3BvbnNlLnBsYW5fc3RhdHMuY2FwYWNpdHkgfHwgMCxcbiAgICAgICAgICAgIGhpdHM6IHBhcnNlSW50KHJlc3BvbnNlLnBsYW5fc3RhdHMuaGl0cyB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIG1pc3NlczogcGFyc2VJbnQocmVzcG9uc2UucGxhbl9zdGF0cy5taXNzZXMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBoaXRSYXRlOiByZXNwb25zZS5wbGFuX3N0YXRzLmhpdF9yYXRlIHx8IDAsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBzcGVjaWZpZWQgY2FjaGUuXG4gICAqL1xuICBhc3luYyBjbGVhckNhY2hlKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgYXdhaXQgcHJvbWlzaWZ5Q2FsbChcbiAgICAgIHRoaXMuY3R4LmNsaWVudHMuYWRtaW5TZXJ2aWNlLFxuICAgICAgJ0NsZWFyQ2FjaGUnLFxuICAgICAgeyBjYWNoZV90eXBlOiBjYWNoZVR5cGVUb1Byb3RvKGNhY2hlVHlwZSkgfSxcbiAgICAgIG1ldGFkYXRhXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gZGF0YWJhc2Ugc3RhdGlzdGljcy5cbiAgICovXG4gIGFzeW5jIGdldFN0YXRpc3RpY3MoZ3JhcGhOYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8U3RhdGlzdGljcz4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLmFkbWluU2VydmljZSxcbiAgICAgICdHZXRTdGF0aXN0aWNzJyxcbiAgICAgIHsgZ3JhcGhfbmFtZTogZ3JhcGhOYW1lIH0sXG4gICAgICBtZXRhZGF0YVxuICAgICk7XG5cbiAgICBjb25zdCBsYWJlbENvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGNvbnN0IGVkZ2VMYWJlbENvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgaWYgKHJlc3BvbnNlLmxhYmVsX2NvdW50cykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UubGFiZWxfY291bnRzKSkge1xuICAgICAgICBsYWJlbENvdW50c1trZXldID0gcGFyc2VJbnQodmFsdWUgYXMgc3RyaW5nLCAxMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLmVkZ2VfbGFiZWxfY291bnRzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXNwb25zZS5lZGdlX2xhYmVsX2NvdW50cykpIHtcbiAgICAgICAgZWRnZUxhYmVsQ291bnRzW2tleV0gPSBwYXJzZUludCh2YWx1ZSBhcyBzdHJpbmcsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZUNvdW50OiBwYXJzZUludChyZXNwb25zZS5ub2RlX2NvdW50IHx8ICcwJywgMTApLFxuICAgICAgZWRnZUNvdW50OiBwYXJzZUludChyZXNwb25zZS5lZGdlX2NvdW50IHx8ICcwJywgMTApLFxuICAgICAgbGFiZWxDb3VudHMsXG4gICAgICBlZGdlTGFiZWxDb3VudHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIHRoZSBSQkFDIHBlcm1pc3Npb24gY2FjaGUuXG4gICAqL1xuICBhc3luYyBpbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgYXdhaXQgcHJvbWlzaWZ5Q2FsbChcbiAgICAgIHRoaXMuY3R4LmNsaWVudHMuYWRtaW5TZXJ2aWNlLFxuICAgICAgJ0ludmFsaWRhdGVQZXJtaXNzaW9uQ2FjaGUnLFxuICAgICAgeyB1c2VybmFtZSB9LFxuICAgICAgbWV0YWRhdGFcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgbWFudWFsIGNvbXBhY3Rpb24gb2YgdGhlIGRhdGFiYXNlIHN0b3JhZ2UuXG4gICAqL1xuICBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8Q29tcGFjdFJlc3VsdD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLmFkbWluU2VydmljZSxcbiAgICAgICdDb21wYWN0JyxcbiAgICAgIHt9LFxuICAgICAgbWV0YWRhdGFcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiByZXNwb25zZS5zdWNjZXNzIHx8IGZhbHNlLFxuICAgICAgbWVzc2FnZTogcmVzcG9uc2UubWVzc2FnZSB8fCAnJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBzeXN0ZW0tbGV2ZWwgbWV0cmljcyAoQ1BVLCBtZW1vcnksIGRpc2sgSS9PLCBzdG9yYWdlLCBuZXR3b3JrKS5cbiAgICovXG4gIGFzeW5jIGdldFN5c3RlbU1ldHJpY3MoKTogUHJvbWlzZTxTeXN0ZW1NZXRyaWNzPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgcHJvbWlzaWZ5Q2FsbChcbiAgICAgIHRoaXMuY3R4LmNsaWVudHMuYWRtaW5TZXJ2aWNlLFxuICAgICAgJ0dldFN5c3RlbU1ldHJpY3MnLFxuICAgICAge30sXG4gICAgICBtZXRhZGF0YVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3B1OiByZXNwb25zZS5jcHVcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm9jZXNzUGVyY2VudDogcmVzcG9uc2UuY3B1LnByb2Nlc3NfcGVyY2VudCB8fCAwLFxuICAgICAgICAgICAgc3lzdGVtUGVyY2VudDogcmVzcG9uc2UuY3B1LnN5c3RlbV9wZXJjZW50IHx8IDAsXG4gICAgICAgICAgICBudW1Db3JlczogcmVzcG9uc2UuY3B1Lm51bV9jb3JlcyB8fCAwLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBtZW1vcnk6IHJlc3BvbnNlLm1lbW9yeVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb2Nlc3NSc3M6IHBhcnNlSW50KHJlc3BvbnNlLm1lbW9yeS5wcm9jZXNzX3JzcyB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIGhlYXBBbGxvYzogcGFyc2VJbnQocmVzcG9uc2UubWVtb3J5LmhlYXBfYWxsb2MgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBoZWFwU3lzOiBwYXJzZUludChyZXNwb25zZS5tZW1vcnkuaGVhcF9zeXMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBzdGFja0luVXNlOiBwYXJzZUludChyZXNwb25zZS5tZW1vcnkuc3RhY2tfaW5fdXNlIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgc3lzdGVtVG90YWw6IHBhcnNlSW50KHJlc3BvbnNlLm1lbW9yeS5zeXN0ZW1fdG90YWwgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBzeXN0ZW1BdmFpbGFibGU6IHBhcnNlSW50KHJlc3BvbnNlLm1lbW9yeS5zeXN0ZW1fYXZhaWxhYmxlIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgc3lzdGVtVXNlZDogcGFyc2VJbnQocmVzcG9uc2UubWVtb3J5LnN5c3RlbV91c2VkIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgc3lzdGVtVXNlZFBlcmNlbnQ6IHJlc3BvbnNlLm1lbW9yeS5zeXN0ZW1fdXNlZF9wZXJjZW50IHx8IDAsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRpc2tJTzogcmVzcG9uc2UuZGlza19pb1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHJlYWRCeXRlczogcGFyc2VJbnQocmVzcG9uc2UuZGlza19pby5yZWFkX2J5dGVzIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgd3JpdGVCeXRlczogcGFyc2VJbnQocmVzcG9uc2UuZGlza19pby53cml0ZV9ieXRlcyB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHJlYWRDb3VudDogcGFyc2VJbnQocmVzcG9uc2UuZGlza19pby5yZWFkX2NvdW50IHx8ICcwJywgMTApLFxuICAgICAgICAgICAgd3JpdGVDb3VudDogcGFyc2VJbnQocmVzcG9uc2UuZGlza19pby53cml0ZV9jb3VudCB8fCAnMCcsIDEwKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc3RvcmFnZTogcmVzcG9uc2Uuc3RvcmFnZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGRiUGF0aDogcmVzcG9uc2Uuc3RvcmFnZS5kYl9wYXRoIHx8ICcnLFxuICAgICAgICAgICAgZGJTaXplQnl0ZXM6IHBhcnNlSW50KHJlc3BvbnNlLnN0b3JhZ2UuZGJfc2l6ZV9ieXRlcyB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHZvbHVtZVRvdGFsOiBwYXJzZUludChyZXNwb25zZS5zdG9yYWdlLnZvbHVtZV90b3RhbCB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHZvbHVtZUZyZWU6IHBhcnNlSW50KHJlc3BvbnNlLnN0b3JhZ2Uudm9sdW1lX2ZyZWUgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICB2b2x1bWVVc2VkOiBwYXJzZUludChyZXNwb25zZS5zdG9yYWdlLnZvbHVtZV91c2VkIHx8ICcwJywgMTApLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBuZXR3b3JrOiByZXNwb25zZS5uZXR3b3JrXG4gICAgICAgID8ge1xuICAgICAgICAgICAgYnl0ZXNTZW50OiBwYXJzZUludChyZXNwb25zZS5uZXR3b3JrLmJ5dGVzX3NlbnQgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBieXRlc1JlY3Y6IHBhcnNlSW50KHJlc3BvbnNlLm5ldHdvcmsuYnl0ZXNfcmVjdiB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHBhY2tldHNTZW50OiBwYXJzZUludChyZXNwb25zZS5uZXR3b3JrLnBhY2tldHNfc2VudCB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHBhY2tldHNSZWN2OiBwYXJzZUludChyZXNwb25zZS5uZXR3b3JrLnBhY2tldHNfcmVjdiB8fCAnMCcsIDEwKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGNvbXB1dGluZyBlbmdpbmUgdG9wb2xvZ3kgdG8gYmUgcmVhZHkuXG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZTogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IDApOiBQcm9taXNlPENvbXB1dGVUb3BvbG9neVJlc3VsdD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLmFkbWluU2VydmljZSxcbiAgICAgICdXYWl0Rm9yQ29tcHV0ZVRvcG9sb2d5JyxcbiAgICAgIHsgZ3JhcGhfbmFtZTogZ3JhcGhOYW1lLCB0aW1lb3V0X21zOiB0aW1lb3V0TXMgfSxcbiAgICAgIG1ldGFkYXRhXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHk6IHJlc3BvbnNlLnJlYWR5IHx8IGZhbHNlLFxuICAgICAgbWVzc2FnZTogcmVzcG9uc2UubWVzc2FnZSB8fCAnJyxcbiAgICB9O1xuICB9XG59XG4iXX0=