@skyux/text-editor 8.7.0 → 9.0.0-alpha.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 (48) hide show
  1. package/esm2022/lib/modules/rich-text-display/rich-text-display.component.mjs +42 -0
  2. package/{esm2020 → esm2022}/lib/modules/rich-text-display/rich-text-display.module.mjs +5 -5
  3. package/{esm2020 → esm2022}/lib/modules/shared/sky-text-editor-resources.module.mjs +11 -11
  4. package/esm2022/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +197 -0
  5. package/esm2022/lib/modules/text-editor/services/text-editor-adapter.service.mjs +431 -0
  6. package/{esm2020 → esm2022}/lib/modules/text-editor/services/text-editor-selection.service.mjs +4 -4
  7. package/esm2022/lib/modules/text-editor/services/text-editor.service.mjs +59 -0
  8. package/esm2022/lib/modules/text-editor/services/text-sanitization.service.mjs +38 -0
  9. package/esm2022/lib/modules/text-editor/text-editor.component.mjs +410 -0
  10. package/{esm2020 → esm2022}/lib/modules/text-editor/text-editor.module.mjs +41 -41
  11. package/esm2022/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +207 -0
  12. package/esm2022/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +119 -0
  13. package/fesm2022/skyux-text-editor.mjs +1828 -0
  14. package/{fesm2020 → fesm2022}/skyux-text-editor.mjs.map +1 -1
  15. package/lib/modules/rich-text-display/rich-text-display.component.d.ts +1 -1
  16. package/lib/modules/text-editor/menubar/text-editor-menubar.component.d.ts +1 -1
  17. package/lib/modules/text-editor/text-editor.component.d.ts +1 -1
  18. package/lib/modules/text-editor/toolbar/text-editor-toolbar.component.d.ts +1 -1
  19. package/package.json +20 -26
  20. package/esm2020/lib/modules/rich-text-display/rich-text-display.component.mjs +0 -44
  21. package/esm2020/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +0 -197
  22. package/esm2020/lib/modules/text-editor/services/text-editor-adapter.service.mjs +0 -421
  23. package/esm2020/lib/modules/text-editor/services/text-editor.service.mjs +0 -64
  24. package/esm2020/lib/modules/text-editor/services/text-sanitization.service.mjs +0 -43
  25. package/esm2020/lib/modules/text-editor/text-editor.component.mjs +0 -395
  26. package/esm2020/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +0 -204
  27. package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +0 -118
  28. package/fesm2015/skyux-text-editor.mjs +0 -1793
  29. package/fesm2015/skyux-text-editor.mjs.map +0 -1
  30. package/fesm2020/skyux-text-editor.mjs +0 -1804
  31. /package/{esm2020 → esm2022}/index.mjs +0 -0
  32. /package/{esm2020 → esm2022}/lib/modules/shared/forms-utility.mjs +0 -0
  33. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/font-list-defaults.mjs +0 -0
  34. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/font-size-list-defaults.mjs +0 -0
  35. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/menu-defaults.mjs +0 -0
  36. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/style-state-defaults.mjs +0 -0
  37. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/toolbar-action-defaults.mjs +0 -0
  38. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/editor-command.mjs +0 -0
  39. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/editor-setting.mjs +0 -0
  40. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/font-state.mjs +0 -0
  41. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/menu-type.mjs +0 -0
  42. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/style-state.mjs +0 -0
  43. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/text-editor-merge-field.mjs +0 -0
  44. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/toolbar-action-type.mjs +0 -0
  45. /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-modal-context.mjs +0 -0
  46. /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-modal-result.mjs +0 -0
  47. /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-target.mjs +0 -0
  48. /package/{esm2020 → esm2022}/skyux-text-editor.mjs +0 -0
