aiservermanager 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/backend/dist/di/container.js +4 -4
- package/backend/dist/di/container.js.map +1 -1
- package/backend/dist/services/resolvers/pciBusOrderIndexResolver.js +77 -0
- package/backend/dist/services/resolvers/pciBusOrderIndexResolver.js.map +1 -0
- package/package.json +1 -1
- package/backend/dist/services/resolvers/sysfsRenderIndexResolver.js +0 -113
- package/backend/dist/services/resolvers/sysfsRenderIndexResolver.js.map +0 -1
|
@@ -13,7 +13,7 @@ const nvidiaSmiDetector_1 = require("../services/detectors/nvidiaSmiDetector");
|
|
|
13
13
|
const amdLinuxDetector_1 = require("../services/detectors/amdLinuxDetector");
|
|
14
14
|
const wmiDetector_1 = require("../services/detectors/wmiDetector");
|
|
15
15
|
const lspciEnricher_1 = require("../services/enrichers/lspciEnricher");
|
|
16
|
-
const
|
|
16
|
+
const pciBusOrderIndexResolver_1 = require("../services/resolvers/pciBusOrderIndexResolver");
|
|
17
17
|
const listOrderIndexResolver_1 = require("../services/resolvers/listOrderIndexResolver");
|
|
18
18
|
const nvidiaSmiUsageProbe_1 = require("../services/probes/nvidiaSmiUsageProbe");
|
|
19
19
|
const amdLinuxUsageProbe_1 = require("../services/probes/amdLinuxUsageProbe");
|
|
@@ -53,9 +53,9 @@ function createContainer() {
|
|
|
53
53
|
if (!isWindows) {
|
|
54
54
|
container.bind(types_1.GPU_ENRICHER).to(lspciEnricher_1.LspciEnricher);
|
|
55
55
|
}
|
|
56
|
-
// Index resolvers — assign the
|
|
57
|
-
// first resolver that matches wins (
|
|
58
|
-
container.bind(types_1.GPU_INDEX_RESOLVER).to(
|
|
56
|
+
// Index resolvers — assign the device number (gpuIndex);
|
|
57
|
+
// first resolver that matches wins (PCIe bus order, list order as fallback)
|
|
58
|
+
container.bind(types_1.GPU_INDEX_RESOLVER).to(pciBusOrderIndexResolver_1.PciBusOrderIndexResolver);
|
|
59
59
|
container.bind(types_1.GPU_INDEX_RESOLVER).to(listOrderIndexResolver_1.ListOrderIndexResolver);
|
|
60
60
|
// Usage probes — dynamic metrics (usage, temperature, vramUsed)
|
|
61
61
|
container.bind(types_1.GPU_USAGE_PROBE).to(nvidiaSmiUsageProbe_1.NvidiaSmiUsageProbe);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":";;AAiDA,0CAmEC;AApHD,4BAA0B;AAC1B,yCAAsC;AACtC,mCAeiB;AACjB,yDAAsD;AAEtD,kFAA+E;AAC/E,sFAAmF;AACnF,uDAAoD;AACpD,6DAA0D;AAE1D,+EAA4E;AAC5E,6EAA0E;AAC1E,mEAAgE;AAEhE,uEAAoE;AAEpE,6FAA0F;AAC1F,yFAAsF;AAEtF,gFAA6E;AAC7E,8EAA2E;AAC3E,+DAA4D;AAE5D,qFAAkF;AAClF,+FAA4F;AAC5F,iFAA8E;AAC9E,qFAAkF;AAClF,mFAAgF;AAEhF,2FAAwF;AACxF,+FAA4F;AAE5F,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAE/C,SAAgB,eAAe;IAC7B,MAAM,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;IAElC,iDAAiD;IACjD,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,IAAI,CAAmB,yBAAiB,CAAC,CAAC,EAAE,CAAC,iDAAuB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACrG,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,IAAI,CAAmB,yBAAiB,CAAC,CAAC,EAAE,CAAC,6CAAqB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACnG,CAAC;IAED,yDAAyD;IACzD,SAAS,CAAC,IAAI,CAAc,oBAAY,CAAC,CAAC,EAAE,CAAC,yBAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAE7E,qDAAqD;IACrD,SAAS,CAAC,IAAI,CAAa,mBAAW,CAAC,CAAC,EAAE,CAAC,uBAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAE1E,oCAAoC;IACpC,SAAS,CAAC,IAAI,CAAgB,sBAAc,CAAC,CAAC,EAAE,CAAC,6BAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAEnF,sDAAsD;IACtD,SAAS,CAAC,IAAI,CAAc,oBAAY,CAAC,CAAC,EAAE,CAAC,qCAAiB,CAAC,CAAC;IAChE,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,IAAI,CAAc,oBAAY,CAAC,CAAC,EAAE,CAAC,yBAAW,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,IAAI,CAAc,oBAAY,CAAC,CAAC,EAAE,CAAC,mCAAgB,CAAC,CAAC;IACjE,CAAC;IAED,6CAA6C;IAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,CAAC,IAAI,CAAc,oBAAY,CAAC,CAAC,EAAE,CAAC,6BAAa,CAAC,CAAC;IAC9D,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PciBusOrderIndexResolver = void 0;
|
|
10
|
+
const inversify_1 = require("inversify");
|
|
11
|
+
/**
|
|
12
|
+
* Assigns gpuIndex by PCIe address (BDF) order: GPUs are sorted by the
|
|
13
|
+
* numeric value of their PCI address (bus, then device, then function) and
|
|
14
|
+
* each gets its position in that order — 0, 1, 2, ...
|
|
15
|
+
*
|
|
16
|
+
* This is the sequential number visible in `lspci` / `rocm-smi --showbus` —
|
|
17
|
+
* deliberately NOT the kernel probe order (HIP/KFD agent order), which can
|
|
18
|
+
* differ from BDF order (e.g. buses 83/86/C3/C6 probe as C3/C6/83/86).
|
|
19
|
+
*
|
|
20
|
+
* Platform-agnostic: every detector reports pciBusId as "BB:DD.F" (an
|
|
21
|
+
* optional "DDDD:" domain prefix is accepted too). GPUs without a
|
|
22
|
+
* parseable address are appended after the sorted ones, preserving detector
|
|
23
|
+
* list order, so every GPU still gets a unique index.
|
|
24
|
+
*/
|
|
25
|
+
let PciBusOrderIndexResolver = class PciBusOrderIndexResolver {
|
|
26
|
+
async isAvailable() {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
async resolve(gpus) {
|
|
30
|
+
if (gpus.length === 0)
|
|
31
|
+
return 0;
|
|
32
|
+
const withBus = [];
|
|
33
|
+
const withoutBus = [];
|
|
34
|
+
for (const gpu of gpus) {
|
|
35
|
+
const value = parsePciBusId(gpu.pciBusId);
|
|
36
|
+
if (value === null) {
|
|
37
|
+
withoutBus.push(gpu);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
withBus.push({ gpu, value });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
withBus.sort((a, b) => a.value - b.value);
|
|
44
|
+
let index = 0;
|
|
45
|
+
for (const { gpu } of withBus) {
|
|
46
|
+
gpu.gpuIndex = index++;
|
|
47
|
+
}
|
|
48
|
+
for (const gpu of withoutBus) {
|
|
49
|
+
gpu.gpuIndex = index++;
|
|
50
|
+
}
|
|
51
|
+
return gpus.length;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
exports.PciBusOrderIndexResolver = PciBusOrderIndexResolver;
|
|
55
|
+
exports.PciBusOrderIndexResolver = PciBusOrderIndexResolver = __decorate([
|
|
56
|
+
(0, inversify_1.injectable)()
|
|
57
|
+
], PciBusOrderIndexResolver);
|
|
58
|
+
/**
|
|
59
|
+
* "BB:DD.F" (optionally "DDDD:BB:DD.F") → numeric BDF value, or null when
|
|
60
|
+
* the string is not a PCI address. Case-insensitive.
|
|
61
|
+
*/
|
|
62
|
+
function parsePciBusId(raw) {
|
|
63
|
+
if (!raw)
|
|
64
|
+
return null;
|
|
65
|
+
const match = raw
|
|
66
|
+
.trim()
|
|
67
|
+
.toUpperCase()
|
|
68
|
+
.match(/^(?:([0-9A-F]{1,4}):)?([0-9A-F]{1,2}):([0-9A-F]{1,2})\.([0-7])$/);
|
|
69
|
+
if (!match)
|
|
70
|
+
return null;
|
|
71
|
+
const domain = match[1] ? parseInt(match[1], 16) : 0;
|
|
72
|
+
const bus = parseInt(match[2], 16);
|
|
73
|
+
const device = parseInt(match[3], 16);
|
|
74
|
+
const func = parseInt(match[4], 16);
|
|
75
|
+
return (domain << 16) | (bus << 8) | (device << 3) | func;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=pciBusOrderIndexResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pciBusOrderIndexResolver.js","sourceRoot":"","sources":["../../../src/services/resolvers/pciBusOrderIndexResolver.ts"],"names":[],"mappings":";;;;;;;;;AAAA,yCAAuC;AAIvC;;;;;;;;;;;;;GAaG;AAEI,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IACnC,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAe;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEhC,MAAM,OAAO,GAAsC,EAAE,CAAC;QACtD,MAAM,UAAU,GAAc,EAAE,CAAC;QAEjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;YAC9B,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC;QACzB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF,CAAA;AAhCY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,sBAAU,GAAE;GACA,wBAAwB,CAgCpC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,KAAK,GAAG,GAAG;SACd,IAAI,EAAE;SACN,WAAW,EAAE;SACb,KAAK,CAAC,iEAAiE,CAAC,CAAC;IAC5E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;AAC5D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
-
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;
|
|
22
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
-
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.SysfsRenderIndexResolver = void 0;
|
|
43
|
-
const fs = __importStar(require("fs"));
|
|
44
|
-
const inversify_1 = require("inversify");
|
|
45
|
-
const ExecTools_1 = require("../../helpers/ExecTools");
|
|
46
|
-
/**
|
|
47
|
-
* Lists DRM cards that own a render node, with their PCI address:
|
|
48
|
-
*
|
|
49
|
-
* card1 0000:c3:00.0
|
|
50
|
-
* card2 0000:c6:00.0
|
|
51
|
-
*
|
|
52
|
-
* Vendor-agnostic: works for any GPU with a DRM render node (AMD, NVIDIA, ...).
|
|
53
|
-
* - Connector entries (card1-DP-1) resolve to the drm card dir, not a PCI
|
|
54
|
-
* device, so they fail the render-node check below.
|
|
55
|
-
* - BMC/iGPU cards without a render node (e.g. ASPEED VGA) are skipped.
|
|
56
|
-
* - Card numbers are assigned by the kernel in device probe order — the same
|
|
57
|
-
* order KFD registers its agents — so card order == HIP order.
|
|
58
|
-
*
|
|
59
|
-
* Linux only.
|
|
60
|
-
*/
|
|
61
|
-
const LIST_RENDER_CARDS = `
|
|
62
|
-
for c in /sys/class/drm/card[0-9]*; do
|
|
63
|
-
d=$(readlink -f "$c/device" 2>/dev/null) || continue
|
|
64
|
-
ls "$d"/drm/renderD* >/dev/null 2>&1 || continue
|
|
65
|
-
printf '%s %s\\n' "$(basename "$c")" "$(basename "$d")"
|
|
66
|
-
done
|
|
67
|
-
`;
|
|
68
|
-
let SysfsRenderIndexResolver = class SysfsRenderIndexResolver {
|
|
69
|
-
async isAvailable() {
|
|
70
|
-
return process.platform === "linux" && fs.existsSync("/sys/class/drm");
|
|
71
|
-
}
|
|
72
|
-
async resolve(gpus) {
|
|
73
|
-
if (gpus.length === 0)
|
|
74
|
-
return 0;
|
|
75
|
-
const result = await ExecTools_1.ExecTools.safeExec(LIST_RENDER_CARDS, { timeout: 5000 });
|
|
76
|
-
if (!result.stdout.trim())
|
|
77
|
-
return 0;
|
|
78
|
-
const byPci = new Map();
|
|
79
|
-
for (const gpu of gpus) {
|
|
80
|
-
if (gpu.pciBusId)
|
|
81
|
-
byPci.set(normalizePci(gpu.pciBusId), gpu);
|
|
82
|
-
}
|
|
83
|
-
let index = 0;
|
|
84
|
-
for (const { pci } of this.parseLines(result.stdout)) {
|
|
85
|
-
const gpu = byPci.get(normalizePci(pci));
|
|
86
|
-
if (!gpu)
|
|
87
|
-
continue; // render card not in the detected list (iGPU, etc.)
|
|
88
|
-
gpu.gpuIndex = index++;
|
|
89
|
-
}
|
|
90
|
-
return index;
|
|
91
|
-
}
|
|
92
|
-
/** "cardN <pci>" lines, sorted by numeric card number (probe order). */
|
|
93
|
-
parseLines(raw) {
|
|
94
|
-
const cards = [];
|
|
95
|
-
for (const line of raw.trim().split("\n")) {
|
|
96
|
-
const [name, pci] = line.split(/\s+/);
|
|
97
|
-
const card = parseInt((name ?? "").replace("card", ""), 10);
|
|
98
|
-
if (name === undefined || pci === undefined || Number.isNaN(card))
|
|
99
|
-
continue;
|
|
100
|
-
cards.push({ card, pci });
|
|
101
|
-
}
|
|
102
|
-
return cards.sort((a, b) => a.card - b.card);
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
exports.SysfsRenderIndexResolver = SysfsRenderIndexResolver;
|
|
106
|
-
exports.SysfsRenderIndexResolver = SysfsRenderIndexResolver = __decorate([
|
|
107
|
-
(0, inversify_1.injectable)()
|
|
108
|
-
], SysfsRenderIndexResolver);
|
|
109
|
-
/** "0000:c3:00.0" → "C3:00.0" — strip domain prefix, uppercase (detector format). */
|
|
110
|
-
function normalizePci(raw) {
|
|
111
|
-
return raw.trim().toUpperCase().replace(/^0+:/, "");
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=sysfsRenderIndexResolver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sysfsRenderIndexResolver.js","sourceRoot":"","sources":["../../../src/services/resolvers/sysfsRenderIndexResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,yCAAuC;AAEvC,uDAAoD;AAGpD;;;;;;;;;;;;;;GAcG;AACH,MAAM,iBAAiB,GAAG;;;;;;CAMzB,CAAC;AAGK,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IACnC,KAAK,CAAC,WAAW;QACf,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAe;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,MAAM,qBAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,CAAC;QAEpC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,QAAQ;gBAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG;gBAAE,SAAS,CAAC,oDAAoD;YACxE,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC;QACzB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wEAAwE;IAChE,UAAU,CAAC,GAAW;QAC5B,MAAM,KAAK,GAAoC,EAAE,CAAC;QAElD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5D,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF,CAAA;AAvCY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,sBAAU,GAAE;GACA,wBAAwB,CAuCpC;AAED,qFAAqF;AACrF,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC"}
|