@pecb-ui/components 1.1.2 → 2.0.0

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.
Files changed (56) hide show
  1. package/README.md +556 -556
  2. package/fesm2022/pecb-ui-components.mjs +998 -1907
  3. package/fesm2022/pecb-ui-components.mjs.map +1 -1
  4. package/index.d.ts +2439 -3
  5. package/package.json +6 -8
  6. package/esm2022/lib/components/button/button.component.mjs +0 -171
  7. package/esm2022/lib/components/card/card.component.mjs +0 -182
  8. package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -126
  9. package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -349
  10. package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -329
  11. package/esm2022/lib/components/input/input.component.mjs +0 -321
  12. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -197
  13. package/esm2022/lib/components/radio/radio.component.mjs +0 -147
  14. package/esm2022/lib/components/right-modal/right-modal.component.mjs +0 -234
  15. package/esm2022/lib/components/sidebar/sidebar.component.mjs +0 -155
  16. package/esm2022/lib/components/status/status.component.mjs +0 -50
  17. package/esm2022/lib/components/tab/tab.component.mjs +0 -151
  18. package/esm2022/lib/components/table/table.component.mjs +0 -503
  19. package/esm2022/lib/components/toggle/toggle.component.mjs +0 -126
  20. package/esm2022/lib/pecb-components.module.mjs +0 -118
  21. package/esm2022/lib/services/loading.service.mjs +0 -182
  22. package/esm2022/lib/services/notification.service.mjs +0 -144
  23. package/esm2022/lib/services/theme.service.mjs +0 -232
  24. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +0 -2
  25. package/esm2022/lib/shared/types/common.types.mjs +0 -6
  26. package/esm2022/lib/shared/utils/accessibility.utils.mjs +0 -223
  27. package/esm2022/lib/shared/utils/dom.utils.mjs +0 -240
  28. package/esm2022/lib/shared/utils/error.utils.mjs +0 -277
  29. package/esm2022/lib/shared/utils/string.utils.mjs +0 -204
  30. package/esm2022/pecb-ui-components.mjs +0 -5
  31. package/esm2022/public-api.mjs +0 -53
  32. package/lib/components/button/button.component.d.ts +0 -130
  33. package/lib/components/card/card.component.d.ts +0 -140
  34. package/lib/components/checkbox/checkbox.component.d.ts +0 -74
  35. package/lib/components/datepicker/datepicker.component.d.ts +0 -155
  36. package/lib/components/dropdown/dropdown.component.d.ts +0 -144
  37. package/lib/components/input/input.component.d.ts +0 -215
  38. package/lib/components/pagination/pagination.component.d.ts +0 -53
  39. package/lib/components/radio/radio.component.d.ts +0 -93
  40. package/lib/components/right-modal/right-modal.component.d.ts +0 -137
  41. package/lib/components/sidebar/sidebar.component.d.ts +0 -97
  42. package/lib/components/status/status.component.d.ts +0 -19
  43. package/lib/components/tab/tab.component.d.ts +0 -102
  44. package/lib/components/table/table.component.d.ts +0 -403
  45. package/lib/components/toggle/toggle.component.d.ts +0 -74
  46. package/lib/pecb-components.module.d.ts +0 -37
  47. package/lib/services/loading.service.d.ts +0 -129
  48. package/lib/services/notification.service.d.ts +0 -136
  49. package/lib/services/theme.service.d.ts +0 -142
  50. package/lib/shared/interfaces/component.interfaces.d.ts +0 -283
  51. package/lib/shared/types/common.types.d.ts +0 -86
  52. package/lib/shared/utils/accessibility.utils.d.ts +0 -167
  53. package/lib/shared/utils/dom.utils.d.ts +0 -108
  54. package/lib/shared/utils/error.utils.d.ts +0 -191
  55. package/lib/shared/utils/string.utils.d.ts +0 -144
  56. package/public-api.d.ts +0 -24