@@ -0,0 +1,207 @@
1
+ import { ChangeDetectionStrategy, Component, Input, } from '@angular/core';
2
+ import { SkyColorpickerMessageType, } from '@skyux/colorpicker';
3
+ import { SkyDropdownMessageType } from '@skyux/popovers';
4
+ import { Subject } from 'rxjs';
5
+ import { takeUntil } from 'rxjs/operators';
6
+ import { SkyFormsUtility } from '../../shared/forms-utility';
7
+ import { STYLE_STATE_DEFAULTS } from '../defaults/style-state-defaults';
8
+ import { SkyUrlModalContext } from '../url-modal/text-editor-url-modal-context';
9
+ import { SkyTextEditorUrlModalComponent } from '../url-modal/text-editor-url-modal.component';
10
+ import { UrlTarget } from '../url-modal/text-editor-url-target';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../services/text-editor-adapter.service";
13
+ import * as i2 from "@skyux/modals";
14
+ import * as i3 from "@angular/common";
15
+ import * as i4 from "@angular/forms";
16
+ import * as i5 from "@skyux/indicators";
17
+ import * as i6 from "@skyux/forms";
18
+ import * as i7 from "@skyux/colorpicker";
19
+ import * as i8 from "@skyux/popovers";
20
+ import * as i9 from "@skyux/theme";
21
+ import * as i10 from "@skyux/layout";
22
+ /**
23
+ * @internal
24
+ */
25
+ export class SkyTextEditorToolbarComponent {
26
+ set editorFocusStream(value) {
27
+ this.#_editorFocusStream = value;
28
+ this.#subscribeEditorFocus();
29
+ }
30
+ get editorFocusStream() {
31
+ return this.#_editorFocusStream;
32
+ }
33
+ set styleState(value) {
34
+ this.#_styleState = value;
35
+ if (value.font !== this.styleStateFontName) {
36
+ if (value.font === '"Blackbaud Sans", Arial, sans-serif') {
37
+ this.styleStateFontName = this.#getFontName('Blackbaud Sans');
38
+ }
39
+ else {
40
+ this.styleStateFontName = this.#getFontName(value.font);
41
+ }
42
+ }
43
+ }
44
+ get styleState() {
45
+ return this.#_styleState;
46
+ }
47
+ set disabled(value) {
48
+ const coercedValue = SkyFormsUtility.coerceBooleanProperty(value);
49
+ if (coercedValue !== this.disabled) {
50
+ this.#_disabled = coercedValue;
51
+ this.#changeDetector.markForCheck();
52
+ }
53
+ }
54
+ get disabled() {
55
+ return this.#_disabled;
56
+ }
57
+ #editorFocusStreamSub;
58
+ #adapterService;
59
+ #changeDetector;
60
+ #modalService;
61
+ #ngUnsubscribe;
62
+ #_editorFocusStream;
63
+ #_disabled;
64
+ #_styleState;
65
+ constructor(adapterService, changeDetector, modalService) {
66
+ this.fontList = [];
67
+ this.fontSizeList = [];
68
+ this.toolbarActions = [];
69
+ this.backColorpickerStream = new Subject();
70
+ this.colorpickerStream = new Subject();
71
+ this.fontPickerStream = new Subject();
72
+ this.fontSizeStream = new Subject();
73
+ this.#ngUnsubscribe = new Subject();
74
+ this.#_editorFocusStream = new Subject();
75
+ this.#_disabled = false;
76
+ this.#_styleState = STYLE_STATE_DEFAULTS;
77
+ this.#adapterService = adapterService;
78
+ this.#changeDetector = changeDetector;
79
+ this.#modalService = modalService;
80
+ }
81
+ ngOnInit() {
82
+ this.#subscribeEditorFocus();
83
+ }
84
+ execCommand(command, value = '') {
85
+ this.#adapterService.execCommand({
86
+ command: command,
87
+ value: value,
88
+ });
89
+ this.styleState = {
90
+ ...this.styleState,
91
+ ...this.#adapterService.getStyleState(),
92
+ };
93
+ }
94
+ toggleFontStyle(currentState, newState, command) {
95
+ if (currentState !== newState) {
96
+ this.execCommand(command);
97
+ }
98
+ // Force sky-checkbox to show changes on user's initial click.
99
+ this.#changeDetector.detectChanges();
100
+ }
101
+ link() {
102
+ const priorSelection = this.#adapterService.saveSelection();
103
+ const currentLink = this.#adapterService.getLink();
104
+ const inputModal = this.#modalService.open(SkyTextEditorUrlModalComponent, [
105
+ {
106
+ provide: SkyUrlModalContext,
107
+ useValue: { urlResult: currentLink },
108
+ },
109
+ ]);
110
+ inputModal.closed.subscribe((result) => {
111
+ if (result.reason === 'save' && priorSelection) {
112
+ if (currentLink) {
113
+ const anchor = this.#adapterService.getSelectedAnchorTag();
114
+ if (anchor) {
115
+ this.#adapterService.selectElement(anchor);
116
+ }
117
+ }
118
+ this.execCommand('unlink');
119
+ if (result.data.target === UrlTarget.None) {
120
+ // Current window
121
+ this.execCommand('createLink', result.data.url);
122
+ }
123
+ else {
124
+ // New Window
125
+ const sText = this.#adapterService.getCurrentSelection();
126
+ this.execCommand('insertHTML', '<a href="' +
127
+ result.data.url +
128
+ '" rel="noopener noreferrer" target="_blank">' +
129
+ sText +
130
+ '</a>');
131
+ }
132
+ }
133
+ });
134
+ }
135
+ unlink() {
136
+ const currentSelectionRange = this.#adapterService
137
+ .getCurrentSelection()
138
+ ?.getRangeAt(0);
139
+ if (currentSelectionRange && currentSelectionRange.toString().length <= 0) {
140
+ const anchorTag = this.#adapterService.getSelectedAnchorTag();
141
+ if (anchorTag) {
142
+ this.#adapterService.selectElement(anchorTag);
143
+ }
144
+ }
145
+ this.execCommand('unlink');
146
+ }
147
+ changeFontSize(size) {
148
+ this.#adapterService.setFontSize(size);
149
+ this.styleState = {
150
+ ...this.styleState,
151
+ ...this.#adapterService.getStyleState(),
152
+ };
153
+ }
154
+ onColorpickerColorChanged(color, isBackground = false) {
155
+ this.execCommand(isBackground ? 'backColor' : 'foreColor', color.hex);
156
+ }
157
+ #subscribeEditorFocus() {
158
+ this.#editorFocusStreamSub?.unsubscribe();
159
+ this.#editorFocusStreamSub = this.editorFocusStream
160
+ .pipe(takeUntil(this.#ngUnsubscribe))
161
+ .subscribe(() => {
162
+ this.styleState = {
163
+ ...this.styleState,
164
+ ...this.#adapterService.getStyleState(),
165
+ };
166
+ this.#closeDropdowns();
167
+ this.#changeDetector.detectChanges();
168
+ });
169
+ }
170
+ #closeDropdowns() {
171
+ const message = {
172
+ type: SkyColorpickerMessageType.Close,
173
+ };
174
+ this.colorpickerStream.next(message);
175
+ this.backColorpickerStream.next(message);
176
+ this.fontPickerStream.next({ type: SkyDropdownMessageType.Close });
177
+ this.fontSizeStream.next({ type: SkyDropdownMessageType.Close });
178
+ }
179
+ #getFontName(fontName) {
180
+ for (let i = 0; i < this.fontList.length; i++) {
181
+ if (fontName.replace(/['"]+/g, '') === this.fontList[i].name) {
182
+ return this.fontList[i].name;
183
+ }
184
+ }
185
+ /* istanbul ignore next */
186
+ return undefined;
187
+ }
188
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTextEditorToolbarComponent, deps: [{ token: i1.SkyTextEditorAdapterService }, { token: i0.ChangeDetectorRef }, { token: i2.SkyModalService }], target: i0.ɵɵFactoryTarget.Component }); }
189
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyTextEditorToolbarComponent, selector: "sky-text-editor-toolbar", inputs: { editorFocusStream: "editorFocusStream", fontList: "fontList", fontSizeList: "fontSizeList", toolbarActions: "toolbarActions", styleState: "styleState", disabled: "disabled" }, ngImport: i0, template: "<sky-toolbar-item\n *ngFor=\"let action of toolbarActions\"\n class=\"sky-text-editor-toolbar-action\"\n [ngClass]=\"'sky-text-editor-toolbar-action-' + action\"\n>\n <ng-container [ngSwitch]=\"action\">\n <ng-container *ngSwitchCase=\"'font-family'\">\n <sky-dropdown\n class=\"sky-text-editor-font-picker\"\n [disabled]=\"disabled\"\n [label]=\"'Font: ' + styleStateFontName\"\n [messageStream]=\"fontPickerStream\"\n >\n <sky-dropdown-button\n [ngStyle]=\"{\n 'font-family': styleState.font\n }\"\n >\n {{ styleStateFontName }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item *ngFor=\"let fontModel of fontList\">\n <button\n type=\"button\"\n [ngStyle]=\"{\n 'font-family': fontModel.value\n }\"\n (click)=\"execCommand('fontname', fontModel.name)\"\n >\n {{ fontModel.name }}\n </button>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </ng-container>\n <ng-container *ngSwitchCase=\"'font-size'\">\n <sky-dropdown\n class=\"sky-text-editor-font-size-picker\"\n [disabled]=\"disabled\"\n [label]=\"'Font size: ' + styleState.fontSize + 'px'\"\n [messageStream]=\"fontSizeStream\"\n >\n <sky-dropdown-button\n [ngStyle]=\"{\n 'font-family': styleState.fontSize\n }\"\n >\n {{ styleState.fontSize + 'px' }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item *ngFor=\"let size of fontSizeList\">\n <button type=\"button\" (click)=\"changeFontSize(size)\">\n {{ size + 'px' }}\n </button>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </ng-container>\n <ng-container *ngSwitchCase=\"'font-style'\">\n <div class=\"sky-switch-icon-group sky-text-editor-font-style-picker\">\n <sky-checkbox\n icon=\"bold\"\n label=\"Bold\"\n title=\"Bold\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.boldState\"\n (ngModelChange)=\"\n toggleFontStyle(styleState.boldState, $event, 'bold')\n \"\n >\n </sky-checkbox>\n <sky-checkbox\n icon=\"italic\"\n label=\"Italicized\"\n title=\"Italicized\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.italicState\"\n (ngModelChange)=\"\n toggleFontStyle(styleState.italicState, $event, 'italic')\n \"\n >\n </sky-checkbox>\n <sky-checkbox\n icon=\"underline\"\n label=\"Underline\"\n title=\"Underline\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.underlineState\"\n (ngModelChange)=\"\n toggleFontStyle(styleState.underlineState, $event, 'underline')\n \"\n >\n </sky-checkbox>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'color'\">\n <div class=\"sky-text-editor-colorpicker-group\">\n <div class=\"sky-text-editor-colorpicker-container\">\n <sky-colorpicker\n class=\"sky-text-editor-font-color-picker\"\n label=\"Font color\"\n [messageStream]=\"colorpickerStream\"\n [showResetButton]=\"false\"\n (selectedColorChanged)=\"onColorpickerColorChanged($event)\"\n pickerButtonIcon=\"highlighter\"\n pickerButtonIconType=\"skyux\"\n #colorPicker\n >\n <input\n outputFormat=\"hex\"\n type=\"text\"\n [allowTransparency]=\"false\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.fontColor\"\n [skyColorpickerInput]=\"colorPicker\"\n />\n </sky-colorpicker>\n </div>\n <div class=\"sky-text-editor-colorpicker-container\">\n <sky-colorpicker\n class=\"sky-text-editor-background-color-picker\"\n label=\"Background color\"\n [messageStream]=\"backColorpickerStream\"\n [showResetButton]=\"false\"\n (selectedColorChanged)=\"onColorpickerColorChanged($event, true)\"\n #backColorPicker\n pickerButtonIcon=\"text-color\"\n pickerButtonIconType=\"skyux\"\n >\n <input\n outputFormat=\"rgba\"\n type=\"text\"\n [allowTransparency]=\"true\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.backColor\"\n [skyColorpickerInput]=\"backColorPicker\"\n />\n </sky-colorpicker>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'list'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Bulleted list\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Bulleted list\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('insertUnorderedList')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"list-ul\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"bullet-list-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n <button\n aria-label=\"Numbered list\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Numbered list\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('insertOrderedList')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"list-ol\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"number-list-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'alignment'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Align left\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Align left\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('justifyLeft')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"align-left\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"align-left-text-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n <button\n aria-label=\"Align center\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Align center\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('justifyCenter')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"align-center\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"center-text-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n <button\n aria-label=\"Align right\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Align right\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('justifyRight')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"align-right\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"align-right-text-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'indentation'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Outdent\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Outdent\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('outdent')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"outdent\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"outdent-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n <button\n aria-label=\"Indent\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Indent\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('indent')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"indent\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"indent-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'undo-redo'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Undo\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Undo\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('undo')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"undo\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"undo-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n <button\n aria-label=\"Redo\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Redo\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('redo')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"repeat\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"redo-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'link'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Link\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Link\"\n [disabled]=\"disabled\"\n [ngClass]=\"{\n 'icon-btn-active': styleState.linkState\n }\"\n (click)=\"link()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"link\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"link-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n <button\n aria-label=\"Unlink\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Unlink\"\n [disabled]=\"!styleState.linkState || disabled\"\n (click)=\"unlink()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"unlink\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"unlink-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n </div>\n </ng-container>\n </ng-container>\n</sky-toolbar-item>\n", styles: [".sky-text-editor-toolbar-action .sky-toolbar-item{margin-right:15px}.sky-text-editor-toolbar-action .sky-text-editor-font-picker ::ng-deep .sky-dropdown-button-content-container{width:140px;height:20px;text-align:left}.sky-text-editor-toolbar-action .sky-text-editor-colorpicker-group{display:flex}.sky-text-editor-toolbar-action .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container{position:relative;top:3px;margin:0 10px 0 0}.sky-text-editor-toolbar-action .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container:last-child{margin-right:0}.sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn{margin-left:0;margin-right:0;border-radius:0;border-right:none}.sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px}.sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #cdcfd2}:host-context(.sky-theme-modern) .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container{top:-2px;margin:0}:host-context(.sky-theme-modern) .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container:last-child ::ng-deep sky-colorpicker .sky-colorpicker-button{margin-right:0}:host-context(.sky-theme-modern) .sky-switch-icon-group .sky-btn{margin:inherit;border-radius:6px}:host-context(.sky-theme-modern) .sky-switch-icon-group .sky-btn:first-of-type,:host-context(.sky-theme-modern) .sky-switch-icon-group .sky-btn:last-of-type{border-radius:6px}:host-context(.sky-theme-modern) .sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn:last-of-type{border:none}.sky-theme-modern .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container{top:-2px;margin:0}.sky-theme-modern .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container:last-child ::ng-deep sky-colorpicker .sky-colorpicker-button{margin-right:0}.sky-theme-modern .sky-switch-icon-group .sky-btn{margin:inherit;border-radius:6px}.sky-theme-modern .sky-switch-icon-group .sky-btn:first-of-type,.sky-theme-modern .sky-switch-icon-group .sky-btn:last-of-type{border-radius:6px}.sky-theme-modern .sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn:last-of-type{border:none}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i6.λ20, selector: "input:not([skyId]):not(.sky-form-control),select:not([skyId]):not(.sky-form-control),textarea:not([skyId]):not(.sky-form-control)" }, { kind: "component", type: i7.λ1, selector: "sky-colorpicker", inputs: ["pickerButtonIcon", "pickerButtonIconType", "label", "labelledBy", "messageStream", "showResetButton"], outputs: ["selectedColorChanged", "selectedColorApplied"] }, { kind: "directive", type: i7.λ2, selector: "[skyColorpickerInput]", inputs: ["skyColorpickerInput", "initialColor", "returnFormat", "outputFormat", "presetColors", "alphaChannel", "allowTransparency"] }, { kind: "component", type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "indeterminate", "required"], outputs: ["change", "checkedChange", "disabledChange", "indeterminateChange"] }, { kind: "component", type: i8.λ2, selector: "sky-dropdown-button" }, { kind: "component", type: i8.λ3, selector: "sky-dropdown", inputs: ["buttonStyle", "buttonType", "disabled", "dismissOnBlur", "label", "horizontalAlignment", "messageStream", "title", "trigger"] }, { kind: "component", type: i8.λ1, selector: "sky-dropdown-item", inputs: ["ariaRole"] }, { kind: "component", type: i8.λ4, selector: "sky-dropdown-menu", inputs: ["ariaLabelledBy", "ariaRole", "useNativeFocus"], outputs: ["menuChanges"] }, { kind: "directive", type: i9.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "component", type: i10.λ39, selector: "sky-toolbar-item" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
190
+ }
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTextEditorToolbarComponent, decorators: [{
192
+ type: Component,
193
+ args: [{ selector: 'sky-text-editor-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<sky-toolbar-item\n *ngFor=\"let action of toolbarActions\"\n class=\"sky-text-editor-toolbar-action\"\n [ngClass]=\"'sky-text-editor-toolbar-action-' + action\"\n>\n <ng-container [ngSwitch]=\"action\">\n <ng-container *ngSwitchCase=\"'font-family'\">\n <sky-dropdown\n class=\"sky-text-editor-font-picker\"\n [disabled]=\"disabled\"\n [label]=\"'Font: ' + styleStateFontName\"\n [messageStream]=\"fontPickerStream\"\n >\n <sky-dropdown-button\n [ngStyle]=\"{\n 'font-family': styleState.font\n }\"\n >\n {{ styleStateFontName }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item *ngFor=\"let fontModel of fontList\">\n <button\n type=\"button\"\n [ngStyle]=\"{\n 'font-family': fontModel.value\n }\"\n (click)=\"execCommand('fontname', fontModel.name)\"\n >\n {{ fontModel.name }}\n </button>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </ng-container>\n <ng-container *ngSwitchCase=\"'font-size'\">\n <sky-dropdown\n class=\"sky-text-editor-font-size-picker\"\n [disabled]=\"disabled\"\n [label]=\"'Font size: ' + styleState.fontSize + 'px'\"\n [messageStream]=\"fontSizeStream\"\n >\n <sky-dropdown-button\n [ngStyle]=\"{\n 'font-family': styleState.fontSize\n }\"\n >\n {{ styleState.fontSize + 'px' }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item *ngFor=\"let size of fontSizeList\">\n <button type=\"button\" (click)=\"changeFontSize(size)\">\n {{ size + 'px' }}\n </button>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </ng-container>\n <ng-container *ngSwitchCase=\"'font-style'\">\n <div class=\"sky-switch-icon-group sky-text-editor-font-style-picker\">\n <sky-checkbox\n icon=\"bold\"\n label=\"Bold\"\n title=\"Bold\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.boldState\"\n (ngModelChange)=\"\n toggleFontStyle(styleState.boldState, $event, 'bold')\n \"\n >\n </sky-checkbox>\n <sky-checkbox\n icon=\"italic\"\n label=\"Italicized\"\n title=\"Italicized\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.italicState\"\n (ngModelChange)=\"\n toggleFontStyle(styleState.italicState, $event, 'italic')\n \"\n >\n </sky-checkbox>\n <sky-checkbox\n icon=\"underline\"\n label=\"Underline\"\n title=\"Underline\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.underlineState\"\n (ngModelChange)=\"\n toggleFontStyle(styleState.underlineState, $event, 'underline')\n \"\n >\n </sky-checkbox>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'color'\">\n <div class=\"sky-text-editor-colorpicker-group\">\n <div class=\"sky-text-editor-colorpicker-container\">\n <sky-colorpicker\n class=\"sky-text-editor-font-color-picker\"\n label=\"Font color\"\n [messageStream]=\"colorpickerStream\"\n [showResetButton]=\"false\"\n (selectedColorChanged)=\"onColorpickerColorChanged($event)\"\n pickerButtonIcon=\"highlighter\"\n pickerButtonIconType=\"skyux\"\n #colorPicker\n >\n <input\n outputFormat=\"hex\"\n type=\"text\"\n [allowTransparency]=\"false\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.fontColor\"\n [skyColorpickerInput]=\"colorPicker\"\n />\n </sky-colorpicker>\n </div>\n <div class=\"sky-text-editor-colorpicker-container\">\n <sky-colorpicker\n class=\"sky-text-editor-background-color-picker\"\n label=\"Background color\"\n [messageStream]=\"backColorpickerStream\"\n [showResetButton]=\"false\"\n (selectedColorChanged)=\"onColorpickerColorChanged($event, true)\"\n #backColorPicker\n pickerButtonIcon=\"text-color\"\n pickerButtonIconType=\"skyux\"\n >\n <input\n outputFormat=\"rgba\"\n type=\"text\"\n [allowTransparency]=\"true\"\n [disabled]=\"disabled\"\n [ngModel]=\"styleState.backColor\"\n [skyColorpickerInput]=\"backColorPicker\"\n />\n </sky-colorpicker>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'list'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Bulleted list\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Bulleted list\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('insertUnorderedList')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"list-ul\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"bullet-list-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n <button\n aria-label=\"Numbered list\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Numbered list\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('insertOrderedList')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"list-ol\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"number-list-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'alignment'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Align left\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Align left\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('justifyLeft')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"align-left\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"align-left-text-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n <button\n aria-label=\"Align center\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Align center\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('justifyCenter')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"align-center\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"center-text-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n <button\n aria-label=\"Align right\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Align right\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('justifyRight')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"align-right\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"align-right-text-line\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'indentation'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Outdent\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Outdent\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('outdent')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"outdent\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"outdent-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n <button\n aria-label=\"Indent\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Indent\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('indent')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"indent\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"indent-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'undo-redo'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Undo\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Undo\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('undo')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"undo\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"undo-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n <button\n aria-label=\"Redo\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Redo\"\n [disabled]=\"disabled\"\n (click)=\"execCommand('redo')\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"repeat\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"redo-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'link'\">\n <div class=\"sky-switch-icon-group\">\n <button\n aria-label=\"Link\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Link\"\n [disabled]=\"disabled\"\n [ngClass]=\"{\n 'icon-btn-active': styleState.linkState\n }\"\n (click)=\"link()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"link\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"link-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n <button\n aria-label=\"Unlink\"\n class=\"sky-btn sky-btn-default sky-btn-icon\"\n title=\"Unlink\"\n [disabled]=\"!styleState.linkState || disabled\"\n (click)=\"unlink()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"unlink\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"unlink-line\" iconType=\"skyux\">\n </sky-icon>\n </button>\n </div>\n </ng-container>\n </ng-container>\n</sky-toolbar-item>\n", styles: [".sky-text-editor-toolbar-action .sky-toolbar-item{margin-right:15px}.sky-text-editor-toolbar-action .sky-text-editor-font-picker ::ng-deep .sky-dropdown-button-content-container{width:140px;height:20px;text-align:left}.sky-text-editor-toolbar-action .sky-text-editor-colorpicker-group{display:flex}.sky-text-editor-toolbar-action .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container{position:relative;top:3px;margin:0 10px 0 0}.sky-text-editor-toolbar-action .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container:last-child{margin-right:0}.sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn{margin-left:0;margin-right:0;border-radius:0;border-right:none}.sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px}.sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #cdcfd2}:host-context(.sky-theme-modern) .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container{top:-2px;margin:0}:host-context(.sky-theme-modern) .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container:last-child ::ng-deep sky-colorpicker .sky-colorpicker-button{margin-right:0}:host-context(.sky-theme-modern) .sky-switch-icon-group .sky-btn{margin:inherit;border-radius:6px}:host-context(.sky-theme-modern) .sky-switch-icon-group .sky-btn:first-of-type,:host-context(.sky-theme-modern) .sky-switch-icon-group .sky-btn:last-of-type{border-radius:6px}:host-context(.sky-theme-modern) .sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn:last-of-type{border:none}.sky-theme-modern .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container{top:-2px;margin:0}.sky-theme-modern .sky-text-editor-colorpicker-group .sky-text-editor-colorpicker-container:last-child ::ng-deep sky-colorpicker .sky-colorpicker-button{margin-right:0}.sky-theme-modern .sky-switch-icon-group .sky-btn{margin:inherit;border-radius:6px}.sky-theme-modern .sky-switch-icon-group .sky-btn:first-of-type,.sky-theme-modern .sky-switch-icon-group .sky-btn:last-of-type{border-radius:6px}.sky-theme-modern .sky-text-editor-toolbar-action .sky-switch-icon-group .sky-btn:last-of-type{border:none}\n"] }]
194
+ }], ctorParameters: function () { return [{ type: i1.SkyTextEditorAdapterService }, { type: i0.ChangeDetectorRef }, { type: i2.SkyModalService }]; }, propDecorators: { editorFocusStream: [{
195
+ type: Input
196
+ }], fontList: [{
197
+ type: Input
198
+ }], fontSizeList: [{
199
+ type: Input
200
+ }], toolbarActions: [{
201
+ type: Input
202
+ }], styleState: [{
203
+ type: Input
204
+ }], disabled: [{
205
+ type: Input
206
+ }] } });
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3ItdG9vbGJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGV4dC1lZGl0b3Ivc3JjL2xpYi9tb2R1bGVzL3RleHQtZWRpdG9yL3Rvb2xiYXIvdGV4dC1lZGl0b3ItdG9vbGJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGV4dC1lZGl0b3Ivc3JjL2xpYi9tb2R1bGVzL3RleHQtZWRpdG9yL3Rvb2xiYXIvdGV4dC1lZGl0b3ItdG9vbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxLQUFLLEdBRU4sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLHlCQUF5QixHQUUxQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBc0Isc0JBQXNCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU3RSxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBS3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7O0FBRWhFOztHQUVHO0FBT0gsTUFBTSxPQUFPLDZCQUE2QjtJQUN4QyxJQUNXLGlCQUFpQixDQUFDLEtBQW9CO1FBQy9D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SSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDNUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUM5QjtTQUNGO1FBRUQsMEJBQTBCO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7OEdBNU1VLDZCQUE2QjtrR0FBN0IsNkJBQTZCLHlQQ3JDMUMsMm1WQW1UQTs7MkZEOVFhLDZCQUE2QjtrQkFOekMsU0FBUzsrQkFDRSx5QkFBeUIsbUJBR2xCLHVCQUF1QixDQUFDLE1BQU07Z0xBSXBDLGlCQUFpQjtzQkFEM0IsS0FBSztnQkFXQyxRQUFRO3NCQURkLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlLLFVBQVU7c0JBRHBCLEtBQUs7Z0JBaUJLLFFBQVE7c0JBRGxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBTa3lDb2xvcnBpY2tlck1lc3NhZ2UsXG4gIFNreUNvbG9ycGlja2VyTWVzc2FnZVR5cGUsXG4gIFNreUNvbG9ycGlja2VyT3V0cHV0LFxufSBmcm9tICdAc2t5dXgvY29sb3JwaWNrZXInO1xuaW1wb3J0IHsgU2t5TW9kYWxDbG9zZUFyZ3MsIFNreU1vZGFsU2VydmljZSB9IGZyb20gJ0Bza3l1eC9tb2RhbHMnO1xuaW1wb3J0IHsgU2t5RHJvcGRvd25NZXNzYWdlLCBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlIH0gZnJvbSAnQHNreXV4L3BvcG92ZXJzJztcblxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUZvcm1zVXRpbGl0eSB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3Jtcy11dGlsaXR5JztcbmltcG9ydCB7IFNUWUxFX1NUQVRFX0RFRkFVTFRTIH0gZnJvbSAnLi4vZGVmYXVsdHMvc3R5bGUtc3RhdGUtZGVmYXVsdHMnO1xuaW1wb3J0IHsgU2t5VGV4dEVkaXRvckFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdGV4dC1lZGl0b3ItYWRhcHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNreVRleHRFZGl0b3JGb250IH0gZnJvbSAnLi4vdHlwZXMvZm9udC1zdGF0ZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yU3R5bGVTdGF0ZSB9IGZyb20gJy4uL3R5cGVzL3N0eWxlLXN0YXRlJztcbmltcG9ydCB7IFNreVRleHRFZGl0b3JUb29sYmFyQWN0aW9uVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rvb2xiYXItYWN0aW9uLXR5cGUnO1xuaW1wb3J0IHsgU2t5VXJsTW9kYWxDb250ZXh0IH0gZnJvbSAnLi4vdXJsLW1vZGFsL3RleHQtZWRpdG9yLXVybC1tb2RhbC1jb250ZXh0JztcbmltcG9ydCB7IFNreVRleHRFZGl0b3JVcmxNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL3VybC1tb2RhbC90ZXh0LWVkaXRvci11cmwtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFVybFRhcmdldCB9IGZyb20gJy4uL3VybC1tb2RhbC90ZXh0LWVkaXRvci11cmwtdGFyZ2V0JztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LXRleHQtZWRpdG9yLXRvb2xiYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC1lZGl0b3ItdG9vbGJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RleHQtZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JUb29sYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBlZGl0b3JGb2N1c1N0cmVhbSh2YWx1ZTogU3ViamVjdDx2b2lkPikge1xuICAgIHRoaXMuI19lZGl0b3JGb2N1c1N0cmVhbSA9IHZhbHVlO1xuICAgIHRoaXMuI3N1YnNjcmliZUVkaXRvckZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVkaXRvckZvY3VzU3RyZWFtKCk6IFN1YmplY3Q8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLiNfZWRpdG9yRm9jdXNTdHJlYW07XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgZm9udExpc3Q6IFNreVRleHRFZGl0b3JGb250W10gPSBbXTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZm9udFNpemVMaXN0OiBudW1iZXJbXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0b29sYmFyQWN0aW9uczogU2t5VGV4dEVkaXRvclRvb2xiYXJBY3Rpb25UeXBlW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHN0eWxlU3RhdGUodmFsdWU6IFNreVRleHRFZGl0b3JTdHlsZVN0YXRlKSB7XG4gICAgdGhpcy4jX3N0eWxlU3RhdGUgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUuZm9udCAhPT0gdGhpcy5zdHlsZVN0YXRlRm9udE5hbWUpIHtcbiAgICAgIGlmICh2YWx1ZS5mb250ID09PSAnXCJCbGFja2JhdWQgU2Fuc1wiLCBBcmlhbCwgc2Fucy1zZXJpZicpIHtcbiAgICAgICAgdGhpcy5zdHlsZVN0YXRlRm9udE5hbWUgPSB0aGlzLiNnZXRGb250TmFtZSgnQmxhY2tiYXVkIFNhbnMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3R5bGVTdGF0ZUZvbnROYW1lID0gdGhpcy4jZ2V0Rm9udE5hbWUodmFsdWUuZm9udCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzdHlsZVN0YXRlKCk6IFNreVRleHRFZGl0b3JTdHlsZVN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy4jX3N0eWxlU3RhdGU7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29lcmNlZFZhbHVlID0gU2t5Rm9ybXNVdGlsaXR5LmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgaWYgKGNvZXJjZWRWYWx1ZSAhPT0gdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy4jX2Rpc2FibGVkID0gY29lcmNlZFZhbHVlO1xuICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jX2Rpc2FibGVkO1xuICB9XG5cbiAgcHVibGljIGJhY2tDb2xvcnBpY2tlclN0cmVhbSA9IG5ldyBTdWJqZWN0PFNreUNvbG9ycGlja2VyTWVzc2FnZT4oKTtcbiAgcHVibGljIGNvbG9ycGlja2VyU3RyZWFtID0gbmV3IFN1YmplY3Q8U2t5Q29sb3JwaWNrZXJNZXNzYWdlPigpO1xuICBwdWJsaWMgZm9udFBpY2tlclN0cmVhbSA9IG5ldyBTdWJqZWN0PFNreURyb3Bkb3duTWVzc2FnZT4oKTtcbiAgcHVibGljIGZvbnRTaXplU3RyZWFtID0gbmV3IFN1YmplY3Q8U2t5RHJvcGRvd25NZXNzYWdlPigpO1xuICBwdWJsaWMgc3R5bGVTdGF0ZUZvbnROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgI2VkaXRvckZvY3VzU3RyZWFtU3ViOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gICNhZGFwdGVyU2VydmljZTogU2t5VGV4dEVkaXRvckFkYXB0ZXJTZXJ2aWNlO1xuICAjY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmO1xuICAjbW9kYWxTZXJ2aWNlOiBTa3lNb2RhbFNlcnZpY2U7XG4gICNuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAjX2VkaXRvckZvY3VzU3RyZWFtID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgI19kaXNhYmxlZCA9IGZhbHNlO1xuICAjX3N0eWxlU3RhdGUgPSBTVFlMRV9TVEFURV9ERUZBVUxUUztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyU2VydmljZTogU2t5VGV4dEVkaXRvckFkYXB0ZXJTZXJ2aWNlLFxuICAgIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBtb2RhbFNlcnZpY2U6IFNreU1vZGFsU2VydmljZVxuICApIHtcbiAgICB0aGlzLiNhZGFwdGVyU2VydmljZSA9IGFkYXB0ZXJTZXJ2aWNlO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy4jbW9kYWxTZXJ2aWNlID0gbW9kYWxTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuI3N1YnNjcmliZUVkaXRvckZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgZXhlY0NvbW1hbmQoY29tbWFuZDogc3RyaW5nLCB2YWx1ZSA9ICcnKTogdm9pZCB7XG4gICAgdGhpcy4jYWRhcHRlclNlcnZpY2UuZXhlY0NvbW1hbmQoe1xuICAgICAgY29tbWFuZDogY29tbWFuZCxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnN0eWxlU3RhdGUgPSB7XG4gICAgICAuLi50aGlzLnN0eWxlU3RhdGUsXG4gICAgICAuLi50aGlzLiNhZGFwdGVyU2VydmljZS5nZXRTdHlsZVN0YXRlKCksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVGb250U3R5bGUoXG4gICAgY3VycmVudFN0YXRlOiBib29sZWFuLFxuICAgIG5ld1N0YXRlOiBib29sZWFuLFxuICAgIGNvbW1hbmQ6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAoY3VycmVudFN0YXRlICE9PSBuZXdTdGF0ZSkge1xuICAgICAgdGhpcy5leGVjQ29tbWFuZChjb21tYW5kKTtcbiAgICB9XG5cbiAgICAvLyBGb3JjZSBza3ktY2hlY2tib3ggdG8gc2hvdyBjaGFuZ2VzIG9uIHVzZXIncyBpbml0aWFsIGNsaWNrLlxuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBsaW5rKCk6IHZvaWQge1xuICAgIGNvbnN0IHByaW9yU2VsZWN0aW9uID0gdGhpcy4jYWRhcHRlclNlcnZpY2Uuc2F2ZVNlbGVjdGlvbigpO1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rID0gdGhpcy4jYWRhcHRlclNlcnZpY2UuZ2V0TGluaygpO1xuICAgIGNvbnN0IGlucHV0TW9kYWwgPSB0aGlzLiNtb2RhbFNlcnZpY2Uub3BlbihTa3lUZXh0RWRpdG9yVXJsTW9kYWxDb21wb25lbnQsIFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZTogU2t5VXJsTW9kYWxDb250ZXh0LFxuICAgICAgICB1c2VWYWx1ZTogeyB1cmxSZXN1bHQ6IGN1cnJlbnRMaW5rIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICAgIGlucHV0TW9kYWwuY2xvc2VkLnN1YnNjcmliZSgocmVzdWx0OiBTa3lNb2RhbENsb3NlQXJncykgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5yZWFzb24gPT09ICdzYXZlJyAmJiBwcmlvclNlbGVjdGlvbikge1xuICAgICAgICBpZiAoY3VycmVudExpbmspIHtcbiAgICAgICAgICBjb25zdCBhbmNob3IgPSB0aGlzLiNhZGFwdGVyU2VydmljZS5nZXRTZWxlY3RlZEFuY2hvclRhZygpO1xuXG4gICAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2Uuc2VsZWN0RWxlbWVudChhbmNob3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoJ3VubGluaycpO1xuICAgICAgICBpZiAocmVzdWx0LmRhdGEudGFyZ2V0ID09PSBVcmxUYXJnZXQuTm9uZSkge1xuICAgICAgICAgIC8vIEN1cnJlbnQgd2luZG93XG4gICAgICAgICAgdGhpcy5leGVjQ29tbWFuZCgnY3JlYXRlTGluaycsIHJlc3VsdC5kYXRhLnVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTmV3IFdpbmRvd1xuICAgICAgICAgIGNvbnN0IHNUZXh0ID0gdGhpcy4jYWRhcHRlclNlcnZpY2UuZ2V0Q3VycmVudFNlbGVjdGlvbigpO1xuICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoXG4gICAgICAgICAgICAnaW5zZXJ0SFRNTCcsXG4gICAgICAgICAgICAnPGEgaHJlZj1cIicgK1xuICAgICAgICAgICAgICByZXN1bHQuZGF0YS51cmwgK1xuICAgICAgICAgICAgICAnXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHRhcmdldD1cIl9ibGFua1wiPicgK1xuICAgICAgICAgICAgICBzVGV4dCArXG4gICAgICAgICAgICAgICc8L2E+J1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxpbmsoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFNlbGVjdGlvblJhbmdlID0gdGhpcy4jYWRhcHRlclNlcnZpY2VcbiAgICAgIC5nZXRDdXJyZW50U2VsZWN0aW9uKClcbiAgICAgID8uZ2V0UmFuZ2VBdCgwKTtcbiAgICBpZiAoY3VycmVudFNlbGVjdGlvblJhbmdlICYmIGN1cnJlbnRTZWxlY3Rpb25SYW5nZS50b1N0cmluZygpLmxlbmd0aCA8PSAwKSB7XG4gICAgICBjb25zdCBhbmNob3JUYWcgPSB0aGlzLiNhZGFwdGVyU2VydmljZS5nZXRTZWxlY3RlZEFuY2hvclRhZygpO1xuICAgICAgaWYgKGFuY2hvclRhZykge1xuICAgICAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5zZWxlY3RFbGVtZW50KGFuY2hvclRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZXhlY0NvbW1hbmQoJ3VubGluaycpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZUZvbnRTaXplKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLnNldEZvbnRTaXplKHNpemUpO1xuICAgIHRoaXMuc3R5bGVTdGF0ZSA9IHtcbiAgICAgIC4uLnRoaXMuc3R5bGVTdGF0ZSxcbiAgICAgIC4uLnRoaXMuI2FkYXB0ZXJTZXJ2aWNlLmdldFN0eWxlU3RhdGUoKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIG9uQ29sb3JwaWNrZXJDb2xvckNoYW5nZWQoXG4gICAgY29sb3I6IFNreUNvbG9ycGlja2VyT3V0cHV0LFxuICAgIGlzQmFja2dyb3VuZCA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZXhlY0NvbW1hbmQoaXNCYWNrZ3JvdW5kID8gJ2JhY2tDb2xvcicgOiAnZm9yZUNvbG9yJywgY29sb3IuaGV4KTtcbiAgfVxuXG4gICNzdWJzY3JpYmVFZGl0b3JGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLiNlZGl0b3JGb2N1c1N0cmVhbVN1Yj8udW5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuI2VkaXRvckZvY3VzU3RyZWFtU3ViID0gdGhpcy5lZGl0b3JGb2N1c1N0cmVhbVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3R5bGVTdGF0ZSA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlU3RhdGUsXG4gICAgICAgICAgLi4udGhpcy4jYWRhcHRlclNlcnZpY2UuZ2V0U3R5bGVTdGF0ZSgpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNjbG9zZURyb3Bkb3ducygpO1xuICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gICNjbG9zZURyb3Bkb3ducygpOiB2b2lkIHtcbiAgICBjb25zdCBtZXNzYWdlOiBTa3lDb2xvcnBpY2tlck1lc3NhZ2UgPSB7XG4gICAgICB0eXBlOiBTa3lDb2xvcnBpY2tlck1lc3NhZ2VUeXBlLkNsb3NlLFxuICAgIH07XG4gICAgdGhpcy5jb2xvcnBpY2tlclN0cmVhbS5uZXh0KG1lc3NhZ2UpO1xuICAgIHRoaXMuYmFja0NvbG9ycGlja2VyU3RyZWFtLm5leHQobWVzc2FnZSk7XG4gICAgdGhpcy5mb250UGlja2VyU3RyZWFtLm5leHQoeyB0eXBlOiBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkNsb3NlIH0pO1xuICAgIHRoaXMuZm9udFNpemVTdHJlYW0ubmV4dCh7IHR5cGU6IFNreURyb3Bkb3duTWVzc2FnZVR5cGUuQ2xvc2UgfSk7XG4gIH1cblxuICAjZ2V0Rm9udE5hbWUoZm9udE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZvbnRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZm9udE5hbWUucmVwbGFjZSgvWydcIl0rL2csICcnKSA9PT0gdGhpcy5mb250TGlzdFtpXS5uYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRMaXN0W2ldLm5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCI8c2t5LXRvb2xiYXItaXRlbVxuICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHRvb2xiYXJBY3Rpb25zXCJcbiAgY2xhc3M9XCJza3ktdGV4dC1lZGl0b3ItdG9vbGJhci1hY3Rpb25cIlxuICBbbmdDbGFzc109XCInc2t5LXRleHQtZWRpdG9yLXRvb2xiYXItYWN0aW9uLScgKyBhY3Rpb25cIlxuPlxuICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJhY3Rpb25cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZm9udC1mYW1pbHknXCI+XG4gICAgICA8c2t5LWRyb3Bkb3duXG4gICAgICAgIGNsYXNzPVwic2t5LXRleHQtZWRpdG9yLWZvbnQtcGlja2VyXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2xhYmVsXT1cIidGb250OiAnICsgc3R5bGVTdGF0ZUZvbnROYW1lXCJcbiAgICAgICAgW21lc3NhZ2VTdHJlYW1dPVwiZm9udFBpY2tlclN0cmVhbVwiXG4gICAgICA+XG4gICAgICAgIDxza3ktZHJvcGRvd24tYnV0dG9uXG4gICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgJ2ZvbnQtZmFtaWx5Jzogc3R5bGVTdGF0ZS5mb250XG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBzdHlsZVN0YXRlRm9udE5hbWUgfX1cbiAgICAgICAgPC9za3ktZHJvcGRvd24tYnV0dG9uPlxuICAgICAgICA8c2t5LWRyb3Bkb3duLW1lbnU+XG4gICAgICAgICAgPHNreS1kcm9wZG93bi1pdGVtICpuZ0Zvcj1cImxldCBmb250TW9kZWwgb2YgZm9udExpc3RcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAnZm9udC1mYW1pbHknOiBmb250TW9kZWwudmFsdWVcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJleGVjQ29tbWFuZCgnZm9udG5hbWUnLCBmb250TW9kZWwubmFtZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBmb250TW9kZWwubmFtZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9za3ktZHJvcGRvd24taXRlbT5cbiAgICAgICAgPC9za3ktZHJvcGRvd24tbWVudT5cbiAgICAgIDwvc2t5LWRyb3Bkb3duPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmb250LXNpemUnXCI+XG4gICAgICA8c2t5LWRyb3Bkb3duXG4gICAgICAgIGNsYXNzPVwic2t5LXRleHQtZWRpdG9yLWZvbnQtc2l6ZS1waWNrZXJcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbbGFiZWxdPVwiJ0ZvbnQgc2l6ZTogJyArIHN0eWxlU3RhdGUuZm9udFNpemUgKyAncHgnXCJcbiAgICAgICAgW21lc3NhZ2VTdHJlYW1dPVwiZm9udFNpemVTdHJlYW1cIlxuICAgICAgPlxuICAgICAgICA8c2t5LWRyb3Bkb3duLWJ1dHRvblxuICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICdmb250LWZhbWlseSc6IHN0eWxlU3RhdGUuZm9udFNpemVcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHN0eWxlU3RhdGUuZm9udFNpemUgKyAncHgnIH19XG4gICAgICAgIDwvc2t5LWRyb3Bkb3duLWJ1dHRvbj5cbiAgICAgICAgPHNreS1kcm9wZG93bi1tZW51PlxuICAgICAgICAgIDxza3ktZHJvcGRvd24taXRlbSAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBmb250U2l6ZUxpc3RcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjaGFuZ2VGb250U2l6ZShzaXplKVwiPlxuICAgICAgICAgICAgICB7eyBzaXplICsgJ3B4JyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9za3ktZHJvcGRvd24taXRlbT5cbiAgICAgICAgPC9za3ktZHJvcGRvd24tbWVudT5cbiAgICAgIDwvc2t5LWRyb3Bkb3duPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmb250LXN0eWxlJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNreS1zd2l0Y2gtaWNvbi1ncm91cCBza3ktdGV4dC1lZGl0b3ItZm9udC1zdHlsZS1waWNrZXJcIj5cbiAgICAgICAgPHNreS1jaGVja2JveFxuICAgICAgICAgIGljb249XCJib2xkXCJcbiAgICAgICAgICBsYWJlbD1cIkJvbGRcIlxuICAgICAgICAgIHRpdGxlPVwiQm9sZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbbmdNb2RlbF09XCJzdHlsZVN0YXRlLmJvbGRTdGF0ZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICB0b2dnbGVGb250U3R5bGUoc3R5bGVTdGF0ZS5ib2xkU3RhdGUsICRldmVudCwgJ2JvbGQnKVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgPC9za3ktY2hlY2tib3g+XG4gICAgICAgIDxza3ktY2hlY2tib3hcbiAgICAgICAgICBpY29uPVwiaXRhbGljXCJcbiAgICAgICAgICBsYWJlbD1cIkl0YWxpY2l6ZWRcIlxuICAgICAgICAgIHRpdGxlPVwiSXRhbGljaXplZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbbmdNb2RlbF09XCJzdHlsZVN0YXRlLml0YWxpY1N0YXRlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcbiAgICAgICAgICAgIHRvZ2dsZUZvbnRTdHlsZShzdHlsZVN0YXRlLml0YWxpY1N0YXRlLCAkZXZlbnQsICdpdGFsaWMnKVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgPC9za3ktY2hlY2tib3g+XG4gICAgICAgIDxza3ktY2hlY2tib3hcbiAgICAgICAgICBpY29uPVwidW5kZXJsaW5lXCJcbiAgICAgICAgICBsYWJlbD1cIlVuZGVybGluZVwiXG4gICAgICAgICAgdGl0bGU9XCJVbmRlcmxpbmVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgW25nTW9kZWxdPVwic3R5bGVTdGF0ZS51bmRlcmxpbmVTdGF0ZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICB0b2dnbGVGb250U3R5bGUoc3R5bGVTdGF0ZS51bmRlcmxpbmVTdGF0ZSwgJGV2ZW50LCAndW5kZXJsaW5lJylcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgIDwvc2t5LWNoZWNrYm94PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NvbG9yJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNreS10ZXh0LWVkaXRvci1jb2xvcnBpY2tlci1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2t5LXRleHQtZWRpdG9yLWNvbG9ycGlja2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxza3ktY29sb3JwaWNrZXJcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LXRleHQtZWRpdG9yLWZvbnQtY29sb3ItcGlja2VyXCJcbiAgICAgICAgICAgIGxhYmVsPVwiRm9udCBjb2xvclwiXG4gICAgICAgICAgICBbbWVzc2FnZVN0cmVhbV09XCJjb2xvcnBpY2tlclN0cmVhbVwiXG4gICAgICAgICAgICBbc2hvd1Jlc2V0QnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgIChzZWxlY3RlZENvbG9yQ2hhbmdlZCk9XCJvbkNvbG9ycGlja2VyQ29sb3JDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgcGlja2VyQnV0dG9uSWNvbj1cImhpZ2hsaWdodGVyXCJcbiAgICAgICAgICAgIHBpY2tlckJ1dHRvbkljb25UeXBlPVwic2t5dXhcIlxuICAgICAgICAgICAgI2NvbG9yUGlja2VyXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG91dHB1dEZvcm1hdD1cImhleFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW2FsbG93VHJhbnNwYXJlbmN5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic3R5bGVTdGF0ZS5mb250Q29sb3JcIlxuICAgICAgICAgICAgICBbc2t5Q29sb3JwaWNrZXJJbnB1dF09XCJjb2xvclBpY2tlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc2t5LWNvbG9ycGlja2VyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNreS10ZXh0LWVkaXRvci1jb2xvcnBpY2tlci1jb250YWluZXJcIj5cbiAgICAgICAgICA8c2t5LWNvbG9ycGlja2VyXG4gICAgICAgICAgICBjbGFzcz1cInNreS10ZXh0LWVkaXRvci1iYWNrZ3JvdW5kLWNvbG9yLXBpY2tlclwiXG4gICAgICAgICAgICBsYWJlbD1cIkJhY2tncm91bmQgY29sb3JcIlxuICAgICAgICAgICAgW21lc3NhZ2VTdHJlYW1dPVwiYmFja0NvbG9ycGlja2VyU3RyZWFtXCJcbiAgICAgICAgICAgIFtzaG93UmVzZXRCdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgKHNlbGVjdGVkQ29sb3JDaGFuZ2VkKT1cIm9uQ29sb3JwaWNrZXJDb2xvckNoYW5nZWQoJGV2ZW50LCB0cnVlKVwiXG4gICAgICAgICAgICAjYmFja0NvbG9yUGlja2VyXG4gICAgICAgICAgICBwaWNrZXJCdXR0b25JY29uPVwidGV4dC1jb2xvclwiXG4gICAgICAgICAgICBwaWNrZXJCdXR0b25JY29uVHlwZT1cInNreXV4XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0PVwicmdiYVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW2FsbG93VHJhbnNwYXJlbmN5XT1cInRydWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzdHlsZVN0YXRlLmJhY2tDb2xvclwiXG4gICAgICAgICAgICAgIFtza3lDb2xvcnBpY2tlcklucHV0XT1cImJhY2tDb2xvclBpY2tlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc2t5LWNvbG9ycGlja2VyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0J1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNreS1zd2l0Y2gtaWNvbi1ncm91cFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkJ1bGxldGVkIGxpc3RcIlxuICAgICAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWRlZmF1bHQgc2t5LWJ0bi1pY29uXCJcbiAgICAgICAgICB0aXRsZT1cIkJ1bGxldGVkIGxpc3RcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cImV4ZWNDb21tYW5kKCdpbnNlcnRVbm9yZGVyZWRMaXN0JylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNreS1pY29uICpza3lUaGVtZUlmPVwiJ2RlZmF1bHQnXCIgaWNvbj1cImxpc3QtdWxcIj4gPC9za3ktaWNvbj5cbiAgICAgICAgICA8c2t5LWljb25cbiAgICAgICAgICAgICpza3lUaGVtZUlmPVwiJ21vZGVybidcIlxuICAgICAgICAgICAgaWNvbj1cImJ1bGxldC1saXN0LWxpbmVcIlxuICAgICAgICAgICAgaWNvblR5cGU9XCJza3l1eFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvc2t5LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIk51bWJlcmVkIGxpc3RcIlxuICAgICAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWRlZmF1bHQgc2t5LWJ0bi1pY29uXCJcbiAgICAgICAgICB0aXRsZT1cIk51bWJlcmVkIGxpc3RcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cImV4ZWNDb21tYW5kKCdpbnNlcnRPcmRlcmVkTGlzdCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidkZWZhdWx0J1wiIGljb249XCJsaXN0LW9sXCI+IDwvc2t5LWljb24+XG4gICAgICAgICAgPHNreS1pY29uXG4gICAgICAgICAgICAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCJcbiAgICAgICAgICAgIGljb249XCJudW1iZXItbGlzdC1saW5lXCJcbiAgICAgICAgICAgIGljb25UeXBlPVwic2t5dXhcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3NreS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhbGlnbm1lbnQnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2t5LXN3aXRjaC1pY29uLWdyb3VwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQWxpZ24gbGVmdFwiXG4gICAgICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tZGVmYXVsdCBza3ktYnRuLWljb25cIlxuICAgICAgICAgIHRpdGxlPVwiQWxpZ24gbGVmdFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY0NvbW1hbmQoJ2p1c3RpZnlMZWZ0JylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNreS1pY29uICpza3lUaGVtZUlmPVwiJ2RlZmF1bHQnXCIgaWNvbj1cImFsaWduLWxlZnRcIj4gPC9za3ktaWNvbj5cbiAgICAgICAgICA8c2t5LWljb25cbiAgICAgICAgICAgICpza3lUaGVtZUlmPVwiJ21vZGVybidcIlxuICAgICAgICAgICAgaWNvbj1cImFsaWduLWxlZnQtdGV4dC1saW5lXCJcbiAgICAgICAgICAgIGljb25UeXBlPVwic2t5dXhcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3NreS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJBbGlnbiBjZW50ZXJcIlxuICAgICAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWRlZmF1bHQgc2t5LWJ0bi1pY29uXCJcbiAgICAgICAgICB0aXRsZT1cIkFsaWduIGNlbnRlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY0NvbW1hbmQoJ2p1c3RpZnlDZW50ZXInKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInZGVmYXVsdCdcIiBpY29uPVwiYWxpZ24tY2VudGVyXCI+IDwvc2t5LWljb24+XG4gICAgICAgICAgPHNreS1pY29uXG4gICAgICAgICAgICAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCJcbiAgICAgICAgICAgIGljb249XCJjZW50ZXItdGV4dC1saW5lXCJcbiAgICAgICAgICAgIGljb25UeXBlPVwic2t5dXhcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3NreS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJBbGlnbiByaWdodFwiXG4gICAgICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tZGVmYXVsdCBza3ktYnRuLWljb25cIlxuICAgICAgICAgIHRpdGxlPVwiQWxpZ24gcmlnaHRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cImV4ZWNDb21tYW5kKCdqdXN0aWZ5UmlnaHQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInZGVmYXVsdCdcIiBpY29uPVwiYWxpZ24tcmlnaHRcIj4gPC9za3ktaWNvbj5cbiAgICAgICAgICA8c2t5LWljb25cbiAgICAgICAgICAgICpza3lUaGVtZUlmPVwiJ21vZGVybidcIlxuICAgICAgICAgICAgaWNvbj1cImFsaWduLXJpZ2h0LXRleHQtbGluZVwiXG4gICAgICAgICAgICBpY29uVHlwZT1cInNreXV4XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9za3ktaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5kZW50YXRpb24nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2t5LXN3aXRjaC1pY29uLWdyb3VwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBhcmlhLWxhYmVsPVwiT3V0ZGVudFwiXG4gICAgICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tZGVmYXVsdCBza3ktYnRuLWljb25cIlxuICAgICAgICAgIHRpdGxlPVwiT3V0ZGVudFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY0NvbW1hbmQoJ291dGRlbnQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInZGVmYXVsdCdcIiBpY29uPVwib3V0ZGVudFwiPiA8L3NreS1pY29uPlxuICAgICAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCIgaWNvbj1cIm91dGRlbnQtbGluZVwiIGljb25UeXBlPVwic2t5dXhcIj5cbiAgICAgICAgICA8L3NreS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJJbmRlbnRcIlxuICAgICAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWRlZmF1bHQgc2t5LWJ0bi1pY29uXCJcbiAgICAgICAgICB0aXRsZT1cIkluZGVudFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY0NvbW1hbmQoJ2luZGVudCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidkZWZhdWx0J1wiIGljb249XCJpbmRlbnRcIj4gPC9za3ktaWNvbj5cbiAgICAgICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInbW9kZXJuJ1wiIGljb249XCJpbmRlbnQtbGluZVwiIGljb25UeXBlPVwic2t5dXhcIj5cbiAgICAgICAgICA8L3NreS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid1bmRvLXJlZG8nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2t5LXN3aXRjaC1pY29uLWdyb3VwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBhcmlhLWxhYmVsPVwiVW5kb1wiXG4gICAgICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tZGVmYXVsdCBza3ktYnRuLWljb25cIlxuICAgICAgICAgIHRpdGxlPVwiVW5kb1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY0NvbW1hbmQoJ3VuZG8nKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInZGVmYXVsdCdcIiBpY29uPVwidW5kb1wiPiA8L3NreS1pY29uPlxuICAgICAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCIgaWNvbj1cInVuZG8tbGluZVwiIGljb25UeXBlPVwic2t5dXhcIj5cbiAgICAgICAgICA8L3NreS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZWRvXCJcbiAgICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1kZWZhdWx0IHNreS1idG4taWNvblwiXG4gICAgICAgICAgdGl0bGU9XCJSZWRvXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJleGVjQ29tbWFuZCgncmVkbycpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidkZWZhdWx0J1wiIGljb249XCJyZXBlYXRcIj4gPC9za3ktaWNvbj5cbiAgICAgICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInbW9kZXJuJ1wiIGljb249XCJyZWRvLWxpbmVcIiBpY29uVHlwZT1cInNreXV4XCI+XG4gICAgICAgICAgPC9za3ktaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbGluaydcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJza3ktc3dpdGNoLWljb24tZ3JvdXBcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaW5rXCJcbiAgICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1kZWZhdWx0IHNreS1idG4taWNvblwiXG4gICAgICAgICAgdGl0bGU9XCJMaW5rXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdpY29uLWJ0bi1hY3RpdmUnOiBzdHlsZVN0YXRlLmxpbmtTdGF0ZVxuICAgICAgICAgIH1cIlxuICAgICAgICAgIChjbGljayk9XCJsaW5rKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNreS1pY29uICpza3lUaGVtZUlmPVwiJ2RlZmF1bHQnXCIgaWNvbj1cImxpbmtcIj4gPC9za3ktaWNvbj5cbiAgICAgICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInbW9kZXJuJ1wiIGljb249XCJsaW5rLWxpbmVcIiBpY29uVHlwZT1cInNreXV4XCI+XG4gICAgICAgICAgPC9za3ktaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBhcmlhLWxhYmVsPVwiVW5saW5rXCJcbiAgICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1kZWZhdWx0IHNreS1idG4taWNvblwiXG4gICAgICAgICAgdGl0bGU9XCJVbmxpbmtcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3R5bGVTdGF0ZS5saW5rU3RhdGUgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJ1bmxpbmsoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInZGVmYXVsdCdcIiBpY29uPVwidW5saW5rXCI+IDwvc2t5LWljb24+XG4gICAgICAgICAgPHNreS1pY29uICpza3lUaGVtZUlmPVwiJ21vZGVybidcIiBpY29uPVwidW5saW5rLWxpbmVcIiBpY29uVHlwZT1cInNreXV4XCI+XG4gICAgICAgICAgPC9za3ktaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L3NreS10b29sYmFyLWl0ZW0+XG4iXX0=
@@ -0,0 +1,119 @@
1
+ import { Component } from '@angular/core';
2
+ import { SkyValidation } from '@skyux/validation';
3
+ import { UrlTarget } from './text-editor-url-target';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@skyux/modals";
6
+ import * as i2 from "./text-editor-url-modal-context";
7
+ import * as i3 from "@angular/forms";
8
+ import * as i4 from "@skyux/core";
9
+ import * as i5 from "@skyux/forms";
10
+ import * as i6 from "@skyux/tabs";
11
+ import * as i7 from "@skyux/i18n";
12
+ const emailKey = 'mailto:';
13
+ const queryStringParamKey = '?Subject=';
14
+ /**
15
+ * @internal
16
+ */
17
+ export class SkyTextEditorUrlModalComponent {
18
+ set activeTab(value) {
19
+ this.#_activeTab = value;
20
+ this.valid = this.#isValid();
21
+ }
22
+ get activeTab() {
23
+ return this.#_activeTab;
24
+ }
25
+ set emailAddress(value) {
26
+ this.#_emailAddress = value;
27
+ this.valid = this.#isValid();
28
+ }
29
+ get emailAddress() {
30
+ return this.#_emailAddress;
31
+ }
32
+ set url(value) {
33
+ this.#_url = value;
34
+ this.valid = this.#isValid();
35
+ }
36
+ get url() {
37
+ return this.#_url;
38
+ }
39
+ #modalInstance;
40
+ #_activeTab;
41
+ #_emailAddress;
42
+ #_url;
43
+ constructor(modalInstance, modalContext) {
44
+ this.emailAddressValid = false;
45
+ this.subject = '';
46
+ this.target = 0;
47
+ this.valid = false;
48
+ this.#_activeTab = 0;
49
+ this.#_emailAddress = '';
50
+ this.#_url = 'https://';
51
+ this.#modalInstance = modalInstance;
52
+ if (modalContext.urlResult) {
53
+ if (modalContext.urlResult.url.startsWith(emailKey)) {
54
+ this.emailAddress = modalContext.urlResult.url.replace(emailKey, '');
55
+ let queryStringIndex = this.emailAddress.indexOf(queryStringParamKey);
56
+ queryStringIndex =
57
+ queryStringIndex > -1
58
+ ? queryStringIndex
59
+ : this.emailAddress.indexOf(queryStringParamKey.toLowerCase());
60
+ /* istanbul ignore else */
61
+ if (queryStringIndex > -1) {
62
+ this.subject = decodeURI(this.emailAddress).slice(queryStringIndex + queryStringParamKey.length);
63
+ this.emailAddress = this.emailAddress.slice(0, queryStringIndex);
64
+ }
65
+ // Set active tab to email
66
+ this.activeTab = 1;
67
+ }
68
+ else {
69
+ (this.url = modalContext.urlResult.url),
70
+ (this.target = modalContext.urlResult.target);
71
+ // set active tab to web page
72
+ this.activeTab = 0;
73
+ }
74
+ }
75
+ }
76
+ activeTabChanged(value) {
77
+ this.activeTab = Number(value);
78
+ }
79
+ save() {
80
+ /* istanbul ignore else */
81
+ if (this.#isValid()) {
82
+ if (this.activeTab === 0) {
83
+ this.#modalInstance.save({
84
+ url: this.url,
85
+ target: this.target
86
+ ? parseInt(this.target, undefined)
87
+ : UrlTarget.None,
88
+ });
89
+ }
90
+ else {
91
+ this.#modalInstance.save({
92
+ url: this.#getEmailUrl(),
93
+ target: UrlTarget.None,
94
+ });
95
+ }
96
+ }
97
+ }
98
+ cancel() {
99
+ this.#modalInstance.cancel();
100
+ }
101
+ #getEmailUrl() {
102
+ return (emailKey +
103
+ this.emailAddress +
104
+ (this.subject ? '?Subject=' + encodeURI(this.subject) : ''));
105
+ }
106
+ #isValid() {
107
+ if (this.activeTab === 0) {
108
+ return !!this.url && SkyValidation.isUrl(this.url);
109
+ }
110
+ return !!this.emailAddress && SkyValidation.isEmail(this.emailAddress);
111
+ }
112
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTextEditorUrlModalComponent, deps: [{ token: i1.SkyModalInstance }, { token: i2.SkyUrlModalContext }], target: i0.ɵɵFactoryTarget.Component }); }
113
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyTextEditorUrlModalComponent, selector: "sky-text-editor-url-modal", ngImport: i0, template: "<sky-modal>\n <sky-modal-header>\n {{ 'skyux_text_editor_url_modal_header_label' | skyLibResources }}\n </sky-modal-header>\n <sky-modal-content>\n <sky-tabset\n data-sky-id=\"test-tabset\"\n [active]=\"activeTab\"\n (activeChange)=\"activeTabChanged($event)\"\n >\n <sky-tab tabHeading=\"Web page\">\n <div class=\"sky-form-group sky-text-editor-url-modal-first-field\">\n <sky-input-box>\n <label\n class=\"sky-control-label sky-control-label-required\"\n [for]=\"urlInput.id\"\n >\n {{ 'skyux_text_editor_url_modal_url_label' | skyLibResources }}\n </label>\n <input\n class=\"sky-form-control\"\n type=\"text\"\n [(ngModel)]=\"url\"\n skyId\n #urlInput=\"skyId\"\n />\n </sky-input-box>\n </div>\n <sky-input-box class=\"sky-form-group\">\n <label class=\"sky-control-label\" [for]=\"targetInput.id\">\n {{ 'skyux_text_editor_url_modal_open_label' | skyLibResources }}\n </label>\n <select\n class=\"sky-form-control\"\n [(ngModel)]=\"target\"\n skyId\n #targetInput=\"skyId\"\n >\n <option value=\"0\">\n {{\n 'skyux_text_editor_url_modal_current_option_label'\n | skyLibResources\n }}\n </option>\n <option value=\"1\">\n {{\n 'skyux_text_editor_url_modal_new_option_label' | skyLibResources\n }}\n </option>\n </select>\n </sky-input-box>\n </sky-tab>\n <sky-tab tabHeading=\"Email address\">\n <div class=\"sky-form-group first-field\">\n <sky-input-box>\n <label\n class=\"sky-control-label sky-control-label-required\"\n [for]=\"emailAddressInput.id\"\n >\n {{ 'skyux_text_editor_url_modal_email_label' | skyLibResources }}\n </label>\n <input\n class=\"sky-form-control\"\n type=\"text\"\n [(ngModel)]=\"emailAddress\"\n skyId\n #emailAddressInput=\"skyId\"\n />\n </sky-input-box>\n </div>\n <sky-input-box class=\"sky-form-group\">\n <label class=\"sky-control-label\" [for]=\"subjectInput.id\">\n {{ 'skyux_text_editor_url_modal_subject_label' | skyLibResources }}\n </label>\n <input\n class=\"sky-form-control\"\n type=\"text\"\n [(ngModel)]=\"subject\"\n skyId\n #subjectInput=\"skyId\"\n />\n </sky-input-box>\n </sky-tab>\n </sky-tabset>\n </sky-modal-content>\n <sky-modal-footer>\n <button\n type=\"submit\"\n class=\"sky-btn sky-btn-primary\"\n [disabled]=\"!valid\"\n (click)=\"save()\"\n >\n {{ 'skyux_text_editor_url_modal_save_button_label' | skyLibResources }}\n </button>\n <button type=\"button\" class=\"sky-btn sky-btn-link\" (click)=\"cancel()\">\n {{ 'skyux_text_editor_url_modal_cancel_button_label' | skyLibResources }}\n </button>\n </sky-modal-footer>\n</sky-modal>\n", styles: [".sky-text-editor-url-modal-first-field{margin-top:15px}\n"], dependencies: [{ kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.λ2, selector: "[skyId]", exportAs: ["skyId"] }, { kind: "component", type: i5.λ10, selector: "sky-input-box", inputs: ["hasErrors", "disabled", "labelText", "characterLimit", "stacked", "helpPopoverTitle", "helpPopoverContent"] }, { kind: "component", type: i1.λ5, selector: "sky-modal", inputs: ["formErrors", "ariaRole", "tiledBody", "ariaDescribedBy", "ariaLabelledBy"] }, { kind: "component", type: i1.λ2, selector: "sky-modal-content" }, { kind: "component", type: i1.λ3, selector: "sky-modal-footer" }, { kind: "component", type: i1.λ4, selector: "sky-modal-header" }, { kind: "component", type: i6.λ1, selector: "sky-tab", inputs: ["active", "disabled", "permalinkValue", "tabHeaderCount", "tabHeading", "tabIndex", "layout"], outputs: ["close"] }, { kind: "component", type: i6.λ2, selector: "sky-tabset", inputs: ["active", "ariaLabel", "ariaLabelledBy", "permalinkId", "tabStyle"], outputs: ["activeChange", "newTab", "openTab", "tabIndexesChange"] }, { kind: "pipe", type: i7.SkyLibResourcesPipe, name: "skyLibResources" }] }); }
114
+ }
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTextEditorUrlModalComponent, decorators: [{
116
+ type: Component,
117
+ args: [{ selector: 'sky-text-editor-url-modal', template: "<sky-modal>\n <sky-modal-header>\n {{ 'skyux_text_editor_url_modal_header_label' | skyLibResources }}\n </sky-modal-header>\n <sky-modal-content>\n <sky-tabset\n data-sky-id=\"test-tabset\"\n [active]=\"activeTab\"\n (activeChange)=\"activeTabChanged($event)\"\n >\n <sky-tab tabHeading=\"Web page\">\n <div class=\"sky-form-group sky-text-editor-url-modal-first-field\">\n <sky-input-box>\n <label\n class=\"sky-control-label sky-control-label-required\"\n [for]=\"urlInput.id\"\n >\n {{ 'skyux_text_editor_url_modal_url_label' | skyLibResources }}\n </label>\n <input\n class=\"sky-form-control\"\n type=\"text\"\n [(ngModel)]=\"url\"\n skyId\n #urlInput=\"skyId\"\n />\n </sky-input-box>\n </div>\n <sky-input-box class=\"sky-form-group\">\n <label class=\"sky-control-label\" [for]=\"targetInput.id\">\n {{ 'skyux_text_editor_url_modal_open_label' | skyLibResources }}\n </label>\n <select\n class=\"sky-form-control\"\n [(ngModel)]=\"target\"\n skyId\n #targetInput=\"skyId\"\n >\n <option value=\"0\">\n {{\n 'skyux_text_editor_url_modal_current_option_label'\n | skyLibResources\n }}\n </option>\n <option value=\"1\">\n {{\n 'skyux_text_editor_url_modal_new_option_label' | skyLibResources\n }}\n </option>\n </select>\n </sky-input-box>\n </sky-tab>\n <sky-tab tabHeading=\"Email address\">\n <div class=\"sky-form-group first-field\">\n <sky-input-box>\n <label\n class=\"sky-control-label sky-control-label-required\"\n [for]=\"emailAddressInput.id\"\n >\n {{ 'skyux_text_editor_url_modal_email_label' | skyLibResources }}\n </label>\n <input\n class=\"sky-form-control\"\n type=\"text\"\n [(ngModel)]=\"emailAddress\"\n skyId\n #emailAddressInput=\"skyId\"\n />\n </sky-input-box>\n </div>\n <sky-input-box class=\"sky-form-group\">\n <label class=\"sky-control-label\" [for]=\"subjectInput.id\">\n {{ 'skyux_text_editor_url_modal_subject_label' | skyLibResources }}\n </label>\n <input\n class=\"sky-form-control\"\n type=\"text\"\n [(ngModel)]=\"subject\"\n skyId\n #subjectInput=\"skyId\"\n />\n </sky-input-box>\n </sky-tab>\n </sky-tabset>\n </sky-modal-content>\n <sky-modal-footer>\n <button\n type=\"submit\"\n class=\"sky-btn sky-btn-primary\"\n [disabled]=\"!valid\"\n (click)=\"save()\"\n >\n {{ 'skyux_text_editor_url_modal_save_button_label' | skyLibResources }}\n </button>\n <button type=\"button\" class=\"sky-btn sky-btn-link\" (click)=\"cancel()\">\n {{ 'skyux_text_editor_url_modal_cancel_button_label' | skyLibResources }}\n </button>\n </sky-modal-footer>\n</sky-modal>\n", styles: [".sky-text-editor-url-modal-first-field{margin-top:15px}\n"] }]
118
+ }], ctorParameters: function () { return [{ type: i1.SkyModalInstance }, { type: i2.SkyUrlModalContext }]; } });
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3ItdXJsLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy90ZXh0LWVkaXRvci9zcmMvbGliL21vZHVsZXMvdGV4dC1lZGl0b3IvdXJsLW1vZGFsL3RleHQtZWRpdG9yLXVybC1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGV4dC1lZGl0b3Ivc3JjL2xpYi9tb2R1bGVzL3RleHQtZWRpdG9yL3VybC1tb2RhbC90ZXh0LWVkaXRvci11cmwtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7QUFFckQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDO0FBRXhDOztHQUVHO0FBTUgsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxJQUFXLFNBQVMsQ0FBQyxLQUFhO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLFlBQVksQ0FBQyxLQUFhO1FBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFXLEdBQUcsQ0FBQyxLQUFhO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQU9ELGNBQWMsQ0FBbUI7SUFFakMsV0FBVyxDQUFLO0lBQ2hCLGNBQWMsQ0FBTTtJQUNwQixLQUFLLENBQWM7SUFFbkIsWUFDRSxhQUErQixFQUMvQixZQUFnQztRQWIzQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLFdBQU0sR0FBb0IsQ0FBQyxDQUFDO1FBQzVCLFVBQUssR0FBRyxLQUFLLENBQUM7UUFJckIsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsVUFBSyxHQUFHLFVBQVUsQ0FBQztRQU1qQixJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUVwQyxJQUFJLFlBQVksQ0FBQyxTQUFTLEVBQUU7WUFDMUIsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFckUsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN0RSxnQkFBZ0I7b0JBQ2QsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQixDQUFDLENBQUMsZ0JBQWdCO3dCQUNsQixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFFbkUsMEJBQTBCO2dCQUMxQixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUMvQyxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQzlDLENBQUM7b0JBQ0YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztpQkFDbEU7Z0JBRUQsMEJBQTBCO2dCQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQzthQUNwQjtpQkFBTTtnQkFDTCxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7b0JBQ3JDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQWEsQ0FBQyxDQUFDO2dCQUV2RCw2QkFBNkI7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQ3BCO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsS0FBa0I7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLElBQUk7UUFDVCwwQkFBMEI7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbkIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7b0JBQ3ZCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztvQkFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07d0JBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQWdCLEVBQUUsU0FBUyxDQUFDO3dCQUM1QyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUk7aUJBQ0QsQ0FBQyxDQUFDO2FBQ3RCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO29CQUN2QixHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDeEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJO2lCQUNMLENBQUMsQ0FBQzthQUN0QjtTQUNGO0lBQ0gsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxDQUNMLFFBQVE7WUFDUixJQUFJLENBQUMsWUFBWTtZQUNqQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDNUQsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RSxDQUFDOzhHQW5IVSw4QkFBOEI7a0dBQTlCLDhCQUE4QixpRUNwQjNDLCt4R0FtR0E7OzJGRC9FYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0UsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTa3lNb2RhbEluc3RhbmNlIH0gZnJvbSAnQHNreXV4L21vZGFscyc7XG5pbXBvcnQgeyBTa3lUYWJJbmRleCB9IGZyb20gJ0Bza3l1eC90YWJzJztcbmltcG9ydCB7IFNreVZhbGlkYXRpb24gfSBmcm9tICdAc2t5dXgvdmFsaWRhdGlvbic7XG5cbmltcG9ydCB7IFNreVVybE1vZGFsQ29udGV4dCB9IGZyb20gJy4vdGV4dC1lZGl0b3ItdXJsLW1vZGFsLWNvbnRleHQnO1xuaW1wb3J0IHsgVXJsTW9kYWxSZXN1bHQgfSBmcm9tICcuL3RleHQtZWRpdG9yLXVybC1tb2RhbC1yZXN1bHQnO1xuaW1wb3J0IHsgVXJsVGFyZ2V0IH0gZnJvbSAnLi90ZXh0LWVkaXRvci11cmwtdGFyZ2V0JztcblxuY29uc3QgZW1haWxLZXkgPSAnbWFpbHRvOic7XG5jb25zdCBxdWVyeVN0cmluZ1BhcmFtS2V5ID0gJz9TdWJqZWN0PSc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS10ZXh0LWVkaXRvci11cmwtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC1lZGl0b3ItdXJsLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC1lZGl0b3ItdXJsLW1vZGFsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JVcmxNb2RhbENvbXBvbmVudCB7XG4gIHB1YmxpYyBzZXQgYWN0aXZlVGFiKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLiNfYWN0aXZlVGFiID0gdmFsdWU7XG4gICAgdGhpcy52YWxpZCA9IHRoaXMuI2lzVmFsaWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlVGFiKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuI19hY3RpdmVUYWI7XG4gIH1cblxuICBwdWJsaWMgc2V0IGVtYWlsQWRkcmVzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy4jX2VtYWlsQWRkcmVzcyA9IHZhbHVlO1xuICAgIHRoaXMudmFsaWQgPSB0aGlzLiNpc1ZhbGlkKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVtYWlsQWRkcmVzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNfZW1haWxBZGRyZXNzO1xuICB9XG5cbiAgcHVibGljIHNldCB1cmwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuI191cmwgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbGlkID0gdGhpcy4jaXNWYWxpZCgpO1xuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jX3VybDtcbiAgfVxuXG4gIHB1YmxpYyBlbWFpbEFkZHJlc3NWYWxpZCA9IGZhbHNlO1xuICBwdWJsaWMgc3ViamVjdCA9ICcnO1xuICBwdWJsaWMgdGFyZ2V0OiBudW1iZXIgfCBzdHJpbmcgPSAwO1xuICBwdWJsaWMgdmFsaWQgPSBmYWxzZTtcblxuICAjbW9kYWxJbnN0YW5jZTogU2t5TW9kYWxJbnN0YW5jZTtcblxuICAjX2FjdGl2ZVRhYiA9IDA7XG4gICNfZW1haWxBZGRyZXNzID0gJyc7XG4gICNfdXJsID0gJ2h0dHBzOi8vJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtb2RhbEluc3RhbmNlOiBTa3lNb2RhbEluc3RhbmNlLFxuICAgIG1vZGFsQ29udGV4dDogU2t5VXJsTW9kYWxDb250ZXh0XG4gICkge1xuICAgIHRoaXMuI21vZGFsSW5zdGFuY2UgPSBtb2RhbEluc3RhbmNlO1xuXG4gICAgaWYgKG1vZGFsQ29udGV4dC51cmxSZXN1bHQpIHtcbiAgICAgIGlmIChtb2RhbENvbnRleHQudXJsUmVzdWx0LnVybC5zdGFydHNXaXRoKGVtYWlsS2V5KSkge1xuICAgICAgICB0aGlzLmVtYWlsQWRkcmVzcyA9IG1vZGFsQ29udGV4dC51cmxSZXN1bHQudXJsLnJlcGxhY2UoZW1haWxLZXksICcnKTtcblxuICAgICAgICBsZXQgcXVlcnlTdHJpbmdJbmRleCA9IHRoaXMuZW1haWxBZGRyZXNzLmluZGV4T2YocXVlcnlTdHJpbmdQYXJhbUtleSk7XG4gICAgICAgIHF1ZXJ5U3RyaW5nSW5kZXggPVxuICAgICAgICAgIHF1ZXJ5U3RyaW5nSW5kZXggPiAtMVxuICAgICAgICAgICAgPyBxdWVyeVN0cmluZ0luZGV4XG4gICAgICAgICAgICA6IHRoaXMuZW1haWxBZGRyZXNzLmluZGV4T2YocXVlcnlTdHJpbmdQYXJhbUtleS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAocXVlcnlTdHJpbmdJbmRleCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy5zdWJqZWN0ID0gZGVjb2RlVVJJKHRoaXMuZW1haWxBZGRyZXNzKS5zbGljZShcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nSW5kZXggKyBxdWVyeVN0cmluZ1BhcmFtS2V5Lmxlbmd0aFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5lbWFpbEFkZHJlc3MgPSB0aGlzLmVtYWlsQWRkcmVzcy5zbGljZSgwLCBxdWVyeVN0cmluZ0luZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBhY3RpdmUgdGFiIHRvIGVtYWlsXG4gICAgICAgIHRoaXMuYWN0aXZlVGFiID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLnVybCA9IG1vZGFsQ29udGV4dC51cmxSZXN1bHQudXJsKSxcbiAgICAgICAgICAodGhpcy50YXJnZXQgPSBtb2RhbENvbnRleHQudXJsUmVzdWx0LnRhcmdldCBhcyBhbnkpO1xuXG4gICAgICAgIC8vIHNldCBhY3RpdmUgdGFiIHRvIHdlYiBwYWdlXG4gICAgICAgIHRoaXMuYWN0aXZlVGFiID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWN0aXZlVGFiQ2hhbmdlZCh2YWx1ZTogU2t5VGFiSW5kZXgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVRhYiA9IE51bWJlcih2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLiNpc1ZhbGlkKCkpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gMCkge1xuICAgICAgICB0aGlzLiNtb2RhbEluc3RhbmNlLnNhdmUoe1xuICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldFxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnRhcmdldCBhcyBzdHJpbmcsIHVuZGVmaW5lZClcbiAgICAgICAgICAgIDogVXJsVGFyZ2V0Lk5vbmUsXG4gICAgICAgIH0gYXMgVXJsTW9kYWxSZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jbW9kYWxJbnN0YW5jZS5zYXZlKHtcbiAgICAgICAgICB1cmw6IHRoaXMuI2dldEVtYWlsVXJsKCksXG4gICAgICAgICAgdGFyZ2V0OiBVcmxUYXJnZXQuTm9uZSxcbiAgICAgICAgfSBhcyBVcmxNb2RhbFJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLiNtb2RhbEluc3RhbmNlLmNhbmNlbCgpO1xuICB9XG5cbiAgI2dldEVtYWlsVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVtYWlsS2V5ICtcbiAgICAgIHRoaXMuZW1haWxBZGRyZXNzICtcbiAgICAgICh0aGlzLnN1YmplY3QgPyAnP1N1YmplY3Q9JyArIGVuY29kZVVSSSh0aGlzLnN1YmplY3QpIDogJycpXG4gICAgKTtcbiAgfVxuXG4gICNpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gMCkge1xuICAgICAgcmV0dXJuICEhdGhpcy51cmwgJiYgU2t5VmFsaWRhdGlvbi5pc1VybCh0aGlzLnVybCk7XG4gICAgfVxuICAgIHJldHVybiAhIXRoaXMuZW1haWxBZGRyZXNzICYmIFNreVZhbGlkYXRpb24uaXNFbWFpbCh0aGlzLmVtYWlsQWRkcmVzcyk7XG4gIH1cbn1cbiIsIjxza3ktbW9kYWw+XG4gIDxza3ktbW9kYWwtaGVhZGVyPlxuICAgIHt7ICdza3l1eF90ZXh0X2VkaXRvcl91cmxfbW9kYWxfaGVhZGVyX2xhYmVsJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICA8L3NreS1tb2RhbC1oZWFkZXI+XG4gIDxza3ktbW9kYWwtY29udGVudD5cbiAgICA8c2t5LXRhYnNldFxuICAgICAgZGF0YS1za3ktaWQ9XCJ0ZXN0LXRhYnNldFwiXG4gICAgICBbYWN0aXZlXT1cImFjdGl2ZVRhYlwiXG4gICAgICAoYWN0aXZlQ2hhbmdlKT1cImFjdGl2ZVRhYkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPHNreS10YWIgdGFiSGVhZGluZz1cIldlYiBwYWdlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJza3ktZm9ybS1ncm91cCBza3ktdGV4dC1lZGl0b3ItdXJsLW1vZGFsLWZpcnN0LWZpZWxkXCI+XG4gICAgICAgICAgPHNreS1pbnB1dC1ib3g+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJza3ktY29udHJvbC1sYWJlbCBza3ktY29udHJvbC1sYWJlbC1yZXF1aXJlZFwiXG4gICAgICAgICAgICAgIFtmb3JdPVwidXJsSW5wdXQuaWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnc2t5dXhfdGV4dF9lZGl0b3JfdXJsX21vZGFsX3VybF9sYWJlbCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgY2xhc3M9XCJza3ktZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInVybFwiXG4gICAgICAgICAgICAgIHNreUlkXG4gICAgICAgICAgICAgICN1cmxJbnB1dD1cInNreUlkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9za3ktaW5wdXQtYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNreS1pbnB1dC1ib3ggY2xhc3M9XCJza3ktZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNreS1jb250cm9sLWxhYmVsXCIgW2Zvcl09XCJ0YXJnZXRJbnB1dC5pZFwiPlxuICAgICAgICAgICAge3sgJ3NreXV4X3RleHRfZWRpdG9yX3VybF9tb2RhbF9vcGVuX2xhYmVsJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJza3ktZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFyZ2V0XCJcbiAgICAgICAgICAgIHNreUlkXG4gICAgICAgICAgICAjdGFyZ2V0SW5wdXQ9XCJza3lJZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjBcIj5cbiAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAnc2t5dXhfdGV4dF9lZGl0b3JfdXJsX21vZGFsX2N1cnJlbnRfb3B0aW9uX2xhYmVsJ1xuICAgICAgICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj5cbiAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAnc2t5dXhfdGV4dF9lZGl0b3JfdXJsX21vZGFsX25ld19vcHRpb25fbGFiZWwnIHwgc2t5TGliUmVzb3VyY2VzXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9za3ktaW5wdXQtYm94PlxuICAgICAgPC9za3ktdGFiPlxuICAgICAgPHNreS10YWIgdGFiSGVhZGluZz1cIkVtYWlsIGFkZHJlc3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNreS1mb3JtLWdyb3VwIGZpcnN0LWZpZWxkXCI+XG4gICAgICAgICAgPHNreS1pbnB1dC1ib3g+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJza3ktY29udHJvbC1sYWJlbCBza3ktY29udHJvbC1sYWJlbC1yZXF1aXJlZFwiXG4gICAgICAgICAgICAgIFtmb3JdPVwiZW1haWxBZGRyZXNzSW5wdXQuaWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnc2t5dXhfdGV4dF9lZGl0b3JfdXJsX21vZGFsX2VtYWlsX2xhYmVsJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cInNreS1mb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZW1haWxBZGRyZXNzXCJcbiAgICAgICAgICAgICAgc2t5SWRcbiAgICAgICAgICAgICAgI2VtYWlsQWRkcmVzc0lucHV0PVwic2t5SWRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3NreS1pbnB1dC1ib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2t5LWlucHV0LWJveCBjbGFzcz1cInNreS1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwic2t5LWNvbnRyb2wtbGFiZWxcIiBbZm9yXT1cInN1YmplY3RJbnB1dC5pZFwiPlxuICAgICAgICAgICAge3sgJ3NreXV4X3RleHRfZWRpdG9yX3VybF9tb2RhbF9zdWJqZWN0X2xhYmVsJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzcz1cInNreS1mb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdWJqZWN0XCJcbiAgICAgICAgICAgIHNreUlkXG4gICAgICAgICAgICAjc3ViamVjdElucHV0PVwic2t5SWRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvc2t5LWlucHV0LWJveD5cbiAgICAgIDwvc2t5LXRhYj5cbiAgICA8L3NreS10YWJzZXQ+XG4gIDwvc2t5LW1vZGFsLWNvbnRlbnQ+XG4gIDxza3ktbW9kYWwtZm9vdGVyPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tcHJpbWFyeVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIXZhbGlkXCJcbiAgICAgIChjbGljayk9XCJzYXZlKClcIlxuICAgID5cbiAgICAgIHt7ICdza3l1eF90ZXh0X2VkaXRvcl91cmxfbW9kYWxfc2F2ZV9idXR0b25fbGFiZWwnIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tbGlua1wiIChjbGljayk9XCJjYW5jZWwoKVwiPlxuICAgICAge3sgJ3NreXV4X3RleHRfZWRpdG9yX3VybF9tb2RhbF9jYW5jZWxfYnV0dG9uX2xhYmVsJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgIDwvYnV0dG9uPlxuICA8L3NreS1tb2RhbC1mb290ZXI+XG48L3NreS1tb2RhbD5cbiJdfQ==