systelab-virtual-keyboard 19.0.0 → 20.1.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 (30) hide show
  1. package/README.md +11 -0
  2. package/fesm2022/systelab-virtual-keyboard.mjs +197 -117
  3. package/fesm2022/systelab-virtual-keyboard.mjs.map +1 -1
  4. package/index.d.ts +182 -6
  5. package/index.d.ts.map +1 -0
  6. package/package.json +6 -8
  7. package/scss/default-theme.scss +102 -0
  8. package/esm2022/lib/constants.mjs +0 -37
  9. package/esm2022/lib/systelab-virtual-keyboard-overlay.service.mjs +0 -177
  10. package/esm2022/lib/systelab-virtual-keyboard.component.mjs +0 -375
  11. package/esm2022/lib/systelab-virtual-keyboard.config.mjs +0 -3
  12. package/esm2022/lib/systelab-virtual-keyboard.directive.mjs +0 -215
  13. package/esm2022/lib/systelab-virtual-keyboard.module.mjs +0 -45
  14. package/esm2022/public-api.mjs +0 -7
  15. package/esm2022/systelab-virtual-keyboard.mjs +0 -5
  16. package/lib/constants.d.ts +0 -25
  17. package/lib/constants.d.ts.map +0 -1
  18. package/lib/systelab-virtual-keyboard-overlay.service.d.ts +0 -38
  19. package/lib/systelab-virtual-keyboard-overlay.service.d.ts.map +0 -1
  20. package/lib/systelab-virtual-keyboard.component.d.ts +0 -43
  21. package/lib/systelab-virtual-keyboard.component.d.ts.map +0 -1
  22. package/lib/systelab-virtual-keyboard.config.d.ts +0 -10
  23. package/lib/systelab-virtual-keyboard.config.d.ts.map +0 -1
  24. package/lib/systelab-virtual-keyboard.directive.d.ts +0 -44
  25. package/lib/systelab-virtual-keyboard.directive.d.ts.map +0 -1
  26. package/lib/systelab-virtual-keyboard.module.d.ts +0 -15
  27. package/lib/systelab-virtual-keyboard.module.d.ts.map +0 -1
  28. package/public-api.d.ts +0 -5
  29. package/public-api.d.ts.map +0 -1
  30. package/systelab-virtual-keyboard.d.ts.map +0 -1
