@libs-ui/services-grid-layout 0.2.357-19

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.
@@ -0,0 +1,123 @@
1
+ import { CompactType, DisplayGrid, GridType } from 'gridster18';
2
+ /**
3
+ * Cấu hình gridster cho lưới CẤP TRANG.
4
+ *
5
+ * Mọi giá trị dưới đây đều đến từ một lỗi đã đo được trên sản phẩm thật, không phải chọn theo cảm
6
+ * tính. Đổi bất kỳ dòng nào có dấu 🔴 sẽ làm sống lại đúng lỗi ghi trong comment.
7
+ */
8
+ export const gridLayoutRootConfig = () => ({
9
+ // 🔴 VerticalFixed — CẤM đổi sang Fit hay ScrollVertical.
10
+ // `Fit` chia đều chiều cao khung cho số hàng đang dùng, nên card khai `rows: 2` phình từ 124px lên
11
+ // 247px. `ScrollVertical` KHÔNG đọc `fixedRowHeight` (mã lib: chỉ `Fixed` và `VerticalFixed` đọc).
12
+ gridType: GridType.VerticalFixed,
13
+ // 🔴 None — CẤM quay lại CompactUp.
14
+ // `CompactUp` hút mọi khối lên sát nhau NGAY sau mỗi thao tác, nên:
15
+ // · kéo mép dưới cho khối cao thêm → chỗ khối dưới vừa nhường bị hút lấp lại tức thì, cú kéo bị
16
+ // `checkGridCollision` báo va chạm rồi HOÀN NGUYÊN (khối đứng im dù kéo);
17
+ // · kéo thả đổi vị trí → khối vừa nhường chỗ bị hút về ngay, khối đang kéo không có chỗ đặt và
18
+ // treo lơ lửng giữa hai khối.
19
+ // Muốn dồn khít thì gọi `sapGon()` của service.
20
+ compactType: CompactType.None,
21
+ displayGrid: DisplayGrid.OnDragAndResize,
22
+ // 🔴 pushItems: true — CẤM để false.
23
+ // `swap` của lib CHỈ hoán vị được HAI KHỐI CÙNG KÍCH THƯỚC (mã lib `checkSwap`: tính diffX/diffY
24
+ // rồi hoán vị, lệch kích thước thì `checkCollision` báo va chạm và hoàn nguyên). Khối 3x2 gặp
25
+ // container 7x5 nên không swap được, mà `pushItems: false` cũng không cho container nhường đường
26
+ // → BẾ TẮC: khối đang kéo không đặt được ở đâu.
27
+ pushItems: true,
28
+ // chỉ đẩy XUỐNG: đẩy ngang làm xô lệch bố cục cột người dùng vừa đặt
29
+ pushDirections: { north: false, east: false, south: true, west: false },
30
+ pushResizeItems: true,
31
+ swap: true,
32
+ swapWhileDragging: true,
33
+ draggable: {
34
+ enabled: true,
35
+ // 🔴 KHÔNG được bỏ. Không có nó thì gridster vào chế độ kéo ngay từ `mousedown`, nên chỉ bấm
36
+ // CHỌN một khối là nó đã nhích theo dù chuột đứng yên. Lib tự huỷ kéo khi nhả chuột trước mốc
37
+ // này nên cú bấm chọn vẫn ăn nguyên vẹn.
38
+ delayStart: 160,
39
+ // 🔴 `checkDragHandleClass` duyệt DOM từ chỗ bấm NGƯỢC LÊN CHA, và trên MỖI node nó kiểm
40
+ // `dragHandleClass` TRƯỚC `ignoreContentClass`. Vì vậy một phần tử KHÔNG được mang cả hai class
41
+ // cùng lúc — mang cả hai thì lib gặp tay cầm trước, trả `true`, class chặn không tới lượt.
42
+ ignoreContentClass: 'libs-ui-grid-layout-block-parent-drag',
43
+ ignoreContent: true,
44
+ dragHandleClass: 'libs-ui-grid-layout-drag-handle',
45
+ },
46
+ resizable: {
47
+ enabled: true,
48
+ // đủ 8 hướng như cửa sổ thường; chỉ có góc dưới-phải thì quá khó trúng
49
+ handles: { s: true, e: true, n: true, w: true, se: true, ne: true, sw: true, nw: true },
50
+ },
51
+ margin: 12,
52
+ outerMargin: true,
53
+ outerMarginBottom: 40,
54
+ minCols: 12,
55
+ maxCols: 12,
56
+ minRows: 2,
57
+ // 🔴 KHÔNG giới hạn chiều cao khối. Lib có BA trần mặc định phải vô hiệu hoá CÙNG LÚC, thiếu một
58
+ // cái là vẫn bị chặn: `maxItemRows: 50` · `maxItemCols: 50` · `maxItemArea: 2500` (trần DIỆN TÍCH
59
+ // cols × rows — khó thấy nhất: khối 12 cột chỉ cần 209 hàng là đụng trần dù hai trần kia còn dư).
60
+ // `maxRows` là trần của CẢ LƯỚI, cũng phải nới theo.
61
+ maxRows: 5000,
62
+ maxItemRows: 5000,
63
+ maxItemCols: 12,
64
+ maxItemArea: 60000,
65
+ // 🔴 Trần LỚP CHỒNG. Mặc định của lib là 2 — quá thấp: khi bật chồng khối, thư viện gán mỗi khối
66
+ // một lớp riêng để chúng khác nhau, nên chỉ 3 khối là đã đụng trần và các khối sau lại rơi về
67
+ // cùng lớp, tức chồng nhau bị chặn trở lại.
68
+ maxLayerIndex: 5000,
69
+ setGridSize: true,
70
+ fixedRowHeight: 56,
71
+ defaultItemCols: 3,
72
+ defaultItemRows: 2,
73
+ minItemRows: 1,
74
+ mobileBreakpoint: -1,
75
+ });
76
+ /**
77
+ * Cấu hình cho lưới LỒNG (ruột một container).
78
+ *
79
+ * Kế thừa lưới trang rồi ghi đè phần khác biệt. Ba điểm quan trọng nhất: `setGridSize` phải TẮT,
80
+ * tay cầm phải mang TÊN RIÊNG, và tự-cuộn-khi-kéo phải TẮT.
81
+ */
82
+ export const gridLayoutNestedConfig = () => ({
83
+ ...gridLayoutRootConfig(),
84
+ // 🔴 PHẢI tắt cho lưới lồng. `setGridSize` làm gridster tự ghi style width/height lên CHÍNH nó,
85
+ // sinh vòng lặp đo-rồi-ghi với ResizeObserver của khung ngoài (khung đổi → onResize xoá style →
86
+ // setGridSize ghi lại) → lưới con co dần về 64x64px trong khung 868px.
87
+ setGridSize: false,
88
+ // khe 2px: khối con là các dòng thông tin của CÙNG một card, khe rộng làm chúng trông như card rời
89
+ margin: 2,
90
+ // Lưới lồng KHÔNG tự chừa lề — lề là của VỎ container (`containerPadding`), không phải của lưới.
91
+ // Đặt ở vỏ thì ruột co lại đúng bằng phần còn lại, tay cầm resize của khối con luôn nằm trong tầm
92
+ // chuột (người dùng chốt 28/08/2026: "lưới cha có padding chứ ko phải con").
93
+ outerMargin: false,
94
+ outerMarginBottom: 0,
95
+ // hàng 16px cho bước kéo mịn, và sàn 1 hàng = 16px nên khối co được nhỏ hơn nhiều
96
+ fixedRowHeight: 16,
97
+ minRows: 1,
98
+ minItemRows: 1,
99
+ defaultItemCols: 2,
100
+ defaultItemRows: 2,
101
+ // 🔴 Tay cầm RIÊNG — CẤM dùng chung tên với lưới trang.
102
+ // `checkDragHandleClass` trả `true` ở node ĐẦU TIÊN có `dragHandleClass`. Dùng chung một tên thì
103
+ // lưới CHA cũng nhận ra tay cầm của khối con và nhấc luôn container.
104
+ draggable: {
105
+ ...gridLayoutRootConfig().draggable,
106
+ dragHandleClass: 'libs-ui-grid-layout-drag-handle-child',
107
+ },
108
+ // 🔴 KÉO MÉP thì khối dưới ĐỨNG YÊN, chỉ khoảng trống giữa hai khối co giãn. Bật (kế thừa từ lưới
109
+ // trang) thì mỗi cú kéo đẩy dồn cả cột xuống — người dùng chỉ muốn một khối to hơn một chút mà cả
110
+ // card dài ra. `pushItems` vẫn giữ: nó lo việc KÉO THẢ đổi chỗ, khác việc đổi kích thước.
111
+ pushResizeItems: false,
112
+ // 🔴 Tắt tự cuộn khi kéo tới sát mép. Lib thấy chuột gần biên là cuộn lưới theo
113
+ // (`scrollSensitivity`), nhưng lưới con nằm trong card có `overflow: hidden` — cuộn ở đây đẩy khối
114
+ // con ra NGOÀI khung container rồi kẹt luôn ở đó.
115
+ disableScrollHorizontal: true,
116
+ disableScrollVertical: true,
117
+ });
118
+ /**
119
+ * Cây rỗng dùng khi chưa có dữ liệu — mặt phẳng vẽ ra một lưới trống thay vì vỡ.
120
+ * Xảy ra trong nhịp giữa lúc component dựng và lúc `init()` chạy.
121
+ */
122
+ export const emptyRootNode = () => ({ id: 'root', x: 0, y: 0, cols: 12, rows: 0, children: [] });
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItY29uZmlnLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2RlZmluZXMvZ3JpZHN0ZXItY29uZmlnLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBa0IsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2hGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDekQsMERBQTBEO0lBQzFELG1HQUFtRztJQUNuRyxtR0FBbUc7SUFDbkcsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhO0lBRWhDLG9DQUFvQztJQUNwQyxvRUFBb0U7SUFDcEUsaUdBQWlHO0lBQ2pHLDZFQUE2RTtJQUM3RSxnR0FBZ0c7SUFDaEcsaUNBQWlDO0lBQ2pDLGdEQUFnRDtJQUNoRCxXQUFXLEVBQUUsV0FBVyxDQUFDLElBQUk7SUFDN0IsV0FBVyxFQUFFLFdBQVcsQ0FBQyxlQUFlO0lBRXhDLHFDQUFxQztJQUNyQyxpR0FBaUc7SUFDakcsOEZBQThGO0lBQzlGLGlHQUFpRztJQUNqRyxnREFBZ0Q7SUFDaEQsU0FBUyxFQUFFLElBQUk7SUFDZixxRUFBcUU7SUFDckUsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUN2RSxlQUFlLEVBQUUsSUFBSTtJQUNyQixJQUFJLEVBQUUsSUFBSTtJQUNWLGlCQUFpQixFQUFFLElBQUk7SUFFdkIsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLElBQUk7UUFDYiw2RkFBNkY7UUFDN0YsOEZBQThGO1FBQzlGLHlDQUF5QztRQUN6QyxVQUFVLEVBQUUsR0FBRztRQUNmLHlGQUF5RjtRQUN6RixnR0FBZ0c7UUFDaEcsMkZBQTJGO1FBQzNGLGtCQUFrQixFQUFFLHVDQUF1QztRQUMzRCxhQUFhLEVBQUUsSUFBSTtRQUNuQixlQUFlLEVBQUUsaUNBQWlDO0tBQ25EO0lBRUQsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLElBQUk7UUFDYix1RUFBdUU7UUFDdkUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFO0tBQ3hGO0lBRUQsTUFBTSxFQUFFLEVBQUU7SUFDVixXQUFXLEVBQUUsSUFBSTtJQUNqQixpQkFBaUIsRUFBRSxFQUFFO0lBQ3JCLE9BQU8sRUFBRSxFQUFFO0lBQ1gsT0FBTyxFQUFFLEVBQUU7SUFDWCxPQUFPLEVBQUUsQ0FBQztJQUVWLGlHQUFpRztJQUNqRyxrR0FBa0c7SUFDbEcsa0dBQWtHO0lBQ2xHLHFEQUFxRDtJQUNyRCxPQUFPLEVBQUUsSUFBSTtJQUNiLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFFbEIsaUdBQWlHO0lBQ2pHLDhGQUE4RjtJQUM5Riw0Q0FBNEM7SUFDNUMsYUFBYSxFQUFFLElBQUk7SUFFbkIsV0FBVyxFQUFFLElBQUk7SUFDakIsY0FBYyxFQUFFLEVBQUU7SUFDbEIsZUFBZSxFQUFFLENBQUM7SUFDbEIsZUFBZSxFQUFFLENBQUM7SUFDbEIsV0FBVyxFQUFFLENBQUM7SUFDZCxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7Q0FDckIsQ0FBQyxDQUFDO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFtQixFQUFFLENBQUMsQ0FBQztJQUMzRCxHQUFHLG9CQUFvQixFQUFFO0lBRXpCLGdHQUFnRztJQUNoRyxnR0FBZ0c7SUFDaEcsdUVBQXVFO0lBQ3ZFLFdBQVcsRUFBRSxLQUFLO0lBRWxCLG1HQUFtRztJQUNuRyxNQUFNLEVBQUUsQ0FBQztJQUNULGlHQUFpRztJQUNqRyxrR0FBa0c7SUFDbEcsNkVBQTZFO0lBQzdFLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLGlCQUFpQixFQUFFLENBQUM7SUFFcEIsa0ZBQWtGO0lBQ2xGLGNBQWMsRUFBRSxFQUFFO0lBQ2xCLE9BQU8sRUFBRSxDQUFDO0lBQ1YsV0FBVyxFQUFFLENBQUM7SUFDZCxlQUFlLEVBQUUsQ0FBQztJQUNsQixlQUFlLEVBQUUsQ0FBQztJQUVsQix3REFBd0Q7SUFDeEQsaUdBQWlHO0lBQ2pHLHFFQUFxRTtJQUNyRSxTQUFTLEVBQUU7UUFDVCxHQUFHLG9CQUFvQixFQUFFLENBQUMsU0FBUztRQUNuQyxlQUFlLEVBQUUsdUNBQXVDO0tBQ3pEO0lBRUQsa0dBQWtHO0lBQ2xHLGtHQUFrRztJQUNsRywwRkFBMEY7SUFDMUYsZUFBZSxFQUFFLEtBQUs7SUFFdEIsZ0ZBQWdGO0lBQ2hGLG1HQUFtRztJQUNuRyxrREFBa0Q7SUFDbEQsdUJBQXVCLEVBQUUsSUFBSTtJQUM3QixxQkFBcUIsRUFBRSxJQUFJO0NBQzVCLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFzQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBhY3RUeXBlLCBEaXNwbGF5R3JpZCwgR3JpZHN0ZXJDb25maWcsIEdyaWRUeXBlIH0gZnJvbSAnZ3JpZHN0ZXIxOCc7XG5pbXBvcnQgeyBUX2dyaWRMYXlvdXRfbm9kZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZ3JpZC1sYXlvdXQuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBD4bqldSBow6xuaCBncmlkc3RlciBjaG8gbMaw4bubaSBD4bqkUCBUUkFORy5cbiAqXG4gKiBN4buNaSBnacOhIHRy4buLIGTGsOG7m2kgxJHDonkgxJHhu4F1IMSR4bq/biB04burIG3hu5l0IGzhu5dpIMSRw6MgxJFvIMSRxrDhu6NjIHRyw6puIHPhuqNuIHBo4bqpbSB0aOG6rXQsIGtow7RuZyBwaOG6o2kgY2jhu41uIHRoZW8gY+G6o21cbiAqIHTDrW5oLiDEkOG7lWkgYuG6pXQga+G7syBkw7JuZyBuw6BvIGPDsyBk4bqldSDwn5S0IHPhur0gbMOgbSBz4buRbmcgbOG6oWkgxJHDum5nIGzhu5dpIGdoaSB0cm9uZyBjb21tZW50LlxuICovXG5leHBvcnQgY29uc3QgZ3JpZExheW91dFJvb3RDb25maWcgPSAoKTogR3JpZHN0ZXJDb25maWcgPT4gKHtcbiAgLy8g8J+UtCBWZXJ0aWNhbEZpeGVkIOKAlCBD4bqkTSDEkeG7lWkgc2FuZyBGaXQgaGF5IFNjcm9sbFZlcnRpY2FsLlxuICAvLyBgRml0YCBjaGlhIMSR4buBdSBjaGnhu4F1IGNhbyBraHVuZyBjaG8gc+G7kSBow6BuZyDEkWFuZyBkw7luZywgbsOqbiBjYXJkIGtoYWkgYHJvd3M6IDJgIHBow6xuaCB04burIDEyNHB4IGzDqm5cbiAgLy8gMjQ3cHguIGBTY3JvbGxWZXJ0aWNhbGAgS0jDlE5HIMSR4buNYyBgZml4ZWRSb3dIZWlnaHRgIChtw6MgbGliOiBjaOG7iSBgRml4ZWRgIHbDoCBgVmVydGljYWxGaXhlZGAgxJHhu41jKS5cbiAgZ3JpZFR5cGU6IEdyaWRUeXBlLlZlcnRpY2FsRml4ZWQsXG5cbiAgLy8g8J+UtCBOb25lIOKAlCBD4bqkTSBxdWF5IGzhuqFpIENvbXBhY3RVcC5cbiAgLy8gYENvbXBhY3RVcGAgaMO6dCBt4buNaSBraOG7kWkgbMOqbiBzw6F0IG5oYXUgTkdBWSBzYXUgbeG7l2kgdGhhbyB0w6FjLCBuw6puOlxuICAvLyAgwrcga8OpbyBtw6lwIGTGsOG7m2kgY2hvIGto4buRaSBjYW8gdGjDqm0g4oaSIGNo4buXIGto4buRaSBkxrDhu5tpIHbhu6thIG5oxrDhu51uZyBi4buLIGjDunQgbOG6pXAgbOG6oWkgdOG7qWMgdGjDrCwgY8O6IGvDqW8gYuG7i1xuICAvLyAgICBgY2hlY2tHcmlkQ29sbGlzaW9uYCBiw6FvIHZhIGNo4bqhbSBy4buTaSBIT8OATiBOR1VZw4pOIChraOG7kWkgxJHhu6luZyBpbSBkw7kga8Opbyk7XG4gIC8vICDCtyBrw6lvIHRo4bqjIMSR4buVaSB24buLIHRyw60g4oaSIGto4buRaSB24burYSBuaMaw4budbmcgY2jhu5cgYuG7iyBow7p0IHbhu4EgbmdheSwga2jhu5FpIMSRYW5nIGvDqW8ga2jDtG5nIGPDsyBjaOG7lyDEkeG6t3QgdsOgXG4gIC8vICAgIHRyZW8gbMahIGzhu61uZyBnaeG7r2EgaGFpIGto4buRaS5cbiAgLy8gTXXhu5FuIGThu5NuIGtow610IHRow6wgZ+G7jWkgYHNhcEdvbigpYCBj4bunYSBzZXJ2aWNlLlxuICBjb21wYWN0VHlwZTogQ29tcGFjdFR5cGUuTm9uZSxcbiAgZGlzcGxheUdyaWQ6IERpc3BsYXlHcmlkLk9uRHJhZ0FuZFJlc2l6ZSxcblxuICAvLyDwn5S0IHB1c2hJdGVtczogdHJ1ZSDigJQgQ+G6pE0gxJHhu4MgZmFsc2UuXG4gIC8vIGBzd2FwYCBj4bunYSBsaWIgQ0jhu4ggaG/DoW4gduG7iyDEkcaw4bujYyBIQUkgS0jhu5BJIEPDmU5HIEvDjUNIIFRIxq/hu5pDIChtw6MgbGliIGBjaGVja1N3YXBgOiB0w61uaCBkaWZmWC9kaWZmWVxuICAvLyBy4buTaSBob8OhbiB24buLLCBs4buHY2gga8OtY2ggdGjGsOG7m2MgdGjDrCBgY2hlY2tDb2xsaXNpb25gIGLDoW8gdmEgY2jhuqFtIHbDoCBob8OgbiBuZ3V5w6puKS4gS2jhu5FpIDN4MiBn4bq3cFxuICAvLyBjb250YWluZXIgN3g1IG7Dqm4ga2jDtG5nIHN3YXAgxJHGsOG7o2MsIG3DoCBgcHVzaEl0ZW1zOiBmYWxzZWAgY8Wpbmcga2jDtG5nIGNobyBjb250YWluZXIgbmjGsOG7nW5nIMSRxrDhu51uZ1xuICAvLyDihpIgQuG6viBU4bquQzoga2jhu5FpIMSRYW5nIGvDqW8ga2jDtG5nIMSR4bq3dCDEkcaw4bujYyDhu58gxJHDonUuXG4gIHB1c2hJdGVtczogdHJ1ZSxcbiAgLy8gY2jhu4kgxJHhuql5IFhV4buQTkc6IMSR4bqpeSBuZ2FuZyBsw6BtIHjDtCBs4buHY2ggYuG7kSBj4bulYyBj4buZdCBuZ8aw4budaSBkw7luZyB24burYSDEkeG6t3RcbiAgcHVzaERpcmVjdGlvbnM6IHsgbm9ydGg6IGZhbHNlLCBlYXN0OiBmYWxzZSwgc291dGg6IHRydWUsIHdlc3Q6IGZhbHNlIH0sXG4gIHB1c2hSZXNpemVJdGVtczogdHJ1ZSxcbiAgc3dhcDogdHJ1ZSxcbiAgc3dhcFdoaWxlRHJhZ2dpbmc6IHRydWUsXG5cbiAgZHJhZ2dhYmxlOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvLyDwn5S0IEtIw5RORyDEkcaw4bujYyBi4buPLiBLaMO0bmcgY8OzIG7DsyB0aMOsIGdyaWRzdGVyIHbDoG8gY2jhur8gxJHhu5kga8OpbyBuZ2F5IHThu6sgYG1vdXNlZG93bmAsIG7Dqm4gY2jhu4kgYuG6pW1cbiAgICAvLyBDSOG7jE4gbeG7mXQga2jhu5FpIGzDoCBuw7MgxJHDoyBuaMOtY2ggdGhlbyBkw7kgY2h14buZdCDEkeG7qW5nIHnDqm4uIExpYiB04buxIGh14bu3IGvDqW8ga2hpIG5o4bqjIGNodeG7mXQgdHLGsOG7m2MgbeG7kWNcbiAgICAvLyBuw6B5IG7Dqm4gY8O6IGLhuqVtIGNo4buNbiB24bqrbiDEg24gbmd1ecOqbiB24bq5bi5cbiAgICBkZWxheVN0YXJ0OiAxNjAsXG4gICAgLy8g8J+UtCBgY2hlY2tEcmFnSGFuZGxlQ2xhc3NgIGR1eeG7h3QgRE9NIHThu6sgY2jhu5cgYuG6pW0gTkfGr+G7okMgTMOKTiBDSEEsIHbDoCB0csOqbiBN4buWSSBub2RlIG7DsyBraeG7g21cbiAgICAvLyBgZHJhZ0hhbmRsZUNsYXNzYCBUUsav4buaQyBgaWdub3JlQ29udGVudENsYXNzYC4gVsOsIHbhuq15IG3hu5l0IHBo4bqnbiB04butIEtIw5RORyDEkcaw4bujYyBtYW5nIGPhuqMgaGFpIGNsYXNzXG4gICAgLy8gY8O5bmcgbMO6YyDigJQgbWFuZyBj4bqjIGhhaSB0aMOsIGxpYiBn4bq3cCB0YXkgY+G6p20gdHLGsOG7m2MsIHRy4bqjIGB0cnVlYCwgY2xhc3MgY2jhurduIGtow7RuZyB04bubaSBsxrDhu6N0LlxuICAgIGlnbm9yZUNvbnRlbnRDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtYmxvY2stcGFyZW50LWRyYWcnLFxuICAgIGlnbm9yZUNvbnRlbnQ6IHRydWUsXG4gICAgZHJhZ0hhbmRsZUNsYXNzOiAnbGlicy11aS1ncmlkLWxheW91dC1kcmFnLWhhbmRsZScsXG4gIH0sXG5cbiAgcmVzaXphYmxlOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvLyDEkeG7pyA4IGjGsOG7m25nIG5oxrAgY+G7rWEgc+G7lSB0aMaw4budbmc7IGNo4buJIGPDsyBnw7NjIGTGsOG7m2ktcGjhuqNpIHRow6wgcXXDoSBraMOzIHRyw7puZ1xuICAgIGhhbmRsZXM6IHsgczogdHJ1ZSwgZTogdHJ1ZSwgbjogdHJ1ZSwgdzogdHJ1ZSwgc2U6IHRydWUsIG5lOiB0cnVlLCBzdzogdHJ1ZSwgbnc6IHRydWUgfSxcbiAgfSxcblxuICBtYXJnaW46IDEyLFxuICBvdXRlck1hcmdpbjogdHJ1ZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDQwLFxuICBtaW5Db2xzOiAxMixcbiAgbWF4Q29sczogMTIsXG4gIG1pblJvd3M6IDIsXG5cbiAgLy8g8J+UtCBLSMOUTkcgZ2nhu5tpIGjhuqFuIGNoaeG7gXUgY2FvIGto4buRaS4gTGliIGPDsyBCQSB0cuG6p24gbeG6t2MgxJHhu4tuaCBwaOG6o2kgdsO0IGhp4buHdSBob8OhIEPDmU5HIEzDmkMsIHRoaeG6v3UgbeG7mXRcbiAgLy8gY8OhaSBsw6AgduG6q24gYuG7iyBjaOG6t246IGBtYXhJdGVtUm93czogNTBgIMK3IGBtYXhJdGVtQ29sczogNTBgIMK3IGBtYXhJdGVtQXJlYTogMjUwMGAgKHRy4bqnbiBESeG7hk4gVMONQ0hcbiAgLy8gY29scyDDlyByb3dzIOKAlCBraMOzIHRo4bqleSBuaOG6pXQ6IGto4buRaSAxMiBj4buZdCBjaOG7iSBj4bqnbiAyMDkgaMOgbmcgbMOgIMSR4bulbmcgdHLhuqduIGTDuSBoYWkgdHLhuqduIGtpYSBjw7JuIGTGsCkuXG4gIC8vIGBtYXhSb3dzYCBsw6AgdHLhuqduIGPhu6dhIEPhuqIgTMav4buaSSwgY8WpbmcgcGjhuqNpIG7hu5tpIHRoZW8uXG4gIG1heFJvd3M6IDUwMDAsXG4gIG1heEl0ZW1Sb3dzOiA1MDAwLFxuICBtYXhJdGVtQ29sczogMTIsXG4gIG1heEl0ZW1BcmVhOiA2MDAwMCxcblxuICAvLyDwn5S0IFRy4bqnbiBM4buaUCBDSOG7kk5HLiBN4bq3YyDEkeG7i25oIGPhu6dhIGxpYiBsw6AgMiDigJQgcXXDoSB0aOG6pXA6IGtoaSBi4bqtdCBjaOG7k25nIGto4buRaSwgdGjGsCB2aeG7h24gZ8OhbiBt4buXaSBraOG7kWlcbiAgLy8gbeG7mXQgbOG7m3AgcmnDqm5nIMSR4buDIGNow7puZyBraMOhYyBuaGF1LCBuw6puIGNo4buJIDMga2jhu5FpIGzDoCDEkcOjIMSR4bulbmcgdHLhuqduIHbDoCBjw6FjIGto4buRaSBzYXUgbOG6oWkgcsahaSB24buBXG4gIC8vIGPDuW5nIGzhu5twLCB04bupYyBjaOG7k25nIG5oYXUgYuG7iyBjaOG6t24gdHLhu58gbOG6oWkuXG4gIG1heExheWVySW5kZXg6IDUwMDAsXG5cbiAgc2V0R3JpZFNpemU6IHRydWUsXG4gIGZpeGVkUm93SGVpZ2h0OiA1NixcbiAgZGVmYXVsdEl0ZW1Db2xzOiAzLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG4gIG1pbkl0ZW1Sb3dzOiAxLFxuICBtb2JpbGVCcmVha3BvaW50OiAtMSxcbn0pO1xuXG4vKipcbiAqIEPhuqV1IGjDrG5oIGNobyBsxrDhu5tpIEzhu5JORyAocnXhu5l0IG3hu5l0IGNvbnRhaW5lcikuXG4gKlxuICogS+G6vyB0aOG7q2EgbMaw4bubaSB0cmFuZyBy4buTaSBnaGkgxJHDqCBwaOG6p24ga2jDoWMgYmnhu4d0LiBCYSDEkWnhu4NtIHF1YW4gdHLhu41uZyBuaOG6pXQ6IGBzZXRHcmlkU2l6ZWAgcGjhuqNpIFThuq5ULFxuICogdGF5IGPhuqdtIHBo4bqjaSBtYW5nIFTDik4gUknDik5HLCB2w6AgdOG7sS1jdeG7mW4ta2hpLWvDqW8gcGjhuqNpIFThuq5ULlxuICovXG5leHBvcnQgY29uc3QgZ3JpZExheW91dE5lc3RlZENvbmZpZyA9ICgpOiBHcmlkc3RlckNvbmZpZyA9PiAoe1xuICAuLi5ncmlkTGF5b3V0Um9vdENvbmZpZygpLFxuXG4gIC8vIPCflLQgUEjhuqJJIHThuq90IGNobyBsxrDhu5tpIGzhu5NuZy4gYHNldEdyaWRTaXplYCBsw6BtIGdyaWRzdGVyIHThu7EgZ2hpIHN0eWxlIHdpZHRoL2hlaWdodCBsw6puIENIw41OSCBuw7MsXG4gIC8vIHNpbmggdsOybmcgbOG6t3AgxJFvLXLhu5NpLWdoaSB24bubaSBSZXNpemVPYnNlcnZlciBj4bunYSBraHVuZyBuZ2/DoGkgKGtodW5nIMSR4buVaSDihpIgb25SZXNpemUgeG/DoSBzdHlsZSDihpJcbiAgLy8gc2V0R3JpZFNpemUgZ2hpIGzhuqFpKSDihpIgbMaw4bubaSBjb24gY28gZOG6p24gduG7gSA2NHg2NHB4IHRyb25nIGtodW5nIDg2OHB4LlxuICBzZXRHcmlkU2l6ZTogZmFsc2UsXG5cbiAgLy8ga2hlIDJweDoga2jhu5FpIGNvbiBsw6AgY8OhYyBkw7JuZyB0aMO0bmcgdGluIGPhu6dhIEPDmU5HIG3hu5l0IGNhcmQsIGtoZSBy4buZbmcgbMOgbSBjaMO6bmcgdHLDtG5nIG5oxrAgY2FyZCBy4budaVxuICBtYXJnaW46IDIsXG4gIC8vIEzGsOG7m2kgbOG7k25nIEtIw5RORyB04buxIGNo4burYSBs4buBIOKAlCBs4buBIGzDoCBj4bunYSBW4buOIGNvbnRhaW5lciAoYGNvbnRhaW5lclBhZGRpbmdgKSwga2jDtG5nIHBo4bqjaSBj4bunYSBsxrDhu5tpLlxuICAvLyDEkOG6t3Qg4bufIHbhu48gdGjDrCBydeG7mXQgY28gbOG6oWkgxJHDum5nIGLhurFuZyBwaOG6p24gY8OybiBs4bqhaSwgdGF5IGPhuqdtIHJlc2l6ZSBj4bunYSBraOG7kWkgY29uIGx1w7RuIG7hurFtIHRyb25nIHThuqdtXG4gIC8vIGNodeG7mXQgKG5nxrDhu51pIGTDuW5nIGNo4buRdCAyOC8wOC8yMDI2OiBcImzGsOG7m2kgY2hhIGPDsyBwYWRkaW5nIGNo4bupIGtvIHBo4bqjaSBjb25cIikuXG4gIG91dGVyTWFyZ2luOiBmYWxzZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDAsXG5cbiAgLy8gaMOgbmcgMTZweCBjaG8gYsaw4bubYyBrw6lvIG3hu4tuLCB2w6Agc8OgbiAxIGjDoG5nID0gMTZweCBuw6puIGto4buRaSBjbyDEkcaw4bujYyBuaOG7jyBoxqFuIG5oaeG7gXVcbiAgZml4ZWRSb3dIZWlnaHQ6IDE2LFxuICBtaW5Sb3dzOiAxLFxuICBtaW5JdGVtUm93czogMSxcbiAgZGVmYXVsdEl0ZW1Db2xzOiAyLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG5cbiAgLy8g8J+UtCBUYXkgY+G6p20gUknDik5HIOKAlCBD4bqkTSBkw7luZyBjaHVuZyB0w6puIHbhu5tpIGzGsOG7m2kgdHJhbmcuXG4gIC8vIGBjaGVja0RyYWdIYW5kbGVDbGFzc2AgdHLhuqMgYHRydWVgIOG7nyBub2RlIMSQ4bqmVSBUScOKTiBjw7MgYGRyYWdIYW5kbGVDbGFzc2AuIETDuW5nIGNodW5nIG3hu5l0IHTDqm4gdGjDrFxuICAvLyBsxrDhu5tpIENIQSBjxaluZyBuaOG6rW4gcmEgdGF5IGPhuqdtIGPhu6dhIGto4buRaSBjb24gdsOgIG5o4bqlYyBsdcO0biBjb250YWluZXIuXG4gIGRyYWdnYWJsZToge1xuICAgIC4uLmdyaWRMYXlvdXRSb290Q29uZmlnKCkuZHJhZ2dhYmxlLFxuICAgIGRyYWdIYW5kbGVDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtZHJhZy1oYW5kbGUtY2hpbGQnLFxuICB9LFxuXG4gIC8vIPCflLQgS8OJTyBNw4lQIHRow6wga2jhu5FpIGTGsOG7m2kgxJDhu6hORyBZw4pOLCBjaOG7iSBraG/huqNuZyB0cuG7kW5nIGdp4buvYSBoYWkga2jhu5FpIGNvIGdpw6NuLiBC4bqtdCAoa+G6vyB0aOG7q2EgdOG7qyBsxrDhu5tpXG4gIC8vIHRyYW5nKSB0aMOsIG3hu5dpIGPDuiBrw6lvIMSR4bqpeSBk4buTbiBj4bqjIGPhu5l0IHh14buRbmcg4oCUIG5nxrDhu51pIGTDuW5nIGNo4buJIG114buRbiBt4buZdCBraOG7kWkgdG8gaMahbiBt4buZdCBjaMO6dCBtw6AgY+G6o1xuICAvLyBjYXJkIGTDoGkgcmEuIGBwdXNoSXRlbXNgIHbhuqtuIGdp4buvOiBuw7MgbG8gdmnhu4djIEvDiU8gVEjhuqIgxJHhu5VpIGNo4buXLCBraMOhYyB2aeG7h2MgxJHhu5VpIGvDrWNoIHRoxrDhu5tjLlxuICBwdXNoUmVzaXplSXRlbXM6IGZhbHNlLFxuXG4gIC8vIPCflLQgVOG6r3QgdOG7sSBjdeG7mW4ga2hpIGvDqW8gdOG7m2kgc8OhdCBtw6lwLiBMaWIgdGjhuqV5IGNodeG7mXQgZ+G6p24gYmnDqm4gbMOgIGN14buZbiBsxrDhu5tpIHRoZW9cbiAgLy8gKGBzY3JvbGxTZW5zaXRpdml0eWApLCBuaMawbmcgbMaw4bubaSBjb24gbuG6sW0gdHJvbmcgY2FyZCBjw7MgYG92ZXJmbG93OiBoaWRkZW5gIOKAlCBjdeG7mW4g4bufIMSRw6J5IMSR4bqpeSBraOG7kWlcbiAgLy8gY29uIHJhIE5HT8OASSBraHVuZyBjb250YWluZXIgcuG7k2kga+G6uXQgbHXDtG4g4bufIMSRw7MuXG4gIGRpc2FibGVTY3JvbGxIb3Jpem9udGFsOiB0cnVlLFxuICBkaXNhYmxlU2Nyb2xsVmVydGljYWw6IHRydWUsXG59KTtcblxuLyoqXG4gKiBDw6J5IHLhu5duZyBkw7luZyBraGkgY2jGsGEgY8OzIGThu68gbGnhu4d1IOKAlCBt4bq3dCBwaOG6s25nIHbhur0gcmEgbeG7mXQgbMaw4bubaSB0cuG7kW5nIHRoYXkgdsOsIHbhu6EuXG4gKiBY4bqjeSByYSB0cm9uZyBuaOG7i3AgZ2nhu69hIGzDumMgY29tcG9uZW50IGThu7FuZyB2w6AgbMO6YyBgaW5pdCgpYCBjaOG6oXkuXG4gKi9cbmV4cG9ydCBjb25zdCBlbXB0eVJvb3ROb2RlID0gKCk6IFRfZ3JpZExheW91dF9ub2RlID0+ICh7IGlkOiAncm9vdCcsIHg6IDAsIHk6IDAsIGNvbHM6IDEyLCByb3dzOiAwLCBjaGlsZHJlbjogW10gfSk7XG4iXX0=