@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.
@@ -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: `&lt;div LibsUiComponentsDragContainerDirective
309
+ [(items)]="items"
310
+ [groupName]="'myGroup'"
311
+ [acceptDragSameGroup]="true"&gt;
312
+ @for (item of items; track item) {
313
+ &lt;div LibsUiDragItemDirective&gt;
314
+ {{ item }}
315
+ &lt;/div&gt;
316
+ }
317
+ &lt;/div&gt;`,
318
+ },
319
+ {
320
+ id: 2,
321
+ title: 'Container-to-Container',
322
+ code: `&lt;div LibsUiComponentsDragContainerDirective
323
+ [(items)]="sourceItems"
324
+ [groupName]="'source'"&gt;
325
+ @for (item of sourceItems; track item) {
326
+ &lt;div LibsUiDragItemDirective&gt;
327
+ {{ item }}
328
+ &lt;/div&gt;
329
+ }
330
+ &lt;/div&gt;
331
+
332
+ &lt;div LibsUiComponentsDragContainerDirective
333
+ [(items)]="targetItems"
334
+ [groupName]="'target'"
335
+ [dropToGroupName]="['source']"&gt;
336
+ @for (item of targetItems; track item) {
337
+ &lt;div LibsUiDragItemDirective&gt;
338
+ {{ item }}
339
+ &lt;/div&gt;
340
+ }
341
+ &lt;/div&gt;`,
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>&#64;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 &#64;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 &#64;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>&#64;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 &#64;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 &#64;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=