@@ -1,375 +0,0 @@
1
- import { Component, EventEmitter, HostListener, Inject, Optional, Output } from '@angular/core';
2
- import { SimpleKeyboard } from 'simple-keyboard';
3
- import { SystelabVirtualKeyboardButton, SystelabVirtualKeyboardInputMethods, SystelabVirtualKeyboardLayouts } from './constants';
4
- import { VIRTUAL_KEYBOARD_CONFIG } from './systelab-virtual-keyboard.config';
5
- import * as i0 from "@angular/core";
6
- export class SystelabVirtualKeyboardComponent {
7
- handleKeyUp(event) {
8
- if (event.isTrusted) {
9
- this.caretEventHandler(event);
10
- }
11
- }
12
- handleMouseUp(event) {
13
- this.caretEventHandler(event);
14
- }
15
- get maxLength() {
16
- return this.activeInputElement?.maxLength ?? -1;
17
- }
18
- get isTextarea() {
19
- return this.activeInputElement?.type === 'textarea';
20
- }
21
- constructor(elementRef, virtualKeyboardConfig) {
22
- this.elementRef = elementRef;
23
- this.virtualKeyboardConfig = virtualKeyboardConfig;
24
- this.debug = false;
25
- this.selectedLayout = SystelabVirtualKeyboardLayouts.default;
26
- this.caretPosition = null;
27
- this.caretPositionEnd = null;
28
- this.shiftPressed = false;
29
- this.closePanel = new EventEmitter();
30
- }
31
- ngAfterViewInit() {
32
- const layout = {
33
- [SystelabVirtualKeyboardLayouts.default]: [
34
- '` 1 2 3 4 5 6 7 8 9 0 - = {bksp}',
35
- '{tab} q w e r t y u i o p [ ] \\',
36
- "{lock} a s d f g h j k l ; ' {enter}",
37
- '{shift} z x c v b n m , . / {shift}',
38
- '{space}',
39
- ],
40
- [SystelabVirtualKeyboardLayouts.shift]: [
41
- '~ ! @ # $ % ^ & * ( ) _ + {bksp}',
42
- '{tab} Q W E R T Y U I O P { } |',
43
- '{lock} A S D F G H J K L : " {enter}',
44
- '{shift} Z X C V B N M < > ? {shift}',
45
- '{space}',
46
- ],
47
- [SystelabVirtualKeyboardLayouts.numeric]: ['7 8 9', '4 5 6', '1 2 3', '0 {bksp}'],
48
- };
49
- const keyboardOptions = this.prepareKeyboardConfig();
50
- this.keyboard = new SimpleKeyboard('.simple-keyboard', keyboardOptions);
51
- this.setLayout(this.selectedLayout);
52
- if (this.debug) {
53
- console.log('Layout: ', layout);
54
- }
55
- }
56
- setActiveInput(input) {
57
- this.activeInputElement = input;
58
- if (this.debug) {
59
- const inputType = this.activeInputElement?.type;
60
- console.log('Layout:', `${inputType}_${this.selectedLayout}`);
61
- }
62
- const { selectionStart, selectionEnd } = this.activeInputElement;
63
- this.setCaretPosition(selectionStart, selectionEnd);
64
- if (this.debug) {
65
- console.log('Caret start at:', this.caretPosition, this.caretPositionEnd);
66
- }
67
- this.focusActiveInput();
68
- }
69
- setLayout(layout) {
70
- this.selectedLayout = layout;
71
- if (this.keyboard) {
72
- this.keyboard.setOptions({
73
- layoutName: layout,
74
- });
75
- }
76
- }
77
- prepareKeyboardConfig() {
78
- const layout = {
79
- [SystelabVirtualKeyboardLayouts.default]: [
80
- '` 1 2 3 4 5 6 7 8 9 0 - = {bksp}',
81
- '{tab} q w e r t y u i o p [ ] \\',
82
- "{lock} a s d f g h j k l ; ' {enter}",
83
- '{shift} z x c v b n m , . / {shift}',
84
- '{space}',
85
- ],
86
- [SystelabVirtualKeyboardLayouts.shift]: [
87
- '~ ! @ # $ % ^ & * ( ) _ + {bksp}',
88
- '{tab} Q W E R T Y U I O P { } |',
89
- '{lock} A S D F G H J K L : " {enter}',
90
- '{shift} Z X C V B N M < > ? {shift}',
91
- '{space}',
92
- ],
93
- [SystelabVirtualKeyboardLayouts.numeric]: ['7 8 9', '4 5 6', '1 2 3', '0 {bksp}'],
94
- };
95
- let keyboardOptions = {
96
- onKeyPress: (button) => this.handleKeyPress(button),
97
- mergeDisplay: true,
98
- theme: 'hg-theme-default hg-layout-default myTheme',
99
- display: {
100
- [SystelabVirtualKeyboardButton.Backspace]: 'delete',
101
- },
102
- buttonTheme: [
103
- {
104
- class: 'virtual-keyboard-delete-button',
105
- buttons: `${SystelabVirtualKeyboardButton.Backspace}`,
106
- },
107
- ],
108
- layout,
109
- };
110
- if (this.virtualKeyboardConfig?.hasOwnProperty('inputMethod')) {
111
- if (this.virtualKeyboardConfig.inputMethod === SystelabVirtualKeyboardInputMethods.onlyMouseEvents) {
112
- keyboardOptions = {
113
- ...keyboardOptions,
114
- useMouseEvents: true,
115
- };
116
- }
117
- else if (this.virtualKeyboardConfig.inputMethod === SystelabVirtualKeyboardInputMethods.onlyTouchEvents) {
118
- keyboardOptions = {
119
- ...keyboardOptions,
120
- useTouchEvents: true,
121
- };
122
- }
123
- }
124
- return keyboardOptions;
125
- }
126
- handleKeyPress(button, e) {
127
- if (this.debug) {
128
- console.log('Key press:', button);
129
- }
130
- if (button[0] === '&' && button.length > 1) {
131
- button = new DOMParser().parseFromString(button, 'text/html').body.textContent;
132
- }
133
- if (button === SystelabVirtualKeyboardButton.Shift || button === SystelabVirtualKeyboardButton.Lock) {
134
- this.shiftPressed = button === SystelabVirtualKeyboardButton.Shift;
135
- this.toggleShiftLayout();
136
- }
137
- else if (button === SystelabVirtualKeyboardButton.Done) {
138
- this.closePanel.emit();
139
- return;
140
- }
141
- if (!this.isAcceptedNonStandardButton(button) && !this.isStandardButton(button)) {
142
- return;
143
- }
144
- const output = this.handleButtonOutput(button);
145
- if (this.activeInputElement) {
146
- this.activeInputElement.value = output;
147
- if (this.debug) {
148
- console.log('Caret at:', this.caretPosition, this.caretPositionEnd, 'Button', e);
149
- }
150
- }
151
- this.dispatchEvents(button);
152
- if (this.shiftPressed) {
153
- this.toggleShiftLayout();
154
- }
155
- this.shiftPressed = button === SystelabVirtualKeyboardButton.Shift;
156
- }
157
- handleButtonOutput(button) {
158
- const commonParams = this.getCommonParams();
159
- let output = this.activeInputElement?.value || '';
160
- if (!this.isStandardButton(button)) {
161
- if (button === SystelabVirtualKeyboardButton.Backspace) {
162
- output = this.removeAt(output, ...commonParams);
163
- }
164
- else if (button === SystelabVirtualKeyboardButton.Space) {
165
- output = this.addStringAt(output, ' ', ...commonParams);
166
- }
167
- else if (button === SystelabVirtualKeyboardButton.Tab) {
168
- // Do nothing for tab
169
- }
170
- else if (button === SystelabVirtualKeyboardButton.Enter) {
171
- if (this.isTextarea) {
172
- output = this.addStringAt(output, '\n', ...commonParams);
173
- }
174
- }
175
- else {
176
- return;
177
- }
178
- }
179
- else {
180
- output = this.addStringAt(output, button, ...commonParams);
181
- }
182
- return output;
183
- }
184
- getCommonParams() {
185
- return [this.caretPosition || 0, this.caretPositionEnd || 0, true];
186
- }
187
- isAcceptedNonStandardButton(button) {
188
- return [
189
- SystelabVirtualKeyboardButton.Backspace.toString(),
190
- SystelabVirtualKeyboardButton.Space.toString(),
191
- SystelabVirtualKeyboardButton.Tab.toString(),
192
- SystelabVirtualKeyboardButton.Enter.toString(),
193
- ].includes(button);
194
- }
195
- dispatchEvents(button) {
196
- const { key, code } = this.convertFromButtonToCode(button);
197
- const eventInit = {
198
- bubbles: true,
199
- cancelable: true,
200
- shiftKey: this.selectedLayout === SystelabVirtualKeyboardLayouts.shift,
201
- key: key,
202
- code: code,
203
- location: 0,
204
- };
205
- // Simulate all needed events on base element
206
- this.activeInputElement?.dispatchEvent(new KeyboardEvent('keydown', eventInit));
207
- this.activeInputElement?.dispatchEvent(new KeyboardEvent('keypress', eventInit));
208
- this.activeInputElement?.dispatchEvent(new Event('input', { bubbles: true }));
209
- this.activeInputElement?.dispatchEvent(new KeyboardEvent('keyup', eventInit));
210
- }
211
- /*
212
- * AUXILIARY METHODS
213
- * */
214
- convertFromButtonToCode(button) {
215
- let key;
216
- let code;
217
- if (button.includes('{') && button.includes('}')) {
218
- // Capitalize name
219
- key = button.slice(1, button.length - 1).toLowerCase();
220
- key = key.charAt(0).toUpperCase() + key.slice(1);
221
- code = key;
222
- // Fix to standard key code
223
- if (code.toLowerCase() === SystelabVirtualKeyboardButton.Backspace.slice(1, SystelabVirtualKeyboardButton.Backspace.length - 1).toLowerCase()) {
224
- code = 'Backspace';
225
- }
226
- }
227
- else {
228
- key = button;
229
- code = Number.isInteger(Number(button)) ? `Digit${button}` : `Key${button.toUpperCase()}`;
230
- }
231
- return { key, code };
232
- }
233
- toggleShiftLayout() {
234
- const currentLayout = this.keyboard.options.layoutName;
235
- const selectedLayout = currentLayout === SystelabVirtualKeyboardLayouts.default ? SystelabVirtualKeyboardLayouts.shift : SystelabVirtualKeyboardLayouts.default;
236
- this.setLayout(selectedLayout);
237
- }
238
- isStandardButton(button) {
239
- return button && !(button[0] === '{' && button[button.length - 1] === '}');
240
- }
241
- /*
242
- * OUTPUT STRING METHODS
243
- * */
244
- removeAt(source, position = source.length, positionEnd = source.length, moveCaret = false) {
245
- if (position === 0 && positionEnd === 0) {
246
- return source;
247
- }
248
- let output;
249
- if (position === positionEnd) {
250
- if (position && position >= 0) {
251
- output = source.slice(0, position - 1) + source.slice(position);
252
- if (moveCaret) {
253
- this.updateCaretPosition(1, true);
254
- }
255
- }
256
- else {
257
- output = source.slice(0, -1);
258
- if (moveCaret) {
259
- this.updateCaretPosition(1, true);
260
- }
261
- }
262
- }
263
- else {
264
- output = source.slice(0, position) + source.slice(positionEnd);
265
- if (moveCaret) {
266
- this.setCaretPosition(position);
267
- }
268
- }
269
- return output;
270
- }
271
- addStringAt(source, str, position = source.length, positionEnd = source.length, moveCaret = false) {
272
- if (this.maxLength !== -1 && source.length >= this.maxLength) {
273
- return source;
274
- }
275
- let output;
276
- if (!position && position !== 0) {
277
- output = source + str;
278
- }
279
- else {
280
- output = [source.slice(0, position), str, source.slice(positionEnd)].join('');
281
- if (moveCaret) {
282
- this.updateCaretPosition(str.length, false);
283
- }
284
- }
285
- return output;
286
- }
287
- /*
288
- * CARET METHODS
289
- * */
290
- caretEventHandler(event) {
291
- let targetTagName = '';
292
- if (event.target.tagName) {
293
- targetTagName = event.target.tagName.toLowerCase();
294
- }
295
- const isTextInput = targetTagName === 'textarea' ||
296
- (targetTagName === 'input' && ['text', 'search', 'email', 'password', 'url', 'tel'].includes(event.target.type));
297
- const isKeyboard = event.target === this.elementRef.nativeElement || (event.target && this.elementRef.nativeElement.contains(event.target));
298
- if (isTextInput && this.activeInputElement == event.target) {
299
- /**
300
- * Tracks current cursor position
301
- * As keys are pressed, text will be added/removed at that position within the input.
302
- */
303
- this.setCaretPosition(event.target.selectionStart, event.target.selectionEnd);
304
- if (this.debug) {
305
- console.log('Caret at:', this.caretPosition, this.caretPositionEnd, event && event.target.tagName.toLowerCase(), event);
306
- }
307
- }
308
- else if (event.type === 'pointerup' && this.activeInputElement === document.activeElement) {
309
- return;
310
- }
311
- else if (!isKeyboard && event?.type !== 'selectionchange') {
312
- /**
313
- * we must ensure caretPosition doesn't persist once reactivated.
314
- */
315
- this.setCaretPosition(null);
316
- if (this.debug) {
317
- console.log(`Caret position reset due to "${event?.type}" event`, event);
318
- }
319
- }
320
- }
321
- focusActiveInput() {
322
- this.activeInputElement?.focus();
323
- this.activeInputElement?.setSelectionRange(this.caretPosition, this.caretPositionEnd);
324
- }
325
- updateCaretPosition(length, minus = false) {
326
- const newCaretPos = this.computeNewCaretPosition(length, minus);
327
- this.setCaretPosition(newCaretPos);
328
- // Scroll to bottom
329
- setTimeout(() => {
330
- this.activeInputElement?.scrollTo({
331
- top: this.activeInputElement.scrollHeight,
332
- });
333
- });
334
- }
335
- computeNewCaretPosition(length, minus = false) {
336
- let caretPosition = this.caretPosition;
337
- if (caretPosition != null) {
338
- if (minus) {
339
- if (caretPosition > 0)
340
- caretPosition = caretPosition - length;
341
- }
342
- else {
343
- caretPosition = caretPosition + length;
344
- }
345
- }
346
- return caretPosition;
347
- }
348
- setCaretPosition(position, endPosition = position) {
349
- this.caretPosition = position;
350
- this.caretPositionEnd = endPosition;
351
- }
352
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: SystelabVirtualKeyboardComponent, deps: [{ token: i0.ElementRef }, { token: VIRTUAL_KEYBOARD_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
353
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.8", type: SystelabVirtualKeyboardComponent, isStandalone: true, selector: "systelab-virtual-keyboard.component", outputs: { closePanel: "closePanel" }, host: { listeners: { "window:keyup": "handleKeyUp($event)", "window:pointerup": "handleMouseUp($event)", "window:mouseup": "handleMouseUp($event)" } }, ngImport: i0, template: "<!--\n ~ Copyright (c) 2020 - 2024 - Instrumentation Laboratory Company and Systelab Technologies, SA. All rights reserved.\n ~ NOTICE: All information contained herein is and remains the property of Instrumentation Laboratory Company and its\n ~ affiliates, if any. The intellectual and technical concepts contained herein are proprietary to Instrumentation\n ~ Laboratory Company and its affiliates and may be covered by U.S. and foreign patents and patent applications, and/or\n ~ are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is\n ~ strictly forbidden unless prior written permission is Instrumentation Laboratory Company.\n -->\n\n<div class=\"simple-keyboard\"></div>\n", styles: [":host{width:100%}.simple-keyboard.hg-theme-default.myTheme{font-family:var(--systelab-virtual-keyboard-font-family)}\n"] }); }
354
- }
355
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: SystelabVirtualKeyboardComponent, decorators: [{
356
- type: Component,
357
- args: [{ selector: 'systelab-virtual-keyboard.component', standalone: true, imports: [], template: "<!--\n ~ Copyright (c) 2020 - 2024 - Instrumentation Laboratory Company and Systelab Technologies, SA. All rights reserved.\n ~ NOTICE: All information contained herein is and remains the property of Instrumentation Laboratory Company and its\n ~ affiliates, if any. The intellectual and technical concepts contained herein are proprietary to Instrumentation\n ~ Laboratory Company and its affiliates and may be covered by U.S. and foreign patents and patent applications, and/or\n ~ are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is\n ~ strictly forbidden unless prior written permission is Instrumentation Laboratory Company.\n -->\n\n<div class=\"simple-keyboard\"></div>\n", styles: [":host{width:100%}.simple-keyboard.hg-theme-default.myTheme{font-family:var(--systelab-virtual-keyboard-font-family)}\n"] }]
358
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
359
- type: Optional
360
- }, {
361
- type: Inject,
362
- args: [VIRTUAL_KEYBOARD_CONFIG]
363
- }] }], propDecorators: { handleKeyUp: [{
364
- type: HostListener,
365
- args: ['window:keyup', ['$event']]
366
- }], handleMouseUp: [{
367
- type: HostListener,
368
- args: ['window:pointerup', ['$event']]
369
- }, {
370
- type: HostListener,
371
- args: ['window:mouseup', ['$event']]
372
- }], closePanel: [{
373
- type: Output
374
- }] } });
375
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVsYWItdmlydHVhbC1rZXlib2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi12aXJ0dWFsLWtleWJvYXJkL3NyYy9saWIvc3lzdGVsYWItdmlydHVhbC1rZXlib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi12aXJ0dWFsLWtleWJvYXJkL3NyYy9saWIvc3lzdGVsYWItdmlydHVhbC1rZXlib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFDSCw2QkFBNkIsRUFDN0IsbUNBQW1DLEVBQ25DLDhCQUE4QixFQUNqQyxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQWlDLHVCQUF1QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBVTVHLE1BQU0sT0FBTyxnQ0FBZ0M7SUFFekMsV0FBVyxDQUFDLEtBQW9CO1FBQzVCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztJQUlELGFBQWEsQ0FBQyxLQUFtQjtRQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsa0JBQWtC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QUFDO0lBQ3hDLENBQUM7OEdBNVlRLGdDQUFnQyw0Q0FnQ3lDLHVCQUF1QjtrR0FoQ2hHLGdDQUFnQyw4UkMxQjdDLG12QkFVQTs7MkZEZ0JhLGdDQUFnQztrQkFQNUMsU0FBUzsrQkFDSSxxQ0FBcUMsY0FDbkMsSUFBSSxXQUNQLEVBQUU7OzBCQW9Db0QsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx1QkFBdUI7eUNBOUJ6RyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVN4QyxhQUFhO3NCQUZaLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUMzQyxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXFCaEMsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTaW1wbGVLZXlib2FyZCB9IGZyb20gJ3NpbXBsZS1rZXlib2FyZCc7XG5pbXBvcnQge1xuICAgIFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLFxuICAgIFN5c3RlbGFiVmlydHVhbEtleWJvYXJkSW5wdXRNZXRob2RzLFxuICAgIFN5c3RlbGFiVmlydHVhbEtleWJvYXJkTGF5b3V0c1xufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZENvbmZpZywgVklSVFVBTF9LRVlCT0FSRF9DT05GSUcgfSBmcm9tICcuL3N5c3RlbGFiLXZpcnR1YWwta2V5Ym9hcmQuY29uZmlnJztcbmltcG9ydCB7IEtleWJvYXJkT3B0aW9ucyB9IGZyb20gJ3NpbXBsZS1rZXlib2FyZC9idWlsZC9pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzeXN0ZWxhYi12aXJ0dWFsLWtleWJvYXJkLmNvbXBvbmVudCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3lzdGVsYWItdmlydHVhbC1rZXlib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICdzeXN0ZWxhYi12aXJ0dWFsLWtleWJvYXJkLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxuICAgIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5pc1RydXN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJ1cCcsIFsnJGV2ZW50J10pXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNldXAnLCBbJyRldmVudCddKVxuICAgIGhhbmRsZU1vdXNlVXAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcbiAgICB9XG5cbiAgICBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUlucHV0RWxlbWVudD8ubWF4TGVuZ3RoID8/IC0xO1xuICAgIH1cblxuICAgIGdldCBpc1RleHRhcmVhKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJbnB1dEVsZW1lbnQ/LnR5cGUgPT09ICd0ZXh0YXJlYSc7XG4gICAgfVxuXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzZWxlY3RlZExheW91dDogU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRMYXlvdXRzID0gU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRMYXlvdXRzLmRlZmF1bHQ7XG4gICAgcHJpdmF0ZSBrZXlib2FyZDogU2ltcGxlS2V5Ym9hcmQ7XG4gICAgcHJpdmF0ZSBjYXJldFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGNhcmV0UG9zaXRpb25FbmQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgYWN0aXZlSW5wdXRFbGVtZW50ITogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgIHByaXZhdGUgc2hpZnRQcmVzc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KCkgY2xvc2VQYW5lbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PiwgQE9wdGlvbmFsKCkgQEluamVjdChWSVJUVUFMX0tFWUJPQVJEX0NPTkZJRykgcHJpdmF0ZSB2aXJ0dWFsS2V5Ym9hcmRDb25maWc6IFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQ29uZmlnLCkge1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0ge1xuICAgICAgICAgICAgW1N5c3RlbGFiVmlydHVhbEtleWJvYXJkTGF5b3V0cy5kZWZhdWx0XTogW1xuICAgICAgICAgICAgICAgICdgIDEgMiAzIDQgNSA2IDcgOCA5IDAgLSA9IHtia3NwfScsXG4gICAgICAgICAgICAgICAgJ3t0YWJ9IHEgdyBlIHIgdCB5IHUgaSBvIHAgWyBdIFxcXFwnLFxuICAgICAgICAgICAgICAgIFwie2xvY2t9IGEgcyBkIGYgZyBoIGogayBsIDsgJyB7ZW50ZXJ9XCIsXG4gICAgICAgICAgICAgICAgJ3tzaGlmdH0geiB4IGMgdiBiIG4gbSAsIC4gLyB7c2hpZnR9JyxcbiAgICAgICAgICAgICAgICAne3NwYWNlfScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1N5c3RlbGFiVmlydHVhbEtleWJvYXJkTGF5b3V0cy5zaGlmdF06IFtcbiAgICAgICAgICAgICAgICAnfiAhIEAgIyAkICUgXiAmYW1wOyAqICggKSBfICsge2Jrc3B9JyxcbiAgICAgICAgICAgICAgICAne3RhYn0gUSBXIEUgUiBUIFkgVSBJIE8gUCB7IH0gfCcsXG4gICAgICAgICAgICAgICAgJ3tsb2NrfSBBIFMgRCBGIEcgSCBKIEsgTCA6IFwiIHtlbnRlcn0nLFxuICAgICAgICAgICAgICAgICd7c2hpZnR9IFogWCBDIFYgQiBOIE0gJmx0OyAmZ3Q7ID8ge3NoaWZ0fScsXG4gICAgICAgICAgICAgICAgJ3tzcGFjZX0nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZExheW91dHMubnVtZXJpY106IFsnNyA4IDknLCAnNCA1IDYnLCAnMSAyIDMnLCAnMCB7YmtzcH0nXSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBrZXlib2FyZE9wdGlvbnM6IEtleWJvYXJkT3B0aW9ucyA9IHRoaXMucHJlcGFyZUtleWJvYXJkQ29uZmlnKCk7XG4gICAgICAgIHRoaXMua2V5Ym9hcmQgPSBuZXcgU2ltcGxlS2V5Ym9hcmQoJy5zaW1wbGUta2V5Ym9hcmQnLCBrZXlib2FyZE9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNldExheW91dCh0aGlzLnNlbGVjdGVkTGF5b3V0KTtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdMYXlvdXQ6ICcsIGxheW91dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWN0aXZlSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5wdXRFbGVtZW50ID0gaW5wdXQ7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0VHlwZSA9IHRoaXMuYWN0aXZlSW5wdXRFbGVtZW50Py50eXBlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0xheW91dDonLCBgJHtpbnB1dFR5cGV9XyR7dGhpcy5zZWxlY3RlZExheW91dH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gdGhpcy5hY3RpdmVJbnB1dEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc2V0Q2FyZXRQb3NpdGlvbihzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhcmV0IHN0YXJ0IGF0OicsIHRoaXMuY2FyZXRQb3NpdGlvbiwgdGhpcy5jYXJldFBvc2l0aW9uRW5kKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlSW5wdXQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TGF5b3V0KGxheW91dDogU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRMYXlvdXRzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkKSB7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkLnNldE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgIGxheW91dE5hbWU6IGxheW91dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlS2V5Ym9hcmRDb25maWcoKTogS2V5Ym9hcmRPcHRpb25zIHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0ge1xuICAgICAgICAgICAgW1N5c3RlbGFiVmlydHVhbEtleWJvYXJkTGF5b3V0cy5kZWZhdWx0XTogW1xuICAgICAgICAgICAgICAgICdgIDEgMiAzIDQgNSA2IDcgOCA5IDAgLSA9IHtia3NwfScsXG4gICAgICAgICAgICAgICAgJ3t0YWJ9IHEgdyBlIHIgdCB5IHUgaSBvIHAgWyBdIFxcXFwnLFxuICAgICAgICAgICAgICAgIFwie2xvY2t9IGEgcyBkIGYgZyBoIGogayBsIDsgJyB7ZW50ZXJ9XCIsXG4gICAgICAgICAgICAgICAgJ3tzaGlmdH0geiB4IGMgdiBiIG4gbSAsIC4gLyB7c2hpZnR9JyxcbiAgICAgICAgICAgICAgICAne3NwYWNlfScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1N5c3RlbGFiVmlydHVhbEtleWJvYXJkTGF5b3V0cy5zaGlmdF06IFtcbiAgICAgICAgICAgICAgICAnfiAhIEAgIyAkICUgXiAmYW1wOyAqICggKSBfICsge2Jrc3B9JyxcbiAgICAgICAgICAgICAgICAne3RhYn0gUSBXIEUgUiBUIFkgVSBJIE8gUCB7IH0gfCcsXG4gICAgICAgICAgICAgICAgJ3tsb2NrfSBBIFMgRCBGIEcgSCBKIEsgTCA6IFwiIHtlbnRlcn0nLFxuICAgICAgICAgICAgICAgICd7c2hpZnR9IFogWCBDIFYgQiBOIE0gJmx0OyAmZ3Q7ID8ge3NoaWZ0fScsXG4gICAgICAgICAgICAgICAgJ3tzcGFjZX0nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZExheW91dHMubnVtZXJpY106IFsnNyA4IDknLCAnNCA1IDYnLCAnMSAyIDMnLCAnMCB7YmtzcH0nXSxcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQga2V5Ym9hcmRPcHRpb25zOiBLZXlib2FyZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvbktleVByZXNzOiAoYnV0dG9uKSA9PiB0aGlzLmhhbmRsZUtleVByZXNzKGJ1dHRvbiksXG4gICAgICAgICAgICBtZXJnZURpc3BsYXk6IHRydWUsXG4gICAgICAgICAgICB0aGVtZTogJ2hnLXRoZW1lLWRlZmF1bHQgaGctbGF5b3V0LWRlZmF1bHQgbXlUaGVtZScsXG4gICAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAgICAgW1N5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLkJhY2tzcGFjZV06ICdkZWxldGUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJ1dHRvblRoZW1lOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjbGFzczogJ3ZpcnR1YWwta2V5Ym9hcmQtZGVsZXRlLWJ1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6IGAke1N5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLkJhY2tzcGFjZX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbGF5b3V0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxLZXlib2FyZENvbmZpZz8uaGFzT3duUHJvcGVydHkoJ2lucHV0TWV0aG9kJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxLZXlib2FyZENvbmZpZy5pbnB1dE1ldGhvZCA9PT0gU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRJbnB1dE1ldGhvZHMub25seU1vdXNlRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAga2V5Ym9hcmRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5rZXlib2FyZE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHVzZU1vdXNlRXZlbnRzOiB0cnVlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52aXJ0dWFsS2V5Ym9hcmRDb25maWcuaW5wdXRNZXRob2QgPT09IFN5c3RlbGFiVmlydHVhbEtleWJvYXJkSW5wdXRNZXRob2RzLm9ubHlUb3VjaEV2ZW50cykge1xuICAgICAgICAgICAgICAgIGtleWJvYXJkT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4ua2V5Ym9hcmRPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICB1c2VUb3VjaEV2ZW50czogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5Ym9hcmRPcHRpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlS2V5UHJlc3MoYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0tleSBwcmVzczonLCBidXR0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJ1dHRvblswXSA9PT0gJyYnICYmIGJ1dHRvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBidXR0b24gPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGJ1dHRvbiwgJ3RleHQvaHRtbCcpLmJvZHkudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnV0dG9uID09PSBTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZEJ1dHRvbi5TaGlmdCB8fCBidXR0b24gPT09IFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLkxvY2spIHtcbiAgICAgICAgICAgIHRoaXMuc2hpZnRQcmVzc2VkID0gYnV0dG9uID09PSBTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZEJ1dHRvbi5TaGlmdDtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2hpZnRMYXlvdXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChidXR0b24gPT09IFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLkRvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbC5lbWl0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNBY2NlcHRlZE5vblN0YW5kYXJkQnV0dG9uKGJ1dHRvbikgJiYgIXRoaXMuaXNTdGFuZGFyZEJ1dHRvbihidXR0b24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmhhbmRsZUJ1dHRvbk91dHB1dChidXR0b24pO1xuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUlucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVJbnB1dEVsZW1lbnQudmFsdWUgPSBvdXRwdXQ7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhcmV0IGF0OicsIHRoaXMuY2FyZXRQb3NpdGlvbiwgdGhpcy5jYXJldFBvc2l0aW9uRW5kLCAnQnV0dG9uJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnRzKGJ1dHRvbik7XG5cbiAgICAgICAgaWYgKHRoaXMuc2hpZnRQcmVzc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVNoaWZ0TGF5b3V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaGlmdFByZXNzZWQgPSBidXR0b24gPT09IFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLlNoaWZ0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQnV0dG9uT3V0cHV0KGJ1dHRvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY29tbW9uUGFyYW1zOiBbbnVtYmVyLCBudW1iZXIsIGJvb2xlYW5dID0gdGhpcy5nZXRDb21tb25QYXJhbXMoKTtcbiAgICAgICAgbGV0IG91dHB1dCA9IHRoaXMuYWN0aXZlSW5wdXRFbGVtZW50Py52YWx1ZSB8fCAnJztcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RhbmRhcmRCdXR0b24oYnV0dG9uKSkge1xuICAgICAgICAgICAgaWYgKGJ1dHRvbiA9PT0gU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRCdXR0b24uQmFja3NwYWNlKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gdGhpcy5yZW1vdmVBdChvdXRwdXQsIC4uLmNvbW1vblBhcmFtcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJ1dHRvbiA9PT0gU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRCdXR0b24uU3BhY2UpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzLmFkZFN0cmluZ0F0KG91dHB1dCwgJyAnLCAuLi5jb21tb25QYXJhbXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChidXR0b24gPT09IFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLlRhYikge1xuICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcgZm9yIHRhYlxuICAgICAgICAgICAgfSBlbHNlIGlmIChidXR0b24gPT09IFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLkVudGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUZXh0YXJlYSkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzLmFkZFN0cmluZ0F0KG91dHB1dCwgJ1xcbicsIC4uLmNvbW1vblBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSB0aGlzLmFkZFN0cmluZ0F0KG91dHB1dCwgYnV0dG9uLCAuLi5jb21tb25QYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbW1vblBhcmFtcygpOiBbbnVtYmVyLCBudW1iZXIsIGJvb2xlYW5dIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLmNhcmV0UG9zaXRpb24gfHwgMCwgdGhpcy5jYXJldFBvc2l0aW9uRW5kIHx8IDAsIHRydWVdO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBY2NlcHRlZE5vblN0YW5kYXJkQnV0dG9uKGJ1dHRvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZEJ1dHRvbi5CYWNrc3BhY2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLlNwYWNlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZEJ1dHRvbi5UYWIudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLkVudGVyLnRvU3RyaW5nKCksXG4gICAgICAgIF0uaW5jbHVkZXMoYnV0dG9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc3BhdGNoRXZlbnRzKGJ1dHRvbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHtrZXksIGNvZGV9ID0gdGhpcy5jb252ZXJ0RnJvbUJ1dHRvblRvQ29kZShidXR0b24pO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5pdDogS2V5Ym9hcmRFdmVudEluaXQgPSB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNoaWZ0S2V5OiB0aGlzLnNlbGVjdGVkTGF5b3V0ID09PSBTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZExheW91dHMuc2hpZnQsXG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXG4gICAgICAgICAgICBsb2NhdGlvbjogMCxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gU2ltdWxhdGUgYWxsIG5lZWRlZCBldmVudHMgb24gYmFzZSBlbGVtZW50XG4gICAgICAgIHRoaXMuYWN0aXZlSW5wdXRFbGVtZW50Py5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgZXZlbnRJbml0KSk7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5wdXRFbGVtZW50Py5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KCdrZXlwcmVzcycsIGV2ZW50SW5pdCkpO1xuICAgICAgICB0aGlzLmFjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0Jywge2J1YmJsZXM6IHRydWV9KSk7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5wdXRFbGVtZW50Py5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KCdrZXl1cCcsIGV2ZW50SW5pdCkpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQVVYSUxJQVJZIE1FVEhPRFNcbiAgICAgKiAqL1xuICAgIHByaXZhdGUgY29udmVydEZyb21CdXR0b25Ub0NvZGUoYnV0dG9uOiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyBjb2RlOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCBrZXk6IHN0cmluZztcbiAgICAgICAgbGV0IGNvZGU6IHN0cmluZztcbiAgICAgICAgaWYgKGJ1dHRvbi5pbmNsdWRlcygneycpICYmIGJ1dHRvbi5pbmNsdWRlcygnfScpKSB7XG4gICAgICAgICAgICAvLyBDYXBpdGFsaXplIG5hbWVcbiAgICAgICAgICAgIGtleSA9IGJ1dHRvbi5zbGljZSgxLCBidXR0b24ubGVuZ3RoIC0gMSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGtleSA9IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKTtcbiAgICAgICAgICAgIGNvZGUgPSBrZXk7XG5cbiAgICAgICAgICAgIC8vIEZpeCB0byBzdGFuZGFyZCBrZXkgY29kZVxuICAgICAgICAgICAgaWYgKGNvZGUudG9Mb3dlckNhc2UoKSA9PT0gU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRCdXR0b24uQmFja3NwYWNlLnNsaWNlKDEsIFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQnV0dG9uLkJhY2tzcGFjZS5sZW5ndGggLSAxKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgY29kZSA9ICdCYWNrc3BhY2UnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gYnV0dG9uO1xuICAgICAgICAgICAgY29kZSA9IE51bWJlci5pc0ludGVnZXIoTnVtYmVyKGJ1dHRvbikpID8gYERpZ2l0JHtidXR0b259YCA6IGBLZXkke2J1dHRvbi50b1VwcGVyQ2FzZSgpfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2tleSwgY29kZX07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVTaGlmdExheW91dCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudExheW91dCA9IHRoaXMua2V5Ym9hcmQub3B0aW9ucy5sYXlvdXROYW1lO1xuICAgICAgICBjb25zdCBzZWxlY3RlZExheW91dDogU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRMYXlvdXRzID1cbiAgICAgICAgICAgIGN1cnJlbnRMYXlvdXQgPT09IFN5c3RlbGFiVmlydHVhbEtleWJvYXJkTGF5b3V0cy5kZWZhdWx0ID8gU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRMYXlvdXRzLnNoaWZ0IDogU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRMYXlvdXRzLmRlZmF1bHQ7XG5cbiAgICAgICAgdGhpcy5zZXRMYXlvdXQoc2VsZWN0ZWRMYXlvdXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTdGFuZGFyZEJ1dHRvbihidXR0b246IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYnV0dG9uICYmICEoYnV0dG9uWzBdID09PSAneycgJiYgYnV0dG9uW2J1dHRvbi5sZW5ndGggLSAxXSA9PT0gJ30nKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIE9VVFBVVCBTVFJJTkcgTUVUSE9EU1xuICAgICAqICovXG4gICAgcHJpdmF0ZSByZW1vdmVBdChzb3VyY2U6IHN0cmluZywgcG9zaXRpb24gPSBzb3VyY2UubGVuZ3RoLCBwb3NpdGlvbkVuZCA9IHNvdXJjZS5sZW5ndGgsIG1vdmVDYXJldCA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwICYmIHBvc2l0aW9uRW5kID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG91dHB1dDogc3RyaW5nO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gcG9zaXRpb25FbmQpIHtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbiAmJiBwb3NpdGlvbiA+PSAwKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIHBvc2l0aW9uIC0gMSkgKyBzb3VyY2Uuc2xpY2UocG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChtb3ZlQ2FyZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJldFBvc2l0aW9uKDEsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgICBpZiAobW92ZUNhcmV0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FyZXRQb3NpdGlvbigxLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBzb3VyY2Uuc2xpY2UoMCwgcG9zaXRpb24pICsgc291cmNlLnNsaWNlKHBvc2l0aW9uRW5kKTtcbiAgICAgICAgICAgIGlmIChtb3ZlQ2FyZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhcmV0UG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFN0cmluZ0F0KHNvdXJjZTogc3RyaW5nLCBzdHI6IHN0cmluZywgcG9zaXRpb24gPSBzb3VyY2UubGVuZ3RoLCBwb3NpdGlvbkVuZCA9IHNvdXJjZS5sZW5ndGgsIG1vdmVDYXJldCA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMubWF4TGVuZ3RoICE9PSAtMSAmJiBzb3VyY2UubGVuZ3RoID49IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG91dHB1dDogc3RyaW5nO1xuXG4gICAgICAgIGlmICghcG9zaXRpb24gJiYgcG9zaXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIG91dHB1dCA9IHNvdXJjZSArIHN0cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dCA9IFtzb3VyY2Uuc2xpY2UoMCwgcG9zaXRpb24pLCBzdHIsIHNvdXJjZS5zbGljZShwb3NpdGlvbkVuZCldLmpvaW4oJycpO1xuICAgICAgICAgICAgaWYgKG1vdmVDYXJldCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FyZXRQb3NpdGlvbihzdHIubGVuZ3RoLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cblxuICAgIC8qXG4gICAgICAgKiBDQVJFVCBNRVRIT0RTXG4gICAgICAgKiAqL1xuICAgIHByaXZhdGUgY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICBsZXQgdGFyZ2V0VGFnTmFtZSA9ICcnO1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRhcmdldFRhZ05hbWUgPSBldmVudC50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNUZXh0SW5wdXQgPVxuICAgICAgICAgICAgdGFyZ2V0VGFnTmFtZSA9PT0gJ3RleHRhcmVhJyB8fFxuICAgICAgICAgICAgKHRhcmdldFRhZ05hbWUgPT09ICdpbnB1dCcgJiYgWyd0ZXh0JywgJ3NlYXJjaCcsICdlbWFpbCcsICdwYXNzd29yZCcsICd1cmwnLCAndGVsJ10uaW5jbHVkZXMoZXZlbnQudGFyZ2V0LnR5cGUpKTtcblxuICAgICAgICBjb25zdCBpc0tleWJvYXJkID1cbiAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgfHwgKGV2ZW50LnRhcmdldCAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKTtcblxuICAgICAgICBpZiAoaXNUZXh0SW5wdXQgJiYgdGhpcy5hY3RpdmVJbnB1dEVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0KSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRyYWNrcyBjdXJyZW50IGN1cnNvciBwb3NpdGlvblxuICAgICAgICAgICAgICogQXMga2V5cyBhcmUgcHJlc3NlZCwgdGV4dCB3aWxsIGJlIGFkZGVkL3JlbW92ZWQgYXQgdGhhdCBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLnNldENhcmV0UG9zaXRpb24oZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0LCBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ2FyZXQgYXQ6JywgdGhpcy5jYXJldFBvc2l0aW9uLCB0aGlzLmNhcmV0UG9zaXRpb25FbmQsIGV2ZW50ICYmIGV2ZW50LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSAncG9pbnRlcnVwJyAmJiB0aGlzLmFjdGl2ZUlucHV0RWxlbWVudCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0tleWJvYXJkICYmIGV2ZW50Py50eXBlICE9PSAnc2VsZWN0aW9uY2hhbmdlJykge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB3ZSBtdXN0IGVuc3VyZSBjYXJldFBvc2l0aW9uIGRvZXNuJ3QgcGVyc2lzdCBvbmNlIHJlYWN0aXZhdGVkLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLnNldENhcmV0UG9zaXRpb24obnVsbCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENhcmV0IHBvc2l0aW9uIHJlc2V0IGR1ZSB0byBcIiR7ZXZlbnQ/LnR5cGV9XCIgZXZlbnRgLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzQWN0aXZlSW5wdXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5wdXRFbGVtZW50Py5mb2N1cygpO1xuICAgICAgICB0aGlzLmFjdGl2ZUlucHV0RWxlbWVudD8uc2V0U2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgICAgICB0aGlzLmNhcmV0UG9zaXRpb24sXG4gICAgICAgICAgICB0aGlzLmNhcmV0UG9zaXRpb25FbmRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcmV0UG9zaXRpb24obGVuZ3RoOiBudW1iZXIsIG1pbnVzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgbmV3Q2FyZXRQb3MgPSB0aGlzLmNvbXB1dGVOZXdDYXJldFBvc2l0aW9uKGxlbmd0aCwgbWludXMpO1xuICAgICAgICB0aGlzLnNldENhcmV0UG9zaXRpb24obmV3Q2FyZXRQb3MpO1xuICAgICAgICAvLyBTY3JvbGwgdG8gYm90dG9tXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVJbnB1dEVsZW1lbnQ/LnNjcm9sbFRvKHtcbiAgICAgICAgICAgICAgICB0b3A6IHRoaXMuYWN0aXZlSW5wdXRFbGVtZW50LnNjcm9sbEhlaWdodCxcbiAgICAgICAgICAgIH0gYXMgU2Nyb2xsVG9PcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlTmV3Q2FyZXRQb3NpdGlvbihsZW5ndGg6IG51bWJlciwgbWludXMgPSBmYWxzZSkge1xuICAgICAgICBsZXQgY2FyZXRQb3NpdGlvbiA9IHRoaXMuY2FyZXRQb3NpdGlvbjtcblxuICAgICAgICBpZiAoY2FyZXRQb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobWludXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FyZXRQb3NpdGlvbiA+IDApIGNhcmV0UG9zaXRpb24gPSBjYXJldFBvc2l0aW9uIC0gbGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbiArIGxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FyZXRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENhcmV0UG9zaXRpb24ocG9zaXRpb246IG51bWJlciB8IG51bGwsIGVuZFBvc2l0aW9uID0gcG9zaXRpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYXJldFBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICAgIHRoaXMuY2FyZXRQb3NpdGlvbkVuZCA9IGVuZFBvc2l0aW9uO1xuICAgIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgKGMpIDIwMjAgLSAyMDI0IC0gSW5zdHJ1bWVudGF0aW9uIExhYm9yYXRvcnkgQ29tcGFueSBhbmQgU3lzdGVsYWIgVGVjaG5vbG9naWVzLCBTQS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgfiBOT1RJQ0U6ICBBbGwgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcyBhbmQgcmVtYWlucyB0aGUgcHJvcGVydHkgb2YgSW5zdHJ1bWVudGF0aW9uIExhYm9yYXRvcnkgQ29tcGFueSBhbmQgaXRzXG4gIH4gYWZmaWxpYXRlcywgaWYgYW55LiAgVGhlIGludGVsbGVjdHVhbCBhbmQgdGVjaG5pY2FsIGNvbmNlcHRzIGNvbnRhaW5lZCBoZXJlaW4gYXJlIHByb3ByaWV0YXJ5IHRvIEluc3RydW1lbnRhdGlvblxuICB+IExhYm9yYXRvcnkgQ29tcGFueSBhbmQgaXRzIGFmZmlsaWF0ZXMgYW5kIG1heSBiZSBjb3ZlcmVkIGJ5IFUuUy4gYW5kIGZvcmVpZ24gcGF0ZW50cyBhbmQgcGF0ZW50IGFwcGxpY2F0aW9ucywgYW5kL29yXG4gIH4gYXJlIHByb3RlY3RlZCBieSB0cmFkZSBzZWNyZXQgb3IgY29weXJpZ2h0IGxhdy4gRGlzc2VtaW5hdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIHJlcHJvZHVjdGlvbiBvZiB0aGlzIG1hdGVyaWFsIGlzXG4gIH4gc3RyaWN0bHkgZm9yYmlkZGVuIHVubGVzcyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gaXMgSW5zdHJ1bWVudGF0aW9uIExhYm9yYXRvcnkgQ29tcGFueS5cbiAgLS0+XG5cbjxkaXYgY2xhc3M9XCJzaW1wbGUta2V5Ym9hcmRcIj48L2Rpdj5cbiJdfQ==
@@ -1,3 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- export const VIRTUAL_KEYBOARD_CONFIG = new InjectionToken('VIRTUAL_KEYBOARD_CONFIG');
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVsYWItdmlydHVhbC1rZXlib2FyZC5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi12aXJ0dWFsLWtleWJvYXJkL3NyYy9saWIvc3lzdGVsYWItdmlydHVhbC1rZXlib2FyZC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLGNBQWMsQ0FBZ0MseUJBQXlCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZElucHV0TWV0aG9kcywgU3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRMYXlvdXRzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgVklSVFVBTF9LRVlCT0FSRF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48U3lzdGVsYWJWaXJ0dWFsS2V5Ym9hcmRDb25maWc+KCdWSVJUVUFMX0tFWUJPQVJEX0NPTkZJRycpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN5c3RlbGFiVmlydHVhbEtleWJvYXJkQ29uZmlnIHtcbiAgICBsYXlvdXQ/OiBTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZExheW91dHM7XG4gICAgaW5wdXRNZXRob2Q/OiBTeXN0ZWxhYlZpcnR1YWxLZXlib2FyZElucHV0TWV0aG9kcztcbiAgICBzaG93SWNvbj86IGJvb2xlYW47XG4gICAgc2hvd09uTW91c2VDbGljaz86IGJvb2xlYW47XG59XG4iXX0=