keevo-components 2.0.288 → 2.0.291
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/kv-avatar/kv-avatar.component.mjs +2 -2
- package/esm2022/lib/components/kv-button/kv-button.component.mjs +3 -3
- package/esm2022/lib/components/kv-buttons/kv-button-popup/kv-button-popup.component.mjs +2 -2
- package/esm2022/lib/components/kv-chart/kv-chart.component.mjs +2 -2
- package/esm2022/lib/components/kv-icon/kv-icon.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-check/kv-check.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-dropdown/kv-dropdown.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-editor/kv-editor.component.mjs +64 -5
- package/esm2022/lib/components/kv-inputs/kv-editor/services/kv-editor-quill.service.mjs +64 -24
- package/esm2022/lib/components/kv-inputs/kv-input-calendar/kv-input-calendar.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-input-mask/kv-input-mask.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-input-number/kv-input-number.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-input-number-addon/kv-input-number-addon.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-input-password/kv-input-password.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-input-text/kv-input-text.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-input-text-addon/kv-input-text-addon.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-input-text-checkbox/kv-input-text-checkbox.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-input-textarea/kv-input-textarea.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-input-time/kv-input-time.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-inputs.module.mjs +8 -4
- package/esm2022/lib/components/kv-inputs/kv-multi-select/kv-multi-select.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-radio-group/kv-radio-group.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-switch/kv-switch.component.mjs +2 -2
- package/esm2022/lib/components/kv-inputs/kv-tree-multi-select/kv-tree-multi-select.component.mjs +2 -2
- package/esm2022/lib/components/kv-instruction-page/kv-instruction-page.component.mjs +57 -11
- package/esm2022/lib/components/kv-layout/layout/kv-layout.component.mjs +2 -2
- package/esm2022/lib/components/kv-page-stepper/kv-page-stepper.component.mjs +2 -2
- package/esm2022/lib/components/kv-pick-list/kv-pick-list.component.mjs +2 -2
- package/esm2022/lib/components/kv-stepper/kv-stepper.component.mjs +2 -2
- package/esm2022/lib/components/kv-table/kv-table.component.mjs +2 -2
- package/esm2022/lib/components/kv-widget-card/kv-widget-card.component.mjs +3 -3
- package/fesm2022/keevo-components.mjs +239 -90
- package/fesm2022/keevo-components.mjs.map +1 -1
- package/lib/components/kv-inputs/kv-editor/kv-editor.component.d.ts +4 -1
- package/lib/components/kv-inputs/kv-editor/services/kv-editor-quill.service.d.ts +1 -0
- package/lib/components/kv-inputs/kv-inputs.module.d.ts +2 -1
- package/lib/components/kv-instruction-page/kv-instruction-page.component.d.ts +13 -4
- package/package.json +1 -1
- package/src/lib/components/keevo-components-styles.scss +3 -0
|
@@ -1,29 +1,75 @@
|
|
|
1
|
-
import { Component, computed, input } from '@angular/core';
|
|
1
|
+
import { Component, computed, input, HostListener, signal, ChangeDetectionStrategy } from '@angular/core';
|
|
2
2
|
import { KvButtonModule } from '../kv-button/kv-button.module';
|
|
3
3
|
import { DividerModule } from 'primeng/divider';
|
|
4
4
|
import { KvCardsInstructionComponent } from './components/cards-instruction/kv-cards-instruction.component';
|
|
5
|
-
import { SidebarModule } from 'primeng/sidebar';
|
|
6
5
|
import * as i0 from "@angular/core";
|
|
7
6
|
import * as i1 from "../kv-button/kv-button.component";
|
|
8
|
-
import * as i2 from "primeng/sidebar";
|
|
9
7
|
export class KvInstructionPageComponent {
|
|
10
8
|
constructor() {
|
|
11
9
|
this.actions = input([]);
|
|
12
10
|
this.camposObrigatorios = input(false);
|
|
11
|
+
// Define se o painel inicia aberto (true) ou fechado (false). Por padrão é true no desktop.
|
|
12
|
+
this.startExpanded = input(true);
|
|
13
13
|
this.whiteCard = input(undefined);
|
|
14
14
|
this.blackCard = input();
|
|
15
|
-
this.
|
|
15
|
+
this.isMobile = signal(false);
|
|
16
|
+
this.userToggledPanel = signal(null);
|
|
17
|
+
this.isPanelExpanded = computed(() => {
|
|
18
|
+
// 1. Respeita a interação manual do usuário primeiro
|
|
19
|
+
const toggled = this.userToggledPanel();
|
|
20
|
+
if (toggled !== null)
|
|
21
|
+
return toggled;
|
|
22
|
+
// 2. Se for mobile, inicia sempre fechado como padrão por UX
|
|
23
|
+
if (this.isMobile())
|
|
24
|
+
return false;
|
|
25
|
+
// 3. Respeita a propriedade (true ou false) definida pelo desenvolvedor na tela via @Input
|
|
26
|
+
return this.startExpanded();
|
|
27
|
+
});
|
|
28
|
+
this.mainContentWidth = computed(() => {
|
|
29
|
+
if (!this.whiteCard() && !this.blackCard())
|
|
30
|
+
return '100%';
|
|
31
|
+
const expanded = this.isPanelExpanded();
|
|
32
|
+
const mobile = this.isMobile();
|
|
33
|
+
if (mobile)
|
|
34
|
+
return expanded ? '0%' : '100%';
|
|
35
|
+
return expanded ? 'calc(75% - 0.25rem)' : '100%';
|
|
36
|
+
});
|
|
37
|
+
this.panelWidth = computed(() => {
|
|
16
38
|
if (!this.whiteCard() && !this.blackCard())
|
|
17
|
-
return '
|
|
18
|
-
|
|
39
|
+
return '0%';
|
|
40
|
+
const expanded = this.isPanelExpanded();
|
|
41
|
+
const mobile = this.isMobile();
|
|
42
|
+
if (mobile)
|
|
43
|
+
return expanded ? '100%' : '0%';
|
|
44
|
+
return expanded ? 'calc(25% - 0.25rem)' : '0%';
|
|
19
45
|
});
|
|
20
|
-
|
|
46
|
+
}
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
this.checkMobileState();
|
|
49
|
+
}
|
|
50
|
+
onResize() {
|
|
51
|
+
this.checkMobileState();
|
|
52
|
+
}
|
|
53
|
+
checkMobileState() {
|
|
54
|
+
if (typeof window !== 'undefined') {
|
|
55
|
+
const isMob = window.innerWidth < 1024;
|
|
56
|
+
// Atualiza o sinal apenas se houver mudança real, economiza ciclos do Change Detection
|
|
57
|
+
if (this.isMobile() !== isMob) {
|
|
58
|
+
this.isMobile.set(isMob);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
togglePanel() {
|
|
63
|
+
this.userToggledPanel.set(!this.isPanelExpanded());
|
|
21
64
|
}
|
|
22
65
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvInstructionPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvInstructionPageComponent, isStandalone: true, selector: "kv-instruction-page", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, camposObrigatorios: { classPropertyName: "camposObrigatorios", publicName: "camposObrigatorios", isSignal: true, isRequired: false, transformFunction: null }, whiteCard: { classPropertyName: "whiteCard", publicName: "whiteCard", isSignal: true, isRequired: false, transformFunction: null }, blackCard: { classPropertyName: "blackCard", publicName: "blackCard", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"h-full flex flex-column overflow-hidden\">\r\n <div class=\"flex-1 min-h-0 flex flex-row p-2
|
|
66
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvInstructionPageComponent, isStandalone: true, selector: "kv-instruction-page", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, camposObrigatorios: { classPropertyName: "camposObrigatorios", publicName: "camposObrigatorios", isSignal: true, isRequired: false, transformFunction: null }, startExpanded: { classPropertyName: "startExpanded", publicName: "startExpanded", isSignal: true, isRequired: false, transformFunction: null }, whiteCard: { classPropertyName: "whiteCard", publicName: "whiteCard", isSignal: true, isRequired: false, transformFunction: null }, blackCard: { classPropertyName: "blackCard", publicName: "blackCard", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<div class=\"h-full flex flex-column overflow-hidden relative\">\r\n <div class=\"flex-1 min-h-0 flex flex-row p-2 justify-content-between relative overflow-hidden\">\r\n <!-- Main Content Container -->\r\n <div class=\"h-full max-h-full transition-all duration-300 ease-in-out overflow-y-auto flex-shrink-0\"\r\n [style.width]=\"mainContentWidth()\" [class.opacity-0]=\"isMobile() && isPanelExpanded()\">\r\n <ng-content select=\"[main-content]\"></ng-content>\r\n </div>\r\n\r\n <!-- Instruction Page Panel (Side) -->\r\n <div class=\"h-full transition-all duration-300 ease-in-out flex-shrink-0 overflow-y-auto\"\r\n [style.width]=\"panelWidth()\" [class.opacity-0]=\"!isPanelExpanded()\">\r\n <kv-cards-instruction [whiteCard]=\"whiteCard()\" [blackCard]=\"blackCard()\" class=\"block w-full h-full\">\r\n <div white-card-content class=\"h-full\">\r\n <ng-content select=\"[white-card-content]\"></ng-content>\r\n </div>\r\n <div black-card-content class=\"h-full\">\r\n <ng-content select=\"[black-card-content]\"></ng-content>\r\n </div>\r\n </kv-cards-instruction>\r\n </div>\r\n\r\n <!-- Floating Toggle Button -->\r\n @if (whiteCard() || blackCard()) {\r\n <kv-button [severity]=\"'secondary'\" [size]=\"'large'\" [type]=\"isPanelExpanded() ? 'text' : undefined\"\r\n [icon]=\"isPanelExpanded() ? 'close' : 'quick_reference'\"\r\n class=\"absolute z-50 transition-all duration-300 ease-in-out bg-white inline-flex border-round\"\r\n [style.top]=\"'1rem'\" [style.right]=\"'1rem'\" (onClick)=\"togglePanel()\">\r\n </kv-button>\r\n }\r\n </div>\r\n\r\n @if (actions().length > 0) {\r\n <div class=\"flex-initial flex-none flex flex-row justify-content-{{\r\n camposObrigatorios() ? 'between' : 'end'\r\n }} align-items-center p-2\">\r\n @if (camposObrigatorios()) {\r\n <span class=\"text-xs text-red-500 font-semibold\">* Preenchimento obrigat\u00F3rio</span>\r\n }\r\n\r\n <div class=\"flex flex-row justify-content-end gap-2\">\r\n @for (action of actions().slice().reverse(); track action.index) {\r\n <kv-button [label]=\"action.label || ''\" [severity]=\"action.severity || 'tertiary'\"\r\n [disabled]=\"action.disabled || false\" [type]=\"action.type\" [size]=\"action.size || 'small'\"\r\n [icon]=\"action.icon || ''\" [iconPosition]=\"action.iconPosition || 'left'\" [items]=\"action.items || []\"\r\n [popup]=\"action.popup || false\" [popupIcon]=\"action.popupIcon || false\" [fullWidth]=\"action.fullWidth || false\"\r\n (onClick)=\"action?.command($event)\"></kv-button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: KvButtonModule }, { kind: "component", type: i1.KvButtonComponent, selector: "kv-button", inputs: ["fullWidth", "type", "loading", "severity", "size", "icon", "iconPosition", "label", "disabled", "items", "popup", "popupIcon"], outputs: ["iconChange", "onClick"] }, { kind: "ngmodule", type: DividerModule }, { kind: "component", type: KvCardsInstructionComponent, selector: "kv-cards-instruction", inputs: ["whiteCard", "blackCard"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
24
67
|
}
|
|
25
68
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvInstructionPageComponent, decorators: [{
|
|
26
69
|
type: Component,
|
|
27
|
-
args: [{ selector: 'kv-instruction-page', standalone: true, imports: [KvButtonModule, DividerModule, KvCardsInstructionComponent,
|
|
28
|
-
}]
|
|
29
|
-
|
|
70
|
+
args: [{ selector: 'kv-instruction-page', standalone: true, imports: [KvButtonModule, DividerModule, KvCardsInstructionComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"h-full flex flex-column overflow-hidden relative\">\r\n <div class=\"flex-1 min-h-0 flex flex-row p-2 justify-content-between relative overflow-hidden\">\r\n <!-- Main Content Container -->\r\n <div class=\"h-full max-h-full transition-all duration-300 ease-in-out overflow-y-auto flex-shrink-0\"\r\n [style.width]=\"mainContentWidth()\" [class.opacity-0]=\"isMobile() && isPanelExpanded()\">\r\n <ng-content select=\"[main-content]\"></ng-content>\r\n </div>\r\n\r\n <!-- Instruction Page Panel (Side) -->\r\n <div class=\"h-full transition-all duration-300 ease-in-out flex-shrink-0 overflow-y-auto\"\r\n [style.width]=\"panelWidth()\" [class.opacity-0]=\"!isPanelExpanded()\">\r\n <kv-cards-instruction [whiteCard]=\"whiteCard()\" [blackCard]=\"blackCard()\" class=\"block w-full h-full\">\r\n <div white-card-content class=\"h-full\">\r\n <ng-content select=\"[white-card-content]\"></ng-content>\r\n </div>\r\n <div black-card-content class=\"h-full\">\r\n <ng-content select=\"[black-card-content]\"></ng-content>\r\n </div>\r\n </kv-cards-instruction>\r\n </div>\r\n\r\n <!-- Floating Toggle Button -->\r\n @if (whiteCard() || blackCard()) {\r\n <kv-button [severity]=\"'secondary'\" [size]=\"'large'\" [type]=\"isPanelExpanded() ? 'text' : undefined\"\r\n [icon]=\"isPanelExpanded() ? 'close' : 'quick_reference'\"\r\n class=\"absolute z-50 transition-all duration-300 ease-in-out bg-white inline-flex border-round\"\r\n [style.top]=\"'1rem'\" [style.right]=\"'1rem'\" (onClick)=\"togglePanel()\">\r\n </kv-button>\r\n }\r\n </div>\r\n\r\n @if (actions().length > 0) {\r\n <div class=\"flex-initial flex-none flex flex-row justify-content-{{\r\n camposObrigatorios() ? 'between' : 'end'\r\n }} align-items-center p-2\">\r\n @if (camposObrigatorios()) {\r\n <span class=\"text-xs text-red-500 font-semibold\">* Preenchimento obrigat\u00F3rio</span>\r\n }\r\n\r\n <div class=\"flex flex-row justify-content-end gap-2\">\r\n @for (action of actions().slice().reverse(); track action.index) {\r\n <kv-button [label]=\"action.label || ''\" [severity]=\"action.severity || 'tertiary'\"\r\n [disabled]=\"action.disabled || false\" [type]=\"action.type\" [size]=\"action.size || 'small'\"\r\n [icon]=\"action.icon || ''\" [iconPosition]=\"action.iconPosition || 'left'\" [items]=\"action.items || []\"\r\n [popup]=\"action.popup || false\" [popupIcon]=\"action.popupIcon || false\" [fullWidth]=\"action.fullWidth || false\"\r\n (onClick)=\"action?.command($event)\"></kv-button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</div>" }]
|
|
71
|
+
}], propDecorators: { onResize: [{
|
|
72
|
+
type: HostListener,
|
|
73
|
+
args: ['window:resize']
|
|
74
|
+
}] } });
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtaW5zdHJ1Y3Rpb24tcGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9rdi1pbnN0cnVjdGlvbi1wYWdlL2t2LWluc3RydWN0aW9uLXBhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtaW5zdHJ1Y3Rpb24tcGFnZS9rdi1pbnN0cnVjdGlvbi1wYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0RBQStELENBQUM7OztBQVU1RyxNQUFNLE9BQU8sMEJBQTBCO0lBUnZDO1FBVUUsWUFBTyxHQUFHLEtBQUssQ0FBZ0IsRUFBRSxDQUFDLENBQUM7UUFDbkMsdUJBQWtCLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRTNDLDRGQUE0RjtRQUM1RixrQkFBYSxHQUFHLEtBQUssQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUVyQyxjQUFTLEdBQUcsS0FBSyxDQUlGLFNBQVMsQ0FBQyxDQUFDO1FBRTFCLGNBQVMsR0FBRyxLQUFLLEVBSUQsQ0FBQztRQUVqQixhQUFRLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzFCLHFCQUFnQixHQUFHLE1BQU0sQ0FBaUIsSUFBSSxDQUFDLENBQUM7UUFxQnhELG9CQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUM5QixxREFBcUQ7WUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEMsSUFBSSxPQUFPLEtBQUssSUFBSTtnQkFBRSxPQUFPLE9BQU8sQ0FBQztZQUVyQyw2REFBNkQ7WUFDN0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBRWxDLDJGQUEyRjtZQUMzRixPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQU1ILHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQUUsT0FBTyxNQUFNLENBQUM7WUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixJQUFJLE1BQU07Z0JBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQzVDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDeEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixJQUFJLE1BQU07Z0JBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzVDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0tBRUo7SUFuREMsUUFBUTtRQUNOLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFHRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLGdCQUFnQjtRQUNyQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZDLHVGQUF1RjtZQUN2RixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsQ0FBQztRQUNKLENBQUM7SUFDSixDQUFDO0lBY0QsV0FBVztRQUNULElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDOzhHQXhEVSwwQkFBMEI7a0dBQTFCLDBCQUEwQix3MEJDZHZDLDRxRkFrRE0seUREekNNLGNBQWMsc1JBQUUsYUFBYSwrQkFBRSwyQkFBMkI7OzJGQUt6RCwwQkFBMEI7a0JBUnRDLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUCxDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsMkJBQTJCLENBQUMsbUJBR3BELHVCQUF1QixDQUFDLE1BQU07OEJBOEIvQyxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBIb3N0TGlzdGVuZXIsIHNpZ25hbCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBLdkJ1dHRvbk1vZHVsZSB9IGZyb20gJy4uL2t2LWJ1dHRvbi9rdi1idXR0b24ubW9kdWxlJztcclxuaW1wb3J0IHsgQnV0dG9uTW9kZWwgfSBmcm9tICcuLi8uLi9hcGkvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLm1vZGVsJztcclxuaW1wb3J0IHsgRGl2aWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGl2aWRlcic7XHJcbmltcG9ydCB7IEt2Q2FyZHNJbnN0cnVjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jYXJkcy1pbnN0cnVjdGlvbi9rdi1jYXJkcy1pbnN0cnVjdGlvbi5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdrdi1pbnN0cnVjdGlvbi1wYWdlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtLdkJ1dHRvbk1vZHVsZSwgRGl2aWRlck1vZHVsZSwgS3ZDYXJkc0luc3RydWN0aW9uQ29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4va3YtaW5zdHJ1Y3Rpb24tcGFnZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2t2LWluc3RydWN0aW9uLXBhZ2UuY29tcG9uZW50LnNjc3MnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLdkluc3RydWN0aW9uUGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGFjdGlvbnMgPSBpbnB1dDxCdXR0b25Nb2RlbFtdPihbXSk7XHJcbiAgY2FtcG9zT2JyaWdhdG9yaW9zID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIFxyXG4gIC8vIERlZmluZSBzZSBvIHBhaW5lbCBpbmljaWEgYWJlcnRvICh0cnVlKSBvdSBmZWNoYWRvIChmYWxzZSkuIFBvciBwYWRyw6NvIMOpIHRydWUgbm8gZGVza3RvcC5cclxuICBzdGFydEV4cGFuZGVkID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7IFxyXG5cclxuICB3aGl0ZUNhcmQgPSBpbnB1dDx7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgaWNvbjogc3RyaW5nO1xyXG4gICAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgfSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuXHJcbiAgYmxhY2tDYXJkID0gaW5wdXQ8e1xyXG4gICAgdGl0bGU6IHN0cmluZztcclxuICAgIGljb246IHN0cmluZztcclxuICAgIGhlaWdodDogbnVtYmVyO1xyXG4gIH0gfCB1bmRlZmluZWQ+KCk7XHJcblxyXG4gIGlzTW9iaWxlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIHVzZXJUb2dnbGVkUGFuZWwgPSBzaWduYWw8Ym9vbGVhbiB8IG51bGw+KG51bGwpO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY2hlY2tNb2JpbGVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcbiAgb25SZXNpemUoKSB7XHJcbiAgICB0aGlzLmNoZWNrTW9iaWxlU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tNb2JpbGVTdGF0ZSgpIHtcclxuICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBjb25zdCBpc01vYiA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTAyNDtcclxuICAgICAgICAvLyBBdHVhbGl6YSBvIHNpbmFsIGFwZW5hcyBzZSBob3V2ZXIgbXVkYW7Dp2EgcmVhbCwgZWNvbm9taXphIGNpY2xvcyBkbyBDaGFuZ2UgRGV0ZWN0aW9uXHJcbiAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUoKSAhPT0gaXNNb2IpIHtcclxuICAgICAgICAgICB0aGlzLmlzTW9iaWxlLnNldChpc01vYik7XHJcbiAgICAgICAgfVxyXG4gICAgIH1cclxuICB9XHJcblxyXG4gIGlzUGFuZWxFeHBhbmRlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIC8vIDEuIFJlc3BlaXRhIGEgaW50ZXJhw6fDo28gbWFudWFsIGRvIHVzdcOhcmlvIHByaW1laXJvXHJcbiAgICBjb25zdCB0b2dnbGVkID0gdGhpcy51c2VyVG9nZ2xlZFBhbmVsKCk7XHJcbiAgICBpZiAodG9nZ2xlZCAhPT0gbnVsbCkgcmV0dXJuIHRvZ2dsZWQ7XHJcbiAgICBcclxuICAgIC8vIDIuIFNlIGZvciBtb2JpbGUsIGluaWNpYSBzZW1wcmUgZmVjaGFkbyBjb21vIHBhZHLDo28gcG9yIFVYXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZSgpKSByZXR1cm4gZmFsc2U7XHJcbiAgICBcclxuICAgIC8vIDMuIFJlc3BlaXRhIGEgcHJvcHJpZWRhZGUgKHRydWUgb3UgZmFsc2UpIGRlZmluaWRhIHBlbG8gZGVzZW52b2x2ZWRvciBuYSB0ZWxhIHZpYSBASW5wdXRcclxuICAgIHJldHVybiB0aGlzLnN0YXJ0RXhwYW5kZWQoKTtcclxuICB9KTtcclxuXHJcbiAgdG9nZ2xlUGFuZWwoKSB7XHJcbiAgICB0aGlzLnVzZXJUb2dnbGVkUGFuZWwuc2V0KCF0aGlzLmlzUGFuZWxFeHBhbmRlZCgpKTtcclxuICB9XHJcblxyXG4gIG1haW5Db250ZW50V2lkdGggPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBpZiAoIXRoaXMud2hpdGVDYXJkKCkgJiYgIXRoaXMuYmxhY2tDYXJkKCkpIHJldHVybiAnMTAwJSc7XHJcbiAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuaXNQYW5lbEV4cGFuZGVkKCk7XHJcbiAgICBjb25zdCBtb2JpbGUgPSB0aGlzLmlzTW9iaWxlKCk7XHJcbiAgICBpZiAobW9iaWxlKSByZXR1cm4gZXhwYW5kZWQgPyAnMCUnIDogJzEwMCUnO1xyXG4gICAgcmV0dXJuIGV4cGFuZGVkID8gJ2NhbGMoNzUlIC0gMC4yNXJlbSknIDogJzEwMCUnO1xyXG4gIH0pO1xyXG5cclxuICBwYW5lbFdpZHRoID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKCF0aGlzLndoaXRlQ2FyZCgpICYmICF0aGlzLmJsYWNrQ2FyZCgpKSByZXR1cm4gJzAlJztcclxuICAgIGNvbnN0IGV4cGFuZGVkID0gdGhpcy5pc1BhbmVsRXhwYW5kZWQoKTtcclxuICAgIGNvbnN0IG1vYmlsZSA9IHRoaXMuaXNNb2JpbGUoKTtcclxuICAgIGlmIChtb2JpbGUpIHJldHVybiBleHBhbmRlZCA/ICcxMDAlJyA6ICcwJSc7XHJcbiAgICByZXR1cm4gZXhwYW5kZWQgPyAnY2FsYygyNSUgLSAwLjI1cmVtKScgOiAnMCUnO1xyXG4gIH0pO1xyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiaC1mdWxsIGZsZXggZmxleC1jb2x1bW4gb3ZlcmZsb3ctaGlkZGVuIHJlbGF0aXZlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtMSBtaW4taC0wIGZsZXggZmxleC1yb3cgcC0yIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHJlbGF0aXZlIG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgPCEtLSBNYWluIENvbnRlbnQgQ29udGFpbmVyIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImgtZnVsbCBtYXgtaC1mdWxsIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTMwMCBlYXNlLWluLW91dCBvdmVyZmxvdy15LWF1dG8gZmxleC1zaHJpbmstMFwiXHJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJtYWluQ29udGVudFdpZHRoKClcIiBbY2xhc3Mub3BhY2l0eS0wXT1cImlzTW9iaWxlKCkgJiYgaXNQYW5lbEV4cGFuZGVkKClcIj5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21haW4tY29udGVudF1cIj48L25nLWNvbnRlbnQ+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEluc3RydWN0aW9uIFBhZ2UgUGFuZWwgKFNpZGUpIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImgtZnVsbCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgZWFzZS1pbi1vdXQgZmxleC1zaHJpbmstMCBvdmVyZmxvdy15LWF1dG9cIlxyXG4gICAgICBbc3R5bGUud2lkdGhdPVwicGFuZWxXaWR0aCgpXCIgW2NsYXNzLm9wYWNpdHktMF09XCIhaXNQYW5lbEV4cGFuZGVkKClcIj5cclxuICAgICAgPGt2LWNhcmRzLWluc3RydWN0aW9uIFt3aGl0ZUNhcmRdPVwid2hpdGVDYXJkKClcIiBbYmxhY2tDYXJkXT1cImJsYWNrQ2FyZCgpXCIgY2xhc3M9XCJibG9jayB3LWZ1bGwgaC1mdWxsXCI+XHJcbiAgICAgICAgPGRpdiB3aGl0ZS1jYXJkLWNvbnRlbnQgY2xhc3M9XCJoLWZ1bGxcIj5cclxuICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlt3aGl0ZS1jYXJkLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgYmxhY2stY2FyZC1jb250ZW50IGNsYXNzPVwiaC1mdWxsXCI+XHJcbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYmxhY2stY2FyZC1jb250ZW50XVwiPjwvbmctY29udGVudD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9rdi1jYXJkcy1pbnN0cnVjdGlvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRmxvYXRpbmcgVG9nZ2xlIEJ1dHRvbiAtLT5cclxuICAgIEBpZiAod2hpdGVDYXJkKCkgfHwgYmxhY2tDYXJkKCkpIHtcclxuICAgIDxrdi1idXR0b24gW3NldmVyaXR5XT1cIidzZWNvbmRhcnknXCIgW3NpemVdPVwiJ2xhcmdlJ1wiIFt0eXBlXT1cImlzUGFuZWxFeHBhbmRlZCgpID8gJ3RleHQnIDogdW5kZWZpbmVkXCJcclxuICAgICAgW2ljb25dPVwiaXNQYW5lbEV4cGFuZGVkKCkgPyAnY2xvc2UnIDogJ3F1aWNrX3JlZmVyZW5jZSdcIlxyXG4gICAgICBjbGFzcz1cImFic29sdXRlIHotNTAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMzAwIGVhc2UtaW4tb3V0IGJnLXdoaXRlIGlubGluZS1mbGV4IGJvcmRlci1yb3VuZFwiXHJcbiAgICAgIFtzdHlsZS50b3BdPVwiJzFyZW0nXCIgW3N0eWxlLnJpZ2h0XT1cIicxcmVtJ1wiIChvbkNsaWNrKT1cInRvZ2dsZVBhbmVsKClcIj5cclxuICAgIDwva3YtYnV0dG9uPlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG5cclxuICBAaWYgKGFjdGlvbnMoKS5sZW5ndGggPiAwKSB7XHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtaW5pdGlhbCBmbGV4LW5vbmUgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQte3tcclxuICAgICAgICBjYW1wb3NPYnJpZ2F0b3Jpb3MoKSA/ICdiZXR3ZWVuJyA6ICdlbmQnXHJcbiAgICAgIH19IGFsaWduLWl0ZW1zLWNlbnRlciBwLTJcIj5cclxuICAgIEBpZiAoY2FtcG9zT2JyaWdhdG9yaW9zKCkpIHtcclxuICAgIDxzcGFuIGNsYXNzPVwidGV4dC14cyB0ZXh0LXJlZC01MDAgZm9udC1zZW1pYm9sZFwiPiogUHJlZW5jaGltZW50byBvYnJpZ2F0w7NyaW88L3NwYW4+XHJcbiAgICB9XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMlwiPlxyXG4gICAgICBAZm9yIChhY3Rpb24gb2YgYWN0aW9ucygpLnNsaWNlKCkucmV2ZXJzZSgpOyB0cmFjayBhY3Rpb24uaW5kZXgpIHtcclxuICAgICAgPGt2LWJ1dHRvbiBbbGFiZWxdPVwiYWN0aW9uLmxhYmVsIHx8ICcnXCIgW3NldmVyaXR5XT1cImFjdGlvbi5zZXZlcml0eSB8fCAndGVydGlhcnknXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uLmRpc2FibGVkIHx8IGZhbHNlXCIgW3R5cGVdPVwiYWN0aW9uLnR5cGVcIiBbc2l6ZV09XCJhY3Rpb24uc2l6ZSB8fCAnc21hbGwnXCJcclxuICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvbiB8fCAnJ1wiIFtpY29uUG9zaXRpb25dPVwiYWN0aW9uLmljb25Qb3NpdGlvbiB8fCAnbGVmdCdcIiBbaXRlbXNdPVwiYWN0aW9uLml0ZW1zIHx8IFtdXCJcclxuICAgICAgICBbcG9wdXBdPVwiYWN0aW9uLnBvcHVwIHx8IGZhbHNlXCIgW3BvcHVwSWNvbl09XCJhY3Rpb24ucG9wdXBJY29uIHx8IGZhbHNlXCIgW2Z1bGxXaWR0aF09XCJhY3Rpb24uZnVsbFdpZHRoIHx8IGZhbHNlXCJcclxuICAgICAgICAob25DbGljayk9XCJhY3Rpb24/LmNvbW1hbmQoJGV2ZW50KVwiPjwva3YtYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICB9XHJcbjwvZGl2PiJdfQ==
|