@libs-ui/components-drag-drop 0.1.1-1
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/README.md +451 -0
- package/defines/css.define.d.ts +4 -0
- package/demo/demo.component.d.ts +56 -0
- package/drag-drop.directive.d.ts +39 -0
- package/drag-drop.service.d.ts +45 -0
- package/drag-item-in-container-virtual-scroll.directive.d.ts +25 -0
- package/drag-item.directive.d.ts +30 -0
- package/drag-scroll.directive.d.ts +24 -0
- package/esm2022/defines/css.define.mjs +104 -0
- package/esm2022/demo/demo.component.mjs +833 -0
- package/esm2022/drag-drop.directive.mjs +482 -0
- package/esm2022/drag-drop.service.mjs +96 -0
- package/esm2022/drag-item-in-container-virtual-scroll.directive.mjs +134 -0
- package/esm2022/drag-item.directive.mjs +267 -0
- package/esm2022/drag-scroll.directive.mjs +144 -0
- package/esm2022/index.mjs +7 -0
- package/esm2022/interfaces/event.interface.mjs +2 -0
- package/esm2022/libs-ui-components-drag-drop.mjs +5 -0
- package/fesm2022/libs-ui-components-drag-drop.mjs +2043 -0
- package/fesm2022/libs-ui-components-drag-drop.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/interfaces/event.interface.d.ts +60 -0
- package/package.json +28 -0
|
@@ -0,0 +1,833 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component } from '@angular/core';
|
|
3
|
+
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
4
|
+
import { LibsUiComponentsDragContainerDirective } from '../drag-drop.directive';
|
|
5
|
+
import { LibsUiDragItemDirective } from '../drag-item.directive';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class LibsUiDragDropDemoComponent {
|
|
8
|
+
// Basic List Items
|
|
9
|
+
basicItems = ['Task 1', 'Task 2', 'Task 3', 'Task 4', 'Task 5'];
|
|
10
|
+
// Kanban Board Columns
|
|
11
|
+
columnsIds = ['todo', 'in-progress', 'done'];
|
|
12
|
+
columns = [
|
|
13
|
+
{
|
|
14
|
+
id: 'todo',
|
|
15
|
+
title: 'To Do',
|
|
16
|
+
items: [
|
|
17
|
+
{
|
|
18
|
+
id: 1,
|
|
19
|
+
title: 'Implement drag and drop',
|
|
20
|
+
description: 'Add drag and drop functionality to the component',
|
|
21
|
+
status: 'todo',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: 2,
|
|
25
|
+
title: 'Add animations',
|
|
26
|
+
description: 'Implement smooth animations for drag and drop',
|
|
27
|
+
status: 'todo',
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'in-progress',
|
|
33
|
+
title: 'In Progress',
|
|
34
|
+
items: [
|
|
35
|
+
{
|
|
36
|
+
id: 3,
|
|
37
|
+
title: 'Fix styling issues',
|
|
38
|
+
description: 'Resolve CSS conflicts in the component',
|
|
39
|
+
status: 'in-progress',
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'done',
|
|
45
|
+
title: 'Done',
|
|
46
|
+
items: [
|
|
47
|
+
{
|
|
48
|
+
id: 4,
|
|
49
|
+
title: 'Setup project structure',
|
|
50
|
+
description: 'Initialize the project with necessary configurations',
|
|
51
|
+
status: 'done',
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
// Nested Items
|
|
57
|
+
nestedItems = [
|
|
58
|
+
{
|
|
59
|
+
id: 1,
|
|
60
|
+
title: 'Project A',
|
|
61
|
+
subItems: ['Task 1', 'Task 2', 'Task 3'],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: 2,
|
|
65
|
+
title: 'Project B',
|
|
66
|
+
subItems: ['Task 4', 'Task 5'],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: 3,
|
|
70
|
+
title: 'Project C',
|
|
71
|
+
subItems: ['Task 6', 'Task 7', 'Task 8'],
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
// API Documentation
|
|
75
|
+
inputsDoc = [
|
|
76
|
+
{
|
|
77
|
+
name: 'items',
|
|
78
|
+
type: 'Array<unknown>',
|
|
79
|
+
default: '[]',
|
|
80
|
+
description: 'Array of items to be displayed in the container',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'mode',
|
|
84
|
+
type: "'move' | 'copy' | 'deepCopy'",
|
|
85
|
+
default: "'move'",
|
|
86
|
+
description: 'Mode for drag and drop operations',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'directionDrag',
|
|
90
|
+
type: "'horizontal' | 'vertical'",
|
|
91
|
+
default: 'undefined',
|
|
92
|
+
description: 'Direction of drag movement',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'viewEncapsulation',
|
|
96
|
+
type: "'emulated' | 'none'",
|
|
97
|
+
default: "'emulated'",
|
|
98
|
+
description: 'View encapsulation mode for styling',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'disableDragContainer',
|
|
102
|
+
type: 'boolean',
|
|
103
|
+
default: 'undefined',
|
|
104
|
+
description: 'Whether to disable drag operations for the container',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'acceptDragSameGroup',
|
|
108
|
+
type: 'boolean',
|
|
109
|
+
default: 'false',
|
|
110
|
+
description: 'Whether to accept drag operations within the same group',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'placeholder',
|
|
114
|
+
type: 'boolean',
|
|
115
|
+
default: 'true',
|
|
116
|
+
description: 'Whether to show placeholder during drag',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'groupName',
|
|
120
|
+
type: 'string',
|
|
121
|
+
default: "'groupDragAndDropDefault'",
|
|
122
|
+
description: 'Name of the group for drag and drop operations',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'dropToGroupName',
|
|
126
|
+
type: 'Array<string> | null',
|
|
127
|
+
default: 'null',
|
|
128
|
+
description: 'List of group names that can accept drops from this container',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: 'stylesOverride',
|
|
132
|
+
type: 'Array<{ className: string, styles: string }>',
|
|
133
|
+
default: 'undefined',
|
|
134
|
+
description: 'Custom styles to override default drag-drop styling',
|
|
135
|
+
},
|
|
136
|
+
];
|
|
137
|
+
outputsDoc = [
|
|
138
|
+
{
|
|
139
|
+
name: 'outDragStartContainer',
|
|
140
|
+
type: 'IDragStart',
|
|
141
|
+
description: 'Event emitted when dragging starts in the container',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'outDragOverContainer',
|
|
145
|
+
type: 'IDragOver',
|
|
146
|
+
description: 'Event emitted when dragging over the container',
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: 'outDragLeaveContainer',
|
|
150
|
+
type: 'IDragLeave',
|
|
151
|
+
description: 'Event emitted when dragging leaves the container',
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: 'outDragEndContainer',
|
|
155
|
+
type: 'IDragEnd',
|
|
156
|
+
description: 'Event emitted when dragging ends in the container',
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: 'outDroppedContainer',
|
|
160
|
+
type: 'IDrop',
|
|
161
|
+
description: 'Event emitted when an item is dropped in the container',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: 'outDroppedContainerEmpty',
|
|
165
|
+
type: 'IDrop',
|
|
166
|
+
description: 'Event emitted when an item is dropped in an empty container',
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: 'outFunctionControl',
|
|
170
|
+
type: 'IDragDropFunctionControlEvent',
|
|
171
|
+
description: 'Event emitted to control drag-drop functionality',
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
// Interface Documentation
|
|
175
|
+
interfacesDoc = [
|
|
176
|
+
{
|
|
177
|
+
name: 'IDragging',
|
|
178
|
+
code: `interface IDragging {
|
|
179
|
+
mousePosition: IMousePosition;
|
|
180
|
+
elementDrag: HTMLElement;
|
|
181
|
+
elementKeepContainer?: boolean;
|
|
182
|
+
itemDragInfo?: IItemDragInfo;
|
|
183
|
+
}`,
|
|
184
|
+
description: 'Interface for drag operation events, containing information about the dragged element and mouse position',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: 'IDragStart',
|
|
188
|
+
code: `interface IDragStart {
|
|
189
|
+
mousePosition: IMousePosition;
|
|
190
|
+
elementDrag: HTMLElement;
|
|
191
|
+
itemDragInfo?: IItemDragInfo;
|
|
192
|
+
}`,
|
|
193
|
+
description: 'Interface for drag start events, triggered when dragging begins',
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
name: 'IDragOver',
|
|
197
|
+
code: `interface IDragOver {
|
|
198
|
+
mousePosition: IMousePosition;
|
|
199
|
+
elementDrag: HTMLElement;
|
|
200
|
+
elementDragOver: HTMLElement;
|
|
201
|
+
itemDragInfo?: IItemDragInfo;
|
|
202
|
+
}`,
|
|
203
|
+
description: 'Interface for drag over events, triggered when an element is dragged over another element',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: 'IDragLeave',
|
|
207
|
+
code: `interface IDragLeave {
|
|
208
|
+
elementDrag: HTMLElement;
|
|
209
|
+
elementDragLeave: HTMLElement;
|
|
210
|
+
itemDragInfo?: IItemDragInfo;
|
|
211
|
+
}`,
|
|
212
|
+
description: 'Interface for drag leave events, triggered when a dragged element leaves another element',
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: 'IDragEnd',
|
|
216
|
+
code: `interface IDragEnd {
|
|
217
|
+
mousePosition: IMousePosition;
|
|
218
|
+
elementDrag: HTMLElement;
|
|
219
|
+
itemDragInfo?: IItemDragInfo;
|
|
220
|
+
}`,
|
|
221
|
+
description: 'Interface for drag end events, triggered when dragging ends',
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
name: 'IDrop',
|
|
225
|
+
code: `interface IDrop {
|
|
226
|
+
elementDrag: HTMLElement;
|
|
227
|
+
elementDrop: HTMLElement;
|
|
228
|
+
itemDragInfo?: IItemDragInfo;
|
|
229
|
+
}`,
|
|
230
|
+
description: 'Interface for drop events, triggered when an element is dropped',
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
name: 'IItemDragInfo',
|
|
234
|
+
code: `interface IItemDragInfo {
|
|
235
|
+
item: object;
|
|
236
|
+
itemsMove?: WritableSignal<Array<unknown>>;
|
|
237
|
+
indexDrag?: number;
|
|
238
|
+
indexDrop?: number;
|
|
239
|
+
itemsDrag: WritableSignal<Array<unknown>>;
|
|
240
|
+
itemsDrop?: WritableSignal<Array<unknown>>;
|
|
241
|
+
containerDrag?: HTMLElement;
|
|
242
|
+
containerDrop?: HTMLElement;
|
|
243
|
+
}`,
|
|
244
|
+
description: 'Interface containing information about the dragged item and its containers',
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
name: 'IDragItemInContainerVirtualScroll',
|
|
248
|
+
code: `interface IDragItemInContainerVirtualScroll {
|
|
249
|
+
itemDragInfo?: IItemDragInfo;
|
|
250
|
+
elementDrag: HTMLElement;
|
|
251
|
+
distanceStartElementAndMouseTop: number;
|
|
252
|
+
distanceStartElementAndMouseLeft: number;
|
|
253
|
+
elementContainer?: HTMLElement;
|
|
254
|
+
dragBoundary?: boolean;
|
|
255
|
+
dragBoundaryAcceptMouseLeaveContainer?: boolean;
|
|
256
|
+
ignoreStopEvent?: boolean;
|
|
257
|
+
}`,
|
|
258
|
+
description: 'Interface for virtual scrolling drag operations, containing information about drag boundaries and container elements',
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
name: 'IMousePosition',
|
|
262
|
+
code: `interface IMousePosition {
|
|
263
|
+
clientX: number;
|
|
264
|
+
clientY: number;
|
|
265
|
+
}`,
|
|
266
|
+
description: 'Interface representing mouse position coordinates',
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: 'IDragDropFunctionControlEvent',
|
|
270
|
+
code: `interface IDragDropFunctionControlEvent {
|
|
271
|
+
setAttributeElementAndItemDrag: () => Promise<void>;
|
|
272
|
+
}`,
|
|
273
|
+
description: 'Interface for drag and drop control functions',
|
|
274
|
+
},
|
|
275
|
+
];
|
|
276
|
+
// Features
|
|
277
|
+
features = [
|
|
278
|
+
{
|
|
279
|
+
id: 1,
|
|
280
|
+
icon: '🔄',
|
|
281
|
+
title: 'Flexible Drag and Drop',
|
|
282
|
+
description: 'Support for container-to-container dragging with customizable group names and drop zones',
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
id: 2,
|
|
286
|
+
icon: '📜',
|
|
287
|
+
title: 'Virtual Scrolling',
|
|
288
|
+
description: 'Efficient handling of large lists with virtual scrolling support',
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
id: 3,
|
|
292
|
+
icon: '🎯',
|
|
293
|
+
title: 'Custom Boundaries',
|
|
294
|
+
description: 'Define custom drag boundaries and drop zones for precise control',
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
id: 4,
|
|
298
|
+
icon: '🎨',
|
|
299
|
+
title: 'Styling Options',
|
|
300
|
+
description: 'Customizable styles for drag items and containers',
|
|
301
|
+
},
|
|
302
|
+
];
|
|
303
|
+
// Code Examples
|
|
304
|
+
codeExamples = [
|
|
305
|
+
{
|
|
306
|
+
id: 1,
|
|
307
|
+
title: 'Basic Usage',
|
|
308
|
+
code: `<div LibsUiComponentsDragContainerDirective
|
|
309
|
+
[(items)]="items"
|
|
310
|
+
[groupName]="'myGroup'"
|
|
311
|
+
[acceptDragSameGroup]="true">
|
|
312
|
+
@for (item of items; track item) {
|
|
313
|
+
<div LibsUiDragItemDirective>
|
|
314
|
+
{{ item }}
|
|
315
|
+
</div>
|
|
316
|
+
}
|
|
317
|
+
</div>`,
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
id: 2,
|
|
321
|
+
title: 'Container-to-Container',
|
|
322
|
+
code: `<div LibsUiComponentsDragContainerDirective
|
|
323
|
+
[(items)]="sourceItems"
|
|
324
|
+
[groupName]="'source'">
|
|
325
|
+
@for (item of sourceItems; track item) {
|
|
326
|
+
<div LibsUiDragItemDirective>
|
|
327
|
+
{{ item }}
|
|
328
|
+
</div>
|
|
329
|
+
}
|
|
330
|
+
</div>
|
|
331
|
+
|
|
332
|
+
<div LibsUiComponentsDragContainerDirective
|
|
333
|
+
[(items)]="targetItems"
|
|
334
|
+
[groupName]="'target'"
|
|
335
|
+
[dropToGroupName]="['source']">
|
|
336
|
+
@for (item of targetItems; track item) {
|
|
337
|
+
<div LibsUiDragItemDirective>
|
|
338
|
+
{{ item }}
|
|
339
|
+
</div>
|
|
340
|
+
}
|
|
341
|
+
</div>`,
|
|
342
|
+
},
|
|
343
|
+
];
|
|
344
|
+
/**
|
|
345
|
+
* Copy text to clipboard
|
|
346
|
+
*/
|
|
347
|
+
copyToClipboard(text) {
|
|
348
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
349
|
+
alert('Copied to clipboard');
|
|
350
|
+
}, (err) => {
|
|
351
|
+
console.error('Could not copy text: ', err);
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiDragDropDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
355
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiDragDropDemoComponent, isStandalone: true, selector: "lib-drag-drop-demo", ngImport: i0, template: `
|
|
356
|
+
<div class="page-container">
|
|
357
|
+
<header>
|
|
358
|
+
<h1>Demo Drag and Drop Component</h1>
|
|
359
|
+
<p>Angular component library for drag and drop functionality</p>
|
|
360
|
+
</header>
|
|
361
|
+
|
|
362
|
+
<main>
|
|
363
|
+
<section class="intro-section">
|
|
364
|
+
<h2>Introduction</h2>
|
|
365
|
+
<p>
|
|
366
|
+
<code>@libs-ui/components-drag-drop</code>
|
|
367
|
+
is a powerful Angular component that enables drag and drop functionality with features like virtual scrolling, multi-selection, and custom boundaries.
|
|
368
|
+
</p>
|
|
369
|
+
</section>
|
|
370
|
+
|
|
371
|
+
<section class="installation-section">
|
|
372
|
+
<h2>Installation</h2>
|
|
373
|
+
<p>To install the library, use npm or yarn:</p>
|
|
374
|
+
|
|
375
|
+
<div class="install-command">
|
|
376
|
+
<pre>
|
|
377
|
+
<code>npm install @libs-ui/components-drag-drop</code>
|
|
378
|
+
<libs_ui-components-buttons-button
|
|
379
|
+
[label]="'Copy'"
|
|
380
|
+
(outClick)="copyToClipboard('npm install @libs-ui/components-drag-drop')" />
|
|
381
|
+
</pre>
|
|
382
|
+
</div>
|
|
383
|
+
|
|
384
|
+
<p>Or with yarn:</p>
|
|
385
|
+
|
|
386
|
+
<div class="install-command">
|
|
387
|
+
<pre>
|
|
388
|
+
<code>yarn add @libs-ui/components-drag-drop</code>
|
|
389
|
+
<libs_ui-components-buttons-button
|
|
390
|
+
[label]="'Copy'"
|
|
391
|
+
(outClick)="copyToClipboard('yarn add @libs-ui/components-drag-drop')" />
|
|
392
|
+
</pre>
|
|
393
|
+
</div>
|
|
394
|
+
</section>
|
|
395
|
+
|
|
396
|
+
<section class="demo-section">
|
|
397
|
+
<h2>Live Demo</h2>
|
|
398
|
+
<div class="demo-container">
|
|
399
|
+
<!-- Basic List Demo -->
|
|
400
|
+
<div class="demo-example">
|
|
401
|
+
<h3>Basic List</h3>
|
|
402
|
+
<div class="list-container">
|
|
403
|
+
<div
|
|
404
|
+
LibsUiComponentsDragContainerDirective
|
|
405
|
+
[(items)]="basicItems"
|
|
406
|
+
[acceptDragSameGroup]="true">
|
|
407
|
+
@for (item of basicItems; track item) {
|
|
408
|
+
<div
|
|
409
|
+
class="list-item"
|
|
410
|
+
LibsUiDragItemDirective>
|
|
411
|
+
<span class="item-icon">📋</span>
|
|
412
|
+
<span class="item-text">{{ item }}</span>
|
|
413
|
+
</div>
|
|
414
|
+
}
|
|
415
|
+
</div>
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
|
|
419
|
+
<!-- Kanban Board Demo -->
|
|
420
|
+
<div class="demo-example">
|
|
421
|
+
<h3>Kanban Board</h3>
|
|
422
|
+
<div class="kanban-board">
|
|
423
|
+
@for (column of columns; track column) {
|
|
424
|
+
<div
|
|
425
|
+
class="kanban-column"
|
|
426
|
+
LibsUiComponentsDragContainerDirective
|
|
427
|
+
[(items)]="column.items"
|
|
428
|
+
[groupName]="column.id"
|
|
429
|
+
[dropToGroupName]="columnsIds"
|
|
430
|
+
[acceptDragSameGroup]="true">
|
|
431
|
+
<h4>{{ column.title }}</h4>
|
|
432
|
+
@for (item of column.items; track item) {
|
|
433
|
+
<div
|
|
434
|
+
class="kanban-item"
|
|
435
|
+
LibsUiDragItemDirective>
|
|
436
|
+
<div class="kanban-item-header">
|
|
437
|
+
<span class="item-title">{{ item.title }}</span>
|
|
438
|
+
<span
|
|
439
|
+
class="item-status"
|
|
440
|
+
[class]="'status-' + item.status">
|
|
441
|
+
{{ item.status }}
|
|
442
|
+
</span>
|
|
443
|
+
</div>
|
|
444
|
+
<p class="item-description">{{ item.description }}</p>
|
|
445
|
+
</div>
|
|
446
|
+
}
|
|
447
|
+
</div>
|
|
448
|
+
}
|
|
449
|
+
</div>
|
|
450
|
+
</div>
|
|
451
|
+
|
|
452
|
+
<!-- Nested Containers Demo -->
|
|
453
|
+
<div class="demo-example">
|
|
454
|
+
<h3>Nested Containers copy</h3>
|
|
455
|
+
<div class="nested-container">
|
|
456
|
+
<div
|
|
457
|
+
LibsUiComponentsDragContainerDirective
|
|
458
|
+
[(items)]="nestedItems"
|
|
459
|
+
[groupName]="'parent'"
|
|
460
|
+
[mode]="'copy'"
|
|
461
|
+
[acceptDragSameGroup]="true">
|
|
462
|
+
@for (item of nestedItems; track item) {
|
|
463
|
+
<div
|
|
464
|
+
class="nested-item"
|
|
465
|
+
LibsUiDragItemDirective>
|
|
466
|
+
<div class="nested-item-header">
|
|
467
|
+
<span class="item-title">{{ item.title }}</span>
|
|
468
|
+
</div>
|
|
469
|
+
<div class="nested-item-content">
|
|
470
|
+
<div
|
|
471
|
+
LibsUiComponentsDragContainerDirective
|
|
472
|
+
[(items)]="item.subItems"
|
|
473
|
+
[groupName]="'child'"
|
|
474
|
+
[acceptDragSameGroup]="true">
|
|
475
|
+
@for (subItem of item.subItems; track subItem) {
|
|
476
|
+
<div
|
|
477
|
+
class="sub-item"
|
|
478
|
+
LibsUiDragItemDirective>
|
|
479
|
+
{{ subItem }}
|
|
480
|
+
</div>
|
|
481
|
+
}
|
|
482
|
+
</div>
|
|
483
|
+
</div>
|
|
484
|
+
</div>
|
|
485
|
+
}
|
|
486
|
+
</div>
|
|
487
|
+
</div>
|
|
488
|
+
</div>
|
|
489
|
+
</div>
|
|
490
|
+
</section>
|
|
491
|
+
|
|
492
|
+
<section class="api-doc-section">
|
|
493
|
+
<h2>API Documentation</h2>
|
|
494
|
+
|
|
495
|
+
<h3>Inputs</h3>
|
|
496
|
+
<div class="table-container">
|
|
497
|
+
<table class="api-table">
|
|
498
|
+
<thead>
|
|
499
|
+
<tr>
|
|
500
|
+
<th>Name</th>
|
|
501
|
+
<th>Type</th>
|
|
502
|
+
<th>Default</th>
|
|
503
|
+
<th>Description</th>
|
|
504
|
+
</tr>
|
|
505
|
+
</thead>
|
|
506
|
+
<tbody>
|
|
507
|
+
@for (input of inputsDoc; track input.name) {
|
|
508
|
+
<tr>
|
|
509
|
+
<td>
|
|
510
|
+
<code>{{ input.name }}</code>
|
|
511
|
+
</td>
|
|
512
|
+
<td>
|
|
513
|
+
<code>{{ input.type }}</code>
|
|
514
|
+
</td>
|
|
515
|
+
<td>{{ input.default }}</td>
|
|
516
|
+
<td>{{ input.description }}</td>
|
|
517
|
+
</tr>
|
|
518
|
+
}
|
|
519
|
+
</tbody>
|
|
520
|
+
</table>
|
|
521
|
+
</div>
|
|
522
|
+
|
|
523
|
+
<h3>Outputs</h3>
|
|
524
|
+
<div class="table-container">
|
|
525
|
+
<table class="api-table">
|
|
526
|
+
<thead>
|
|
527
|
+
<tr>
|
|
528
|
+
<th>Name</th>
|
|
529
|
+
<th>Type</th>
|
|
530
|
+
<th>Description</th>
|
|
531
|
+
</tr>
|
|
532
|
+
</thead>
|
|
533
|
+
<tbody>
|
|
534
|
+
@for (output of outputsDoc; track output.name) {
|
|
535
|
+
<tr>
|
|
536
|
+
<td>
|
|
537
|
+
<code>{{ output.name }}</code>
|
|
538
|
+
</td>
|
|
539
|
+
<td>
|
|
540
|
+
<code>{{ output.type }}</code>
|
|
541
|
+
</td>
|
|
542
|
+
<td>{{ output.description }}</td>
|
|
543
|
+
</tr>
|
|
544
|
+
}
|
|
545
|
+
</tbody>
|
|
546
|
+
</table>
|
|
547
|
+
</div>
|
|
548
|
+
</section>
|
|
549
|
+
|
|
550
|
+
<section class="interfaces-section">
|
|
551
|
+
<h2>Interfaces</h2>
|
|
552
|
+
<div class="interface-docs">
|
|
553
|
+
@for (interfaceItem of interfacesDoc; track interfaceItem.name) {
|
|
554
|
+
<div class="interface-item">
|
|
555
|
+
<h3>{{ interfaceItem.name }}</h3>
|
|
556
|
+
<pre><code>{{interfaceItem.code}}</code></pre>
|
|
557
|
+
<p>{{ interfaceItem.description }}</p>
|
|
558
|
+
</div>
|
|
559
|
+
}
|
|
560
|
+
</div>
|
|
561
|
+
</section>
|
|
562
|
+
|
|
563
|
+
<section class="features-section">
|
|
564
|
+
<h2>Features</h2>
|
|
565
|
+
<ul>
|
|
566
|
+
@for (feature of features; track feature.id) {
|
|
567
|
+
<li>
|
|
568
|
+
<span class="feature-icon">{{ feature.icon }}</span>
|
|
569
|
+
<div class="feature-info">
|
|
570
|
+
<h3>{{ feature.title }}</h3>
|
|
571
|
+
<p>{{ feature.description }}</p>
|
|
572
|
+
</div>
|
|
573
|
+
</li>
|
|
574
|
+
}
|
|
575
|
+
</ul>
|
|
576
|
+
</section>
|
|
577
|
+
|
|
578
|
+
<section class="usage-section">
|
|
579
|
+
<h2>Usage</h2>
|
|
580
|
+
<div class="code-examples">
|
|
581
|
+
@for (example of codeExamples; track example.id) {
|
|
582
|
+
<div class="code-example">
|
|
583
|
+
<h3>{{ example.title }}</h3>
|
|
584
|
+
<pre><code [innerHTML]="example.code"></code></pre>
|
|
585
|
+
</div>
|
|
586
|
+
}
|
|
587
|
+
</div>
|
|
588
|
+
</section>
|
|
589
|
+
</main>
|
|
590
|
+
</div>
|
|
591
|
+
`, isInline: true, styles: [".page-container{max-width:1200px;margin:0 auto;padding:20px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;line-height:1.6;color:#333}header{text-align:center;padding:40px 0;background-color:#fff;border-radius:8px;margin-bottom:30px;box-shadow:0 2px 5px #0000001a}header h1{font-size:2.5rem;color:#2c3e50;margin-bottom:10px}header p{font-size:1.2rem;color:#7f8c8d}section{background-color:#fff;border-radius:8px;padding:30px;margin-bottom:30px;box-shadow:0 2px 5px #0000001a}h2{font-size:1.8rem;color:#2c3e50;margin-bottom:20px;padding-bottom:10px;border-bottom:2px solid #ecf0f1}h3{font-size:1.4rem;color:#34495e;margin-bottom:15px}h4{font-size:1.2rem;color:#34495e;margin-bottom:10px}p{margin-bottom:15px}code{font-family:Courier New,Courier,monospace;background-color:#f7f7f7;padding:2px 5px;border-radius:3px;font-size:.9em}pre{background-color:#f7f7f7;padding:15px;border-radius:5px;overflow-x:auto;margin-bottom:20px;display:flex;align-items:center;justify-content:space-between}pre code{background-color:transparent;padding:0}.installation-section .install-command{position:relative;margin-bottom:20px}.installation-section .copy-button{position:absolute;top:10px;right:10px;background:#3498db;color:#fff;border:none;border-radius:4px;padding:5px 10px;font-size:.9rem;cursor:pointer;transition:background .2s}.installation-section .copy-button:hover{background:#2980b9}.demo-container{display:grid;grid-template-columns:1fr;gap:30px}.demo-example{background:#f7f7f7;padding:20px;border-radius:8px;margin-bottom:20px}.list-container{max-width:400px;margin:20px auto}.list-item{padding:12px;margin:8px 0;background:#fff;border:1px solid #e0e0e0;border-radius:6px;display:flex;align-items:center;transition:transform .2s,box-shadow .2s}.list-item:hover{transform:translateY(-2px);box-shadow:0 4px 8px #0000001a}.item-icon{margin-right:12px;font-size:1.2em}.kanban-board{display:flex;gap:20px;padding:20px;overflow-x:auto}.kanban-column{flex:1;min-width:300px;background:#f5f5f5;padding:15px;border-radius:8px}.kanban-item{background:#fff;padding:12px;margin:8px 0;border-radius:6px;box-shadow:0 1px 3px #0000001a}.kanban-item-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.item-title{font-weight:500}.item-status{padding:4px 8px;border-radius:4px;font-size:.8em}.status-todo{background:#ffebee;color:#c62828}.status-in-progress{background:#fff3e0;color:#ef6c00}.status-done{background:#e8f5e9;color:#2e7d32}.item-description{font-size:.9em;color:#666}.nested-container{max-width:800px;margin:0 auto}.nested-item{background:#fff;border:1px solid #e0e0e0;border-radius:8px;margin:12px 0;overflow:hidden}.nested-item-header{padding:12px;background:#f5f5f5;border-bottom:1px solid #e0e0e0}.nested-item-content{padding:12px}.sub-item{padding:8px;margin:4px 0;background:#f9f9f9;border:1px solid #e0e0e0;border-radius:4px}.api-doc-section{margin-bottom:40px}.table-container{overflow-x:auto;margin-bottom:30px}.api-table{width:100%;border-collapse:collapse;margin-bottom:20px}.api-table th,.api-table td{padding:12px 15px;text-align:left;border-bottom:1px solid #e1e1e1}.api-table th{background-color:#f5f5f5;font-weight:700}.api-table tbody tr:hover{background-color:#f9f9f9}.features-section ul{list-style:none}.features-section li{display:flex;margin-bottom:25px;align-items:flex-start}.feature-icon{font-size:2rem;margin-right:20px;min-width:40px;text-align:center}.feature-info{flex:1}.code-examples{display:grid;grid-template-columns:1fr;gap:20px}@media (min-width: 768px){.code-examples{grid-template-columns:repeat(2,1fr)}}@media (min-width: 992px){.code-examples{grid-template-columns:repeat(3,1fr)}}.code-example{border:1px solid #ecf0f1;border-radius:5px;padding:15px}@media (max-width: 768px){header{padding:30px 0}header h1{font-size:2rem}section{padding:20px}.kanban-board{flex-direction:column}.kanban-column{min-width:100%}.feature-icon{font-size:1.5rem;margin-right:15px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LibsUiComponentsDragContainerDirective, selector: "[LibsUiComponentsDragContainerDirective]", inputs: ["disableDragContainer", "mode", "directionDrag", "viewEncapsulation", "acceptDragSameGroup", "placeholder", "groupName", "dropToGroupName", "items", "stylesOverride"], outputs: ["itemsChange", "outDragStartContainer", "outDragOverContainer", "outDragLeaveContainer", "outDragEndContainer", "outDroppedContainer", "outDroppedContainerEmpty", "outFunctionControl"] }, { kind: "directive", type: LibsUiDragItemDirective, selector: "[LibsUiDragItemDirective]", inputs: ["fieldId", "item", "itemInContainerVirtualScroll", "throttleTimeHandlerDraggingEvent", "ignoreStopEvent", "onlyMouseDownStopEvent", "dragRootElement", "dragBoundary", "dragBoundaryAcceptMouseLeaveContainer", "elementContainer", "zIndex", "disable"], outputs: ["outDragStart", "outDragOver", "outDragLeave", "outDragEnd", "outDropped"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }] });
|
|
592
|
+
}
|
|
593
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiDragDropDemoComponent, decorators: [{
|
|
594
|
+
type: Component,
|
|
595
|
+
args: [{ selector: 'lib-drag-drop-demo', standalone: true, imports: [CommonModule, LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective, LibsUiComponentsButtonsButtonComponent], template: `
|
|
596
|
+
<div class="page-container">
|
|
597
|
+
<header>
|
|
598
|
+
<h1>Demo Drag and Drop Component</h1>
|
|
599
|
+
<p>Angular component library for drag and drop functionality</p>
|
|
600
|
+
</header>
|
|
601
|
+
|
|
602
|
+
<main>
|
|
603
|
+
<section class="intro-section">
|
|
604
|
+
<h2>Introduction</h2>
|
|
605
|
+
<p>
|
|
606
|
+
<code>@libs-ui/components-drag-drop</code>
|
|
607
|
+
is a powerful Angular component that enables drag and drop functionality with features like virtual scrolling, multi-selection, and custom boundaries.
|
|
608
|
+
</p>
|
|
609
|
+
</section>
|
|
610
|
+
|
|
611
|
+
<section class="installation-section">
|
|
612
|
+
<h2>Installation</h2>
|
|
613
|
+
<p>To install the library, use npm or yarn:</p>
|
|
614
|
+
|
|
615
|
+
<div class="install-command">
|
|
616
|
+
<pre>
|
|
617
|
+
<code>npm install @libs-ui/components-drag-drop</code>
|
|
618
|
+
<libs_ui-components-buttons-button
|
|
619
|
+
[label]="'Copy'"
|
|
620
|
+
(outClick)="copyToClipboard('npm install @libs-ui/components-drag-drop')" />
|
|
621
|
+
</pre>
|
|
622
|
+
</div>
|
|
623
|
+
|
|
624
|
+
<p>Or with yarn:</p>
|
|
625
|
+
|
|
626
|
+
<div class="install-command">
|
|
627
|
+
<pre>
|
|
628
|
+
<code>yarn add @libs-ui/components-drag-drop</code>
|
|
629
|
+
<libs_ui-components-buttons-button
|
|
630
|
+
[label]="'Copy'"
|
|
631
|
+
(outClick)="copyToClipboard('yarn add @libs-ui/components-drag-drop')" />
|
|
632
|
+
</pre>
|
|
633
|
+
</div>
|
|
634
|
+
</section>
|
|
635
|
+
|
|
636
|
+
<section class="demo-section">
|
|
637
|
+
<h2>Live Demo</h2>
|
|
638
|
+
<div class="demo-container">
|
|
639
|
+
<!-- Basic List Demo -->
|
|
640
|
+
<div class="demo-example">
|
|
641
|
+
<h3>Basic List</h3>
|
|
642
|
+
<div class="list-container">
|
|
643
|
+
<div
|
|
644
|
+
LibsUiComponentsDragContainerDirective
|
|
645
|
+
[(items)]="basicItems"
|
|
646
|
+
[acceptDragSameGroup]="true">
|
|
647
|
+
@for (item of basicItems; track item) {
|
|
648
|
+
<div
|
|
649
|
+
class="list-item"
|
|
650
|
+
LibsUiDragItemDirective>
|
|
651
|
+
<span class="item-icon">📋</span>
|
|
652
|
+
<span class="item-text">{{ item }}</span>
|
|
653
|
+
</div>
|
|
654
|
+
}
|
|
655
|
+
</div>
|
|
656
|
+
</div>
|
|
657
|
+
</div>
|
|
658
|
+
|
|
659
|
+
<!-- Kanban Board Demo -->
|
|
660
|
+
<div class="demo-example">
|
|
661
|
+
<h3>Kanban Board</h3>
|
|
662
|
+
<div class="kanban-board">
|
|
663
|
+
@for (column of columns; track column) {
|
|
664
|
+
<div
|
|
665
|
+
class="kanban-column"
|
|
666
|
+
LibsUiComponentsDragContainerDirective
|
|
667
|
+
[(items)]="column.items"
|
|
668
|
+
[groupName]="column.id"
|
|
669
|
+
[dropToGroupName]="columnsIds"
|
|
670
|
+
[acceptDragSameGroup]="true">
|
|
671
|
+
<h4>{{ column.title }}</h4>
|
|
672
|
+
@for (item of column.items; track item) {
|
|
673
|
+
<div
|
|
674
|
+
class="kanban-item"
|
|
675
|
+
LibsUiDragItemDirective>
|
|
676
|
+
<div class="kanban-item-header">
|
|
677
|
+
<span class="item-title">{{ item.title }}</span>
|
|
678
|
+
<span
|
|
679
|
+
class="item-status"
|
|
680
|
+
[class]="'status-' + item.status">
|
|
681
|
+
{{ item.status }}
|
|
682
|
+
</span>
|
|
683
|
+
</div>
|
|
684
|
+
<p class="item-description">{{ item.description }}</p>
|
|
685
|
+
</div>
|
|
686
|
+
}
|
|
687
|
+
</div>
|
|
688
|
+
}
|
|
689
|
+
</div>
|
|
690
|
+
</div>
|
|
691
|
+
|
|
692
|
+
<!-- Nested Containers Demo -->
|
|
693
|
+
<div class="demo-example">
|
|
694
|
+
<h3>Nested Containers copy</h3>
|
|
695
|
+
<div class="nested-container">
|
|
696
|
+
<div
|
|
697
|
+
LibsUiComponentsDragContainerDirective
|
|
698
|
+
[(items)]="nestedItems"
|
|
699
|
+
[groupName]="'parent'"
|
|
700
|
+
[mode]="'copy'"
|
|
701
|
+
[acceptDragSameGroup]="true">
|
|
702
|
+
@for (item of nestedItems; track item) {
|
|
703
|
+
<div
|
|
704
|
+
class="nested-item"
|
|
705
|
+
LibsUiDragItemDirective>
|
|
706
|
+
<div class="nested-item-header">
|
|
707
|
+
<span class="item-title">{{ item.title }}</span>
|
|
708
|
+
</div>
|
|
709
|
+
<div class="nested-item-content">
|
|
710
|
+
<div
|
|
711
|
+
LibsUiComponentsDragContainerDirective
|
|
712
|
+
[(items)]="item.subItems"
|
|
713
|
+
[groupName]="'child'"
|
|
714
|
+
[acceptDragSameGroup]="true">
|
|
715
|
+
@for (subItem of item.subItems; track subItem) {
|
|
716
|
+
<div
|
|
717
|
+
class="sub-item"
|
|
718
|
+
LibsUiDragItemDirective>
|
|
719
|
+
{{ subItem }}
|
|
720
|
+
</div>
|
|
721
|
+
}
|
|
722
|
+
</div>
|
|
723
|
+
</div>
|
|
724
|
+
</div>
|
|
725
|
+
}
|
|
726
|
+
</div>
|
|
727
|
+
</div>
|
|
728
|
+
</div>
|
|
729
|
+
</div>
|
|
730
|
+
</section>
|
|
731
|
+
|
|
732
|
+
<section class="api-doc-section">
|
|
733
|
+
<h2>API Documentation</h2>
|
|
734
|
+
|
|
735
|
+
<h3>Inputs</h3>
|
|
736
|
+
<div class="table-container">
|
|
737
|
+
<table class="api-table">
|
|
738
|
+
<thead>
|
|
739
|
+
<tr>
|
|
740
|
+
<th>Name</th>
|
|
741
|
+
<th>Type</th>
|
|
742
|
+
<th>Default</th>
|
|
743
|
+
<th>Description</th>
|
|
744
|
+
</tr>
|
|
745
|
+
</thead>
|
|
746
|
+
<tbody>
|
|
747
|
+
@for (input of inputsDoc; track input.name) {
|
|
748
|
+
<tr>
|
|
749
|
+
<td>
|
|
750
|
+
<code>{{ input.name }}</code>
|
|
751
|
+
</td>
|
|
752
|
+
<td>
|
|
753
|
+
<code>{{ input.type }}</code>
|
|
754
|
+
</td>
|
|
755
|
+
<td>{{ input.default }}</td>
|
|
756
|
+
<td>{{ input.description }}</td>
|
|
757
|
+
</tr>
|
|
758
|
+
}
|
|
759
|
+
</tbody>
|
|
760
|
+
</table>
|
|
761
|
+
</div>
|
|
762
|
+
|
|
763
|
+
<h3>Outputs</h3>
|
|
764
|
+
<div class="table-container">
|
|
765
|
+
<table class="api-table">
|
|
766
|
+
<thead>
|
|
767
|
+
<tr>
|
|
768
|
+
<th>Name</th>
|
|
769
|
+
<th>Type</th>
|
|
770
|
+
<th>Description</th>
|
|
771
|
+
</tr>
|
|
772
|
+
</thead>
|
|
773
|
+
<tbody>
|
|
774
|
+
@for (output of outputsDoc; track output.name) {
|
|
775
|
+
<tr>
|
|
776
|
+
<td>
|
|
777
|
+
<code>{{ output.name }}</code>
|
|
778
|
+
</td>
|
|
779
|
+
<td>
|
|
780
|
+
<code>{{ output.type }}</code>
|
|
781
|
+
</td>
|
|
782
|
+
<td>{{ output.description }}</td>
|
|
783
|
+
</tr>
|
|
784
|
+
}
|
|
785
|
+
</tbody>
|
|
786
|
+
</table>
|
|
787
|
+
</div>
|
|
788
|
+
</section>
|
|
789
|
+
|
|
790
|
+
<section class="interfaces-section">
|
|
791
|
+
<h2>Interfaces</h2>
|
|
792
|
+
<div class="interface-docs">
|
|
793
|
+
@for (interfaceItem of interfacesDoc; track interfaceItem.name) {
|
|
794
|
+
<div class="interface-item">
|
|
795
|
+
<h3>{{ interfaceItem.name }}</h3>
|
|
796
|
+
<pre><code>{{interfaceItem.code}}</code></pre>
|
|
797
|
+
<p>{{ interfaceItem.description }}</p>
|
|
798
|
+
</div>
|
|
799
|
+
}
|
|
800
|
+
</div>
|
|
801
|
+
</section>
|
|
802
|
+
|
|
803
|
+
<section class="features-section">
|
|
804
|
+
<h2>Features</h2>
|
|
805
|
+
<ul>
|
|
806
|
+
@for (feature of features; track feature.id) {
|
|
807
|
+
<li>
|
|
808
|
+
<span class="feature-icon">{{ feature.icon }}</span>
|
|
809
|
+
<div class="feature-info">
|
|
810
|
+
<h3>{{ feature.title }}</h3>
|
|
811
|
+
<p>{{ feature.description }}</p>
|
|
812
|
+
</div>
|
|
813
|
+
</li>
|
|
814
|
+
}
|
|
815
|
+
</ul>
|
|
816
|
+
</section>
|
|
817
|
+
|
|
818
|
+
<section class="usage-section">
|
|
819
|
+
<h2>Usage</h2>
|
|
820
|
+
<div class="code-examples">
|
|
821
|
+
@for (example of codeExamples; track example.id) {
|
|
822
|
+
<div class="code-example">
|
|
823
|
+
<h3>{{ example.title }}</h3>
|
|
824
|
+
<pre><code [innerHTML]="example.code"></code></pre>
|
|
825
|
+
</div>
|
|
826
|
+
}
|
|
827
|
+
</div>
|
|
828
|
+
</section>
|
|
829
|
+
</main>
|
|
830
|
+
</div>
|
|
831
|
+
`, styles: [".page-container{max-width:1200px;margin:0 auto;padding:20px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;line-height:1.6;color:#333}header{text-align:center;padding:40px 0;background-color:#fff;border-radius:8px;margin-bottom:30px;box-shadow:0 2px 5px #0000001a}header h1{font-size:2.5rem;color:#2c3e50;margin-bottom:10px}header p{font-size:1.2rem;color:#7f8c8d}section{background-color:#fff;border-radius:8px;padding:30px;margin-bottom:30px;box-shadow:0 2px 5px #0000001a}h2{font-size:1.8rem;color:#2c3e50;margin-bottom:20px;padding-bottom:10px;border-bottom:2px solid #ecf0f1}h3{font-size:1.4rem;color:#34495e;margin-bottom:15px}h4{font-size:1.2rem;color:#34495e;margin-bottom:10px}p{margin-bottom:15px}code{font-family:Courier New,Courier,monospace;background-color:#f7f7f7;padding:2px 5px;border-radius:3px;font-size:.9em}pre{background-color:#f7f7f7;padding:15px;border-radius:5px;overflow-x:auto;margin-bottom:20px;display:flex;align-items:center;justify-content:space-between}pre code{background-color:transparent;padding:0}.installation-section .install-command{position:relative;margin-bottom:20px}.installation-section .copy-button{position:absolute;top:10px;right:10px;background:#3498db;color:#fff;border:none;border-radius:4px;padding:5px 10px;font-size:.9rem;cursor:pointer;transition:background .2s}.installation-section .copy-button:hover{background:#2980b9}.demo-container{display:grid;grid-template-columns:1fr;gap:30px}.demo-example{background:#f7f7f7;padding:20px;border-radius:8px;margin-bottom:20px}.list-container{max-width:400px;margin:20px auto}.list-item{padding:12px;margin:8px 0;background:#fff;border:1px solid #e0e0e0;border-radius:6px;display:flex;align-items:center;transition:transform .2s,box-shadow .2s}.list-item:hover{transform:translateY(-2px);box-shadow:0 4px 8px #0000001a}.item-icon{margin-right:12px;font-size:1.2em}.kanban-board{display:flex;gap:20px;padding:20px;overflow-x:auto}.kanban-column{flex:1;min-width:300px;background:#f5f5f5;padding:15px;border-radius:8px}.kanban-item{background:#fff;padding:12px;margin:8px 0;border-radius:6px;box-shadow:0 1px 3px #0000001a}.kanban-item-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.item-title{font-weight:500}.item-status{padding:4px 8px;border-radius:4px;font-size:.8em}.status-todo{background:#ffebee;color:#c62828}.status-in-progress{background:#fff3e0;color:#ef6c00}.status-done{background:#e8f5e9;color:#2e7d32}.item-description{font-size:.9em;color:#666}.nested-container{max-width:800px;margin:0 auto}.nested-item{background:#fff;border:1px solid #e0e0e0;border-radius:8px;margin:12px 0;overflow:hidden}.nested-item-header{padding:12px;background:#f5f5f5;border-bottom:1px solid #e0e0e0}.nested-item-content{padding:12px}.sub-item{padding:8px;margin:4px 0;background:#f9f9f9;border:1px solid #e0e0e0;border-radius:4px}.api-doc-section{margin-bottom:40px}.table-container{overflow-x:auto;margin-bottom:30px}.api-table{width:100%;border-collapse:collapse;margin-bottom:20px}.api-table th,.api-table td{padding:12px 15px;text-align:left;border-bottom:1px solid #e1e1e1}.api-table th{background-color:#f5f5f5;font-weight:700}.api-table tbody tr:hover{background-color:#f9f9f9}.features-section ul{list-style:none}.features-section li{display:flex;margin-bottom:25px;align-items:flex-start}.feature-icon{font-size:2rem;margin-right:20px;min-width:40px;text-align:center}.feature-info{flex:1}.code-examples{display:grid;grid-template-columns:1fr;gap:20px}@media (min-width: 768px){.code-examples{grid-template-columns:repeat(2,1fr)}}@media (min-width: 992px){.code-examples{grid-template-columns:repeat(3,1fr)}}.code-example{border:1px solid #ecf0f1;border-radius:5px;padding:15px}@media (max-width: 768px){header{padding:30px 0}header h1{font-size:2rem}section{padding:20px}.kanban-board{flex-direction:column}.kanban-column{min-width:100%}.feature-icon{font-size:1.5rem;margin-right:15px}}\n"] }]
|
|
832
|
+
}] });
|
|
833
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVtby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJhZy1kcm9wL3NyYy9kZW1vL2RlbW8uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQW9tQmpFLE1BQU0sT0FBTywyQkFBMkI7SUFDdEMsbUJBQW1CO0lBQ25CLFVBQVUsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVoRSx1QkFBdUI7SUFDdkIsVUFBVSxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3QyxPQUFPLEdBQWE7UUFDbEI7WUFDRSxFQUFFLEVBQUUsTUFBTTtZQUNWLEtBQUssRUFBRSxPQUFPO1lBQ2QsS0FBSyxFQUFFO2dCQUNMO29CQUNFLEVBQUUsRUFBRSxDQUFDO29CQUNMLEtBQUssRUFBRSx5QkFBeUI7b0JBQ2hDLFdBQVcsRUFBRSxrREFBa0Q7b0JBQy9ELE1BQU0sRUFBRSxNQUFNO2lCQUNmO2dCQUNEO29CQUNFLEVBQUUsRUFBRSxDQUFDO29CQUNMLEtBQUssRUFBRSxnQkFBZ0I7b0JBQ3ZCLFdBQVcsRUFBRSwrQ0FBK0M7b0JBQzVELE1BQU0sRUFBRSxNQUFNO2lCQUNmO2FBQ0Y7U0FDRjtRQUNEO1lBQ0UsRUFBRSxFQUFFLGFBQWE7WUFDakIsS0FBSyxFQUFF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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0T1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmUgfSBmcm9tICcuLi9kcmFnLWRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7IExpYnNVaURyYWdJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi4vZHJhZy1pdGVtLmRpcmVjdGl2ZSc7XG5cbmludGVyZmFjZSBUYXNrIHtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhdHVzOiAndG9kbycgfCAnaW4tcHJvZ3Jlc3MnIHwgJ2RvbmUnO1xufVxuXG5pbnRlcmZhY2UgQ29sdW1uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgaXRlbXM6IFRhc2tbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWRyYWctZHJvcC1kZW1vJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmUsIExpYnNVaURyYWdJdGVtRGlyZWN0aXZlLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInBhZ2UtY29udGFpbmVyXCI+XG4gICAgICA8aGVhZGVyPlxuICAgICAgICA8aDE+RGVtbyBEcmFnIGFuZCBEcm9wIENvbXBvbmVudDwvaDE+XG4gICAgICAgIDxwPkFuZ3VsYXIgY29tcG9uZW50IGxpYnJhcnkgZm9yIGRyYWcgYW5kIGRyb3AgZnVuY3Rpb25hbGl0eTwvcD5cbiAgICAgIDwvaGVhZGVyPlxuXG4gICAgICA8bWFpbj5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJpbnRyby1zZWN0aW9uXCI+XG4gICAgICAgICAgPGgyPkludHJvZHVjdGlvbjwvaDI+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8Y29kZT4mIzY0O2xpYnMtdWkvY29tcG9uZW50cy1kcmFnLWRyb3A8L2NvZGU+XG4gICAgICAgICAgICBpcyBhIHBvd2VyZnVsIEFuZ3VsYXIgY29tcG9uZW50IHRoYXQgZW5hYmxlcyBkcmFnIGFuZCBkcm9wIGZ1bmN0aW9uYWxpdHkgd2l0aCBmZWF0dXJlcyBsaWtlIHZpcnR1YWwgc2Nyb2xsaW5nLCBtdWx0aS1zZWxlY3Rpb24sIGFuZCBjdXN0b20gYm91bmRhcmllcy5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImluc3RhbGxhdGlvbi1zZWN0aW9uXCI+XG4gICAgICAgICAgPGgyPkluc3RhbGxhdGlvbjwvaDI+XG4gICAgICAgICAgPHA+VG8gaW5zdGFsbCB0aGUgbGlicmFyeSwgdXNlIG5wbSBvciB5YXJuOjwvcD5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnN0YWxsLWNvbW1hbmRcIj5cbiAgICAgICAgICAgIDxwcmU+XG4gICAgICAgICAgICAgIDxjb2RlPm5wbSBpbnN0YWxsICYjNjQ7bGlicy11aS9jb21wb25lbnRzLWRyYWctZHJvcDwvY29kZT5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ29weSdcIlxuICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJjb3B5VG9DbGlwYm9hcmQoJ25wbSBpbnN0YWxsIEBsaWJzLXVpL2NvbXBvbmVudHMtZHJhZy1kcm9wJylcIiAvPlxuICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8cD5PciB3aXRoIHlhcm46PC9wPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImluc3RhbGwtY29tbWFuZFwiPlxuICAgICAgICAgICAgPHByZT5cbiAgICAgICAgICAgICAgPGNvZGU+eWFybiBhZGQgJiM2NDtsaWJzLXVpL2NvbXBvbmVudHMtZHJhZy1kcm9wPC9jb2RlPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDb3B5J1wiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImNvcHlUb0NsaXBib2FyZCgneWFybiBhZGQgQGxpYnMtdWkvY29tcG9uZW50cy1kcmFnLWRyb3AnKVwiIC8+XG4gICAgICAgICAgICA8L3ByZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGVtby1zZWN0aW9uXCI+XG4gICAgICAgICAgPGgyPkxpdmUgRGVtbzwvaDI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRlbW8tY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8IS0tIEJhc2ljIExpc3QgRGVtbyAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZW1vLWV4YW1wbGVcIj5cbiAgICAgICAgICAgICAgPGgzPkJhc2ljIExpc3Q8L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZVxuICAgICAgICAgICAgICAgICAgWyhpdGVtcyldPVwiYmFzaWNJdGVtc1wiXG4gICAgICAgICAgICAgICAgICBbYWNjZXB0RHJhZ1NhbWVHcm91cF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGJhc2ljSXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBMaWJzVWlEcmFnSXRlbURpcmVjdGl2ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0taWNvblwiPvCfk4s8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpdGVtLXRleHRcIj57eyBpdGVtIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBLYW5iYW4gQm9hcmQgRGVtbyAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZW1vLWV4YW1wbGVcIj5cbiAgICAgICAgICAgICAgPGgzPkthbmJhbiBCb2FyZDwvaDM+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrYW5iYW4tYm9hcmRcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1uczsgdHJhY2sgY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwia2FuYmFuLWNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlXG4gICAgICAgICAgICAgICAgICAgIFsoaXRlbXMpXT1cImNvbHVtbi5pdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgIFtncm91cE5hbWVdPVwiY29sdW1uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2Ryb3BUb0dyb3VwTmFtZV09XCJjb2x1bW5zSWRzXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjY2VwdERyYWdTYW1lR3JvdXBdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aDQ+e3sgY29sdW1uLnRpdGxlIH19PC9oND5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBjb2x1bW4uaXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImthbmJhbi1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIExpYnNVaURyYWdJdGVtRGlyZWN0aXZlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImthbmJhbi1pdGVtLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tdGl0bGVcIj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1zdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCInc3RhdHVzLScgKyBpdGVtLnN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uc3RhdHVzIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJpdGVtLWRlc2NyaXB0aW9uXCI+e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIE5lc3RlZCBDb250YWluZXJzIERlbW8gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVtby1leGFtcGxlXCI+XG4gICAgICAgICAgICAgIDxoMz5OZXN0ZWQgQ29udGFpbmVycyBjb3B5PC9oMz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5lc3RlZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZVxuICAgICAgICAgICAgICAgICAgWyhpdGVtcyldPVwibmVzdGVkSXRlbXNcIlxuICAgICAgICAgICAgICAgICAgW2dyb3VwTmFtZV09XCIncGFyZW50J1wiXG4gICAgICAgICAgICAgICAgICBbbW9kZV09XCInY29weSdcIlxuICAgICAgICAgICAgICAgICAgW2FjY2VwdERyYWdTYW1lR3JvdXBdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBuZXN0ZWRJdGVtczsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuZXN0ZWQtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmU+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5lc3RlZC1pdGVtLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpdGVtLXRpdGxlXCI+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmVzdGVkLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKGl0ZW1zKV09XCJpdGVtLnN1Ykl0ZW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwTmFtZV09XCInY2hpbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdERyYWdTYW1lR3JvdXBdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChzdWJJdGVtIG9mIGl0ZW0uc3ViSXRlbXM7IHRyYWNrIHN1Ykl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN1Yi1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpYnNVaURyYWdJdGVtRGlyZWN0aXZlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3ViSXRlbSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImFwaS1kb2Mtc2VjdGlvblwiPlxuICAgICAgICAgIDxoMj5BUEkgRG9jdW1lbnRhdGlvbjwvaDI+XG5cbiAgICAgICAgICA8aDM+SW5wdXRzPC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJhcGktdGFibGVcIj5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aD5EZWZhdWx0PC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIEBmb3IgKGlucHV0IG9mIGlucHV0c0RvYzsgdHJhY2sgaW5wdXQubmFtZSkge1xuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPGNvZGU+e3sgaW5wdXQubmFtZSB9fTwvY29kZT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7IGlucHV0LnR5cGUgfX08L2NvZGU+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyBpbnB1dC5kZWZhdWx0IH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGlucHV0LmRlc2NyaXB0aW9uIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxoMz5PdXRwdXRzPC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJhcGktdGFibGVcIj5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIEBmb3IgKG91dHB1dCBvZiBvdXRwdXRzRG9jOyB0cmFjayBvdXRwdXQubmFtZSkge1xuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPGNvZGU+e3sgb3V0cHV0Lm5hbWUgfX08L2NvZGU+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT57eyBvdXRwdXQudHlwZSB9fTwvY29kZT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7IG91dHB1dC5kZXNjcmlwdGlvbiB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImludGVyZmFjZXMtc2VjdGlvblwiPlxuICAgICAgICAgIDxoMj5JbnRlcmZhY2VzPC9oMj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJmYWNlLWRvY3NcIj5cbiAgICAgICAgICAgIEBmb3IgKGludGVyZmFjZUl0ZW0gb2YgaW50ZXJmYWNlc0RvYzsgdHJhY2sgaW50ZXJmYWNlSXRlbS5uYW1lKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnRlcmZhY2UtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxoMz57eyBpbnRlcmZhY2VJdGVtLm5hbWUgfX08L2gzPlxuICAgICAgICAgICAgICAgIDxwcmU+PGNvZGU+e3tpbnRlcmZhY2VJdGVtLmNvZGV9fTwvY29kZT48L3ByZT5cbiAgICAgICAgICAgICAgICA8cD57eyBpbnRlcmZhY2VJdGVtLmRlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZmVhdHVyZXMtc2VjdGlvblwiPlxuICAgICAgICAgIDxoMj5GZWF0dXJlczwvaDI+XG4gICAgICAgICAgPHVsPlxuICAgICAgICAgICAgQGZvciAoZmVhdHVyZSBvZiBmZWF0dXJlczsgdHJhY2sgZmVhdHVyZS5pZCkge1xuICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZWF0dXJlLWljb25cIj57eyBmZWF0dXJlLmljb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlYXR1cmUtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGgzPnt7IGZlYXR1cmUudGl0bGUgfX08L2gzPlxuICAgICAgICAgICAgICAgICAgPHA+e3sgZmVhdHVyZS5kZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJ1c2FnZS1zZWN0aW9uXCI+XG4gICAgICAgICAgPGgyPlVzYWdlPC9oMj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS1leGFtcGxlc1wiPlxuICAgICAgICAgICAgQGZvciAoZXhhbXBsZSBvZiBjb2RlRXhhbXBsZXM7IHRyYWNrIGV4YW1wbGUuaWQpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvZGUtZXhhbXBsZVwiPlxuICAgICAgICAgICAgICAgIDxoMz57eyBleGFtcGxlLnRpdGxlIH19PC9oMz5cbiAgICAgICAgICAgICAgICA8cHJlPjxjb2RlIFtpbm5lckhUTUxdPVwiZXhhbXBsZS5jb2RlXCI+PC9jb2RlPjwvcHJlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9tYWluPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAucGFnZS1jb250YWluZXIge1xuICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDtcbiAgICAgICAgbWFyZ2luOiAwIGF1dG87XG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBUYWhvbWEsIEdlbmV2YSwgVmVyZGFuYSwgc2Fucy1zZXJpZjtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjtcbiAgICAgICAgY29sb3I6ICMzMzM7XG4gICAgICB9XG5cbiAgICAgIGhlYWRlciB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogNDBweCAwO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDMwcHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgICB9XG5cbiAgICAgIGhlYWRlciBoMSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMi41cmVtO1xuICAgICAgICBjb2xvcjogIzJjM2U1MDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgIH1cblxuICAgICAgaGVhZGVyIHAge1xuICAgICAgICBmb250LXNpemU6IDEuMnJlbTtcbiAgICAgICAgY29sb3I6ICM3ZjhjOGQ7XG4gICAgICB9XG5cbiAgICAgIHNlY3Rpb24ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDMwcHg7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDMwcHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgICB9XG5cbiAgICAgIGgyIHtcbiAgICAgICAgZm9udC1zaXplOiAxLjhyZW07XG4gICAgICAgIGNvbG9yOiAjMmMzZTUwO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNlY2YwZjE7XG4gICAgICB9XG5cbiAgICAgIGgzIHtcbiAgICAgICAgZm9udC1zaXplOiAxLjRyZW07XG4gICAgICAgIGNvbG9yOiAjMzQ0OTVlO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICAgICAgfVxuXG4gICAgICBoNCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMS4ycmVtO1xuICAgICAgICBjb2xvcjogIzM0NDk1ZTtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgIH1cblxuICAgICAgcCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XG4gICAgICB9XG5cbiAgICAgIGNvZGUge1xuICAgICAgICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgQ291cmllciwgbW9ub3NwYWNlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3O1xuICAgICAgICBwYWRkaW5nOiAycHggNXB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45ZW07XG4gICAgICB9XG5cbiAgICAgIHByZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7XG4gICAgICAgIHBhZGRpbmc6IDE1cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgfVxuXG4gICAgICBwcmUgY29kZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICAvKiBJbnN0YWxsYXRpb24gc2VjdGlvbiBzdHlsZXMgKi9cbiAgICAgIC5pbnN0YWxsYXRpb24tc2VjdGlvbiAuaW5zdGFsbC1jb21tYW5kIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICAgICAgfVxuXG4gICAgICAuaW5zdGFsbGF0aW9uLXNlY3Rpb24gLmNvcHktYnV0dG9uIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDEwcHg7XG4gICAgICAgIHJpZ2h0OiAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjMzQ5OGRiO1xuICAgICAgICBjb2xvcjogd2hpdGU7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBwYWRkaW5nOiA1cHggMTBweDtcbiAgICAgICAgZm9udC1zaXplOiAwLjlyZW07XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzO1xuICAgICAgfVxuXG4gICAgICAuaW5zdGFsbGF0aW9uLXNlY3Rpb24gLmNvcHktYnV0dG9uOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogIzI5ODBiOTtcbiAgICAgIH1cblxuICAgICAgLyogRGVtbyBzZWN0aW9uIHN0eWxlcyAqL1xuICAgICAgLmRlbW8tY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XG4gICAgICAgIGdhcDogMzBweDtcbiAgICAgIH1cblxuICAgICAgLmRlbW8tZXhhbXBsZSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmN2Y3Zjc7XG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICAgIH1cblxuICAgICAgLyogTGlzdCBzdHlsZXMgKi9cbiAgICAgIC5saXN0LWNvbnRhaW5lciB7XG4gICAgICAgIG1heC13aWR0aDogNDAwcHg7XG4gICAgICAgIG1hcmdpbjogMjBweCBhdXRvO1xuICAgICAgfVxuXG4gICAgICAubGlzdC1pdGVtIHtcbiAgICAgICAgcGFkZGluZzogMTJweDtcbiAgICAgICAgbWFyZ2luOiA4cHggMDtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMGUwZTA7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgdHJhbnNpdGlvbjpcbiAgICAgICAgICB0cmFuc2Zvcm0gMC4ycyxcbiAgICAgICAgICBib3gtc2hhZG93IDAuMnM7XG4gICAgICB9XG5cbiAgICAgIC5saXN0LWl0ZW06aG92ZXIge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgICB9XG5cbiAgICAgIC5pdGVtLWljb24ge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDEycHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMS4yZW07XG4gICAgICB9XG5cbiAgICAgIC8qIEthbmJhbiBzdHlsZXMgKi9cbiAgICAgIC5rYW5iYW4tYm9hcmQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDIwcHg7XG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICB9XG5cbiAgICAgIC5rYW5iYW4tY29sdW1uIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLXdpZHRoOiAzMDBweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcbiAgICAgICAgcGFkZGluZzogMTVweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgfVxuXG4gICAgICAua2FuYmFuLWl0ZW0ge1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgICAgcGFkZGluZzogMTJweDtcbiAgICAgICAgbWFyZ2luOiA4cHggMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAgICAgfVxuXG4gICAgICAua2FuYmFuLWl0ZW0taGVhZGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gICAgICB9XG5cbiAgICAgIC5pdGVtLXRpdGxlIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIH1cblxuICAgICAgLml0ZW0tc3RhdHVzIHtcbiAgICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBmb250LXNpemU6IDAuOGVtO1xuICAgICAgfVxuXG4gICAgICAuc3RhdHVzLXRvZG8ge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZlYmVlO1xuICAgICAgICBjb2xvcjogI2M2MjgyODtcbiAgICAgIH1cblxuICAgICAgLnN0YXR1cy1pbi1wcm9ncmVzcyB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmYzZTA7XG4gICAgICAgIGNvbG9yOiAjZWY2YzAwO1xuICAgICAgfVxuXG4gICAgICAuc3RhdHVzLWRvbmUge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZThmNWU5O1xuICAgICAgICBjb2xvcjogIzJlN2QzMjtcbiAgICAgIH1cblxuICAgICAgLml0ZW0tZGVzY3JpcHRpb24ge1xuICAgICAgICBmb250LXNpemU6IDAuOWVtO1xuICAgICAgICBjb2xvcjogIzY2NjtcbiAgICAgIH1cblxuICAgICAgLyogTmVzdGVkIGNvbnRhaW5lcnMgc3R5bGVzICovXG4gICAgICAubmVzdGVkLWNvbnRhaW5lciB7XG4gICAgICAgIG1heC13aWR0aDogODAwcHg7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgfVxuXG4gICAgICAubmVzdGVkLWl0ZW0ge1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UwZTBlMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBtYXJnaW46IDEycHggMDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgLm5lc3RlZC1pdGVtLWhlYWRlciB7XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTBlMGUwO1xuICAgICAgfVxuXG4gICAgICAubmVzdGVkLWl0ZW0tY29udGVudCB7XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5zdWItaXRlbSB7XG4gICAgICAgIHBhZGRpbmc6IDhweDtcbiAgICAgICAgbWFyZ2luOiA0cHggMDtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y5ZjlmOTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UwZTBlMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgfVxuXG4gICAgICAvKiBBUEkgZG9jdW1lbnRhdGlvbiBzdHlsZXMgKi9cbiAgICAgIC5hcGktZG9jLXNlY3Rpb24ge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA0MHB4O1xuICAgICAgfVxuXG4gICAgICAudGFibGUtY29udGFpbmVyIHtcbiAgICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMzBweDtcbiAgICAgIH1cblxuICAgICAgLmFwaS10YWJsZSB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICAgICAgfVxuXG4gICAgICAuYXBpLXRhYmxlIHRoLFxuICAgICAgLmFwaS10YWJsZSB0ZCB7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTVweDtcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMWUxZTE7XG4gICAgICB9XG5cbiAgICAgIC5hcGktdGFibGUgdGgge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgIH1cblxuICAgICAgLmFwaS10YWJsZSB0Ym9keSB0cjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG4gICAgICB9XG5cbiAgICAgIC8qIEZlYXR1cmVzIHNlY3Rpb24gKi9cbiAgICAgIC5mZWF0dXJlcy1zZWN0aW9uIHVsIHtcbiAgICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmZlYXR1cmVzLXNlY3Rpb24gbGkge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgIH1cblxuICAgICAgLmZlYXR1cmUtaWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMnJlbTtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4O1xuICAgICAgICBtaW4td2lkdGg6IDQwcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIH1cblxuICAgICAgLmZlYXR1cmUtaW5mbyB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIENvZGUgZXhhbXBsZXMgKi9cbiAgICAgIC5jb2RlLWV4YW1wbGVzIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XG4gICAgICAgIGdhcDogMjBweDtcbiAgICAgIH1cblxuICAgICAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gICAgICAgIC5jb2RlLWV4YW1wbGVzIHtcbiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAgICAgICAuY29kZS1leGFtcGxlcyB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuY29kZS1leGFtcGxlIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2VjZjBmMTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgICAgICBwYWRkaW5nOiAxNXB4O1xuICAgICAgfVxuXG4gICAgICAvKiBSZXNwb25zaXZlIGFkanVzdG1lbnRzICovXG4gICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgICAgICAgaGVhZGVyIHtcbiAgICAgICAgICBwYWRkaW5nOiAzMHB4IDA7XG4gICAgICAgIH1cblxuICAgICAgICBoZWFkZXIgaDEge1xuICAgICAgICAgIGZvbnQtc2l6ZTogMnJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlY3Rpb24ge1xuICAgICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgIH1cblxuICAgICAgICAua2FuYmFuLWJvYXJkIHtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG5cbiAgICAgICAgLmthbmJhbi1jb2x1bW4ge1xuICAgICAgICAgIG1pbi13aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mZWF0dXJlLWljb24ge1xuICAgICAgICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgICAgICAgIG1hcmdpbi1yaWdodDogMTVweDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaURyYWdEcm9wRGVtb0NvbXBvbmVudCB7XG4gIC8vIEJhc2ljIExpc3QgSXRlbXNcbiAgYmFzaWNJdGVtcyA9IFsnVGFzayAxJywgJ1Rhc2sgMicsICdUYXNrIDMnLCAnVGFzayA0JywgJ1Rhc2sgNSddO1xuXG4gIC8vIEthbmJhbiBCb2FyZCBDb2x1bW5zXG4gIGNvbHVtbnNJZHMgPSBbJ3RvZG8nLCAnaW4tcHJvZ3Jlc3MnLCAnZG9uZSddO1xuICBjb2x1bW5zOiBDb2x1bW5bXSA9IFtcbiAgICB7XG4gICAgICBpZDogJ3RvZG8nLFxuICAgICAgdGl0bGU6ICdUbyBEbycsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgdGl0bGU6ICdJbXBsZW1lbnQgZHJhZyBhbmQgZHJvcCcsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdBZGQgZHJhZyBhbmQgZHJvcCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBjb21wb25lbnQnLFxuICAgICAgICAgIHN0YXR1czogJ3RvZG8nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDIsXG4gICAgICAgICAgdGl0bGU6ICdBZGQgYW5pbWF0aW9ucycsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdJbXBsZW1lbnQgc21vb3RoIGFuaW1hdGlvbnMgZm9yIGRyYWcgYW5kIGRyb3AnLFxuICAgICAgICAgIHN0YXR1czogJ3RvZG8nLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnaW4tcHJvZ3Jlc3MnLFxuICAgICAgdGl0bGU6ICdJbiBQcm9ncmVzcycsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDMsXG4gICAgICAgICAgdGl0bGU6ICdGaXggc3R5bGluZyBpc3N1ZXMnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUmVzb2x2ZSBDU1MgY29uZmxpY3RzIGluIHRoZSBjb21wb25lbnQnLFxuICAgICAgICAgIHN0YXR1czogJ2luLXByb2dyZXNzJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2RvbmUnLFxuICAgICAgdGl0bGU6ICdEb25lJyxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogNCxcbiAgICAgICAgICB0aXRsZTogJ1NldHVwIHByb2plY3Qgc3RydWN0dXJlJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0luaXRpYWxpemUgdGhlIHByb2plY3Qgd2l0aCBuZWNlc3NhcnkgY29uZmlndXJhdGlvbnMnLFxuICAgICAgICAgIHN0YXR1czogJ2RvbmUnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICBdO1xuXG4gIC8vIE5lc3RlZCBJdGVtc1xuICBuZXN0ZWRJdGVtcyA9IFtcbiAgICB7XG4gICAgICBpZDogMSxcbiAgICAgIHRpdGxlOiAnUHJvamVjdCBBJyxcbiAgICAgIHN1Ykl0ZW1zOiBbJ1Rhc2sgMScsICdUYXNrIDInLCAnVGFzayAzJ10sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogMixcbiAgICAgIHRpdGxlOiAnUHJvamVjdCBCJyxcbiAgICAgIHN1Ykl0ZW1zOiBbJ1Rhc2sgNCcsICdUYXNrIDUnXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAzLFxuICAgICAgdGl0bGU6ICdQcm9qZWN0IEMnLFxuICAgICAgc3ViSXRlbXM6IFsnVGFzayA2JywgJ1Rhc2sgNycsICdUYXNrIDgnXSxcbiAgICB9LFxuICBdO1xuXG4gIC8vIEFQSSBEb2N1bWVudGF0aW9uXG4gIGlucHV0c0RvYyA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnaXRlbXMnLFxuICAgICAgdHlwZTogJ0FycmF5PHVua25vd24+JyxcbiAgICAgIGRlZmF1bHQ6ICdbXScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FycmF5IG9mIGl0ZW1zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY29udGFpbmVyJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdtb2RlJyxcbiAgICAgIHR5cGU6IFwiJ21vdmUnIHwgJ2NvcHknIHwgJ2RlZXBDb3B5J1wiLFxuICAgICAgZGVmYXVsdDogXCInbW92ZSdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiAnTW9kZSBmb3IgZHJhZyBhbmQgZHJvcCBvcGVyYXRpb25zJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdkaXJlY3Rpb25EcmFnJyxcbiAgICAgIHR5cGU6IFwiJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJ1wiLFxuICAgICAgZGVmYXVsdDogJ3VuZGVmaW5lZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0RpcmVjdGlvbiBvZiBkcmFnIG1vdmVtZW50JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICd2aWV3RW5jYXBzdWxhdGlvbicsXG4gICAgICB0eXBlOiBcIidlbXVsYXRlZCcgfCAnbm9uZSdcIixcbiAgICAgIGRlZmF1bHQ6IFwiJ2VtdWxhdGVkJ1wiLFxuICAgICAgZGVzY3JpcHRpb246ICdWaWV3IGVuY2Fwc3VsYXRpb24gbW9kZSBmb3Igc3R5bGluZycsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnZGlzYWJsZURyYWdDb250YWluZXInLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZGVmYXVsdDogJ3VuZGVmaW5lZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gZGlzYWJsZSBkcmFnIG9wZXJhdGlvbnMgZm9yIHRoZSBjb250YWluZXInLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2FjY2VwdERyYWdTYW1lR3JvdXAnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZGVmYXVsdDogJ2ZhbHNlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBhY2NlcHQgZHJhZyBvcGVyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBncm91cCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAncGxhY2Vob2xkZXInLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZGVmYXVsdDogJ3RydWUnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgcGxhY2Vob2xkZXIgZHVyaW5nIGRyYWcnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2dyb3VwTmFtZScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6IFwiJ2dyb3VwRHJhZ0FuZERyb3BEZWZhdWx0J1wiLFxuICAgICAgZGVzY3JpcHRpb246ICdOYW1lIG9mIHRoZSBncm91cCBmb3IgZHJhZyBhbmQgZHJvcCBvcGVyYXRpb25zJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdkcm9wVG9Hcm91cE5hbWUnLFxuICAgICAgdHlwZTogJ0FycmF5PHN0cmluZz4gfCBudWxsJyxcbiAgICAgIGRlZmF1bHQ6ICdudWxsJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBvZiBncm91cCBuYW1lcyB0aGF0IGNhbiBhY2NlcHQgZHJvcHMgZnJvbSB0aGlzIGNvbnRhaW5lcicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnc3R5bGVzT3ZlcnJpZGUnLFxuICAgICAgdHlwZTogJ0FycmF5PHsgY2xhc3NOYW1lOiBzdHJpbmcsIHN0eWxlczogc3RyaW5nIH0+JyxcbiAgICAgIGRlZmF1bHQ6ICd1bmRlZmluZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXN0b20gc3R5bGVzIHRvIG92ZXJyaWRlIGRlZmF1bHQgZHJhZy1kcm9wIHN0eWxpbmcnLFxuICAgIH0sXG4gIF07XG5cbiAgb3V0cHV0c0RvYyA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnb3V0RHJhZ1N0YXJ0Q29udGFpbmVyJyxcbiAgICAgIHR5cGU6ICdJRHJhZ1N0YXJ0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXZlbnQgZW1pdHRlZCB3aGVuIGRyYWdnaW5nIHN0YXJ0cyBpbiB0aGUgY29udGFpbmVyJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdvdXREcmFnT3ZlckNvbnRhaW5lcicsXG4gICAgICB0eXBlOiAnSURyYWdPdmVyJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXZlbnQgZW1pdHRlZCB3aGVuIGRyYWdnaW5nIG92ZXIgdGhlIGNvbnRhaW5lcicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnb3V0RHJhZ0xlYXZlQ29udGFpbmVyJyxcbiAgICAgIHR5cGU6ICdJRHJhZ0xlYXZlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXZlbnQgZW1pdHRlZCB3aGVuIGRyYWdnaW5nIGxlYXZlcyB0aGUgY29udGFpbmVyJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdvdXREcmFnRW5kQ29udGFpbmVyJyxcbiAgICAgIHR5cGU6ICdJRHJhZ0VuZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0V2ZW50IGVtaXR0ZWQgd2hlbiBkcmFnZ2luZyBlbmRzIGluIHRoZSBjb250YWluZXInLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ291dERyb3BwZWRDb250YWluZXInLFxuICAgICAgdHlwZTogJ0lEcm9wJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXZlbnQgZW1pdHRlZCB3aGVuIGFuIGl0ZW0gaXMgZHJvcHBlZCBpbiB0aGUgY29udGFpbmVyJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdvdXREcm9wcGVkQ29udGFpbmVyRW1wdHknLFxuICAgICAgdHlwZTogJ0lEcm9wJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXZlbnQgZW1pdHRlZCB3aGVuIGFuIGl0ZW0gaXMgZHJvcHBlZCBpbiBhbiBlbXB0eSBjb250YWluZXInLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ291dEZ1bmN0aW9uQ29udHJvbCcsXG4gICAgICB0eXBlOiAnSURyYWdEcm9wRnVuY3Rpb25Db250cm9sRXZlbnQnLFxuICAgICAgZGVzY3JpcHRpb246ICdFdmVudCBlbWl0dGVkIHRvIGNvbnRyb2wgZHJhZy1kcm9wIGZ1bmN0aW9uYWxpdHknLFxuICAgIH0sXG4gIF07XG5cbiAgLy8gSW50ZXJmYWNlIERvY3VtZW50YXRpb25cbiAgaW50ZXJmYWNlc0RvYyA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnSURyYWdnaW5nJyxcbiAgICAgIGNvZGU6IGBpbnRlcmZhY2UgSURyYWdnaW5nIHtcbiAgbW91c2VQb3NpdGlvbjogSU1vdXNlUG9zaXRpb247XG4gIGVsZW1lbnREcmFnOiBIVE1MRWxlbWVudDtcbiAgZWxlbWVudEtlZXBDb250YWluZXI/OiBib29sZWFuO1xuICBpdGVtRHJhZ0luZm8/OiBJSXRlbURyYWdJbmZvO1xufWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ludGVyZmFjZSBmb3IgZHJhZyBvcGVyYXRpb24gZXZlbnRzLCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcmFnZ2VkIGVsZW1lbnQgYW5kIG1vdXNlIHBvc2l0aW9uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJRHJhZ1N0YXJ0JyxcbiAgICAgIGNvZGU6IGBpbnRlcmZhY2UgSURyYWdTdGFydCB7XG4gIG1vdXNlUG9zaXRpb246IElNb3VzZVBvc2l0aW9uO1xuICBlbGVtZW50RHJhZzogSFRNTEVsZW1lbnQ7XG4gIGl0ZW1EcmFnSW5mbz86IElJdGVtRHJhZ0luZm87XG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJmYWNlIGZvciBkcmFnIHN0YXJ0IGV2ZW50cywgdHJpZ2dlcmVkIHdoZW4gZHJhZ2dpbmcgYmVnaW5zJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJRHJhZ092ZXInLFxuICAgICAgY29kZTogYGludGVyZmFjZSBJRHJhZ092ZXIge1xuICBtb3VzZVBvc2l0aW9uOiBJTW91c2VQb3NpdGlvbjtcbiAgZWxlbWVudERyYWc6IEhUTUxFbGVtZW50O1xuICBlbGVtZW50RHJhZ092ZXI6IEhUTUxFbGVtZW50O1xuICBpdGVtRHJhZ0luZm8/OiBJSXRlbURyYWdJbmZvO1xufWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ludGVyZmFjZSBmb3IgZHJhZyBvdmVyIGV2ZW50cywgdHJpZ2dlcmVkIHdoZW4gYW4gZWxlbWVudCBpcyBkcmFnZ2VkIG92ZXIgYW5vdGhlciBlbGVtZW50JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJRHJhZ0xlYXZlJyxcbiAgICAgIGNvZGU6IGBpbnRlcmZhY2UgSURyYWdMZWF2ZSB7XG4gIGVsZW1lbnREcmFnOiBIVE1MRWxlbWVudDtcbiAgZWxlbWVudERyYWdMZWF2ZTogSFRNTEVsZW1lbnQ7XG4gIGl0ZW1EcmFnSW5mbz86IElJdGVtRHJhZ0luZm87XG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJmYWNlIGZvciBkcmFnIGxlYXZlIGV2ZW50cywgdHJpZ2dlcmVkIHdoZW4gYSBkcmFnZ2VkIGVsZW1lbnQgbGVhdmVzIGFub3RoZXIgZWxlbWVudCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSURyYWdFbmQnLFxuICAgICAgY29kZTogYGludGVyZmFjZSBJRHJhZ0VuZCB7XG4gIG1vdXNlUG9zaXRpb246IElNb3VzZVBvc2l0aW9uO1xuICBlbGVtZW50RHJhZzogSFRNTEVsZW1lbnQ7XG4gIGl0ZW1EcmFnSW5mbz86IElJdGVtRHJhZ0luZm87XG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJmYWNlIGZvciBkcmFnIGVuZCBldmVudHMsIHRyaWdnZXJlZCB3aGVuIGRyYWdnaW5nIGVuZHMnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0lEcm9wJyxcbiAgICAgIGNvZGU6IGBpbnRlcmZhY2UgSURyb3Age1xuICBlbGVtZW50RHJhZzogSFRNTEVsZW1lbnQ7XG4gIGVsZW1lbnREcm9wOiBIVE1MRWxlbWVudDtcbiAgaXRlbURyYWdJbmZvPzogSUl0ZW1EcmFnSW5mbztcbn1gLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcmZhY2UgZm9yIGRyb3AgZXZlbnRzLCB0cmlnZ2VyZWQgd2hlbiBhbiBlbGVtZW50IGlzIGRyb3BwZWQnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0lJdGVtRHJhZ0luZm8nLFxuICAgICAgY29kZTogYGludGVyZmFjZSBJSXRlbURyYWdJbmZvIHtcbiAgaXRlbTogb2JqZWN0O1xuICBpdGVtc01vdmU/OiBXcml0YWJsZVNpZ25hbDxBcnJheTx1bmtub3duPj47XG4gIGluZGV4RHJhZz86IG51bWJlcjtcbiAgaW5kZXhEcm9wPzogbnVtYmVyO1xuICBpdGVtc0RyYWc6IFdyaXRhYmxlU2lnbmFsPEFycmF5PHVua25vd24+PjtcbiAgaXRlbXNEcm9wPzogV3JpdGFibGVTaWduYWw8QXJyYXk8dW5rbm93bj4+O1xuICBjb250YWluZXJEcmFnPzogSFRNTEVsZW1lbnQ7XG4gIGNvbnRhaW5lckRyb3A/OiBIVE1MRWxlbWVudDtcbn1gLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcmZhY2UgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJhZ2dlZCBpdGVtIGFuZCBpdHMgY29udGFpbmVycycsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSURyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsJyxcbiAgICAgIGNvZGU6IGBpbnRlcmZhY2UgSURyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsIHtcbiAgaXRlbURyYWdJbmZvPzogSUl0ZW1EcmFnSW5mbztcbiAgZWxlbWVudERyYWc6IEhUTUxFbGVtZW50O1xuICBkaXN0YW5jZVN0YXJ0RWxlbWVudEFuZE1vdXNlVG9wOiBudW1iZXI7XG4gIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VMZWZ0OiBudW1iZXI7XG4gIGVsZW1lbnRDb250YWluZXI/OiBIVE1MRWxlbWVudDtcbiAgZHJhZ0JvdW5kYXJ5PzogYm9vbGVhbjtcbiAgZHJhZ0JvdW5kYXJ5QWNjZXB0TW91c2VMZWF2ZUNvbnRhaW5lcj86IGJvb2xlYW47XG4gIGlnbm9yZVN0b3BFdmVudD86IGJvb2xlYW47XG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJmYWNlIGZvciB2aXJ0dWFsIHNjcm9sbGluZyBkcmFnIG9wZXJhdGlvbnMsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgZHJhZyBib3VuZGFyaWVzIGFuZCBjb250YWluZXIgZWxlbWVudHMnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0lNb3VzZVBvc2l0aW9uJyxcbiAgICAgIGNvZGU6IGBpbnRlcmZhY2UgSU1vdXNlUG9zaXRpb24ge1xuICBjbGllbnRYOiBudW1iZXI7XG4gIGNsaWVudFk6IG51bWJlcjtcbn1gLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcmZhY2UgcmVwcmVzZW50aW5nIG1vdXNlIHBvc2l0aW9uIGNvb3JkaW5hdGVzJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJRHJhZ0Ryb3BGdW5jdGlvbkNvbnRyb2xFdmVudCcsXG4gICAgICBjb2RlOiBgaW50ZXJmYWNlIElEcmFnRHJvcEZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ludGVyZmFjZSBmb3IgZHJhZyBhbmQgZHJvcCBjb250cm9sIGZ1bmN0aW9ucycsXG4gICAgfSxcbiAgXTtcblxuICAvLyBGZWF0dXJlc1xuICBmZWF0dXJlcyA9IFtcbiAgICB7XG4gICAgICBpZDogMSxcbiAgICAgIGljb246ICfwn5SEJyxcbiAgICAgIHRpdGxlOiAnRmxleGlibGUgRHJhZyBhbmQgRHJvcCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1N1cHBvcnQgZm9yIGNvbnRhaW5lci10by1jb250YWluZXIgZHJhZ2dpbmcgd2l0aCBjdXN0b21pemFibGUgZ3JvdXAgbmFtZXMgYW5kIGRyb3Agem9uZXMnLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IDIsXG4gICAgICBpY29uOiAn8J+TnCcsXG4gICAgICB0aXRsZTogJ1ZpcnR1YWwgU2Nyb2xsaW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRWZmaWNpZW50IGhhbmRsaW5nIG9mIGxhcmdlIGxpc3RzIHdpdGggdmlydHVhbCBzY3JvbGxpbmcgc3VwcG9ydCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogMyxcbiAgICAgIGljb246ICfwn46vJyxcbiAgICAgIHRpdGxlOiAnQ3VzdG9tIEJvdW5kYXJpZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdEZWZpbmUgY3VzdG9tIGRyYWcgYm91bmRhcmllcyBhbmQgZHJvcCB6b25lcyBmb3IgcHJlY2lzZSBjb250cm9sJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiA0LFxuICAgICAgaWNvbjogJ/CfjqgnLFxuICAgICAgdGl0bGU6ICdTdHlsaW5nIE9wdGlvbnMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXN0b21pemFibGUgc3R5bGVzIGZvciBkcmFnIGl0ZW1zIGFuZCBjb250YWluZXJzJyxcbiAgICB9LFxuICBdO1xuXG4gIC8vIENvZGUgRXhhbXBsZXNcbiAgY29kZUV4YW1wbGVzID0gW1xuICAgIHtcbiAgICAgIGlkOiAxLFxuICAgICAgdGl0bGU6ICdCYXNpYyBVc2FnZScsXG4gICAgICBjb2RlOiBgJmx0O2RpdiBMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZSBcbiAgWyhpdGVtcyldPVwiaXRlbXNcIlxuICBbZ3JvdXBOYW1lXT1cIidteUdyb3VwJ1wiXG4gIFthY2NlcHREcmFnU2FtZUdyb3VwXT1cInRydWVcIiZndDtcbiAgQGZvciAoaXRlbSBvZiBpdGVtczsgdHJhY2sgaXRlbSkge1xuICAgICZsdDtkaXYgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmUmZ3Q7XG4gICAgICB7eyBpdGVtIH19XG4gICAgJmx0Oy9kaXYmZ3Q7XG4gIH1cbiZsdDsvZGl2Jmd0O2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogMixcbiAgICAgIHRpdGxlOiAnQ29udGFpbmVyLXRvLUNvbnRhaW5lcicsXG4gICAgICBjb2RlOiBgJmx0O2RpdiBMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZSBcbiAgWyhpdGVtcyldPVwic291cmNlSXRlbXNcIlxuICBbZ3JvdXBOYW1lXT1cIidzb3VyY2UnXCImZ3Q7XG4gIEBmb3IgKGl0ZW0gb2Ygc291cmNlSXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAmbHQ7ZGl2IExpYnNVaURyYWdJdGVtRGlyZWN0aXZlJmd0O1xuICAgICAge3sgaXRlbSB9fVxuICAgICZsdDsvZGl2Jmd0O1xuICB9XG4mbHQ7L2RpdiZndDtcblxuJmx0O2RpdiBMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZSBcbiAgWyhpdGVtcyldPVwidGFyZ2V0SXRlbXNcIlxuICBbZ3JvdXBOYW1lXT1cIid0YXJnZXQnXCJcbiAgW2Ryb3BUb0dyb3VwTmFtZV09XCJbJ3NvdXJjZSddXCImZ3Q7XG4gIEBmb3IgKGl0ZW0gb2YgdGFyZ2V0SXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAmbHQ7ZGl2IExpYnNVaURyYWdJdGVtRGlyZWN0aXZlJmd0O1xuICAgICAge3sgaXRlbSB9fVxuICAgICZsdDsvZGl2Jmd0O1xuICB9XG4mbHQ7L2RpdiZndDtgLFxuICAgIH0sXG4gIF07XG5cbiAgLyoqXG4gICAqIENvcHkgdGV4dCB0byBjbGlwYm9hcmRcbiAgICovXG4gIGNvcHlUb0NsaXBib2FyZCh0ZXh0OiBzdHJpbmcpIHtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBhbGVydCgnQ29waWVkIHRvIGNsaXBib2FyZCcpO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGNvcHkgdGV4dDogJywgZXJyKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iXX0=
|