@seniorsistemas/angular-components 19.7.5 → 19.7.6
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/chips/README.md +3 -2
- package/chips/lib/chips/chip-item/chip-item.component.d.ts +2 -0
- package/chips/lib/chips/chips/chips.component.d.ts +2 -1
- package/datepicker/README.md +15 -2
- package/datepicker/lib/datepicker/date-segment-input.d.ts +82 -0
- package/datepicker/lib/datepicker/date.utils.d.ts +3 -7
- package/datepicker/lib/datepicker/datepicker.component.d.ts +101 -8
- package/esm2022/chips/lib/chips/chip-item/chip-item.component.mjs +15 -4
- package/esm2022/chips/lib/chips/chips/chips.component.mjs +26 -14
- package/esm2022/datepicker/lib/datepicker/date-segment-input.mjs +418 -0
- package/esm2022/datepicker/lib/datepicker/date.utils.mjs +7 -79
- package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +451 -41
- package/esm2022/sidebar/lib/sidebar/sidebar.component.mjs +8 -6
- package/esm2022/thumbnail/lib/thumbnail/thumbnail.component.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-chips.mjs +39 -16
- package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +873 -118
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs +7 -5
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
- package/package.json +1 -1
- package/sidebar/lib/sidebar/sidebar.component.d.ts +3 -1
package/chips/README.md
CHANGED
|
@@ -142,8 +142,9 @@ paises = [
|
|
|
142
142
|
## Acessibilidade
|
|
143
143
|
|
|
144
144
|
- O campo de entrada é um `<input>` acessível via teclado
|
|
145
|
-
- **Enter** confirma adição do chip; **Tab**
|
|
146
|
-
-
|
|
145
|
+
- **Enter** confirma a adição do chip; **Tab** sempre navega normalmente para o próximo elemento da tela, independente de `addOnTab`
|
|
146
|
+
- `addOnTab` controla apenas se o valor digitado é adicionado como chip antes do foco sair do campo — nunca bloqueia a navegação
|
|
147
|
+
- Cada chip já adicionado é focável via **Tab** (na ordem: chips existentes → campo de entrada), removível com **Backspace**/**Delete** e ativável com **Enter**/**Espaço** (mesmo comportamento de um clique)
|
|
147
148
|
- Use `aria-label` ou `<label for="...">` apontando para `inputId` para associar um rótulo ao campo
|
|
148
149
|
|
|
149
150
|
## Componentes relacionados
|
|
@@ -31,8 +31,10 @@ export declare class ChipItemComponent {
|
|
|
31
31
|
event: Event;
|
|
32
32
|
data: string | Object;
|
|
33
33
|
}>;
|
|
34
|
+
private readonly chipElement?;
|
|
34
35
|
clickedRemove($event: Event): void;
|
|
35
36
|
onChipClicked($event: Event): void;
|
|
37
|
+
focus(): void;
|
|
36
38
|
get _text(): string;
|
|
37
39
|
get _rawText(): any;
|
|
38
40
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChipItemComponent, never>;
|
|
@@ -73,7 +73,7 @@ export declare class ChipsComponent implements AfterViewInit, ControlValueAccess
|
|
|
73
73
|
valueChange: EventEmitter<any[] | string[]>;
|
|
74
74
|
private readonly templates;
|
|
75
75
|
private readonly input;
|
|
76
|
-
|
|
76
|
+
private readonly chipItems;
|
|
77
77
|
onChange: (value: string[] | any[]) => void;
|
|
78
78
|
onTouched: (value: string[] | any[]) => void;
|
|
79
79
|
private isTabEventActive;
|
|
@@ -100,6 +100,7 @@ export declare class ChipsComponent implements AfterViewInit, ControlValueAccess
|
|
|
100
100
|
private getMappedValues;
|
|
101
101
|
private getValueToAdd;
|
|
102
102
|
private hasDuplicatedItem;
|
|
103
|
+
private restoreFocusAfterRemove;
|
|
103
104
|
private storeValue;
|
|
104
105
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChipsComponent, never>;
|
|
105
106
|
static ɵcmp: i0.ɵɵComponentDeclaration<ChipsComponent, "s-chips", never, { "disabled": { "alias": "disabled"; "required": false; }; "field": { "alias": "field"; "required": false; }; "value": { "alias": "value"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "max": { "alias": "max"; "required": false; }; "maxLength": { "alias": "maxLength"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "allowDuplicated": { "alias": "allowDuplicated"; "required": false; }; "caseSensitiveDuplication": { "alias": "caseSensitiveDuplication"; "required": false; }; "addOnTab": { "alias": "addOnTab"; "required": false; }; "addOnBlur": { "alias": "addOnBlur"; "required": false; }; "separator": { "alias": "separator"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "infoLabel": { "alias": "infoLabel"; "required": false; }; "keyFilter": { "alias": "keyFilter"; "required": false; }; "showTooltip": { "alias": "showTooltip"; "required": false; }; "maxLengthRenderWithoutTooltip": { "alias": "maxLengthRenderWithoutTooltip"; "required": false; }; }, { "added": "added"; "removed": "removed"; "focused": "focused"; "focusLost": "focusLost"; "chipClicked": "chipClicked"; "valueChange": "valueChange"; }, ["templates"], never, true, never>;
|
package/datepicker/README.md
CHANGED
|
@@ -51,8 +51,8 @@ export class MeuComponent {}
|
|
|
51
51
|
| `min` | `Date \| null` | `null` | Não | Data mínima selecionável. Dias anteriores ficam desabilitados. |
|
|
52
52
|
| `max` | `Date \| null` | `null` | Não | Data máxima selecionável. Dias posteriores ficam desabilitados. |
|
|
53
53
|
| `defaultDate` | `Date \| null` | `null` | Não | Data exibida ao abrir o painel quando nenhuma data está selecionada. |
|
|
54
|
-
| `dateFormat` | `string` | `'dd/MM/yyyy'` | Não | Formato de exibição da data
|
|
55
|
-
| `hourFormat` | `'12' \| '24'` | `'24'` | Não | Formato de exibição das horas. |
|
|
54
|
+
| `dateFormat` | `string` | resolvido do locale, fallback `'dd/MM/yyyy'` | Não | Formato de exibição da data (tokens `dd`, `MM`, `yyyy`). Quando omitido, é resolvido a partir do locale ativo (chave de tradução `platform.angular_components.date_format`). Vale para todos os modos exceto `year`. |
|
|
55
|
+
| `hourFormat` | `'12' \| '24'` | resolvido do locale, fallback `'24'` | Não | Formato de exibição das horas. Quando omitido, é resolvido a partir do locale ativo (chave de tradução `platform.angular_components.hour_format`). |
|
|
56
56
|
| `minuteStep` | `number` | `5` | Não | Incremento em minutos ao usar as setas do time picker. |
|
|
57
57
|
| `showSeconds` | `boolean` | `false` | Não | Exibe o campo de segundos no time picker. |
|
|
58
58
|
| `rangeSeparator` | `string` | `' — '` | Não | Separador exibido entre as datas no modo `range`. |
|
|
@@ -191,6 +191,19 @@ const config: CalendarFieldConfig = {
|
|
|
191
191
|
<s-dynamic-form [config]="config" />
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
+
## Digitação por segmento
|
|
195
|
+
|
|
196
|
+
Nos modos `date`, `month`, `time` e `datetime`, o campo não usa `<input type="date">` nativo — o formato exibido segue o `dateFormat`/`hourFormat` (explícito ou resolvido do locale via ngx-translate), não o locale do browser/SO. A digitação replica o comportamento nativo:
|
|
197
|
+
|
|
198
|
+
- Clicar em um segmento (dia, mês, ano, hora, minuto, segundo) seleciona o segmento inteiro
|
|
199
|
+
- `Tab`/`Shift+Tab` e `←`/`→` navegam entre os segmentos sem sair do campo; nas bordas (último/primeiro segmento), o `Tab` volta a se comportar normalmente e move o foco para fora do campo, enquanto `←`/`→` simplesmente não fazem nada (como num `<input type="date">` nativo)
|
|
200
|
+
- `↑`/`↓` incrementam/decrementam o valor do segmento ativo, dando a volta (wrap) dentro do range válido
|
|
201
|
+
- Digitar um número preenche o segmento e avança automaticamente ao completar (ex.: digitar `1`, `5` no dia avança para o mês)
|
|
202
|
+
- Ao sair de um segmento incompleto (Tab, clique fora ou avanço automático), o valor é completado com zero à esquerda e ajustado aos limites (ex.: `2` no mês vira `02`; um dia maior que o total de dias do mês é reduzido para o último dia válido, considerando ano bissexto)
|
|
203
|
+
- Alterar o mês ou o ano com o dia já preenchido reajusta o dia automaticamente se ele deixar de ser válido (ex.: dia 31 + mês fevereiro → dia 28/29)
|
|
204
|
+
|
|
205
|
+
Em dispositivos touch (`(pointer: coarse)`), o campo cai automaticamente para o mesmo comportamento de `mode="range"`/`mode="year"` — somente leitura, com seleção exclusiva pelo painel do calendário — evitando abrir o teclado do aparelho no lugar do seletor nativo.
|
|
206
|
+
|
|
194
207
|
## Acessibilidade
|
|
195
208
|
|
|
196
209
|
- O trigger usa `role="combobox"` com `aria-haspopup="grid"`, `aria-expanded` e `aria-controls` apontando para o painel
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export type SegmentKind = 'day' | 'month' | 'year' | 'hour' | 'minute' | 'second' | 'ampm';
|
|
2
|
+
export interface EditableSegmentState {
|
|
3
|
+
kind: SegmentKind;
|
|
4
|
+
length: number;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
export interface LiteralSegmentState {
|
|
8
|
+
kind: 'literal';
|
|
9
|
+
text: string;
|
|
10
|
+
}
|
|
11
|
+
export type SegmentState = EditableSegmentState | LiteralSegmentState;
|
|
12
|
+
export interface SegmentEngineConfig {
|
|
13
|
+
mode: 'date' | 'month' | 'time' | 'datetime';
|
|
14
|
+
dateFormat: string;
|
|
15
|
+
hourFormat: '12' | '24';
|
|
16
|
+
showSeconds: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface FormatToken {
|
|
19
|
+
kind: 'day' | 'month' | 'year' | 'literal';
|
|
20
|
+
raw: string;
|
|
21
|
+
}
|
|
22
|
+
/** Tokeniza um `dateFormat` (ex.: `dd/MM/yyyy`, `MM/dd/yy`) em tokens de dia/mês/ano + literais. */
|
|
23
|
+
export declare function tokenizeDateFormat(format: string): FormatToken[];
|
|
24
|
+
/** Dias no mês (1-12), já resolvendo fevereiro/ano bissexto via rollover nativo do `Date`. */
|
|
25
|
+
export declare function daysInMonth(month: number, year: number): number;
|
|
26
|
+
/**
|
|
27
|
+
* Engine de segmentos (dia/mês/ano/hora/minuto/segundo/ampm) para o trigger do datepicker.
|
|
28
|
+
* Sem dependências de Angular — DOM/CVA ficam por conta do componente que a consome.
|
|
29
|
+
*/
|
|
30
|
+
export declare class DateSegmentEngine {
|
|
31
|
+
private segments;
|
|
32
|
+
private config;
|
|
33
|
+
private activeIndex;
|
|
34
|
+
private freshEntry;
|
|
35
|
+
configure(config: SegmentEngineConfig): void;
|
|
36
|
+
getDisplayString(): string;
|
|
37
|
+
private renderSegment;
|
|
38
|
+
private segmentRenderLength;
|
|
39
|
+
getSegmentRange(index: number): [number, number];
|
|
40
|
+
getFirstEditableIndex(): number;
|
|
41
|
+
getLastEditableIndex(): number;
|
|
42
|
+
getActiveIndex(): number | null;
|
|
43
|
+
activeKind(): SegmentKind | null;
|
|
44
|
+
selectSegmentAt(charIndex: number): number;
|
|
45
|
+
private nearestEditableFrom;
|
|
46
|
+
selectSegment(index: number): void;
|
|
47
|
+
selectFirstSegment(): void;
|
|
48
|
+
/** Commita (pad/clamp) o segmento ativo e move para o próximo/anterior editável. */
|
|
49
|
+
moveToAdjacentSegment(direction: 1 | -1): 'moved' | 'boundary';
|
|
50
|
+
typeDigit(digit: string): void;
|
|
51
|
+
private autoAdvance;
|
|
52
|
+
setAmPm(value: 0 | 1): void;
|
|
53
|
+
clearActiveSegment(kind: 'backspace' | 'delete'): void;
|
|
54
|
+
/** Limpa todos os segmentos editáveis (usado quando o campo inteiro está selecionado, ex.: Ctrl+A). */
|
|
55
|
+
clearAll(): void;
|
|
56
|
+
/** Incrementa/decrementa o segmento ativo, dando a volta (wrap) dentro do range válido. */
|
|
57
|
+
incrementActiveSegment(delta: 1 | -1): void;
|
|
58
|
+
/** Pad/clamp do segmento ativo (ex.: "2" -> "02", "45" no dia -> clamp para daysInMonth). */
|
|
59
|
+
commitActiveSegment(): void;
|
|
60
|
+
/** Commita o segmento ativo e sai do modo de edição (usado no blur do campo). */
|
|
61
|
+
deactivate(): void;
|
|
62
|
+
private clampAndPad;
|
|
63
|
+
private boundsFor;
|
|
64
|
+
/**
|
|
65
|
+
* Bound do dia dependendo do que já é conhecido de mês/ano. Nunca "adivinha" com o mês/ano
|
|
66
|
+
* atuais do sistema — isso estreitaria o range antes da hora (ex.: dia=29 digitado antes do
|
|
67
|
+
* ano, mês=fevereiro conhecido mas ano ainda não -> se assumisse o ano atual do sistema e ele
|
|
68
|
+
* não fosse bissexto, o dia seria clampado para 28 e nunca mais reexpandido para 29 mesmo que
|
|
69
|
+
* o ano realmente digitado depois seja bissexto). Em vez disso, fica sempre no lado permissivo
|
|
70
|
+
* até que a informação realmente exista.
|
|
71
|
+
*/
|
|
72
|
+
private daysInMonthNow;
|
|
73
|
+
private reconcileDayIfNeeded;
|
|
74
|
+
private findEditable;
|
|
75
|
+
isEmpty(): boolean;
|
|
76
|
+
isComplete(): boolean;
|
|
77
|
+
loadFromDate(date: Date | null): void;
|
|
78
|
+
private renderValueFor;
|
|
79
|
+
/** Constrói o `Date` a partir dos segmentos; `null` enquanto incompleto. Usa `referenceDate` para preencher partes ausentes (ex.: hora ao editar só a data). */
|
|
80
|
+
toDate(referenceDate?: Date | null): Date | null;
|
|
81
|
+
}
|
|
82
|
+
export {};
|
|
@@ -3,19 +3,15 @@ export type { DateRange };
|
|
|
3
3
|
export declare function formatNativeDate(date: Date): string;
|
|
4
4
|
/**
|
|
5
5
|
* Formata uma data segundo um padrão simples contendo os tokens `dd`, `MM` e `yyyy`.
|
|
6
|
-
* Usado
|
|
7
|
-
* não controla o formato. Para `type="date"` nativo o formato é definido pelo browser.
|
|
6
|
+
* Usado para exibição em campos `type="text"` (modos `range` e seleção múltipla).
|
|
8
7
|
*/
|
|
9
8
|
export declare function formatWithPattern(date: Date, pattern: string): string;
|
|
10
|
-
export declare function formatTime(h: number, m: number, s?: number): string;
|
|
11
9
|
/** Parses yyyy-MM-dd. Returns null when invalid. */
|
|
12
10
|
export declare function parseDate(raw: string): Date | null;
|
|
13
11
|
export declare function isSameDay(a: Date, b: Date): boolean;
|
|
14
12
|
export declare function stripTime(date: Date): number;
|
|
15
13
|
export declare function parseRangeInput(raw: string, separator?: string): DateRange | null;
|
|
16
|
-
export declare function parseTimeInput(raw: string, base: Date | null, maxHours: number, maxMinutes: number): Date | null;
|
|
17
14
|
export declare function parseYearInput(raw: string): Date | null;
|
|
18
|
-
export declare function
|
|
19
|
-
|
|
20
|
-
export declare function parseInput(mode: string, raw: string, base: Date | null, maxHours: number, maxMinutes: number, rangeSeparator?: string): Date | DateRange | null;
|
|
15
|
+
export declare function parseInput(mode: string, raw: string, rangeSeparator?: string): Date | DateRange | null;
|
|
16
|
+
/** Formata range/seleção múltipla (dateFormat) e o ano em `mode='year'`. Demais modos são resolvidos pela engine de segmentos. */
|
|
21
17
|
export declare function formatValueForInput(mode: string, value: Date | DateRange | Date[] | null, rangeSeparator?: string, dateFormat?: string, multipleSeparator?: string): string;
|
|
@@ -16,6 +16,7 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
16
16
|
private static readonly MAX_HOURS;
|
|
17
17
|
private static readonly MAX_MINUTES;
|
|
18
18
|
private static readonly HOURS_PER_MERIDIEM;
|
|
19
|
+
private static readonly DOUBLE_CLICK_THRESHOLD_MS;
|
|
19
20
|
private static nextId;
|
|
20
21
|
/** HTML `id` aplicado ao elemento `<input>`. Auto-gerado quando omitido. */
|
|
21
22
|
readonly inputId: import("@angular/core").InputSignal<string>;
|
|
@@ -53,10 +54,16 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
53
54
|
readonly max: import("@angular/core").InputSignal<Date | null>;
|
|
54
55
|
/** Data exibida ao abrir o calendário quando nenhuma data está selecionada. */
|
|
55
56
|
readonly defaultDate: import("@angular/core").InputSignal<Date | null>;
|
|
56
|
-
/**
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Formato de exibição da data no campo. Quando omitido, é resolvido a partir do
|
|
59
|
+
* locale ativo (chave `platform.angular_components.date_format`), com fallback para `dd/MM/yyyy`.
|
|
60
|
+
*/
|
|
61
|
+
readonly dateFormat: import("@angular/core").InputSignal<string | undefined>;
|
|
62
|
+
/**
|
|
63
|
+
* Formato de exibição das horas: `'12'` ou `'24'`. Quando omitido, é resolvido a partir
|
|
64
|
+
* do locale ativo (chave `platform.angular_components.hour_format`), com fallback para `'24'`.
|
|
65
|
+
*/
|
|
66
|
+
readonly hourFormat: import("@angular/core").InputSignal<"12" | "24" | undefined>;
|
|
60
67
|
/** Incremento em minutos ao usar as setas do time picker. */
|
|
61
68
|
readonly minuteStep: import("@angular/core").InputSignal<number>;
|
|
62
69
|
/** Quando `true`, exibe o campo de segundos no time picker. */
|
|
@@ -137,22 +144,43 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
137
144
|
protected readonly pendingRangeStart: import("@angular/core").WritableSignal<Date | null>;
|
|
138
145
|
protected readonly hoverDate: import("@angular/core").WritableSignal<Date | null>;
|
|
139
146
|
private _hasFormatError;
|
|
140
|
-
private _isBadInput;
|
|
141
147
|
private onValidatorChange;
|
|
142
148
|
private _onChange;
|
|
143
149
|
private _onTouched;
|
|
144
150
|
private readonly popupPanel;
|
|
145
151
|
private readonly increaseHourButton;
|
|
146
152
|
private readonly iconButton;
|
|
153
|
+
private readonly triggerInput;
|
|
147
154
|
private readonly injector;
|
|
148
155
|
private readonly hostElement;
|
|
156
|
+
private readonly translateService;
|
|
157
|
+
private readonly destroyRef;
|
|
158
|
+
private readonly currentLang;
|
|
159
|
+
/** Reflete `(pointer: coarse)` — dispositivos touch preferem o popup do calendário ao teclado. */
|
|
160
|
+
protected readonly isTouchDevice: import("@angular/core").WritableSignal<boolean>;
|
|
161
|
+
private readonly segmentEngine;
|
|
162
|
+
private lastSegmentConfig;
|
|
163
|
+
private measureCanvas?;
|
|
164
|
+
/** Incrementado a cada mutação do usuário — invalida callbacks de clique/foco adiados que ficaram obsoletos. */
|
|
165
|
+
private interactionGeneration;
|
|
166
|
+
/** `timeStamp` do último mousedown no input segmentado — usado pra detectar duplo clique na mão. */
|
|
167
|
+
private lastMouseDownAt;
|
|
168
|
+
constructor();
|
|
149
169
|
protected readonly resolvedIcon: import("@angular/core").Signal<string>;
|
|
170
|
+
/** `dateFormat` explícito ou resolvido a partir do locale ativo (fallback `dd/MM/yyyy`). */
|
|
171
|
+
protected readonly resolvedDateFormat: import("@angular/core").Signal<string>;
|
|
172
|
+
/** `hourFormat` explícito ou resolvido a partir do locale ativo (fallback `'24'`). */
|
|
173
|
+
protected readonly resolvedHourFormat: import("@angular/core").Signal<"12" | "24">;
|
|
174
|
+
/** Modos cujo formato de exibição é resolvido pela engine de segmentos (independente de touch/readonly). */
|
|
175
|
+
protected readonly isSegmentModeCandidate: import("@angular/core").Signal<boolean>;
|
|
176
|
+
/** Interatividade de digitação por segmento — desligada em touch ou quando `readonlyInput` é usado. */
|
|
177
|
+
protected readonly isSegmentedMode: import("@angular/core").Signal<boolean>;
|
|
150
178
|
/** Indica se o time picker deve usar o formato de 12 horas com seletor AM/PM. */
|
|
151
179
|
protected readonly is12HourFormat: import("@angular/core").Signal<boolean>;
|
|
152
180
|
/** Hora exibida no time picker: 1–12 no formato 12h, 0–23 no formato 24h. */
|
|
153
181
|
protected readonly displayHours: import("@angular/core").Signal<number>;
|
|
154
182
|
/** Meridiano atual derivado da hora interna (0–23). */
|
|
155
|
-
protected readonly amPm: import("@angular/core").Signal<"
|
|
183
|
+
protected readonly amPm: import("@angular/core").Signal<"PM" | "AM">;
|
|
156
184
|
protected readonly positions: ConnectedPosition[];
|
|
157
185
|
protected readonly popupId: import("@angular/core").Signal<string>;
|
|
158
186
|
protected readonly currentMonthIndex: import("@angular/core").Signal<number>;
|
|
@@ -163,7 +191,6 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
163
191
|
/** Seleção múltipla ativa: apenas no modo `date` com `selectionMode = 'multiple'`. */
|
|
164
192
|
protected readonly isMultipleMode: import("@angular/core").Signal<boolean>;
|
|
165
193
|
protected readonly orderedWeekDayKeys: import("@angular/core").Signal<string[]>;
|
|
166
|
-
protected readonly inputType: import("@angular/core").Signal<"date" | "month" | "time" | "text" | "datetime-local">;
|
|
167
194
|
protected readonly dialogAriaLabelKey: import("@angular/core").Signal<"platform.angular_components.datepicker_select_range" | "platform.angular_components.datepicker_select_date">;
|
|
168
195
|
protected readonly placeholderKey: import("@angular/core").Signal<string>;
|
|
169
196
|
protected readonly effectiveRange: import("@angular/core").Signal<{
|
|
@@ -198,14 +225,66 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
198
225
|
private prepareOpenView;
|
|
199
226
|
private focusBestCalendarTarget;
|
|
200
227
|
protected closePanel(): void;
|
|
228
|
+
/**
|
|
229
|
+
* O backdrop do CDK Overlay cobre a tela inteira, incluindo o próprio trigger — clicar no
|
|
230
|
+
* input ou nos botões do trigger enquanto o painel já está aberto também dispara
|
|
231
|
+
* `backdropClick` (o próprio `<input>` nunca recebe o `click` nesse caso, então
|
|
232
|
+
* `handleInputClick` nunca dispara). Sem este filtro, clicar no input para trocar de
|
|
233
|
+
* segmento fecharia o painel e roubaria o foco para o botão do ícone (via `closePanel`).
|
|
234
|
+
* Quando o clique caiu especificamente sobre o `<input>`, reaplicamos a mesma lógica de
|
|
235
|
+
* reposicionamento de segmento que `handleInputClick` faria, em vez de só ignorar o clique.
|
|
236
|
+
*/
|
|
237
|
+
protected handleBackdropClick(event: MouseEvent): void;
|
|
201
238
|
protected toggle(): void;
|
|
202
239
|
protected handleOverlayKeydown(event: KeyboardEvent): void;
|
|
203
|
-
protected handleInputClick(): void;
|
|
240
|
+
protected handleInputClick(event: MouseEvent): void;
|
|
241
|
+
/**
|
|
242
|
+
* Ponto de entrada único pro clique no input segmentado — chamado tanto por
|
|
243
|
+
* `handleInputClick` (mousedown direto no `<input>`, o primeiro clique, antes do backdrop
|
|
244
|
+
* existir) quanto por `handleBackdropClick` (cliques seguintes, já com o painel aberto e o
|
|
245
|
+
* backdrop cobrindo o input). Precisa ser único porque os dois cliques de um duplo clique
|
|
246
|
+
* real costumam chegar por caminhos DIFERENTES — o primeiro via mousedown no input, o
|
|
247
|
+
* segundo via backdropClick — então rastrear o timestamp do "último clique" separadamente
|
|
248
|
+
* em cada handler nunca detectaria um duplo clique de verdade. Nem `dblclick` nem
|
|
249
|
+
* `event.detail` são confiáveis aqui (dependem da contagem/targeting interna de cliques do
|
|
250
|
+
* browser, que nossas manipulações de foco/seleção parecem atrapalhar — observado
|
|
251
|
+
* empiricamente: `event.detail` fica sempre 1), daí a detecção manual por timestamp.
|
|
252
|
+
*/
|
|
253
|
+
private handleSegmentPointerDown;
|
|
254
|
+
/**
|
|
255
|
+
* Seleciona o segmento sob a coordenada `clientX` de um clique no input segmentado.
|
|
256
|
+
* Compartilhado por `handleInputClick` (mousedown real no `<input>` — usamos `mousedown`
|
|
257
|
+
* em vez de `click` porque o `focus`/`openOnFocus` disparado no meio do gesto pode montar
|
|
258
|
+
* o backdrop do CDK Overlay embaixo do cursor antes do `mouseup`, fazendo o browser resolver
|
|
259
|
+
* o `click` pro ancestral comum entre o alvo do mousedown e o do mouseup — na prática,
|
|
260
|
+
* `<body>` — em vez do `<input>` ou do backdrop) e `handleBackdropClick` (clique no trigger
|
|
261
|
+
* com o painel já aberto em regime estável, interceptado pelo backdrop do CDK Overlay).
|
|
262
|
+
*/
|
|
263
|
+
private applySegmentClick;
|
|
264
|
+
/** Duplo clique seleciona o input inteiro (todos os segmentos), como num `<input>` de texto comum. */
|
|
265
|
+
protected handleInputDblClick(event: MouseEvent): void;
|
|
266
|
+
/**
|
|
267
|
+
* Seleciona todos os segmentos do input (usado tanto pelo duplo clique detectado na mão em
|
|
268
|
+
* `handleSegmentPointerDown` quanto por `handleInputDblClick`, mantido como caminho direto
|
|
269
|
+
* pra quem dispara um `dblclick` de verdade, ex.: acessibilidade/testes).
|
|
270
|
+
*/
|
|
271
|
+
private selectWholeField;
|
|
204
272
|
protected handleInputFocus(event: Event): void;
|
|
273
|
+
/** Mapeia a coordenada X (viewport) de um clique para o índice de caractere mais próximo no valor exibido. */
|
|
274
|
+
private clickClientXToCharIndex;
|
|
205
275
|
protected handleNativeInput(event: Event): void;
|
|
206
276
|
protected handleInputBlur(event: Event): void;
|
|
207
277
|
protected handleInputChange(raw: string): void;
|
|
208
278
|
protected handleTriggerKeydown(event: KeyboardEvent): void;
|
|
279
|
+
/** Teclas que devem passar direto para o browser sem inserir/alterar nada no campo. */
|
|
280
|
+
private static readonly SEGMENTED_PASSTHROUGH_KEYS;
|
|
281
|
+
/** Digitação por segmento (dia/mês/ano/hora/minuto/segundo/ampm) no input do trigger. */
|
|
282
|
+
private handleSegmentedKeydown;
|
|
283
|
+
/** Sincroniza o DOM com o estado atual da engine (valor + seleção do segmento ativo) após uma mutação. */
|
|
284
|
+
private syncSegmentedInput;
|
|
285
|
+
private selectActiveSegmentRange;
|
|
286
|
+
/** Propaga o valor da engine para o modelo (CVA) assim que todos os segmentos estiverem completos. */
|
|
287
|
+
private commitSegmentedValueIfComplete;
|
|
209
288
|
protected navigatePrev(): void;
|
|
210
289
|
protected navigateNext(): void;
|
|
211
290
|
protected handleCalendarGridKeydown(event: KeyboardEvent): void;
|
|
@@ -245,6 +324,20 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
245
324
|
protected formatDayAriaLabel(date: Date): string;
|
|
246
325
|
/** Formata o valor para exibição no input, aplicando rangeSeparator, dateFormat e multipleSeparator. */
|
|
247
326
|
private formatForDisplay;
|
|
327
|
+
/**
|
|
328
|
+
* Atualiza `inputDate` a partir de um valor único, roteando pela engine de segmentos
|
|
329
|
+
* (date/month/time/datetime) ou pelo formatador legado (range/year/multiple).
|
|
330
|
+
*/
|
|
331
|
+
private setDisplayFor;
|
|
332
|
+
/**
|
|
333
|
+
* (Re)configura a engine de segmentos quando `mode`/`dateFormat`/`hourFormat`/`showSeconds`
|
|
334
|
+
* mudaram desde a última chamada, recarregando o valor atual. Chamado de forma síncrona a
|
|
335
|
+
* partir de todo ponto de entrada que usa a engine — não depende de um `effect()` (que só
|
|
336
|
+
* roda em um ciclo de change detection, tarde demais para leituras/escritas imediatas).
|
|
337
|
+
*/
|
|
338
|
+
private ensureSegmentEngineConfigured;
|
|
339
|
+
/** Retorna a tradução de `key`, ou `fallback` quando a chave não está traduzida (ngx-translate retorna a própria chave). */
|
|
340
|
+
private resolveTranslatedOrDefault;
|
|
248
341
|
private syncTimeToValue;
|
|
249
342
|
private buildCalendarDay;
|
|
250
343
|
private computeValidationErrors;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
3
3
|
import { CheckDisabled } from '@seniorsistemas/angular-components/shared';
|
|
4
4
|
import { TooltipDirective } from '@seniorsistemas/angular-components/tooltip';
|
|
5
5
|
import { NgClass, NgTemplateOutlet } from '@angular/common';
|
|
6
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@ngx-translate/core";
|
|
7
9
|
/**
|
|
8
10
|
* @description Componente interno de item individual de chip, utilizado pelo {@link ChipsComponent}.
|
|
9
11
|
* Responsável pela renderização do texto, tooltip e botão de remoção de cada chip.
|
|
@@ -29,12 +31,18 @@ export class ChipItemComponent {
|
|
|
29
31
|
clickRemove = new EventEmitter();
|
|
30
32
|
/** @description Emitido ao clicar sobre o chip (fora do botão de remoção). */
|
|
31
33
|
chipClicked = new EventEmitter();
|
|
34
|
+
chipElement;
|
|
32
35
|
clickedRemove($event) {
|
|
36
|
+
$event.preventDefault();
|
|
33
37
|
this.clickRemove.emit({ itemIndex: this.itemIndex, event: $event });
|
|
34
38
|
}
|
|
35
39
|
onChipClicked($event) {
|
|
40
|
+
$event.preventDefault();
|
|
36
41
|
this.chipClicked.emit({ event: $event, data: this.dataRender });
|
|
37
42
|
}
|
|
43
|
+
focus() {
|
|
44
|
+
this.chipElement?.nativeElement.focus();
|
|
45
|
+
}
|
|
38
46
|
get _text() {
|
|
39
47
|
const _text = this._rawText;
|
|
40
48
|
return (_text.substring(0, _text.length > this.maxLengthRenderWithoutTooltip ? this.maxLengthRenderWithoutTooltip : _text.length) + (_text.length > this.maxLengthRenderWithoutTooltip ? '...' : ''));
|
|
@@ -43,7 +51,7 @@ export class ChipItemComponent {
|
|
|
43
51
|
return this.objectField ? this.dataRender[this.objectField] || '' : this.dataRender || '';
|
|
44
52
|
}
|
|
45
53
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChipItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
46
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChipItemComponent, isStandalone: true, selector: "s-chip-item", inputs: { dataRender: "dataRender", objectField: "objectField", disabled: "disabled", templateRef: "templateRef", itemIndex: "itemIndex", showTooltip: "showTooltip", maxLengthRenderWithoutTooltip: "maxLengthRenderWithoutTooltip" }, outputs: { clickRemove: "clickRemove", chipClicked: "chipClicked" }, ngImport: i0, template: "<ng-template #itemRender>\n <div\n class=\"rounded-medium border border-grayscale-50 bg-grayscale-10 break-words text-xs text-center flex items-center gap-2 px-1.5\"\n [ngClass]=\"{ 'hover:bg-grayscale-30': !disabled, 'opacity-50': disabled }\"\n (click)=\"onChipClicked($event)\"
|
|
54
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChipItemComponent, isStandalone: true, selector: "s-chip-item", inputs: { dataRender: "dataRender", objectField: "objectField", disabled: "disabled", templateRef: "templateRef", itemIndex: "itemIndex", showTooltip: "showTooltip", maxLengthRenderWithoutTooltip: "maxLengthRenderWithoutTooltip" }, outputs: { clickRemove: "clickRemove", chipClicked: "chipClicked" }, viewQueries: [{ propertyName: "chipElement", first: true, predicate: ["chipElement"], descendants: true }], ngImport: i0, template: "<ng-template #itemRender>\n <div\n #chipElement\n class=\"rounded-medium border border-grayscale-50 bg-grayscale-10 break-words text-xs text-center flex items-center gap-2 px-1.5 focus:outline focus:outline-2 focus:outline-criticality-blue\"\n [ngClass]=\"{ 'hover:bg-grayscale-30': !disabled, 'opacity-50': disabled }\"\n role=\"button\"\n [attr.aria-label]=\"_rawText + ', ' + ('platform.angular_components.remove' | translate)\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n (click)=\"onChipClicked($event)\"\n (keydown.enter)=\"onChipClicked($event)\"\n (keydown.space)=\"onChipClicked($event)\"\n (keydown.backspace)=\"clickedRemove($event)\"\n (keydown.delete)=\"clickedRemove($event)\"\n [sTooltip]=\"_rawText\"\n [showDelay]=\"0\"\n [visible]=\"showTooltip ? _rawText.length > maxLengthRenderWithoutTooltip : false\">\n @if(templateRef) {\n <ng-container\n *ngTemplateOutlet=\"templateRef; context: { $implicit: dataRender, text: _text }\">\n </ng-container>\n } @else {\n {{ _text }}\n }\n <i class=\"fas fa-times\" aria-hidden=\"true\" [ngClass]=\"{ 'cursor-pointer': !disabled, 'cursor-default': disabled }\" (click)=\"clickedRemove($event)\"></i>\n </div>\n</ng-template>\n\n\n@if(objectField && !templateRef) {\n <ng-container *ngTemplateOutlet=\"itemRender;\"></ng-container>\n}\n\n@if(!objectField && !templateRef) {\n <ng-container *ngTemplateOutlet=\"itemRender;\"></ng-container>\n}\n\n@if(templateRef) {\n <ng-container *ngTemplateOutlet=\"itemRender\"></ng-container>\n}\n", dependencies: [{ kind: "directive", type: TooltipDirective, selector: "[sTooltip]", inputs: ["sTooltip", "tooltipPosition", "showDelay", "displayTime", "tooltipEvent", "escape", "visible", "mobileBehavior", "focusedInputRef", "checkTruncatedText"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
|
|
47
55
|
}
|
|
48
56
|
__decorate([
|
|
49
57
|
CheckDisabled()
|
|
@@ -53,7 +61,7 @@ __decorate([
|
|
|
53
61
|
], ChipItemComponent.prototype, "onChipClicked", null);
|
|
54
62
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChipItemComponent, decorators: [{
|
|
55
63
|
type: Component,
|
|
56
|
-
args: [{ selector: 's-chip-item', standalone: true, imports: [TooltipDirective, NgTemplateOutlet, NgClass], template: "<ng-template #itemRender>\n <div\n class=\"rounded-medium border border-grayscale-50 bg-grayscale-10 break-words text-xs text-center flex items-center gap-2 px-1.5\"\n [ngClass]=\"{ 'hover:bg-grayscale-30': !disabled, 'opacity-50': disabled }\"\n (click)=\"onChipClicked($event)\"
|
|
64
|
+
args: [{ selector: 's-chip-item', standalone: true, imports: [TooltipDirective, NgTemplateOutlet, NgClass, TranslateModule], template: "<ng-template #itemRender>\n <div\n #chipElement\n class=\"rounded-medium border border-grayscale-50 bg-grayscale-10 break-words text-xs text-center flex items-center gap-2 px-1.5 focus:outline focus:outline-2 focus:outline-criticality-blue\"\n [ngClass]=\"{ 'hover:bg-grayscale-30': !disabled, 'opacity-50': disabled }\"\n role=\"button\"\n [attr.aria-label]=\"_rawText + ', ' + ('platform.angular_components.remove' | translate)\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n (click)=\"onChipClicked($event)\"\n (keydown.enter)=\"onChipClicked($event)\"\n (keydown.space)=\"onChipClicked($event)\"\n (keydown.backspace)=\"clickedRemove($event)\"\n (keydown.delete)=\"clickedRemove($event)\"\n [sTooltip]=\"_rawText\"\n [showDelay]=\"0\"\n [visible]=\"showTooltip ? _rawText.length > maxLengthRenderWithoutTooltip : false\">\n @if(templateRef) {\n <ng-container\n *ngTemplateOutlet=\"templateRef; context: { $implicit: dataRender, text: _text }\">\n </ng-container>\n } @else {\n {{ _text }}\n }\n <i class=\"fas fa-times\" aria-hidden=\"true\" [ngClass]=\"{ 'cursor-pointer': !disabled, 'cursor-default': disabled }\" (click)=\"clickedRemove($event)\"></i>\n </div>\n</ng-template>\n\n\n@if(objectField && !templateRef) {\n <ng-container *ngTemplateOutlet=\"itemRender;\"></ng-container>\n}\n\n@if(!objectField && !templateRef) {\n <ng-container *ngTemplateOutlet=\"itemRender;\"></ng-container>\n}\n\n@if(templateRef) {\n <ng-container *ngTemplateOutlet=\"itemRender\"></ng-container>\n}\n" }]
|
|
57
65
|
}], propDecorators: { dataRender: [{
|
|
58
66
|
type: Input,
|
|
59
67
|
args: [{ required: true }]
|
|
@@ -78,5 +86,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
78
86
|
type: Output
|
|
79
87
|
}], chipClicked: [{
|
|
80
88
|
type: Output
|
|
89
|
+
}], chipElement: [{
|
|
90
|
+
type: ViewChild,
|
|
91
|
+
args: ['chipElement']
|
|
81
92
|
}], clickedRemove: [], onChipClicked: [] } });
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9jaGlwcy9zcmMvbGliL2NoaXBzL2NoaXAtaXRlbS9jaGlwLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2NoaXBzL3NyYy9saWIvY2hpcHMvY2hpcC1pdGVtL2NoaXAtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUM1RDs7Ozs7R0FLRztBQU9ILE1BQU0sT0FBTyxpQkFBaUI7SUFDMUIseUZBQXlGO0lBQzlELFVBQVUsQ0FBbUI7SUFDeEQsNkdBQTZHO0lBQ2xGLFdBQVcsQ0FBVTtJQUNoRCwrRUFBK0U7SUFDcEQsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUM1Qyw2RUFBNkU7SUFDcEUsV0FBVyxDQUFnQztJQUNwRCxvR0FBb0c7SUFDekUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLHdGQUF3RjtJQUM3RCxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzlDLHNHQUFzRztJQUMzRSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7SUFFOUQsa0VBQWtFO0lBQ3hELFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBdUMsQ0FBQztJQUNoRiw4RUFBOEU7SUFDcEUsV0FBVyxHQUFHLElBQUksWUFBWSxFQUEyQyxDQUFDO0lBR3BGLGFBQWEsQ0FBQyxNQUFhO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFhO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDNUIsT0FBTyxDQUNILEtBQUssQ0FBQyxTQUFTLENBQ1gsQ0FBQyxFQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ3hHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDdkUsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxVQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO0lBQ3ZHLENBQUM7d0dBMUNRLGlCQUFpQjs0RkFBakIsaUJBQWlCLG9YQ2hCOUIsMnNDQStCQSw0Q0RqQmMsZ0JBQWdCLDROQUFFLGdCQUFnQixvSkFBRSxPQUFPOztBQXdCckQ7SUFEQyxhQUFhLEVBQUU7c0RBR2Y7QUFFRDtJQURDLGFBQWEsRUFBRTtzREFHZjs0RkE1QlEsaUJBQWlCO2tCQU43QixTQUFTOytCQUNJLGFBQWEsY0FFWCxJQUFJLFdBQ1AsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7OEJBSTNCLFVBQVU7c0JBQXBDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVFLFdBQVc7c0JBQXJDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVFLFFBQVE7c0JBQWxDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVoQixXQUFXO3NCQUFuQixLQUFLO2dCQUVxQixTQUFTO3NCQUFuQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFRSxXQUFXO3NCQUFyQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFRSw2QkFBNkI7c0JBQXZELEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUdmLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFHUCxhQUFhLE1BSWIsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGVja0Rpc2FibGVkIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9zaGFyZWQnO1xyXG5pbXBvcnQgeyBUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy90b29sdGlwJztcclxuaW1wb3J0IHsgTmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBpbnRlcm5vIGRlIGl0ZW0gaW5kaXZpZHVhbCBkZSBjaGlwLCB1dGlsaXphZG8gcGVsbyB7QGxpbmsgQ2hpcHNDb21wb25lbnR9LlxyXG4gKiBSZXNwb25zw6F2ZWwgcGVsYSByZW5kZXJpemHDp8OjbyBkbyB0ZXh0bywgdG9vbHRpcCBlIGJvdMOjbyBkZSByZW1vw6fDo28gZGUgY2FkYSBjaGlwLlxyXG4gKlxyXG4gKiBAY2F0ZWdvcnkgSW5wdXRzXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAncy1jaGlwLWl0ZW0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoaXAtaXRlbS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW1Rvb2x0aXBEaXJlY3RpdmUsIE5nVGVtcGxhdGVPdXRsZXQsIE5nQ2xhc3NdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hpcEl0ZW1Db21wb25lbnQge1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDb250ZcO6ZG8gYSBzZXIgZXhpYmlkbyBubyBjaGlwIChzdHJpbmcgb3Ugb2JqZXRvKS4gQ2FtcG8gb2JyaWdhdMOzcmlvLiAqL1xyXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgZGF0YVJlbmRlciE6IHN0cmluZyB8IE9iamVjdDtcclxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUgZG8gb2JqZXRvIHVzYWRhIHBhcmEgZXhpYmnDp8OjbyBxdWFuZG8gYGRhdGFSZW5kZXJgIGZvciB1bSBvYmpldG8uIENhbXBvIG9icmlnYXTDs3Jpby4gKi9cclxuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIG9iamVjdEZpZWxkITogc3RyaW5nO1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBEZXNhYmlsaXRhIG9zIGV2ZW50b3MgZGUgY2xpcXVlIGRvIGNoaXAuIENhbXBvIG9icmlnYXTDs3Jpby4gKi9cclxuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIFRlbXBsYXRlIHBlcnNvbmFsaXphZG8gcGFyYSByZW5kZXJpemHDp8OjbyBpbnRlcm5hIGRvIGNoaXAuICovXHJcbiAgICBASW5wdXQoKSB0ZW1wbGF0ZVJlZiE6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIMONbmRpY2UgZG8gY2hpcCBuYSBsaXN0YSwgdXNhZG8gYW8gZW1pdGlyIG8gZXZlbnRvIGRlIHJlbW/Dp8Ojby4gQ2FtcG8gb2JyaWdhdMOzcmlvLiAqL1xyXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgaXRlbUluZGV4ID0gLTE7XHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIG8gdG9vbHRpcCBwYXJhIGNoaXBzIGNvbSB0ZXh0byB0cnVuY2Fkby4gQ2FtcG8gb2JyaWdhdMOzcmlvLiAqL1xyXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2hvd1Rvb2x0aXAgPSB0cnVlO1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBMaW1pdGUgZGUgY2FyYWN0ZXJlcyBleGliaWRvcyBhbnRlcyBkZSB0cnVuY2FyIG8gdGV4dG8gZG8gY2hpcC4gQ2FtcG8gb2JyaWdhdMOzcmlvLiAqL1xyXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgbWF4TGVuZ3RoUmVuZGVyV2l0aG91dFRvb2x0aXAgPSAyMDtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBkZSByZW1vw6fDo28gZG8gY2hpcC4gKi9cclxuICAgIEBPdXRwdXQoKSBjbGlja1JlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpdGVtSW5kZXg6IG51bWJlcjsgZXZlbnQ6IEV2ZW50IH0+KCk7XHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gYW8gY2xpY2FyIHNvYnJlIG8gY2hpcCAoZm9yYSBkbyBib3TDo28gZGUgcmVtb8Onw6NvKS4gKi9cclxuICAgIEBPdXRwdXQoKSBjaGlwQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogRXZlbnQ7IGRhdGE6IHN0cmluZyB8IE9iamVjdCB9PigpO1xyXG5cclxuICAgIEBDaGVja0Rpc2FibGVkKClcclxuICAgIGNsaWNrZWRSZW1vdmUoJGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIHRoaXMuY2xpY2tSZW1vdmUuZW1pdCh7IGl0ZW1JbmRleDogdGhpcy5pdGVtSW5kZXgsIGV2ZW50OiAkZXZlbnQgfSk7XHJcbiAgICB9XHJcbiAgICBAQ2hlY2tEaXNhYmxlZCgpXHJcbiAgICBvbkNoaXBDbGlja2VkKCRldmVudDogRXZlbnQpIHtcclxuICAgICAgICB0aGlzLmNoaXBDbGlja2VkLmVtaXQoeyBldmVudDogJGV2ZW50LCBkYXRhOiB0aGlzLmRhdGFSZW5kZXIgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF90ZXh0KCkge1xyXG4gICAgICAgIGNvbnN0IF90ZXh0ID0gdGhpcy5fcmF3VGV4dDtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBfdGV4dC5zdWJzdHJpbmcoXHJcbiAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICAgX3RleHQubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGhSZW5kZXJXaXRob3V0VG9vbHRpcCA/IHRoaXMubWF4TGVuZ3RoUmVuZGVyV2l0aG91dFRvb2x0aXAgOiBfdGV4dC5sZW5ndGgsXHJcbiAgICAgICAgICAgICkgKyAoX3RleHQubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGhSZW5kZXJXaXRob3V0VG9vbHRpcCA/ICcuLi4nIDogJycpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgX3Jhd1RleHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0RmllbGQgPyAodGhpcy5kYXRhUmVuZGVyIGFzIGFueSlbdGhpcy5vYmplY3RGaWVsZF0gfHwgJycgOiB0aGlzLmRhdGFSZW5kZXIgfHwgJyc7XHJcbiAgICB9XHJcbn1cclxuIiwiPG5nLXRlbXBsYXRlICNpdGVtUmVuZGVyPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyb3VuZGVkLW1lZGl1bSBib3JkZXIgYm9yZGVyLWdyYXlzY2FsZS01MCBiZy1ncmF5c2NhbGUtMTAgYnJlYWstd29yZHMgdGV4dC14cyB0ZXh0LWNlbnRlciBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBweC0xLjVcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdob3ZlcjpiZy1ncmF5c2NhbGUtMzAnOiAhZGlzYWJsZWQsICdvcGFjaXR5LTUwJzogZGlzYWJsZWQgfVwiXG4gICAgICAgIChjbGljayk9XCJvbkNoaXBDbGlja2VkKCRldmVudClcIiBcbiAgICAgICAgW3NUb29sdGlwXT1cIl9yYXdUZXh0XCJcbiAgICAgICAgW3Nob3dEZWxheV09XCIwXCJcbiAgICAgICAgW3Zpc2libGVdPVwic2hvd1Rvb2x0aXAgPyBfcmF3VGV4dC5sZW5ndGggPiBtYXhMZW5ndGhSZW5kZXJXaXRob3V0VG9vbHRpcCA6IGZhbHNlXCI+XG4gICAgICAgICAgICBAaWYodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVSZWY7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBkYXRhUmVuZGVyLCB0ZXh0OiBfdGV4dCB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICB7eyBfdGV4dCB9fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIiBbbmdDbGFzc109XCJ7ICdjdXJzb3ItcG9pbnRlcic6ICFkaXNhYmxlZCwgJ2N1cnNvci1kZWZhdWx0JzogZGlzYWJsZWQgfVwiIChjbGljayk9XCJjbGlja2VkUmVtb3ZlKCRldmVudClcIj48L2k+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cbkBpZihvYmplY3RGaWVsZCAmJiAhdGVtcGxhdGVSZWYpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVJlbmRlcjtcIj48L25nLWNvbnRhaW5lcj5cbn1cblxuQGlmKCFvYmplY3RGaWVsZCAmJiAhdGVtcGxhdGVSZWYpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVJlbmRlcjtcIj48L25nLWNvbnRhaW5lcj5cbn1cblxuQGlmKHRlbXBsYXRlUmVmKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1SZW5kZXJcIj48L25nLWNvbnRhaW5lcj5cbn1cbiJdfQ==
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9jaGlwcy9zcmMvbGliL2NoaXBzL2NoaXAtaXRlbS9jaGlwLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2NoaXBzL3NyYy9saWIvY2hpcHMvY2hpcC1pdGVtL2NoaXAtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQUN0RDs7Ozs7R0FLRztBQU9ILE1BQU0sT0FBTyxpQkFBaUI7SUFDMUIseUZBQXlGO0lBQzlELFVBQVUsQ0FBbUI7SUFDeEQsNkdBQTZHO0lBQ2xGLFdBQVcsQ0FBVTtJQUNoRCwrRUFBK0U7SUFDcEQsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUM1Qyw2RUFBNkU7SUFDcEUsV0FBVyxDQUFnQztJQUNwRCxvR0FBb0c7SUFDekUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLHdGQUF3RjtJQUM3RCxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzlDLHNHQUFzRztJQUMzRSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7SUFFOUQsa0VBQWtFO0lBQ3hELFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBdUMsQ0FBQztJQUNoRiw4RUFBOEU7SUFDcEUsV0FBVyxHQUFHLElBQUksWUFBWSxFQUEyQyxDQUFDO0lBR25FLFdBQVcsQ0FBMkI7SUFHdkQsYUFBYSxDQUFDLE1BQWE7UUFDdkIsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFhO1FBQ3ZCLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTSxLQUFLO1FBQ1IsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDNUIsT0FBTyxDQUNILEtBQUssQ0FBQyxTQUFTLENBQ1gsQ0FBQyxFQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ3hHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDdkUsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxVQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO0lBQ3ZHLENBQUM7d0dBbkRRLGlCQUFpQjs0RkFBakIsaUJBQWlCLGdlQ2pCOUIsK3FEQXVDQSw0Q0R4QmMsZ0JBQWdCLDROQUFFLGdCQUFnQixvSkFBRSxPQUFPLG1GQUFFLGVBQWU7O0FBMkJ0RTtJQURDLGFBQWEsRUFBRTtzREFJZjtBQUVEO0lBREMsYUFBYSxFQUFFO3NEQUlmOzRGQWpDUSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0ksYUFBYSxjQUVYLElBQUksV0FDUCxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUM7OEJBSTVDLFVBQVU7c0JBQXBDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVFLFdBQVc7c0JBQXJDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVFLFFBQVE7c0JBQWxDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVoQixXQUFXO3NCQUFuQixLQUFLO2dCQUVxQixTQUFTO3NCQUFuQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFRSxXQUFXO3NCQUFyQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFRSw2QkFBNkI7c0JBQXZELEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUdmLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFHVSxXQUFXO3NCQUQzQixTQUFTO3VCQUFDLGFBQWE7Z0JBSXhCLGFBQWEsTUFLYixhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2hlY2tEaXNhYmxlZCB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvc2hhcmVkJztcclxuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdG9vbHRpcCc7XHJcbmltcG9ydCB7IE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnRlIGludGVybm8gZGUgaXRlbSBpbmRpdmlkdWFsIGRlIGNoaXAsIHV0aWxpemFkbyBwZWxvIHtAbGluayBDaGlwc0NvbXBvbmVudH0uXHJcbiAqIFJlc3BvbnPDoXZlbCBwZWxhIHJlbmRlcml6YcOnw6NvIGRvIHRleHRvLCB0b29sdGlwIGUgYm90w6NvIGRlIHJlbW/Dp8OjbyBkZSBjYWRhIGNoaXAuXHJcbiAqXHJcbiAqIEBjYXRlZ29yeSBJbnB1dHNcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzLWNoaXAtaXRlbScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hpcC1pdGVtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbVG9vbHRpcERpcmVjdGl2ZSwgTmdUZW1wbGF0ZU91dGxldCwgTmdDbGFzcywgVHJhbnNsYXRlTW9kdWxlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENoaXBJdGVtQ29tcG9uZW50IHtcclxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udGXDumRvIGEgc2VyIGV4aWJpZG8gbm8gY2hpcCAoc3RyaW5nIG91IG9iamV0bykuIENhbXBvIG9icmlnYXTDs3Jpby4gKi9cclxuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGRhdGFSZW5kZXIhOiBzdHJpbmcgfCBPYmplY3Q7XHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlIGRvIG9iamV0byB1c2FkYSBwYXJhIGV4aWJpw6fDo28gcXVhbmRvIGBkYXRhUmVuZGVyYCBmb3IgdW0gb2JqZXRvLiBDYW1wbyBvYnJpZ2F0w7NyaW8uICovXHJcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBvYmplY3RGaWVsZCE6IHN0cmluZztcclxuICAgIC8qKiBAZGVzY3JpcHRpb24gRGVzYWJpbGl0YSBvcyBldmVudG9zIGRlIGNsaXF1ZSBkbyBjaGlwLiBDYW1wbyBvYnJpZ2F0w7NyaW8uICovXHJcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBUZW1wbGF0ZSBwZXJzb25hbGl6YWRvIHBhcmEgcmVuZGVyaXphw6fDo28gaW50ZXJuYSBkbyBjaGlwLiAqL1xyXG4gICAgQElucHV0KCkgdGVtcGxhdGVSZWYhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiDDjW5kaWNlIGRvIGNoaXAgbmEgbGlzdGEsIHVzYWRvIGFvIGVtaXRpciBvIGV2ZW50byBkZSByZW1vw6fDo28uIENhbXBvIG9icmlnYXTDs3Jpby4gKi9cclxuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGl0ZW1JbmRleCA9IC0xO1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSBvIHRvb2x0aXAgcGFyYSBjaGlwcyBjb20gdGV4dG8gdHJ1bmNhZG8uIENhbXBvIG9icmlnYXTDs3Jpby4gKi9cclxuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHNob3dUb29sdGlwID0gdHJ1ZTtcclxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGltaXRlIGRlIGNhcmFjdGVyZXMgZXhpYmlkb3MgYW50ZXMgZGUgdHJ1bmNhciBvIHRleHRvIGRvIGNoaXAuIENhbXBvIG9icmlnYXTDs3Jpby4gKi9cclxuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIG1heExlbmd0aFJlbmRlcldpdGhvdXRUb29sdGlwID0gMjA7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIGFvIGNsaWNhciBubyBib3TDo28gZGUgcmVtb8Onw6NvIGRvIGNoaXAuICovXHJcbiAgICBAT3V0cHV0KCkgY2xpY2tSZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaXRlbUluZGV4OiBudW1iZXI7IGV2ZW50OiBFdmVudCB9PigpO1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIGFvIGNsaWNhciBzb2JyZSBvIGNoaXAgKGZvcmEgZG8gYm90w6NvIGRlIHJlbW/Dp8OjbykuICovXHJcbiAgICBAT3V0cHV0KCkgY2hpcENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IEV2ZW50OyBkYXRhOiBzdHJpbmcgfCBPYmplY3QgfT4oKTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdjaGlwRWxlbWVudCcpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNoaXBFbGVtZW50PzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gICAgQENoZWNrRGlzYWJsZWQoKVxyXG4gICAgY2xpY2tlZFJlbW92ZSgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5jbGlja1JlbW92ZS5lbWl0KHsgaXRlbUluZGV4OiB0aGlzLml0ZW1JbmRleCwgZXZlbnQ6ICRldmVudCB9KTtcclxuICAgIH1cclxuICAgIEBDaGVja0Rpc2FibGVkKClcclxuICAgIG9uQ2hpcENsaWNrZWQoJGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuY2hpcENsaWNrZWQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIGRhdGE6IHRoaXMuZGF0YVJlbmRlciB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGlwRWxlbWVudD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBfdGV4dCgpIHtcclxuICAgICAgICBjb25zdCBfdGV4dCA9IHRoaXMuX3Jhd1RleHQ7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgX3RleHQuc3Vic3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICAgIF90ZXh0Lmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoUmVuZGVyV2l0aG91dFRvb2x0aXAgPyB0aGlzLm1heExlbmd0aFJlbmRlcldpdGhvdXRUb29sdGlwIDogX3RleHQubGVuZ3RoLFxyXG4gICAgICAgICAgICApICsgKF90ZXh0Lmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoUmVuZGVyV2l0aG91dFRvb2x0aXAgPyAnLi4uJyA6ICcnKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF9yYXdUZXh0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9iamVjdEZpZWxkID8gKHRoaXMuZGF0YVJlbmRlciBhcyBhbnkpW3RoaXMub2JqZWN0RmllbGRdIHx8ICcnIDogdGhpcy5kYXRhUmVuZGVyIHx8ICcnO1xyXG4gICAgfVxyXG59XHJcbiIsIjxuZy10ZW1wbGF0ZSAjaXRlbVJlbmRlcj5cbiAgICA8ZGl2XG4gICAgICAgICNjaGlwRWxlbWVudFxuICAgICAgICBjbGFzcz1cInJvdW5kZWQtbWVkaXVtIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTUwIGJnLWdyYXlzY2FsZS0xMCBicmVhay13b3JkcyB0ZXh0LXhzIHRleHQtY2VudGVyIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTEuNSBmb2N1czpvdXRsaW5lIGZvY3VzOm91dGxpbmUtMiBmb2N1czpvdXRsaW5lLWNyaXRpY2FsaXR5LWJsdWVcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdob3ZlcjpiZy1ncmF5c2NhbGUtMzAnOiAhZGlzYWJsZWQsICdvcGFjaXR5LTUwJzogZGlzYWJsZWQgfVwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIl9yYXdUZXh0ICsgJywgJyArICgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnJlbW92ZScgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQgPyAtMSA6IDBcIlxuICAgICAgICAoY2xpY2spPVwib25DaGlwQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25DaGlwQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib25DaGlwQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uYmFja3NwYWNlKT1cImNsaWNrZWRSZW1vdmUoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duLmRlbGV0ZSk9XCJjbGlja2VkUmVtb3ZlKCRldmVudClcIlxuICAgICAgICBbc1Rvb2x0aXBdPVwiX3Jhd1RleHRcIlxuICAgICAgICBbc2hvd0RlbGF5XT1cIjBcIlxuICAgICAgICBbdmlzaWJsZV09XCJzaG93VG9vbHRpcCA/IF9yYXdUZXh0Lmxlbmd0aCA+IG1heExlbmd0aFJlbmRlcldpdGhvdXRUb29sdGlwIDogZmFsc2VcIj5cbiAgICAgICAgICAgIEBpZih0ZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVJlZjsgY29udGV4dDogeyAkaW1wbGljaXQ6IGRhdGFSZW5kZXIsIHRleHQ6IF90ZXh0IH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIHt7IF90ZXh0IH19XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFtuZ0NsYXNzXT1cInsgJ2N1cnNvci1wb2ludGVyJzogIWRpc2FibGVkLCAnY3Vyc29yLWRlZmF1bHQnOiBkaXNhYmxlZCB9XCIgKGNsaWNrKT1cImNsaWNrZWRSZW1vdmUoJGV2ZW50KVwiPjwvaT5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuQGlmKG9iamVjdEZpZWxkICYmICF0ZW1wbGF0ZVJlZikge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtUmVuZGVyO1wiPjwvbmctY29udGFpbmVyPlxufVxuXG5AaWYoIW9iamVjdEZpZWxkICYmICF0ZW1wbGF0ZVJlZikge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtUmVuZGVyO1wiPjwvbmctY29udGFpbmVyPlxufVxuXG5AaWYodGVtcGxhdGVSZWYpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVJlbmRlclwiPjwvbmctY29udGFpbmVyPlxufVxuIl19
|