@@ -1,151 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { generateUniqueId } from '../../shared/utils/dom.utils';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- /**
7
- * A professional tab component with multiple styles and sizes.
8
- * Fully accessible with WCAG 2.1 AA compliance.
9
- *
10
- * @example
11
- * ```html
12
- * <pecb-tab
13
- * label="Tab Name"
14
- * [active]="true"
15
- * style="rounded"
16
- * size="md"
17
- * (clicked)="handleClick()"
18
- * ></pecb-tab>
19
- *
20
- * <!-- With badge number and close button -->
21
- * <pecb-tab
22
- * label="Tab Name"
23
- * [icon]="10"
24
- * [closable]="true"
25
- * [active]="true"
26
- * (closed)="handleClose()"
27
- * ></pecb-tab>
28
- * ```
29
- *
30
- * @publicApi
31
- */
32
- export class TabComponent {
33
- constructor() {
34
- /**
35
- * Unique ID for the tab element
36
- */
37
- this.id = generateUniqueId('tab');
38
- /**
39
- * The visual style of the tab
40
- */
41
- this.style = 'rounded';
42
- /**
43
- * The size of the tab
44
- */
45
- this.size = 'md';
46
- /**
47
- * Label text to display
48
- */
49
- this.label = 'Tab Name';
50
- /**
51
- * Whether the tab is in active state
52
- */
53
- this.active = false;
54
- /**
55
- * Whether the tab is disabled
56
- */
57
- this.disabled = false;
58
- /**
59
- * Whether to show close button
60
- */
61
- this.closable = true;
62
- /**
63
- * Event emitted when the tab is clicked
64
- */
65
- this.clicked = new EventEmitter();
66
- /**
67
- * Event emitted when the close button is clicked
68
- */
69
- this.closed = new EventEmitter();
70
- }
71
- /**
72
- * Get CSS classes for the tab
73
- */
74
- get tabClasses() {
75
- return [
76
- 'pecb-tab',
77
- `pecb-tab--${this.style}`,
78
- `pecb-tab--${this.size}`,
79
- this.active ? 'pecb-tab--active' : '',
80
- this.disabled ? 'pecb-tab--disabled' : ''
81
- ].filter(Boolean);
82
- }
83
- /**
84
- * Handle tab click
85
- */
86
- onClick(event) {
87
- if (!this.disabled) {
88
- event.stopPropagation();
89
- this.clicked.emit(this.id);
90
- }
91
- }
92
- /**
93
- * Handle close button click
94
- */
95
- onClose(event) {
96
- if (!this.disabled) {
97
- event.stopPropagation();
98
- this.closed.emit(this.id);
99
- }
100
- }
101
- /**
102
- * Handle keyboard events for accessibility
103
- */
104
- onKeyDown(event) {
105
- if (this.disabled)
106
- return;
107
- // Handle Enter/Space for tab selection
108
- if (event.key === 'Enter' || event.key === ' ') {
109
- event.preventDefault();
110
- this.clicked.emit(this.id);
111
- }
112
- // Handle Delete/Backspace for close (if closable)
113
- if (this.closable && (event.key === 'Delete' || event.key === 'Backspace')) {
114
- event.preventDefault();
115
- this.closed.emit(this.id);
116
- }
117
- }
118
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
119
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TabComponent, isStandalone: true, selector: "pecb-tab", inputs: { id: "id", style: "style", size: "size", label: "label", icon: "icon", active: "active", disabled: "disabled", closable: "closable", ariaLabel: "ariaLabel", ariaControls: "ariaControls", ariaSelected: "ariaSelected" }, outputs: { clicked: "clicked", closed: "closed" }, ngImport: i0, template: "<div\r\n [id]=\"id\"\r\n [class]=\"tabClasses.join(' ')\"\r\n role=\"tab\"\r\n [attr.aria-label]=\"ariaLabel || label\"\r\n [attr.aria-controls]=\"ariaControls\"\r\n [attr.aria-selected]=\"ariaSelected !== undefined ? ariaSelected : active\"\r\n [attr.aria-disabled]=\"disabled\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n (click)=\"onClick($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n>\r\n <span class=\"pecb-tab__content\">\r\n <!-- Label -->\r\n <span class=\"pecb-tab__label\">{{ label }}</span>\r\n\r\n <!-- Icon/Badge -->\r\n <span *ngIf=\"icon\" class=\"pecb-tab__icon\" aria-hidden=\"true\">\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Close button -->\r\n <button\r\n *ngIf=\"closable\"\r\n type=\"button\"\r\n class=\"pecb-tab__close\"\r\n [attr.aria-label]=\"'Close ' + label\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClose($event)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </span>\r\n</div>\r\n", styles: [".pecb-tab{position:relative;display:inline-flex;align-items:center;justify-content:center;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;text-align:center;cursor:pointer;-webkit-user-select:none;user-select:none;background-color:#ececec;color:#616161;border:1px solid transparent;transition-property:background-color,border-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-tab:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-tab--sm{padding:6px 12px;font-size:12px;gap:6px;border-radius:6px}.pecb-tab--sm .pecb-tab__content{gap:6px}.pecb-tab--sm .pecb-tab__icon{width:14px;height:14px;font-size:12px}.pecb-tab--sm .pecb-tab__close{width:14px;height:14px;font-size:14px;margin-left:6px}.pecb-tab--md{padding:8px 16px;font-size:14px;gap:8px;border-radius:8px}.pecb-tab--md .pecb-tab__content{gap:8px}.pecb-tab--md .pecb-tab__icon{width:16px;height:16px;font-size:14px}.pecb-tab--md .pecb-tab__close{width:16px;height:16px;font-size:16px;margin-left:8px}.pecb-tab--rounded{border-radius:80px;background-color:#ececec;color:#616161;border-color:transparent}.pecb-tab--rounded.pecb-tab--sm{border-radius:80px}.pecb-tab--rounded:hover:not(.pecb-tab--disabled):not(.pecb-tab--active){background-color:#e4e4e4;color:#313131}.pecb-tab--rounded.pecb-tab--active{background-color:#c2c2c2;color:#212427;border-color:transparent;font-weight:500}.pecb-tab--rounded.pecb-tab--active .pecb-tab__icon{background-color:#a11e29;color:#fff}.pecb-tab--rounded.pecb-tab--active .pecb-tab__close{color:#313131}.pecb-tab--rounded.pecb-tab--disabled{background-color:#ececec;color:#919191;cursor:not-allowed}.pecb-tab--rounded.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab--rounded.pecb-tab--disabled .pecb-tab__close{color:#919191}.pecb-tab--line{border-radius:0;background-color:transparent!important;border:none;border-bottom:2px solid transparent;padding-bottom:8px;color:#616161}.pecb-tab--line.pecb-tab--sm{padding-bottom:6px;border-bottom-width:2px}.pecb-tab--line:hover:not(.pecb-tab--disabled):not(.pecb-tab--active){color:#313131;border-bottom-color:#c2c2c2;background-color:transparent!important}.pecb-tab--line.pecb-tab--active{color:#a11e29;border-bottom-color:#a11e29;font-weight:500;background-color:transparent!important}.pecb-tab--line.pecb-tab--active .pecb-tab__icon{background-color:#a11e29;color:#fff}.pecb-tab--line.pecb-tab--active .pecb-tab__close{color:#313131}.pecb-tab--line.pecb-tab--disabled{color:#919191;cursor:not-allowed;background-color:transparent!important;border-bottom-color:#c2c2c2}.pecb-tab--line.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab--line.pecb-tab--disabled .pecb-tab__close{color:#919191}.pecb-tab__content{display:inline-flex;align-items:center;justify-content:center;gap:8px}.pecb-tab__icon{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 6px;border-radius:10px;background-color:#a11e29;color:#fff;font-size:12px;font-weight:700;line-height:1;flex-shrink:0;white-space:nowrap}.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab__label{white-space:nowrap;line-height:1.2}.pecb-tab__close{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;background-color:transparent;color:#313131;cursor:pointer;border-radius:50%;font-size:16px;line-height:1;flex-shrink:0;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-tab__close:hover:not(:disabled){background-color:#3131311a;color:#313131}.pecb-tab__close:active:not(:disabled){background-color:#31313133}.pecb-tab__close:disabled{cursor:not-allowed;opacity:.5}.pecb-tab__close:focus-visible{outline:2px solid #a11e29;outline-offset:1px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
120
- }
121
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabComponent, decorators: [{
122
- type: Component,
123
- args: [{ selector: 'pecb-tab', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n [id]=\"id\"\r\n [class]=\"tabClasses.join(' ')\"\r\n role=\"tab\"\r\n [attr.aria-label]=\"ariaLabel || label\"\r\n [attr.aria-controls]=\"ariaControls\"\r\n [attr.aria-selected]=\"ariaSelected !== undefined ? ariaSelected : active\"\r\n [attr.aria-disabled]=\"disabled\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n (click)=\"onClick($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n>\r\n <span class=\"pecb-tab__content\">\r\n <!-- Label -->\r\n <span class=\"pecb-tab__label\">{{ label }}</span>\r\n\r\n <!-- Icon/Badge -->\r\n <span *ngIf=\"icon\" class=\"pecb-tab__icon\" aria-hidden=\"true\">\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Close button -->\r\n <button\r\n *ngIf=\"closable\"\r\n type=\"button\"\r\n class=\"pecb-tab__close\"\r\n [attr.aria-label]=\"'Close ' + label\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClose($event)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </span>\r\n</div>\r\n", styles: [".pecb-tab{position:relative;display:inline-flex;align-items:center;justify-content:center;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;text-align:center;cursor:pointer;-webkit-user-select:none;user-select:none;background-color:#ececec;color:#616161;border:1px solid transparent;transition-property:background-color,border-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-tab:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-tab--sm{padding:6px 12px;font-size:12px;gap:6px;border-radius:6px}.pecb-tab--sm .pecb-tab__content{gap:6px}.pecb-tab--sm .pecb-tab__icon{width:14px;height:14px;font-size:12px}.pecb-tab--sm .pecb-tab__close{width:14px;height:14px;font-size:14px;margin-left:6px}.pecb-tab--md{padding:8px 16px;font-size:14px;gap:8px;border-radius:8px}.pecb-tab--md .pecb-tab__content{gap:8px}.pecb-tab--md .pecb-tab__icon{width:16px;height:16px;font-size:14px}.pecb-tab--md .pecb-tab__close{width:16px;height:16px;font-size:16px;margin-left:8px}.pecb-tab--rounded{border-radius:80px;background-color:#ececec;color:#616161;border-color:transparent}.pecb-tab--rounded.pecb-tab--sm{border-radius:80px}.pecb-tab--rounded:hover:not(.pecb-tab--disabled):not(.pecb-tab--active){background-color:#e4e4e4;color:#313131}.pecb-tab--rounded.pecb-tab--active{background-color:#c2c2c2;color:#212427;border-color:transparent;font-weight:500}.pecb-tab--rounded.pecb-tab--active .pecb-tab__icon{background-color:#a11e29;color:#fff}.pecb-tab--rounded.pecb-tab--active .pecb-tab__close{color:#313131}.pecb-tab--rounded.pecb-tab--disabled{background-color:#ececec;color:#919191;cursor:not-allowed}.pecb-tab--rounded.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab--rounded.pecb-tab--disabled .pecb-tab__close{color:#919191}.pecb-tab--line{border-radius:0;background-color:transparent!important;border:none;border-bottom:2px solid transparent;padding-bottom:8px;color:#616161}.pecb-tab--line.pecb-tab--sm{padding-bottom:6px;border-bottom-width:2px}.pecb-tab--line:hover:not(.pecb-tab--disabled):not(.pecb-tab--active){color:#313131;border-bottom-color:#c2c2c2;background-color:transparent!important}.pecb-tab--line.pecb-tab--active{color:#a11e29;border-bottom-color:#a11e29;font-weight:500;background-color:transparent!important}.pecb-tab--line.pecb-tab--active .pecb-tab__icon{background-color:#a11e29;color:#fff}.pecb-tab--line.pecb-tab--active .pecb-tab__close{color:#313131}.pecb-tab--line.pecb-tab--disabled{color:#919191;cursor:not-allowed;background-color:transparent!important;border-bottom-color:#c2c2c2}.pecb-tab--line.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab--line.pecb-tab--disabled .pecb-tab__close{color:#919191}.pecb-tab__content{display:inline-flex;align-items:center;justify-content:center;gap:8px}.pecb-tab__icon{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 6px;border-radius:10px;background-color:#a11e29;color:#fff;font-size:12px;font-weight:700;line-height:1;flex-shrink:0;white-space:nowrap}.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab__label{white-space:nowrap;line-height:1.2}.pecb-tab__close{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;background-color:transparent;color:#313131;cursor:pointer;border-radius:50%;font-size:16px;line-height:1;flex-shrink:0;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-tab__close:hover:not(:disabled){background-color:#3131311a;color:#313131}.pecb-tab__close:active:not(:disabled){background-color:#31313133}.pecb-tab__close:disabled{cursor:not-allowed;opacity:.5}.pecb-tab__close:focus-visible{outline:2px solid #a11e29;outline-offset:1px}\n"] }]
124
- }], propDecorators: { id: [{
125
- type: Input
126
- }], style: [{
127
- type: Input
128
- }], size: [{
129
- type: Input
130
- }], label: [{
131
- type: Input
132
- }], icon: [{
133
- type: Input
134
- }], active: [{
135
- type: Input
136
- }], disabled: [{
137
- type: Input
138
- }], closable: [{
139
- type: Input
140
- }], ariaLabel: [{
141
- type: Input
142
- }], ariaControls: [{
143
- type: Input
144
- }], ariaSelected: [{
145
- type: Input
146
- }], clicked: [{
147
- type: Output
148
- }], closed: [{
149
- type: Output
150
- }] } });
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvdGFiL3RhYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7O0FBS2hFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBU0gsTUFBTSxPQUFPLFlBQVk7SUFSekI7UUFTRTs7V0FFRztRQUNNLE9BQUUsR0FBVyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5Qzs7V0FFRztRQUNNLFVBQUssR0FBYSxTQUFTLENBQUM7UUFFckM7O1dBRUc7UUFDTSxTQUFJLEdBQVksSUFBSSxDQUFDO1FBRTlCOztXQUVHO1FBQ00sVUFBSyxHQUFHLFVBQVUsQ0FBQztRQU81Qjs7V0FFRztRQUNNLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFeEI7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ00sYUFBUSxHQUFHLElBQUksQ0FBQztRQW1CekI7O1dBRUc7UUFDTyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUUvQzs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0tBcUQvQztJQW5EQzs7T0FFRztJQUNILElBQUksVUFBVTtRQUNaLE9BQU87WUFDTCxVQUFVO1lBQ1YsYUFBYSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3pCLGFBQWEsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUMxQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsS0FBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsS0FBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQUMsS0FBb0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFMUIsdUNBQXVDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMvQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzNFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7K0dBdEhVLFlBQVk7bUdBQVosWUFBWSwyVkN6Q3pCLGlnQ0FrQ0EsZzRIREVZLFlBQVk7OzRGQUtYLFlBQVk7a0JBUnhCLFNBQVM7K0JBQ0UsVUFBVSxjQUNSLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFHTix1QkFBdUIsQ0FBQyxNQUFNOzhCQU10QyxFQUFFO3NCQUFWLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLE1BQU07c0JBQWQsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csU0FBUztzQkFBakIsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0ksT0FBTztzQkFBaEIsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9kb20udXRpbHMnO1xyXG5cclxuZXhwb3J0IHR5cGUgVGFiU3R5bGUgPSAncm91bmRlZCcgfCAnbGluZSc7XHJcbmV4cG9ydCB0eXBlIFRhYlNpemUgPSAnc20nIHwgJ21kJztcclxuXHJcbi8qKlxyXG4gKiBBIHByb2Zlc3Npb25hbCB0YWIgY29tcG9uZW50IHdpdGggbXVsdGlwbGUgc3R5bGVzIGFuZCBzaXplcy5cclxuICogRnVsbHkgYWNjZXNzaWJsZSB3aXRoIFdDQUcgMi4xIEFBIGNvbXBsaWFuY2UuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPHBlY2ItdGFiXHJcbiAqICAgbGFiZWw9XCJUYWIgTmFtZVwiXHJcbiAqICAgW2FjdGl2ZV09XCJ0cnVlXCJcclxuICogICBzdHlsZT1cInJvdW5kZWRcIlxyXG4gKiAgIHNpemU9XCJtZFwiXHJcbiAqICAgKGNsaWNrZWQpPVwiaGFuZGxlQ2xpY2soKVwiXHJcbiAqID48L3BlY2ItdGFiPlxyXG4gKlxyXG4gKiA8IS0tIFdpdGggYmFkZ2UgbnVtYmVyIGFuZCBjbG9zZSBidXR0b24gLS0+XHJcbiAqIDxwZWNiLXRhYlxyXG4gKiAgIGxhYmVsPVwiVGFiIE5hbWVcIlxyXG4gKiAgIFtpY29uXT1cIjEwXCJcclxuICogICBbY2xvc2FibGVdPVwidHJ1ZVwiXHJcbiAqICAgW2FjdGl2ZV09XCJ0cnVlXCJcclxuICogICAoY2xvc2VkKT1cImhhbmRsZUNsb3NlKClcIlxyXG4gKiA+PC9wZWNiLXRhYj5cclxuICogYGBgXHJcbiAqXHJcbiAqIEBwdWJsaWNBcGlcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncGVjYi10YWInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFiLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYkNvbXBvbmVudCB7XHJcbiAgLyoqXHJcbiAgICogVW5pcXVlIElEIGZvciB0aGUgdGFiIGVsZW1lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gZ2VuZXJhdGVVbmlxdWVJZCgndGFiJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHRhYlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHN0eWxlOiBUYWJTdHlsZSA9ICdyb3VuZGVkJztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIHRhYlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNpemU6IFRhYlNpemUgPSAnbWQnO1xyXG5cclxuICAvKipcclxuICAgKiBMYWJlbCB0ZXh0IHRvIGRpc3BsYXlcclxuICAgKi9cclxuICBASW5wdXQoKSBsYWJlbCA9ICdUYWIgTmFtZSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIGJhZGdlIG51bWJlciB0byBkaXNwbGF5IGFmdGVyIHRoZSBsYWJlbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGljb24/OiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIHRhYiBpcyBpbiBhY3RpdmUgc3RhdGVcclxuICAgKi9cclxuICBASW5wdXQoKSBhY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgdGFiIGlzIGRpc2FibGVkXHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBzaG93IGNsb3NlIGJ1dHRvblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNsb3NhYmxlID0gdHJ1ZTtcclxuXHJcbiAgLy8gLS0tIEFSSUEgQWNjZXNzaWJpbGl0eSBQcm9wZXJ0aWVzIC0tLVxyXG5cclxuICAvKipcclxuICAgKiBBY2Nlc3NpYmxlIGxhYmVsIGZvciB0aGUgdGFiXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXJpYUxhYmVsPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBJRCBvZiB0aGUgdGFiIHBhbmVsIHRoaXMgdGFiIGNvbnRyb2xzXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXJpYUNvbnRyb2xzPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRhYiBwYW5lbCBpcyBzZWxlY3RlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGFyaWFTZWxlY3RlZD86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdGFiIGlzIGNsaWNrZWRcclxuICAgKi9cclxuICBAT3V0cHV0KCkgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGNsb3NlIGJ1dHRvbiBpcyBjbGlja2VkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBHZXQgQ1NTIGNsYXNzZXMgZm9yIHRoZSB0YWJcclxuICAgKi9cclxuICBnZXQgdGFiQ2xhc3NlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAncGVjYi10YWInLFxyXG4gICAgICBgcGVjYi10YWItLSR7dGhpcy5zdHlsZX1gLFxyXG4gICAgICBgcGVjYi10YWItLSR7dGhpcy5zaXplfWAsXHJcbiAgICAgIHRoaXMuYWN0aXZlID8gJ3BlY2ItdGFiLS1hY3RpdmUnIDogJycsXHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPyAncGVjYi10YWItLWRpc2FibGVkJyA6ICcnXHJcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSB0YWIgY2xpY2tcclxuICAgKi9cclxuICBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KHRoaXMuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGNsb3NlIGJ1dHRvbiBjbGlja1xyXG4gICAqL1xyXG4gIG9uQ2xvc2UoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgdGhpcy5jbG9zZWQuZW1pdCh0aGlzLmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHMgZm9yIGFjY2Vzc2liaWxpdHlcclxuICAgKi9cclxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgLy8gSGFuZGxlIEVudGVyL1NwYWNlIGZvciB0YWIgc2VsZWN0aW9uXHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KHRoaXMuaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBEZWxldGUvQmFja3NwYWNlIGZvciBjbG9zZSAoaWYgY2xvc2FibGUpXHJcbiAgICBpZiAodGhpcy5jbG9zYWJsZSAmJiAoZXZlbnQua2V5ID09PSAnRGVsZXRlJyB8fCBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmNsb3NlZC5lbWl0KHRoaXMuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2XHJcbiAgW2lkXT1cImlkXCJcclxuICBbY2xhc3NdPVwidGFiQ2xhc3Nlcy5qb2luKCcgJylcIlxyXG4gIHJvbGU9XCJ0YWJcIlxyXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsIHx8IGxhYmVsXCJcclxuICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImFyaWFDb250cm9sc1wiXHJcbiAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJhcmlhU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCA/IGFyaWFTZWxlY3RlZCA6IGFjdGl2ZVwiXHJcbiAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQgPyAtMSA6IDBcIlxyXG4gIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIlxyXG4gIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcclxuPlxyXG4gIDxzcGFuIGNsYXNzPVwicGVjYi10YWJfX2NvbnRlbnRcIj5cclxuICAgIDwhLS0gTGFiZWwgLS0+XHJcbiAgICA8c3BhbiBjbGFzcz1cInBlY2ItdGFiX19sYWJlbFwiPnt7IGxhYmVsIH19PC9zcGFuPlxyXG5cclxuICAgIDwhLS0gSWNvbi9CYWRnZSAtLT5cclxuICAgIDxzcGFuICpuZ0lmPVwiaWNvblwiIGNsYXNzPVwicGVjYi10YWJfX2ljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAge3sgaWNvbiB9fVxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDwhLS0gQ2xvc2UgYnV0dG9uIC0tPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cImNsb3NhYmxlXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNsYXNzPVwicGVjYi10YWJfX2Nsb3NlXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ2xvc2UgJyArIGxhYmVsXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L3NwYW4+XHJcbjwvZGl2PlxyXG4iXX0=