@ajf/material 12.1.3 → 12.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/material-barcode.umd.js +3 -7
- package/bundles/material-barcode.umd.js.map +1 -1
- package/bundles/material-calendar.umd.js +5 -17
- package/bundles/material-calendar.umd.js.map +1 -1
- package/bundles/material-checkbox-group.umd.js +4 -14
- package/bundles/material-checkbox-group.umd.js.map +1 -1
- package/bundles/material-form-builder.umd.js +497 -483
- package/bundles/material-form-builder.umd.js.map +1 -1
- package/bundles/material-forms.umd.js +96 -64
- package/bundles/material-forms.umd.js.map +1 -1
- package/bundles/material-image.umd.js +3 -10
- package/bundles/material-image.umd.js.map +1 -1
- package/bundles/material-monaco-editor.umd.js +4 -7
- package/bundles/material-monaco-editor.umd.js.map +1 -1
- package/bundles/material-node-icon.umd.js +3 -10
- package/bundles/material-node-icon.umd.js.map +1 -1
- package/bundles/material-page-slider.umd.js +2 -7
- package/bundles/material-page-slider.umd.js.map +1 -1
- package/bundles/material-reports.umd.js +4 -6
- package/bundles/material-reports.umd.js.map +1 -1
- package/bundles/material-time.umd.js +4 -12
- package/bundles/material-time.umd.js.map +1 -1
- package/calendar/index.metadata.json +1 -1
- package/checkbox-group/index.metadata.json +1 -1
- package/esm2015/barcode/barcode-module.js +3 -7
- package/esm2015/barcode/barcode.js +3 -3
- package/esm2015/calendar/calendar-module.js +4 -14
- package/esm2015/calendar/calendar.js +4 -6
- package/esm2015/checkbox-group/checkbox-group-item.js +3 -3
- package/esm2015/checkbox-group/checkbox-group-module.js +4 -14
- package/esm2015/form-builder/branch-line.js +2 -2
- package/esm2015/form-builder/choices-origin-data-source.js +1 -1
- package/esm2015/form-builder/choices-origin-editor-dialog.js +7 -4
- package/esm2015/form-builder/choices-origin-editor.js +1 -1
- package/esm2015/form-builder/condition-editor-dialog.js +1 -1
- package/esm2015/form-builder/condition-editor.js +9 -8
- package/esm2015/form-builder/form-builder-module.js +29 -14
- package/esm2015/form-builder/form-builder-service.js +126 -125
- package/esm2015/form-builder/form-builder-utils.js +4 -3
- package/esm2015/form-builder/form-builder.js +30 -26
- package/esm2015/form-builder/node-entry.js +7 -5
- package/esm2015/form-builder/node-properties.js +297 -311
- package/esm2015/form-builder/node-type-entry.js +2 -2
- package/esm2015/form-builder/string-identifier-dialog.js +5 -7
- package/esm2015/form-builder/validation-condition-editor-dialog.js +1 -1
- package/esm2015/form-builder/warning-condition-editor-dialog.js +1 -1
- package/esm2015/forms/barcode-field.js +3 -3
- package/esm2015/forms/boolean-field.js +3 -3
- package/esm2015/forms/date-field.js +2 -2
- package/esm2015/forms/date-input-field.js +4 -4
- package/esm2015/forms/empty-field.js +3 -3
- package/esm2015/forms/field-service.js +42 -42
- package/esm2015/forms/field-warning-dialog.js +1 -1
- package/esm2015/forms/field.js +2 -2
- package/esm2015/forms/form.js +2 -2
- package/esm2015/forms/forms-module.js +55 -23
- package/esm2015/forms/input-field.js +2 -2
- package/esm2015/forms/multiple-choice-field.js +3 -3
- package/esm2015/forms/range-field.js +3 -3
- package/esm2015/forms/single-choice-field.js +3 -3
- package/esm2015/forms/table-field.js +3 -3
- package/esm2015/forms/text-field.js +2 -2
- package/esm2015/forms/time-field.js +3 -3
- package/esm2015/forms/video-url-field.js +2 -2
- package/esm2015/forms/warning-alert-service.js +1 -1
- package/esm2015/image/image-module.js +4 -11
- package/esm2015/image/image.js +2 -2
- package/esm2015/monaco-editor/autocomplete-singleton-model.js +3 -2
- package/esm2015/monaco-editor/editor-options-model.js +1 -1
- package/esm2015/monaco-editor/monaco-editor-module.js +3 -7
- package/esm2015/monaco-editor/monaco-editor.js +3 -3
- package/esm2015/node-icon/node-icon-module.js +4 -11
- package/esm2015/node-icon/node-icon.js +1 -1
- package/esm2015/page-slider/page-slider-module.js +3 -8
- package/esm2015/page-slider/page-slider.js +2 -2
- package/esm2015/reports/chart-widget.js +2 -2
- package/esm2015/reports/formula-widget.js +2 -2
- package/esm2015/reports/image-container-widget.js +2 -2
- package/esm2015/reports/image-widget.js +2 -2
- package/esm2015/reports/map-widget.js +2 -2
- package/esm2015/reports/page-break-widget.js +2 -2
- package/esm2015/reports/report.js +2 -2
- package/esm2015/reports/reports-module.js +3 -6
- package/esm2015/reports/table-widget.js +3 -3
- package/esm2015/reports/text-widget.js +2 -2
- package/esm2015/reports/widget.js +3 -2
- package/esm2015/time/time-module.js +4 -12
- package/esm2015/time/time.js +3 -3
- package/fesm2015/barcode.js +3 -7
- package/fesm2015/barcode.js.map +1 -1
- package/fesm2015/calendar.js +5 -17
- package/fesm2015/calendar.js.map +1 -1
- package/fesm2015/checkbox-group.js +4 -14
- package/fesm2015/checkbox-group.js.map +1 -1
- package/fesm2015/form-builder.js +494 -483
- package/fesm2015/form-builder.js.map +1 -1
- package/fesm2015/forms.js +96 -64
- package/fesm2015/forms.js.map +1 -1
- package/fesm2015/image.js +3 -10
- package/fesm2015/image.js.map +1 -1
- package/fesm2015/monaco-editor.js +5 -8
- package/fesm2015/monaco-editor.js.map +1 -1
- package/fesm2015/node-icon.js +3 -10
- package/fesm2015/node-icon.js.map +1 -1
- package/fesm2015/page-slider.js +2 -7
- package/fesm2015/page-slider.js.map +1 -1
- package/fesm2015/reports.js +4 -6
- package/fesm2015/reports.js.map +1 -1
- package/fesm2015/time.js +4 -12
- package/fesm2015/time.js.map +1 -1
- package/form-builder/index.metadata.json +1 -1
- package/forms/index.metadata.json +1 -1
- package/image/index.metadata.json +1 -1
- package/monaco-editor/index.metadata.json +1 -1
- package/node-icon/index.metadata.json +1 -1
- package/package.json +2 -4
- package/page-slider/index.metadata.json +1 -1
- package/reports/index.metadata.json +1 -1
- package/time/index.metadata.json +1 -1
- package/bundles/material-report-builder.umd.js +0 -5814
- package/bundles/material-report-builder.umd.js.map +0 -1
- package/esm2015/report-builder/column.js +0 -97
- package/esm2015/report-builder/condition-editor.js +0 -159
- package/esm2015/report-builder/content.js +0 -255
- package/esm2015/report-builder/custom-widget-dialog.js +0 -51
- package/esm2015/report-builder/custom-widget-toolbar-button.js +0 -70
- package/esm2015/report-builder/custom-widgets-toolbar.js +0 -124
- package/esm2015/report-builder/forms-analyzer-dialog.js +0 -315
- package/esm2015/report-builder/forms-analyzer.js +0 -264
- package/esm2015/report-builder/image-filter.js +0 -32
- package/esm2015/report-builder/image-group.js +0 -106
- package/esm2015/report-builder/index.js +0 -25
- package/esm2015/report-builder/models.js +0 -23
- package/esm2015/report-builder/operations.js +0 -23
- package/esm2015/report-builder/properties.js +0 -765
- package/esm2015/report-builder/public-api.js +0 -26
- package/esm2015/report-builder/quill-editor.js +0 -299
- package/esm2015/report-builder/renderer-widget.js +0 -238
- package/esm2015/report-builder/report-builder-drag-data.js +0 -23
- package/esm2015/report-builder/report-builder-module.js +0 -114
- package/esm2015/report-builder/report-builder-service.js +0 -1685
- package/esm2015/report-builder/report-builder.externs.js +0 -6
- package/esm2015/report-builder/report-builder.js +0 -69
- package/esm2015/report-builder/theme-color-dialog.js +0 -90
- package/esm2015/report-builder/theme-color.js +0 -215
- package/esm2015/report-builder/tokens.js +0 -24
- package/esm2015/report-builder/toolbar-dialog.js +0 -56
- package/esm2015/report-builder/toolbar.js +0 -90
- package/esm2015/report-builder/utils.js +0 -48
- package/esm2015/report-builder/widget-toolbar-button.js +0 -47
- package/esm2015/report-builder/widgets-row-buttons.js +0 -133
- package/esm2015/report-builder/widgets-toolbar.js +0 -79
- package/fesm2015/report-builder.js +0 -5332
- package/fesm2015/report-builder.js.map +0 -1
- package/report-builder/_report-builder.scss +0 -0
- package/report-builder/column.d.ts +0 -63
- package/report-builder/condition-editor.d.ts +0 -67
- package/report-builder/content.d.ts +0 -142
- package/report-builder/custom-widget-dialog.d.ts +0 -31
- package/report-builder/custom-widget-toolbar-button.d.ts +0 -45
- package/report-builder/custom-widgets-toolbar.d.ts +0 -71
- package/report-builder/forms-analyzer-dialog.d.ts +0 -91
- package/report-builder/forms-analyzer.d.ts +0 -102
- package/report-builder/image-filter.d.ts +0 -25
- package/report-builder/image-group.d.ts +0 -69
- package/report-builder/index.d.ts +0 -24
- package/report-builder/index.metadata.json +0 -1
- package/report-builder/models.d.ts +0 -43
- package/report-builder/operations.d.ts +0 -45
- package/report-builder/package.json +0 -9
- package/report-builder/properties.d.ts +0 -365
- package/report-builder/public-api.d.ts +0 -26
- package/report-builder/quill-editor.d.ts +0 -113
- package/report-builder/renderer-widget.d.ts +0 -80
- package/report-builder/report-builder-drag-data.d.ts +0 -32
- package/report-builder/report-builder-module.d.ts +0 -23
- package/report-builder/report-builder-service.d.ts +0 -722
- package/report-builder/report-builder.d.ts +0 -36
- package/report-builder/theme-color-dialog.d.ts +0 -42
- package/report-builder/theme-color.d.ts +0 -108
- package/report-builder/tokens.d.ts +0 -24
- package/report-builder/toolbar-dialog.d.ts +0 -30
- package/report-builder/toolbar.d.ts +0 -48
- package/report-builder/utils.d.ts +0 -29
- package/report-builder/widget-toolbar-button.d.ts +0 -28
- package/report-builder/widgets-row-buttons.d.ts +0 -57
- package/report-builder/widgets-toolbar.d.ts +0 -44
|
@@ -1,765 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright (C) Gnucoop soc. coop.
|
|
4
|
-
*
|
|
5
|
-
* This file is part of the Advanced JSON forms (ajf).
|
|
6
|
-
*
|
|
7
|
-
* Advanced JSON forms (ajf) is free software: you can redistribute it and/or
|
|
8
|
-
* modify it under the terms of the GNU Affero General Public License as
|
|
9
|
-
* published by the Free Software Foundation, either version 3 of the License,
|
|
10
|
-
* or (at your option) any later version.
|
|
11
|
-
*
|
|
12
|
-
* Advanced JSON forms (ajf) is distributed in the hope that it will be useful,
|
|
13
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
|
|
15
|
-
* General Public License for more details.
|
|
16
|
-
*
|
|
17
|
-
* You should have received a copy of the GNU Affero General Public License
|
|
18
|
-
* along with Advanced JSON forms (ajf).
|
|
19
|
-
* If not, see http://www.gnu.org/licenses/.
|
|
20
|
-
*
|
|
21
|
-
*/
|
|
22
|
-
import { AjfAggregationType, AjfWidgetType } from '@ajf/core/reports';
|
|
23
|
-
import { deepCopy } from '@ajf/core/utils';
|
|
24
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, ViewEncapsulation } from '@angular/core';
|
|
25
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
26
|
-
import { Subscription } from 'rxjs';
|
|
27
|
-
import { distinctUntilChanged, filter, map, startWith, withLatestFrom } from 'rxjs/operators';
|
|
28
|
-
import { AjfReportBuilderFormsAnalyzerDialog } from './forms-analyzer-dialog';
|
|
29
|
-
import { AjfReportBuilderService } from './report-builder-service';
|
|
30
|
-
export class AjfReportBuilderProperties {
|
|
31
|
-
constructor(_dialog, _service) {
|
|
32
|
-
this._dialog = _dialog;
|
|
33
|
-
this._service = _service;
|
|
34
|
-
/**
|
|
35
|
-
* true when the first time chart type is setted
|
|
36
|
-
*
|
|
37
|
-
* @memberOf AjfReportBuilderProperties
|
|
38
|
-
*/
|
|
39
|
-
this.initChartType = false;
|
|
40
|
-
/**
|
|
41
|
-
* the current widget
|
|
42
|
-
*
|
|
43
|
-
* @memberOf AjfReportBuilderProperties
|
|
44
|
-
*/
|
|
45
|
-
this.currentWidget = null;
|
|
46
|
-
/**
|
|
47
|
-
* this array contains the forms exploited for generate data labels
|
|
48
|
-
*
|
|
49
|
-
* @memberOf AjfReportBuilderProperties
|
|
50
|
-
*/
|
|
51
|
-
this.forms = [];
|
|
52
|
-
this.colors = [];
|
|
53
|
-
/**
|
|
54
|
-
* FAKE DATA
|
|
55
|
-
*/
|
|
56
|
-
this.formsJson = { forms: [] };
|
|
57
|
-
/**
|
|
58
|
-
* WIDGET
|
|
59
|
-
*/
|
|
60
|
-
this.widgetName = '';
|
|
61
|
-
this.marginExpanded = false;
|
|
62
|
-
this.paddingExpanded = false;
|
|
63
|
-
this.borderWidthExpanded = false;
|
|
64
|
-
this.borderRadiusExpanded = false;
|
|
65
|
-
this.backgroundColor = '#127bdc';
|
|
66
|
-
this.styleBackgroundColor = 'rgb(255,255,255,0)';
|
|
67
|
-
this.borderColor = '#127bdc';
|
|
68
|
-
this.styleColor = 'rgb(0,0,0,0)';
|
|
69
|
-
this.align = [false, 'center', 'right', 'justify'];
|
|
70
|
-
this.fonts = [
|
|
71
|
-
false, 'blackr', 'black-italic', 'bold', 'bold-condensed', 'bold-condensed-italic',
|
|
72
|
-
'bold-italic', 'condensed', 'condensed-italic', 'italic', 'light', 'light-italic', 'medium',
|
|
73
|
-
'medium-italic', 'thinr', 'thin-italic'
|
|
74
|
-
];
|
|
75
|
-
this.currentModule = {};
|
|
76
|
-
this.quillModules = {
|
|
77
|
-
toolbar: [
|
|
78
|
-
['formula'], ['bold', 'italic', 'underline', 'strike'],
|
|
79
|
-
// ['blockquote', 'code-block'],
|
|
80
|
-
[{ 'header': 1 }, { 'header': 2 }],
|
|
81
|
-
[{ 'list': 'ordered' }, { 'list': 'bullet' }],
|
|
82
|
-
[{ 'script': 'sub' }, { 'script': 'super' }],
|
|
83
|
-
// [{ 'indent': '-1'}, { 'indent': '+1' }], // outdent/indent
|
|
84
|
-
// [{ 'direction': 'rtl' }], // text direction
|
|
85
|
-
[{ 'size': ['small', false, 'large', 'huge'] }],
|
|
86
|
-
[{ 'header': [1, 2, 3, 4, 5, 6, false] }],
|
|
87
|
-
[{ 'color': this.colors }, { 'background': this.colors }],
|
|
88
|
-
[{ 'font': this.fonts }], [{ 'align': this.align }],
|
|
89
|
-
['clean'], // remove formatting button
|
|
90
|
-
// ['link', 'class', 'video'] // link and image, video
|
|
91
|
-
]
|
|
92
|
-
};
|
|
93
|
-
this.chartBorderColor = [];
|
|
94
|
-
this.chartBorderWidth = 3;
|
|
95
|
-
/**
|
|
96
|
-
*
|
|
97
|
-
* IMAGE
|
|
98
|
-
*/
|
|
99
|
-
this.imageUrl = 'https://angular.io/resources/images/logos/angular2/angular.png';
|
|
100
|
-
/**
|
|
101
|
-
*
|
|
102
|
-
* TEXT
|
|
103
|
-
*/
|
|
104
|
-
this.htmlText = '';
|
|
105
|
-
/**
|
|
106
|
-
* these variables indicate that the user want to change section
|
|
107
|
-
*/
|
|
108
|
-
this.reportStyles = false;
|
|
109
|
-
this.sectionStyles = false;
|
|
110
|
-
this.widgetStyles = true;
|
|
111
|
-
this.sectionColor = false;
|
|
112
|
-
this.widgetColor = false;
|
|
113
|
-
this.visibilitySection = false;
|
|
114
|
-
this.currentColor = '';
|
|
115
|
-
this._icon = null;
|
|
116
|
-
this.iconSet = { 'icon': 'true', 'title': 'report', 'data': null };
|
|
117
|
-
this.flagSet = {
|
|
118
|
-
'icon': 'false',
|
|
119
|
-
'class': ['flag-icon'],
|
|
120
|
-
'prefixClass': 'flag-icon-',
|
|
121
|
-
'title': 'flags',
|
|
122
|
-
'data': [
|
|
123
|
-
{ 'class': 'dz', 'info': 'Algeria' },
|
|
124
|
-
{ 'class': 'ao', 'info': 'Angola' },
|
|
125
|
-
{ 'class': 'bj', 'info': 'Benin' },
|
|
126
|
-
{ 'class': 'bw', 'info': 'Botswana' },
|
|
127
|
-
{ 'class': 'bf', 'info': 'Burkina Faso' },
|
|
128
|
-
{ 'class': 'bi', 'info': 'Burundi' },
|
|
129
|
-
{ 'class': 'cm', 'info': 'Cameroon' },
|
|
130
|
-
{ 'class': 'cv', 'info': 'Cabo Verde' },
|
|
131
|
-
{ 'class': 'cf', 'info': 'The Central African Republic' },
|
|
132
|
-
{ 'class': 'td', 'info': 'Chad' },
|
|
133
|
-
{ 'class': 'km', 'info': 'The Comoros' },
|
|
134
|
-
{ 'class': 'ci', 'info': 'Cote D\'avoire' },
|
|
135
|
-
{ 'class': 'cd', 'info': 'The Democratic Republic of Congo' },
|
|
136
|
-
{ 'class': 'dj', 'info': 'Dijibouti' },
|
|
137
|
-
{ 'class': 'eg', 'info': 'Egypt' },
|
|
138
|
-
{ 'class': 'gq', 'info': 'Equatorial Guinea' },
|
|
139
|
-
{ 'class': 'er', 'info': 'Eritrea' },
|
|
140
|
-
{ 'class': 'et', 'info': 'Ethiopia' },
|
|
141
|
-
{ 'class': 'tf', 'info': 'French Southern Territories' },
|
|
142
|
-
{ 'class': 'ga', 'info': 'Gabon' },
|
|
143
|
-
{ 'class': 'gm', 'info': 'The Gambia' },
|
|
144
|
-
{ 'class': 'gh', 'info': 'Ghana' },
|
|
145
|
-
{ 'class': 'gn', 'info': 'Guinea' },
|
|
146
|
-
{ 'class': 'gw', 'info': 'Guinea-Bissau' },
|
|
147
|
-
{ 'class': 'ke', 'info': 'Kenya' },
|
|
148
|
-
{ 'class': 'ls', 'info': 'Leshotho' },
|
|
149
|
-
{ 'class': 'lr', 'info': 'Liberia' },
|
|
150
|
-
{ 'class': 'ly', 'info': 'Libya' },
|
|
151
|
-
{ 'class': 'mg', 'info': 'Madagascar' },
|
|
152
|
-
{ 'class': 'mw', 'info': 'Malawy' },
|
|
153
|
-
{ 'class': 'ml', 'info': 'Mali' },
|
|
154
|
-
{ 'class': 'mr', 'info': 'Mauritania' },
|
|
155
|
-
{ 'class': 'mu', 'info': 'Mauritius' },
|
|
156
|
-
{ 'class': 'yt', 'info': 'Mayotte' },
|
|
157
|
-
{ 'class': 'ma', 'info': 'Marocco' },
|
|
158
|
-
{ 'class': 'mz', 'info': 'Mozambique' },
|
|
159
|
-
{ 'class': 'na', 'info': 'Namibia' },
|
|
160
|
-
{ 'class': 'ne', 'info': 'Niger' },
|
|
161
|
-
{ 'class': 'ng', 'info': 'Nigeria' },
|
|
162
|
-
{ 'class': 'cg', 'info': 'Republic of the Congo' },
|
|
163
|
-
{ 'class': 'rw', 'info': 'Rwnda' },
|
|
164
|
-
{ 'class': 're', 'info': 'rèunion' },
|
|
165
|
-
{ 'class': 'sh', 'info': 'Saint Helena, Ascension and Tristan da Cunha' },
|
|
166
|
-
{ 'class': 'st', 'info': 'Sao Tome and Principe' },
|
|
167
|
-
{ 'class': 'sn', 'info': 'Senegal' },
|
|
168
|
-
{ 'class': 'sc', 'info': 'Seychelles' },
|
|
169
|
-
{ 'class': 'sl', 'info': 'Sierra Leone' },
|
|
170
|
-
{ 'class': 'so', 'info': 'Somalia' },
|
|
171
|
-
{ 'class': 'za', 'info': 'South Africa' },
|
|
172
|
-
{ 'class': 'ss', 'info': 'South Sudan' },
|
|
173
|
-
{ 'class': 'sd', 'info': 'Sudan' },
|
|
174
|
-
{ 'class': 'sz', 'info': 'Swaziland' },
|
|
175
|
-
{ 'class': 'tz', 'info': 'Tanzania' },
|
|
176
|
-
{ 'class': 'tg', 'info': 'Togo' },
|
|
177
|
-
{ 'class': 'tn', 'info': 'Tunisia' },
|
|
178
|
-
{ 'class': 'ug', 'info': 'Uganda' },
|
|
179
|
-
{ 'class': 'eh', 'info': 'Western Sahara' },
|
|
180
|
-
{ 'class': 'zm', 'info': 'Zambia' },
|
|
181
|
-
{ 'class': 'zw', 'info': 'Zimbawe' },
|
|
182
|
-
{ 'class': 'iq', 'info': 'Iraq' },
|
|
183
|
-
{ 'class': 'lb', 'info': 'Lebanon' },
|
|
184
|
-
{ 'class': 'bd', 'info': 'Bangladesh' },
|
|
185
|
-
{ 'class': 'ir', 'info': 'Iran (Islamic Republic of)' },
|
|
186
|
-
{ 'class': 'my', 'info': 'Malaysia' },
|
|
187
|
-
{ 'class': 'np', 'info': 'Nepal' },
|
|
188
|
-
{ 'class': 'pk', 'info': 'Pakistan' },
|
|
189
|
-
{ 'class': 'th', 'info': 'Thailand' },
|
|
190
|
-
{ 'class': 'jo', 'info': 'Jordan' },
|
|
191
|
-
{ 'class': 'ye', 'info': 'Yemen' }
|
|
192
|
-
]
|
|
193
|
-
};
|
|
194
|
-
this._currentWidgetSub = Subscription.EMPTY;
|
|
195
|
-
this._formsSub = Subscription.EMPTY;
|
|
196
|
-
this._colorSub = Subscription.EMPTY;
|
|
197
|
-
this._headerStyleSub = Subscription.EMPTY;
|
|
198
|
-
this._contentStylesSub = Subscription.EMPTY;
|
|
199
|
-
this._footerStylesSub = Subscription.EMPTY;
|
|
200
|
-
this._originSub = Subscription.EMPTY;
|
|
201
|
-
this._stylesUpdatesSubs = Subscription.EMPTY;
|
|
202
|
-
this._updateWidgetMarginEvt = new EventEmitter();
|
|
203
|
-
this._updateWidgetPaddingEvt = new EventEmitter();
|
|
204
|
-
this._updateWidgetBorderWidthEvt = new EventEmitter();
|
|
205
|
-
this._updateWidgetBorderRadiusEvt = new EventEmitter();
|
|
206
|
-
this.tabValue = 'backgroundColor';
|
|
207
|
-
this.setForms();
|
|
208
|
-
this.iconSet.data = Object.keys(_service.iconSets).filter(x => x != 'ajf-icon').map(i => {
|
|
209
|
-
return { name: i, icons: _service.iconSets[i] };
|
|
210
|
-
});
|
|
211
|
-
this._headerStyleSub = this._service.headerStyles.subscribe(s => {
|
|
212
|
-
if (s['background-color'] != null) {
|
|
213
|
-
this.styleBackgroundColor = s['background-color'];
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
this._contentStylesSub = this._service.contentStyles.subscribe(s => {
|
|
217
|
-
if (s['background-color'] != null) {
|
|
218
|
-
this.styleBackgroundColor = s['background-color'];
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
this._footerStylesSub = this._service.footerStyles.subscribe(s => {
|
|
222
|
-
if (s['background-color'] != null) {
|
|
223
|
-
this.styleBackgroundColor = s['background-color'];
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
this._originSub = this._service.origin.subscribe(s => {
|
|
227
|
-
this.origin = s;
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
get currentLayoutWidget() {
|
|
231
|
-
return this.currentWidget;
|
|
232
|
-
}
|
|
233
|
-
get currentTextWidget() {
|
|
234
|
-
return this.currentWidget;
|
|
235
|
-
}
|
|
236
|
-
get icon() {
|
|
237
|
-
return this._icon;
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
*
|
|
241
|
-
* UTILS
|
|
242
|
-
*/
|
|
243
|
-
/**
|
|
244
|
-
* return a number value
|
|
245
|
-
*
|
|
246
|
-
* @param value
|
|
247
|
-
*
|
|
248
|
-
* @memberOf AjfReportBuilderProperties
|
|
249
|
-
*/
|
|
250
|
-
toNumber(value) {
|
|
251
|
-
let numberPattern = /^(-)?\d+/g;
|
|
252
|
-
if (value == null) {
|
|
253
|
-
return 0;
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
const matches = value.match(numberPattern);
|
|
257
|
-
if (matches == null || matches.length == 0) {
|
|
258
|
-
return 0;
|
|
259
|
-
}
|
|
260
|
-
return Number(matches[0]);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
toNumberArray(value) {
|
|
264
|
-
if (value == null) {
|
|
265
|
-
return [];
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
return (value || '')
|
|
269
|
-
.replace('px', '')
|
|
270
|
-
.split(' ')
|
|
271
|
-
.filter(v => v !== '' && v != null)
|
|
272
|
-
.map(v => this.toNumber(v));
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
fillPxNumberArray(value) {
|
|
276
|
-
const vl = value.length;
|
|
277
|
-
switch (vl) {
|
|
278
|
-
case 0:
|
|
279
|
-
return [0, 0, 0, 0];
|
|
280
|
-
case 1:
|
|
281
|
-
const v = value[0];
|
|
282
|
-
return [v, v, v, v];
|
|
283
|
-
case 2:
|
|
284
|
-
const v21 = value[0];
|
|
285
|
-
const v22 = value[1];
|
|
286
|
-
return [v21, v22, v21, v22];
|
|
287
|
-
case 3:
|
|
288
|
-
const v31 = value[0];
|
|
289
|
-
const v32 = value[1];
|
|
290
|
-
const v33 = value[2];
|
|
291
|
-
return [v31, v32, v33, v32];
|
|
292
|
-
default:
|
|
293
|
-
return value;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
percent(value) {
|
|
297
|
-
let temp = this.roundTo(value * 100, 3);
|
|
298
|
-
return temp;
|
|
299
|
-
}
|
|
300
|
-
roundTo(value, decimalPositions) {
|
|
301
|
-
let i = value * Math.pow(10, decimalPositions);
|
|
302
|
-
i = Math.floor(i);
|
|
303
|
-
return i / Math.pow(10, decimalPositions);
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* call to service to set the forms
|
|
307
|
-
*
|
|
308
|
-
* @memberOf AjfReportBuilderProperties
|
|
309
|
-
*/
|
|
310
|
-
setForms() {
|
|
311
|
-
let forms = [];
|
|
312
|
-
try {
|
|
313
|
-
for (let i = 0; i < this.formsJson.forms.length; i++) {
|
|
314
|
-
forms.push(deepCopy(this.formsJson.forms[i]));
|
|
315
|
-
}
|
|
316
|
-
this._service.setReportForms(forms);
|
|
317
|
-
}
|
|
318
|
-
catch (e) {
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* call to service to set the width of the idx column of layout widget
|
|
323
|
-
*
|
|
324
|
-
* @param col
|
|
325
|
-
* @param idx
|
|
326
|
-
*
|
|
327
|
-
* @memberOf AjfReportBuilderProperties
|
|
328
|
-
*/
|
|
329
|
-
instantColumnValue(col, idx) {
|
|
330
|
-
if (col === null) {
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
this._service.instantColumnValue(col, idx);
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* force copy of style
|
|
337
|
-
*
|
|
338
|
-
* @memberOf AjfReportBuilderProperties
|
|
339
|
-
*/
|
|
340
|
-
// TODO delete this
|
|
341
|
-
setStyle() {
|
|
342
|
-
if (this.currentWidget == null) {
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
this.currentWidget.styles = deepCopy(this.currentWidget.styles);
|
|
346
|
-
this._service.updateCurrentWidget(this.currentWidget);
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* call to service to add new style to widget
|
|
350
|
-
*
|
|
351
|
-
* @param label
|
|
352
|
-
* @param value
|
|
353
|
-
*
|
|
354
|
-
* @memberOf AjfReportBuilderProperties
|
|
355
|
-
*/
|
|
356
|
-
setWidgetStyles(label, value) {
|
|
357
|
-
this._service.setWidgetStyles(label, value);
|
|
358
|
-
this.currentColor = value;
|
|
359
|
-
this.setStyle();
|
|
360
|
-
}
|
|
361
|
-
setWidgetMargin(idx, value) {
|
|
362
|
-
this._updateWidgetMarginEvt.emit({ idx, value });
|
|
363
|
-
}
|
|
364
|
-
setWidgetPadding(idx, value) {
|
|
365
|
-
this._updateWidgetPaddingEvt.emit({ idx, value });
|
|
366
|
-
}
|
|
367
|
-
setWidgetBorderWidth(idx, value) {
|
|
368
|
-
this._updateWidgetBorderWidthEvt.emit({ idx, value });
|
|
369
|
-
}
|
|
370
|
-
setWidgetBorderRadius(idx, value) {
|
|
371
|
-
this._updateWidgetBorderRadiusEvt.emit({ idx, value });
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* call to service to add new style to section
|
|
375
|
-
*
|
|
376
|
-
* @param label
|
|
377
|
-
* @param value
|
|
378
|
-
*
|
|
379
|
-
* @memberOf AjfReportBuilderProperties
|
|
380
|
-
*/
|
|
381
|
-
setSectionStyles(label, value) {
|
|
382
|
-
this._service.setSectionStyles(this.origin, label, value);
|
|
383
|
-
this.styleColor = value;
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* call to service to add new style to report
|
|
387
|
-
*
|
|
388
|
-
* @param label
|
|
389
|
-
* @param value
|
|
390
|
-
*
|
|
391
|
-
* @memberOf AjfReportBuilderProperties
|
|
392
|
-
*/
|
|
393
|
-
setReportStyles(label, value) {
|
|
394
|
-
this._service.setReportStyles(label, value);
|
|
395
|
-
this.styleBackgroundColor = value;
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* add custom color
|
|
399
|
-
*
|
|
400
|
-
*
|
|
401
|
-
* @memberOf AjfReportBuilderProperties
|
|
402
|
-
*/
|
|
403
|
-
addCustomColor() {
|
|
404
|
-
this._service.addCustomColor(this.currentColor);
|
|
405
|
-
this._service.updateCurrentWidget(this.currentWidget);
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* get the module exploit to quill text editor
|
|
409
|
-
*
|
|
410
|
-
* @returns
|
|
411
|
-
*
|
|
412
|
-
* @memberOf AjfReportBuilderProperties
|
|
413
|
-
*/
|
|
414
|
-
getModule() {
|
|
415
|
-
return this.quillModules;
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* true is the input type value is equal to current widget type
|
|
419
|
-
*
|
|
420
|
-
* @param value
|
|
421
|
-
* @returns
|
|
422
|
-
*
|
|
423
|
-
* @memberOf AjfReportBuilderProperties
|
|
424
|
-
*/
|
|
425
|
-
isChartTypeSelected(value) {
|
|
426
|
-
if (this.initChartType == false) {
|
|
427
|
-
return false;
|
|
428
|
-
}
|
|
429
|
-
const myObj = this.currentWidget;
|
|
430
|
-
if (value === myObj.chartType) {
|
|
431
|
-
return true;
|
|
432
|
-
}
|
|
433
|
-
else {
|
|
434
|
-
return false;
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
/* layout functions */
|
|
438
|
-
/**
|
|
439
|
-
* call to service to add a column to current layout widget
|
|
440
|
-
*
|
|
441
|
-
*
|
|
442
|
-
* @memberOf AjfReportBuilderProperties
|
|
443
|
-
*/
|
|
444
|
-
addColumn() {
|
|
445
|
-
this._service.addColumn();
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* call to service to add a obj to current layout widget
|
|
449
|
-
*
|
|
450
|
-
* @param idx
|
|
451
|
-
*
|
|
452
|
-
* @memberOf AjfReportBuilderProperties
|
|
453
|
-
*/
|
|
454
|
-
fixedColumn(idx) {
|
|
455
|
-
this._service.fixedColumn(idx);
|
|
456
|
-
}
|
|
457
|
-
/**
|
|
458
|
-
* call to service to remove obj of current layout widget
|
|
459
|
-
*
|
|
460
|
-
* @param idx
|
|
461
|
-
*
|
|
462
|
-
* @memberOf AjfReportBuilderProperties
|
|
463
|
-
*/
|
|
464
|
-
unfixedColumn(idx) {
|
|
465
|
-
this._service.remove('unfixedColumn', idx);
|
|
466
|
-
}
|
|
467
|
-
/* image functions */
|
|
468
|
-
/**
|
|
469
|
-
* call to service to set image url
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
* @memberOf AjfReportBuilderProperties
|
|
473
|
-
*/
|
|
474
|
-
setImageUrl() {
|
|
475
|
-
this._service.setImageUrl(this.imageUrl);
|
|
476
|
-
}
|
|
477
|
-
setIcon(icon) {
|
|
478
|
-
this._icon = icon;
|
|
479
|
-
this._service.setIcon(icon);
|
|
480
|
-
}
|
|
481
|
-
/* chart functions */
|
|
482
|
-
/**
|
|
483
|
-
* call to service to set the type of chart
|
|
484
|
-
*
|
|
485
|
-
* @param type
|
|
486
|
-
*
|
|
487
|
-
* @memberOf AjfReportBuilderProperties
|
|
488
|
-
*/
|
|
489
|
-
setChartType(type) {
|
|
490
|
-
this.initChartType = true;
|
|
491
|
-
this._service.setChartType(type);
|
|
492
|
-
}
|
|
493
|
-
setChartBorderColor(value) {
|
|
494
|
-
if (value == null) {
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
this._service.setChartBorderWidth(value);
|
|
498
|
-
}
|
|
499
|
-
setTab(event) {
|
|
500
|
-
if (event.index === 0) {
|
|
501
|
-
this.tabValue = 'backgroundColor';
|
|
502
|
-
}
|
|
503
|
-
else {
|
|
504
|
-
this.tabValue = 'borderColor';
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
/**
|
|
508
|
-
* call to service to remove background color to current chart
|
|
509
|
-
*
|
|
510
|
-
* @param index
|
|
511
|
-
*
|
|
512
|
-
* @memberOf AjfReportBuilderProperties
|
|
513
|
-
*/
|
|
514
|
-
removeChartBackgroundColor(index) {
|
|
515
|
-
this._service.removeChartBackgroundColor(index);
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* call to service to remove border color to current chart
|
|
519
|
-
*
|
|
520
|
-
* @param index
|
|
521
|
-
*
|
|
522
|
-
* @memberOf AjfReportBuilderProperties
|
|
523
|
-
*/
|
|
524
|
-
removeChartBorderColor(index) {
|
|
525
|
-
this._service.removeChartBorderColor(index);
|
|
526
|
-
}
|
|
527
|
-
hideMenu() {
|
|
528
|
-
this._service.updateCurrentWidget(null);
|
|
529
|
-
}
|
|
530
|
-
openFormulaDialog(event) {
|
|
531
|
-
this.dialogRef = this._dialog.open(AjfReportBuilderFormsAnalyzerDialog);
|
|
532
|
-
this.dialogRef.componentInstance.aggregation = AjfAggregationType.None;
|
|
533
|
-
this.dialogRef.componentInstance.isFormula = true;
|
|
534
|
-
if (event != null && event.reference != null) {
|
|
535
|
-
this.dialogRef.componentInstance.formula = event.formula;
|
|
536
|
-
this.dialogRef.componentInstance.reference = event.reference;
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
ngOnInit() {
|
|
540
|
-
this._formsSub = this._service.reportForms.subscribe(x => {
|
|
541
|
-
this.forms = x || [];
|
|
542
|
-
});
|
|
543
|
-
this._currentWidgetSub = this._service.currentWidget.subscribe(x => {
|
|
544
|
-
if (x != null) {
|
|
545
|
-
if (this.currentWidget !== x) {
|
|
546
|
-
this.currentWidget = x;
|
|
547
|
-
this.widgetName = AjfWidgetType[x.widgetType];
|
|
548
|
-
this.reportStyles = false;
|
|
549
|
-
this.sectionStyles = false;
|
|
550
|
-
this.widgetStyles = false;
|
|
551
|
-
this.sectionColor = false;
|
|
552
|
-
this.widgetColor = false;
|
|
553
|
-
this.visibilitySection = false;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
else {
|
|
557
|
-
this.currentWidget = null;
|
|
558
|
-
this.widgetName = '';
|
|
559
|
-
}
|
|
560
|
-
});
|
|
561
|
-
this._colorSub = this._service.colors.subscribe(x => {
|
|
562
|
-
if (x && x.length > 0) {
|
|
563
|
-
this.colors = x;
|
|
564
|
-
this.quillModules = {
|
|
565
|
-
toolbar: [
|
|
566
|
-
['bold', 'italic', 'underline', 'strike'],
|
|
567
|
-
// ['blockquote', 'code-block'],
|
|
568
|
-
[{ 'header': 1 }, { 'header': 2 }],
|
|
569
|
-
[{ 'list': 'ordered' }, { 'list': 'bullet' }],
|
|
570
|
-
[{ 'script': 'sub' }, { 'script': 'super' }],
|
|
571
|
-
// [{ 'indent': '-1'}, { 'indent': '+1' }], // outdent/indent
|
|
572
|
-
// [{ 'direction': 'rtl' }], // text direction
|
|
573
|
-
[{ 'size': ['small', false, 'large', 'huge'] }],
|
|
574
|
-
[{ 'header': [1, 2, 3, 4, 5, 6, false] }],
|
|
575
|
-
[
|
|
576
|
-
{ 'color': this.colors }, { 'background': this.colors }
|
|
577
|
-
],
|
|
578
|
-
[{ 'font': this.fonts }], [{ 'align': this.align }], ['formula'],
|
|
579
|
-
['clean'], // remove formatting button
|
|
580
|
-
// ['link', 'class', 'video'] // link and image, video
|
|
581
|
-
]
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
});
|
|
585
|
-
this.getHTML = this._service.currentWidget.pipe(map((widget) => {
|
|
586
|
-
if (widget != null) {
|
|
587
|
-
const myObj = this.currentWidget;
|
|
588
|
-
return myObj.htmlText;
|
|
589
|
-
}
|
|
590
|
-
return '';
|
|
591
|
-
}), distinctUntilChanged(), startWith('<p><br></p>'));
|
|
592
|
-
this.getHeightWidget = this._service.currentWidget.pipe(filter(x => x != null), map((myObj) => {
|
|
593
|
-
if (myObj != null) {
|
|
594
|
-
let value = this.toNumber(myObj.styles['height']);
|
|
595
|
-
if (value != null || value != null) {
|
|
596
|
-
return value;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
return undefined;
|
|
600
|
-
}), distinctUntilChanged());
|
|
601
|
-
this.getFontSizeWidget = this._service.currentWidget.pipe(map((myObj) => {
|
|
602
|
-
if (myObj != null) {
|
|
603
|
-
return (this.toNumber(myObj.styles['font-size']) || 12);
|
|
604
|
-
}
|
|
605
|
-
return undefined;
|
|
606
|
-
}), distinctUntilChanged());
|
|
607
|
-
this.getFontAlignWidget = this._service.currentWidget.pipe(map((myObj) => {
|
|
608
|
-
if (myObj != null) {
|
|
609
|
-
return ((myObj.styles['text-align']) || 'center');
|
|
610
|
-
}
|
|
611
|
-
return undefined;
|
|
612
|
-
}), distinctUntilChanged());
|
|
613
|
-
this.getBorderWidthWidget = this._service.currentWidget.pipe(map((myObj) => {
|
|
614
|
-
if (myObj != null) {
|
|
615
|
-
return this.fillPxNumberArray(this.toNumberArray(myObj.styles['border-width']));
|
|
616
|
-
}
|
|
617
|
-
return undefined;
|
|
618
|
-
}), distinctUntilChanged(), startWith([0, 0, 0, 0]));
|
|
619
|
-
this.getBorderWidthWidgetTop =
|
|
620
|
-
this.getBorderWidthWidget.pipe(filter(m => m != null), map(m => m[0]));
|
|
621
|
-
this.getBorderWidthWidgetRight =
|
|
622
|
-
this.getBorderWidthWidget.pipe(filter(m => m != null), map(m => m[1]));
|
|
623
|
-
this.getBorderWidthWidgetBottom =
|
|
624
|
-
this.getBorderWidthWidget.pipe(filter(m => m != null), map(m => m[2]));
|
|
625
|
-
this.getBorderWidthWidgetLeft =
|
|
626
|
-
this.getBorderWidthWidget.pipe(filter(m => m != null), map(m => m[3]));
|
|
627
|
-
this.getBorderRadiusWidget = this._service.currentWidget.pipe(map((myObj) => {
|
|
628
|
-
if (myObj != null) {
|
|
629
|
-
return this.fillPxNumberArray(this.toNumberArray(myObj.styles['border-radius']));
|
|
630
|
-
}
|
|
631
|
-
return undefined;
|
|
632
|
-
}), distinctUntilChanged(), startWith([0, 0, 0, 0]));
|
|
633
|
-
this.getBorderRadiusWidgetTopLeft =
|
|
634
|
-
this.getBorderRadiusWidget.pipe(filter(m => m != null), map(m => m[0]));
|
|
635
|
-
this.getBorderRadiusWidgetTopRight =
|
|
636
|
-
this.getBorderRadiusWidget.pipe(filter(m => m != null), map(m => m[1]));
|
|
637
|
-
this.getBorderRadiusWidgetBottomRight =
|
|
638
|
-
this.getBorderRadiusWidget.pipe(filter(m => m != null), map(m => m[2]));
|
|
639
|
-
this.getBorderRadiusWidgetBottomLeft =
|
|
640
|
-
this.getBorderRadiusWidget.pipe(filter(m => m != null), map(m => m[3]));
|
|
641
|
-
this.getMarginWidget = this._service.currentWidget.pipe(map((myObj) => {
|
|
642
|
-
if (myObj != null && myObj.styles != null && myObj.styles['margin'] != null) {
|
|
643
|
-
return this.fillPxNumberArray(this.toNumberArray(myObj.styles['margin']));
|
|
644
|
-
}
|
|
645
|
-
return undefined;
|
|
646
|
-
}), distinctUntilChanged(), startWith([0, 0, 0, 0]));
|
|
647
|
-
this.getMarginWidgetTop = this.getMarginWidget.pipe(filter(m => m != null), map(m => m[0]));
|
|
648
|
-
this.getMarginWidgetRight = this.getMarginWidget.pipe(filter(m => m != null), map(m => m[1]));
|
|
649
|
-
this.getMarginWidgetBottom = this.getMarginWidget.pipe(filter(m => m != null), map(m => m[2]));
|
|
650
|
-
this.getMarginWidgetLeft = this.getMarginWidget.pipe(filter(m => m != null), map(m => m[3]));
|
|
651
|
-
this.getPaddingWidget = this._service.currentWidget.pipe(map((myObj) => {
|
|
652
|
-
if (myObj != null && myObj.styles != null && myObj.styles['padding'] != null) {
|
|
653
|
-
return this.fillPxNumberArray(this.toNumberArray(myObj.styles['padding']));
|
|
654
|
-
}
|
|
655
|
-
return undefined;
|
|
656
|
-
}), distinctUntilChanged());
|
|
657
|
-
this.getPaddingWidgetTop = this.getPaddingWidget.pipe(filter(m => m != null), map(m => m[0]));
|
|
658
|
-
this.getPaddingWidgetRight =
|
|
659
|
-
this.getPaddingWidget.pipe(filter(m => m != null), map(m => m[1]));
|
|
660
|
-
this.getPaddingWidgetBottom =
|
|
661
|
-
this.getPaddingWidget.pipe(filter(m => m != null), map(m => m[2]));
|
|
662
|
-
this.getPaddingWidgetLeft = this.getPaddingWidget.pipe(filter(m => m != null), map(m => m[3]));
|
|
663
|
-
this.getBackgroundColorWidget = this._service.currentWidget.pipe(map((myObj) => {
|
|
664
|
-
if (myObj != null && myObj.styles != null) {
|
|
665
|
-
return myObj.styles['backgroundColor'] || '';
|
|
666
|
-
}
|
|
667
|
-
}), distinctUntilChanged());
|
|
668
|
-
this.getColorWidget = this._service.currentWidget.pipe(map((myObj) => {
|
|
669
|
-
if (myObj != null && myObj.styles != null) {
|
|
670
|
-
return myObj.styles['color'] || '';
|
|
671
|
-
}
|
|
672
|
-
}), distinctUntilChanged());
|
|
673
|
-
this._stylesUpdatesSubs = this._updateWidgetMarginEvt
|
|
674
|
-
.pipe(withLatestFrom(this.getMarginWidget))
|
|
675
|
-
.subscribe(r => {
|
|
676
|
-
if (r == null) {
|
|
677
|
-
return;
|
|
678
|
-
}
|
|
679
|
-
const idx = r[0].idx;
|
|
680
|
-
const value = r[0].value;
|
|
681
|
-
const v = (r[1] || [0, 0, 0, 0]);
|
|
682
|
-
if (v == null || v.length < idx) {
|
|
683
|
-
return;
|
|
684
|
-
}
|
|
685
|
-
v[idx] = value;
|
|
686
|
-
this.setWidgetStyles('margin', v);
|
|
687
|
-
});
|
|
688
|
-
this._stylesUpdatesSubs.add(this._updateWidgetPaddingEvt
|
|
689
|
-
.pipe(withLatestFrom(this.getPaddingWidget))
|
|
690
|
-
.subscribe(r => {
|
|
691
|
-
if (r == null) {
|
|
692
|
-
return;
|
|
693
|
-
}
|
|
694
|
-
const idx = r[0].idx;
|
|
695
|
-
const value = r[0].value;
|
|
696
|
-
const v = (r[1] || [0, 0, 0, 0]);
|
|
697
|
-
if (v == null || v.length < idx) {
|
|
698
|
-
return;
|
|
699
|
-
}
|
|
700
|
-
v[idx] = value;
|
|
701
|
-
this.setWidgetStyles('padding', v);
|
|
702
|
-
}));
|
|
703
|
-
this._stylesUpdatesSubs.add(this._updateWidgetBorderWidthEvt
|
|
704
|
-
.pipe(withLatestFrom(this.getBorderWidthWidget))
|
|
705
|
-
.subscribe(r => {
|
|
706
|
-
if (r == null) {
|
|
707
|
-
return;
|
|
708
|
-
}
|
|
709
|
-
const idx = r[0].idx;
|
|
710
|
-
const value = r[0].value;
|
|
711
|
-
const v = (r[1] || [0, 0, 0, 0]);
|
|
712
|
-
if (v == null || v.length < idx) {
|
|
713
|
-
return;
|
|
714
|
-
}
|
|
715
|
-
v[idx] = value;
|
|
716
|
-
this.setWidgetStyles('border-width', v);
|
|
717
|
-
}));
|
|
718
|
-
this._stylesUpdatesSubs.add(this._updateWidgetBorderRadiusEvt
|
|
719
|
-
.pipe(withLatestFrom(this.getBorderRadiusWidget))
|
|
720
|
-
.subscribe(r => {
|
|
721
|
-
if (r == null) {
|
|
722
|
-
return;
|
|
723
|
-
}
|
|
724
|
-
const idx = r[0].idx;
|
|
725
|
-
const value = r[0].value;
|
|
726
|
-
const v = (r[1] || [0, 0, 0, 0]);
|
|
727
|
-
if (v == null || v.length < idx) {
|
|
728
|
-
return;
|
|
729
|
-
}
|
|
730
|
-
v[idx] = value;
|
|
731
|
-
this.setWidgetStyles('border-radius', v);
|
|
732
|
-
}));
|
|
733
|
-
}
|
|
734
|
-
ngOnChanges(changes) {
|
|
735
|
-
this.currentWidget = changes.widget.currentValue;
|
|
736
|
-
if (this.currentWidget == null) {
|
|
737
|
-
return;
|
|
738
|
-
}
|
|
739
|
-
this.widgetName = AjfWidgetType[this.currentWidget.widgetType];
|
|
740
|
-
}
|
|
741
|
-
ngOnDestroy() {
|
|
742
|
-
this._currentWidgetSub.unsubscribe();
|
|
743
|
-
this._formsSub.unsubscribe();
|
|
744
|
-
this._colorSub.unsubscribe();
|
|
745
|
-
this._headerStyleSub.unsubscribe();
|
|
746
|
-
this._contentStylesSub.unsubscribe();
|
|
747
|
-
this._footerStylesSub.unsubscribe();
|
|
748
|
-
this._originSub.unsubscribe();
|
|
749
|
-
this._stylesUpdatesSubs.unsubscribe();
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
AjfReportBuilderProperties.decorators = [
|
|
753
|
-
{ type: Component, args: [{
|
|
754
|
-
selector: 'ajf-report-builder-properties',
|
|
755
|
-
template: "<ng-template [ngIf]=\"currentWidget != null\">\n <div class=\"ajf-content\">\n <button\n mat-button\n class=\"ajf-hide-menu\"\n matTooltip=\"hide-menu\"\n (click)=\"hideMenu()\"\n [matTooltipPosition]=\"'above'\"\n >\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n <mat-button-toggle-group class=\"ajf-menu-css\">\n <mat-button-toggle\n (click)=\"reportStyles = !reportStyles; sectionStyles = false; widgetStyles = false\"\n value=\"left\"\n [ngClass]=\"{'ajf-selected': reportStyles}\"\n >\n report\n <ng-container>{{'CSS style'|transloco}}</ng-container>\n </mat-button-toggle>\n <mat-button-toggle\n (click)=\"sectionStyles = !sectionStyles; reportStyles = false; widgetStyles = false\"\n [ngClass]=\"{'ajf-selected': sectionStyles}\"\n >\n {{ origin }}\n <ng-container>{{'CSS style'|transloco}}</ng-container>\n </mat-button-toggle>\n <mat-button-toggle\n (click)=\"widgetStyles = !widgetStyles; sectionStyles = false; reportStyles = false\"\n [ngClass]=\"{'ajf-selected': widgetStyles}\"\n >\n {{ widgetName }}\n <ng-container>{{'CSS style'|transloco}}</ng-container>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div class=\"ajf-style-container\" *ngIf=\"(reportStyles) ? true : false \">\n <mat-tab-group>\n <mat-tab label=\"Background Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'report'\"\n [label]=\"'color'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n <div class=\"ajf-style-container\" *ngIf=\"(sectionStyles) ? true : false \">\n <mat-tab-group>\n <mat-tab label=\"Background Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'section'\"\n [label]=\"'color'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n <div class=\"ajf-style-container\" *ngIf=\"(widgetStyles) ? true : false \">\n <mat-tab-group *ngIf=\"(currentWidget.widgetType != 4)\">\n <mat-tab label=\"Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'widget'\"\n [label]=\"'color'\"\n [init]=\"'icon'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n <mat-tab label=\"Background Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'widget'\"\n [label]=\"'background-color'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n </mat-tab-group>\n <div\n class=\"properties-container\"\n *ngIf=\"(currentWidget.widgetType !== 8)\"\n >\n <div class=\"ajf-layout-preview\">\n <div class=\"ajf-vbottom\">\n <div>{{'height'|transloco}}</div>\n <div>{{ getHeightWidget|async }}</div>\n </div>\n <div class=\"ajf-margin-box\">\n <div class=\"ajf-top-label\">{{'margin'|transloco}}</div>\n <div class=\"ajf-vtop\">{{ getMarginWidgetTop|async }}</div>\n <div class=\"ajf-vright\">{{ getMarginWidgetRight|async }}</div>\n <div class=\"ajf-vbottom\">{{ getMarginWidgetBottom|async }}</div>\n <div class=\"ajf-vleft\">{{ getMarginWidgetLeft|async }}</div>\n <div class=\"ajf-border-box\">\n <div class=\"ajf-vtop\">{{ getBorderWidthWidgetTop|async }}</div>\n <div class=\"ajf-vright\">\n {{ getBorderWidthWidgetRight|async }}\n </div>\n <div class=\"ajf-vbottom\">\n {{ getBorderWidthWidgetBottom|async }}\n </div>\n <div class=\"ajf-vleft\">{{ getBorderWidthWidgetLeft|async }}</div>\n <div class=\"ajf-vtl\">\n {{ getBorderRadiusWidgetTopLeft|async }}\n </div>\n <div class=\"ajf-vtr\">\n {{ getBorderRadiusWidgetTopRight|async }}\n </div>\n <div class=\"ajf-vbr\">\n {{ getBorderRadiusWidgetBottomRight|async }}\n </div>\n <div class=\"ajf-vbl\">\n {{ getBorderRadiusWidgetBottomLeft|async }}\n </div>\n <div class=\"ajf-top-label\">{{'border'|transloco}}</div>\n <div class=\"ajf-padding-box\">\n <div class=\"ajf-top-label\">{{'padding'|transloco}}</div>\n <div class=\"ajf-vtop\">{{ getPaddingWidgetTop|async }}</div>\n <div class=\"ajf-vright\">{{ getPaddingWidgetRight|async }}</div>\n <div class=\"ajf-vbottom\">\n {{ getPaddingWidgetBottom|async }}\n </div>\n <div class=\"ajf-vleft\">{{ getPaddingWidgetLeft|async }}</div>\n <div class=\"ajf-content-box\">{{'content'|transloco}}</div>\n </div>\n </div>\n </div>\n </div>\n <mat-grid-list rowHeight=\"2em\" cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'height'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('height', $event.value)\"\n min=\"0\"\n max=\"200\"\n step=\"1\"\n [value]=\"getHeightWidget|async\"\n tickInterval=\"1\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!marginExpanded\"\n (click)=\"marginExpanded = !marginExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"marginExpanded\"\n (click)=\"marginExpanded = !marginExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'margin'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n [disabled]=\"marginExpanded\"\n (change)=\"setWidgetStyles('margin', $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"marginExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'margin top'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(0, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'margin right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(1, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'margin bottom'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(2, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetBottom|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'margin left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(3, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!paddingExpanded\"\n (click)=\"paddingExpanded = !paddingExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"paddingExpanded\"\n (click)=\"paddingExpanded = !paddingExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'padding'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('padding', $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"paddingExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'padding top'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(0, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'padding right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(1, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'padding bottom'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(2, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetBottom|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'padding left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(3, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!borderWidthExpanded\"\n (click)=\"borderWidthExpanded = !borderWidthExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"borderWidthExpanded\"\n (click)=\"borderWidthExpanded = !borderWidthExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border width'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('border-width', $event.value)\"\n min=\"0\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetTop|async\"\n tickInterval=\"1\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"borderWidthExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border width top'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(0, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border width right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(1, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border width bottom'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(2, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetBottom|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border width left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(3, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!borderRadiusExpanded\"\n (click)=\"borderRadiusExpanded = !borderRadiusExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"borderRadiusExpanded\"\n (click)=\"borderRadiusExpanded = !borderRadiusExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border radius'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('border-radius', $event.value)\"\n min=\"0\"\n max=\"100\"\n step=\"1\"\n tickInterval=\"10\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"borderRadiusExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border radius top left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(0, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetTopLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border radius top right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(1, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetTopRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border radius bottom left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(2, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetBottomLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span\n >{{'border radius bottom right'|transloco}}</span\n >\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(3, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetBottomRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n </div>\n <div class=\"properties-container\" *ngIf=\"currentWidget.widgetType === 2\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"3\">\n <span>{{'font size'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('font-size', $event.value);\"\n min=\"1\"\n max=\"150\"\n step=\"1\"\n [value]=\"getFontSizeWidget|async\"\n tickInterval=\"1\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </div>\n <ng-template [ngIf]=\"currentWidget.widgetType === 5\">\n <br />\n <form>\n <mat-form-field>\n <input\n matInput\n [placeholder]=\"'Font size' | transloco\"\n [value]=\"getFontSizeWidget|async\"\n [(ngModel)]=\"fontSize\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"setWidgetStyles('font-size', fontSize)\"\n />\n </mat-form-field>\n <mat-select\n (selectionChange)=\"setWidgetStyles('font-style', $event.value)\"\n [placeholder]=\"'Font style' | transloco\"\n >\n <mat-option value=\"normal\">{{'Normal'|transloco}}</mat-option>\n <mat-option value=\"italic\">{{'Italic'|transloco}}</mat-option>\n <mat-option value=\"oblique\">{{'Oblique'|transloco}}</mat-option>\n </mat-select>\n <mat-select\n (selectionChange)=\"setWidgetStyles('text-align', $event.value)\"\n [placeholder]=\"'Align' | transloco\"\n >\n <mat-option value=\"center\">{{'Center'|transloco}}</mat-option>\n <mat-option value=\"left\">{{'Left'|transloco}}</mat-option>\n <mat-option value=\"right\">{{'Right'|transloco}}</mat-option>\n </mat-select>\n </form>\n </ng-template>\n <h1>\n <ng-container>{{'properties of'|transloco}}</ng-container>\n {{ widgetName|transloco }}\n </h1>\n </div>\n <div [ngSwitch]=\"currentWidget.widgetType\">\n <ng-template [ngSwitchCase]=\"0\">\n <h1>{{'Column'|transloco}}</h1>\n <ng-template\n ngFor\n let-col\n [ngForOf]=\"currentLayoutWidget.columns\"\n let-idx=\"index\"\n >\n <mat-toolbar>\n <mat-toolbar-row *ngIf=\"col !== -1\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile colspan=\"1\"> {{idx + 1}} </mat-grid-tile>\n <mat-grid-tile colspan=\"9\">\n <mat-slider\n style=\"width: 90%\"\n min=\"0.1\"\n max=\"1\"\n step=\"0.01\"\n value=\"{{col}}\"\n thumb-label=\"true\"\n tick-interval=\"true\"\n (change)=\"instantColumnValue($event.value,idx)\"\n >\n </mat-slider>\n {{percent(col)}}%\n </mat-grid-tile>\n <mat-grid-tile colspan=\"2\">\n <button\n style=\"width: 5%\"\n mat-button\n (click)=\"fixedColumn(idx)\"\n >\n fixed\n </button>\n </mat-grid-tile>\n </mat-grid-list>\n </mat-toolbar-row>\n <mat-toolbar-row *ngIf=\"col == -1\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile colspan=\"1\"> {{idx + 1}} </mat-grid-tile>\n <mat-grid-tile colspan=\"11\">\n <button\n style=\"width: 90%\"\n mat-button\n (click)=\"unfixedColumn(idx)\"\n >\n percent\n </button>\n </mat-grid-tile>\n </mat-grid-list>\n </mat-toolbar-row>\n </mat-toolbar>\n </ng-template>\n <mat-toolbar>\n <mat-toolbar-row>\n <button\n mat-button\n (click)=\"addColumn()\"\n *ngIf=\"currentLayoutWidget.columns.length < 10\"\n >\n {{'Add column'|transloco}}\n </button>\n </mat-toolbar-row>\n </mat-toolbar>\n </ng-template>\n <ng-template [ngSwitchCase]=\"2\">\n <ajf-image-group\n (formulaClick)=\"openFormulaDialog($event)\"\n [data]=\"iconSet\"\n ></ajf-image-group>\n <ajf-image-group\n (formulaClick)=\"openFormulaDialog($event)\"\n [data]=\"flagSet\"\n ></ajf-image-group>\n <ajf-report-builder-forms-analyzer></ajf-report-builder-forms-analyzer>\n <input\n mat-input\n [placeholder]=\"'paste a link' | transloco\"\n style=\"width: 100%\"\n [(ngModel)]=\"imageUrl\"\n />\n <button mat-button (click)=\"setImageUrl()\">\n {{'Set image'|transloco}}\n </button>\n </ng-template>\n <ng-template [ngSwitchCase]=\"3\">\n <div style=\"width: 500px\">\n <ajf-quill-editor\n [(ngModel)]=\"currentTextWidget.htmlText\"\n [modules]=\"getModule()\"\n [maxLength]=\"200\"\n [theme]=\"bubble\"\n [initHTML]=\"(getHTML|async) || ''\"\n (formulaClick)=\"openFormulaDialog($event)\"\n >\n </ajf-quill-editor>\n </div>\n </ng-template>\n <ng-template [ngSwitchCase]=\"4\">\n <h3>{{'Choose type of Chart'|transloco}}</h3>\n <mat-button-toggle-group class=\"ajf-chart-buttons\">\n <div class=\"ajf-row\">\n <mat-button-toggle\n value=\"reportbuilder-linechart\"\n (click)=\"setChartType(0)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-linechart\">\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-barchartvertical\"\n (click)=\"setChartType(1)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-barchartvertical\"\n >\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-bubblechart\"\n (click)=\"setChartType(8)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-bubblechart\">\n </mat-icon>\n </mat-button-toggle>\n </div>\n <div class=\"row\">\n <mat-button-toggle\n value=\"reportbuilder-barcharthorizontal\"\n (click)=\"setChartType(2)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-barcharthorizontal\"\n >\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-radarchart\"\n (click)=\"setChartType(3)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-radarchart\">\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-barchartvertical\"\n (click)=\"setChartType(1)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-barchartvertical\"\n >\n </mat-icon>\n </mat-button-toggle>\n </div>\n <div class=\"ajf-row\">\n <mat-button-toggle\n value=\"reportbuilder-scatterchart\"\n (click)=\"setChartType(4)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-scatterchart\"\n >\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-polarareachart\"\n (click)=\"setChartType(5)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-polarareachart\"\n >\n </mat-icon>\n </mat-button-toggle>\n </div>\n <div class=\"ajf-row\">\n <mat-button-toggle\n value=\"reportbuilder-piechart\"\n (click)=\"setChartType(6)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-piechart\">\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-donoughtchart\"\n (click)=\"setChartType(7)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-donoughtchart\"\n >\n </mat-icon>\n </mat-button-toggle>\n </div>\n </mat-button-toggle-group>\n <h3>{{'Labels'|transloco}}</h3>\n <ajf-report-builder-forms-analyzer></ajf-report-builder-forms-analyzer>\n <ajf-theme-color\n [section]=\"'chart'\"\n [label]=\"tabValue\"\n ></ajf-theme-color>\n <mat-card>\n <mat-card-header>\n <mat-card-title>{{'Border width'|transloco}}</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <mat-slider\n min=\"1\"\n max=\"100\"\n style=\"width: 99%\"\n step=\"1\"\n (change)=\"setChartBorderColor($event.value)\"\n [value]=\"chartBorderWidth\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-card-content>\n </mat-card>\n <mat-tab-group (selectChange)=\"setTab($event)\">\n <mat-tab label=\"Background\">\n <mat-list>\n <ng-template\n ngFor\n let-color\n [ngForOf]=\"(getChartBackgroundColor|async)\"\n let-idx=\"index\"\n >\n <mat-list-item>\n <span [style.background]=\"color\"> {{ color }} </span>\n <button mat-button (click)=\"removeChartBackgroundColor(idx)\">\n {{'Remove'|transloco}}\n </button>\n </mat-list-item>\n </ng-template>\n </mat-list>\n </mat-tab>\n <mat-tab label=\"Border\">\n <mat-list>\n <ng-template\n ngFor\n let-color\n [ngForOf]=\"(getChartBorderColor|async)\"\n let-idx=\"index\"\n >\n <mat-list-item>\n <span [style.background]=\"color\"> {{ color }} </span>\n <button mat-button (click)=\"removeChartBorderColor(idx)\">\n remove\n </button>\n </mat-list-item>\n </ng-template>\n </mat-list>\n </mat-tab>\n </mat-tab-group>\n </ng-template>\n <ng-template [ngSwitchCase]=\"5\">\n <ajf-report-builder-forms-analyzer></ajf-report-builder-forms-analyzer>\n </ng-template>\n </div>\n <button\n mat-button\n (click)=\"visibilitySection = !visibilitySection\"\n [ngClass]=\"{'ajf-selected': visibilitySection}\"\n >\n {{ widgetName|transloco }}\n <ng-container>{{'Visibility'|transloco}}</ng-container>\n </button>\n <div [style.display]=\"visibilitySection ? 'block' : 'none'\">\n <ajf-report-builder-condition-editor\n [visibility]=\"currentWidget.visibility\"\n ></ajf-report-builder-condition-editor>\n </div>\n </div>\n</ng-template>\n",
|
|
756
|
-
encapsulation: ViewEncapsulation.None,
|
|
757
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
758
|
-
styles: ["ajf-report-builder-properties .ajf-selected{background-color:darkred;color:#fff}ajf-report-builder-properties .ajf-style-container{height:auto;width:100%;position:relative;margin-bottom:60px;text-align:center}ajf-report-builder-properties .ajf-style-container mat-tab-group .ajf-style-panel{min-height:350px}ajf-report-builder-properties .ajf-style-container .ajf-style-background,ajf-report-builder-properties .ajf-style-container .ajf-style-color{width:100%;height:350px;position:relative;margin:30px}ajf-report-builder-properties .ajf-style-container .mat-list-item-content{position:normal !important;display:block !important;height:350px !important}ajf-report-builder-properties .ajf-style-container mat-tab-group .mat-tab-body-wrapper,ajf-report-builder-properties .ajf-style-container mat-tab-group .mat-list-item-content{position:normal !important;display:block !important;height:350px !important}ajf-report-builder-properties .ajf-content{margin-top:10px;margin-right:15px;margin-bottom:290px;margin-left:15px}ajf-report-builder-properties .ajf-content .ajf-menu-css{width:100% !important;font-size:10px !important}ajf-report-builder-properties .ajf-content .ajf-menu-css mat-button-toggle{width:33% !important}ajf-report-builder-properties .ajf-content mat-button-toggle-group{width:100% !important}ajf-report-builder-properties .ajf-content mat-button-toggle-group mat-button-toggle{width:auto !important}ajf-report-builder-properties .ajf-content mat-button-toggle-group mat-button-toggle mat-icon{margin:15px}ajf-report-builder-properties button{width:100%;margin-bottom:30px}ajf-report-builder-properties .ajf-hide-menu{width:auto !important}ajf-report-builder-properties h1,ajf-report-builder-properties h3,ajf-report-builder-properties h5{text-align:center}ajf-report-builder-properties .ajf-row{display:flex;flex-direction:column;width:100%}ajf-report-builder-properties .mat-tab-body.mat-tab-active{min-height:600px}ajf-report-builder-properties mat-grid-list{width:100%}ajf-report-builder-properties mat-grid-tile{overflow:visible !important}ajf-report-builder-properties mat-grid-tile.ajf-lal{text-align:left}ajf-report-builder-properties .ajf-chart-buttons mat-icon{font-size:15px}ajf-report-builder-properties .ajf-layout-preview{background-color:#fff;width:100%;font-size:.9em;box-sizing:border-box;position:relative}ajf-report-builder-properties .ajf-layout-preview .ajf-top-label{position:absolute;top:1em;left:1em;text-align:left}ajf-report-builder-properties .ajf-layout-preview .ajf-vtop{position:absolute;top:1em;right:0;left:0}ajf-report-builder-properties .ajf-layout-preview .ajf-vbottom{position:absolute;bottom:0;right:0;left:0}ajf-report-builder-properties .ajf-layout-preview .ajf-vright{position:absolute;top:50%;right:1em;margin-top:.5em}ajf-report-builder-properties .ajf-layout-preview .ajf-vleft{position:absolute;top:50%;left:1em;margin-top:.5em}ajf-report-builder-properties .ajf-layout-preview .ajf-vtl{position:absolute;top:1em;left:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-vtr{position:absolute;top:1em;right:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-vbl{position:absolute;bottom:1em;left:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-vbr{position:absolute;bottom:1em;right:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box{background-color:#fff;padding:3em;position:relative;border:solid 1px #ccc}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box{background-color:#ddd;padding:3em;position:relative;box-sizing:border-box}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box>.ajf-top-label{left:4em}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box .ajf-padding-box{padding:3em;background-color:#aaa;position:relative;box-sizing:border-box}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box .ajf-padding-box .ajf-content-box{background-color:#888;padding:2em;text-align:center;box-sizing:border-box}\n"]
|
|
759
|
-
},] }
|
|
760
|
-
];
|
|
761
|
-
AjfReportBuilderProperties.ctorParameters = () => [
|
|
762
|
-
{ type: MatDialog },
|
|
763
|
-
{ type: AjfReportBuilderService }
|
|
764
|
-
];
|
|
765
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9yZXBvcnQtYnVpbGRlci9wcm9wZXJ0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUlILE9BQU8sRUFDTCxrQkFBa0IsRUFLbEIsYUFBYSxFQUNkLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFJWixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBZSxNQUFNLDBCQUEwQixDQUFDO0FBQ2pFLE9BQU8sRUFBYSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTVGLE9BQU8sRUFBQyxtQ0FBbUMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTVFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBU2pFLE1BQU0sT0FBTywwQkFBMEI7SUFnUnJDLFlBQW9CLE9BQWtCLEVBQVUsUUFBaUM7UUFBN0QsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUFVLGFBQVEsR0FBUixRQUFRLENBQXlCO1FBL1FqRjs7OztXQUlHO1FBQ0gsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFdEI7Ozs7V0FJRztRQUNILGtCQUFhLEdBQW1CLElBQUksQ0FBQztRQVFyQzs7OztXQUlHO1FBQ0gsVUFBSyxHQUFjLEVBQUUsQ0FBQztRQUd0QixXQUFNLEdBQWEsRUFBRSxDQUFDO1FBU3RCOztXQUVHO1FBRUgsY0FBUyxHQUFRLEVBQUMsS0FB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QVk7UUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFO1lBQzlCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QyxDQUFDOzs7WUF4NEJGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsK0JBQStCO2dCQUN6Qyxxa2lDQUE4QjtnQkFFOUIsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNoRDs7O1lBZE8sU0FBUztZQU1ULHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtBamZGb3JtfSBmcm9tICdAYWpmL2NvcmUvZm9ybXMnO1xuaW1wb3J0IHtBamZDb25kaXRpb259IGZyb20gJ0BhamYvY29yZS9tb2RlbHMnO1xuaW1wb3J0IHtcbiAgQWpmQWdncmVnYXRpb25UeXBlLFxuICBBamZDaGFydFdpZGdldCxcbiAgQWpmTGF5b3V0V2lkZ2V0LFxuICBBamZUZXh0V2lkZ2V0LFxuICBBamZXaWRnZXQsXG4gIEFqZldpZGdldFR5cGVcbn0gZnJvbSAnQGFqZi9jb3JlL3JlcG9ydHMnO1xuaW1wb3J0IHtkZWVwQ29weX0gZnJvbSAnQGFqZi9jb3JlL3V0aWxzJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdERpYWxvZywgTWF0RGlhbG9nUmVmfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHN0YXJ0V2l0aCwgd2l0aExhdGVzdEZyb219IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtBamZSZXBvcnRCdWlsZGVyRm9ybXNBbmFseXplckRpYWxvZ30gZnJvbSAnLi9mb3Jtcy1hbmFseXplci1kaWFsb2cnO1xuaW1wb3J0IHtBamZGb3JtVmFyaWFibGVzfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQge0FqZlJlcG9ydEJ1aWxkZXJTZXJ2aWNlfSBmcm9tICcuL3JlcG9ydC1idWlsZGVyLXNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhamYtcmVwb3J0LWJ1aWxkZXItcHJvcGVydGllcycsXG4gIHRlbXBsYXRlVXJsOiAncHJvcGVydGllcy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3Byb3BlcnRpZXMuY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiAgdHJ1ZSB3aGVuIHRoZSBmaXJzdCB0aW1lIGNoYXJ0IHR5cGUgaXMgc2V0dGVkXG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgaW5pdENoYXJ0VHlwZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiB0aGUgY3VycmVudCB3aWRnZXRcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBjdXJyZW50V2lkZ2V0OiBBamZXaWRnZXR8bnVsbCA9IG51bGw7XG4gIGdldCBjdXJyZW50TGF5b3V0V2lkZ2V0KCk6IEFqZkxheW91dFdpZGdldCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFdpZGdldCBhcyBBamZMYXlvdXRXaWRnZXQ7XG4gIH1cbiAgZ2V0IGN1cnJlbnRUZXh0V2lkZ2V0KCk6IEFqZlRleHRXaWRnZXQge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRXaWRnZXQgYXMgQWpmVGV4dFdpZGdldDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGlzIGFycmF5IGNvbnRhaW5zIHRoZSBmb3JtcyBleHBsb2l0ZWQgZm9yIGdlbmVyYXRlIGRhdGEgbGFiZWxzXG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgZm9ybXM6IEFqZkZvcm1bXSA9IFtdO1xuXG5cbiAgY29sb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50V2lkZ2V0XG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgb3JpZ2luOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZBS0UgREFUQVxuICAgKi9cblxuICBmb3Jtc0pzb246IGFueSA9IHtmb3JtczogW119O1xuXG4gIC8qKlxuICAgKiBXSURHRVRcbiAgICovXG5cbiAgd2lkZ2V0TmFtZSA9ICcnO1xuICBnZXRIVE1MOiBPYnNlcnZhYmxlPHN0cmluZ3x1bmRlZmluZWQ+O1xuICBnZXRIZWlnaHRXaWRnZXQ6IE9ic2VydmFibGU8bnVtYmVyfHVuZGVmaW5lZD47XG4gIGdldEZvbnRTaXplV2lkZ2V0OiBPYnNlcnZhYmxlPG51bWJlcnx1bmRlZmluZWQ+O1xuICBnZXRGb250QWxpZ25XaWRnZXQ6IE9ic2VydmFibGU8bnVtYmVyfHVuZGVmaW5lZD47XG4gIGdldEJhY2tncm91bmRDb2xvcldpZGdldDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBnZXRDb2xvcldpZGdldDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBnZXRTdHlsZTogT2JzZXJ2YWJsZTxhbnk+O1xuICBnZXRDaGFydEJhY2tncm91bmRDb2xvcjogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIGdldENoYXJ0Qm9yZGVyQ29sb3I6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuICBnZXRWaXNpYmlsaXR5OiBPYnNlcnZhYmxlPEFqZkNvbmRpdGlvbj47XG4gIGdldENvbG9yOiBPYnNlcnZhYmxlPFN0cmluZ1tdPjtcblxuICBtYXJnaW5FeHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBnZXRNYXJnaW5XaWRnZXQ6IE9ic2VydmFibGU8bnVtYmVyW118dW5kZWZpbmVkPjtcbiAgZ2V0TWFyZ2luV2lkZ2V0VG9wOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldE1hcmdpbldpZGdldFJpZ2h0OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldE1hcmdpbldpZGdldEJvdHRvbTogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRNYXJnaW5XaWRnZXRMZWZ0OiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgcGFkZGluZ0V4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGdldFBhZGRpbmdXaWRnZXQ6IE9ic2VydmFibGU8bnVtYmVyW118dW5kZWZpbmVkPjtcbiAgZ2V0UGFkZGluZ1dpZGdldFRvcDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRQYWRkaW5nV2lkZ2V0UmlnaHQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgZ2V0UGFkZGluZ1dpZGdldEJvdHRvbTogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRQYWRkaW5nV2lkZ2V0TGVmdDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGJvcmRlcldpZHRoRXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZ2V0Qm9yZGVyV2lkdGhXaWRnZXQ6IE9ic2VydmFibGU8bnVtYmVyW118dW5kZWZpbmVkPjtcbiAgZ2V0Qm9yZGVyV2lkdGhXaWRnZXRUb3A6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgZ2V0Qm9yZGVyV2lkdGhXaWRnZXRSaWdodDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRCb3JkZXJXaWR0aFdpZGdldEJvdHRvbTogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRCb3JkZXJXaWR0aFdpZGdldExlZnQ6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICBib3JkZXJSYWRpdXNFeHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBnZXRCb3JkZXJSYWRpdXNXaWRnZXQ6IE9ic2VydmFibGU8bnVtYmVyW118dW5kZWZpbmVkPjtcbiAgZ2V0Qm9yZGVyUmFkaXVzV2lkZ2V0VG9wTGVmdDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRCb3JkZXJSYWRpdXNXaWRnZXRUb3BSaWdodDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRCb3JkZXJSYWRpdXNXaWRnZXRCb3R0b21SaWdodDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRCb3JkZXJSYWRpdXNXaWRnZXRCb3R0b21MZWZ0OiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgYmFja2dyb3VuZENvbG9yID0gJyMxMjdiZGMnO1xuICBzdHlsZUJhY2tncm91bmRDb2xvciA9ICdyZ2IoMjU1LDI1NSwyNTUsMCknO1xuICBib3JkZXJDb2xvciA9ICcjMTI3YmRjJztcbiAgc3R5bGVDb2xvciA9ICdyZ2IoMCwwLDAsMCknO1xuICB3YmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIGZvbnRTaXplOiBzdHJpbmc7XG4gIGJ1YmJsZTogc3RyaW5nO1xuXG4gIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFqZlJlcG9ydEJ1aWxkZXJGb3Jtc0FuYWx5emVyRGlhbG9nPjtcbiAgY29udGFpbmVyOiBBamZGb3JtVmFyaWFibGVzO1xuXG5cbiAgYWxpZ24gPSBbZmFsc2UsICdjZW50ZXInLCAncmlnaHQnLCAnanVzdGlmeSddO1xuXG4gIGZvbnRzID0gW1xuICAgIGZhbHNlLCAnYmxhY2tyJywgJ2JsYWNrLWl0YWxpYycsICdib2xkJywgJ2JvbGQtY29uZGVuc2VkJywgJ2JvbGQtY29uZGVuc2VkLWl0YWxpYycsXG4gICAgJ2JvbGQtaXRhbGljJywgJ2NvbmRlbnNlZCcsICdjb25kZW5zZWQtaXRhbGljJywgJ2l0YWxpYycsICdsaWdodCcsICdsaWdodC1pdGFsaWMnLCAnbWVkaXVtJyxcbiAgICAnbWVkaXVtLWl0YWxpYycsICd0aGlucicsICd0aGluLWl0YWxpYydcbiAgXTtcbiAgY3VycmVudE1vZHVsZTogYW55ID0ge307XG4gIHF1aWxsTW9kdWxlcyA9IHtcbiAgICB0b29sYmFyOiBbXG4gICAgICBbJ2Zvcm11bGEnXSwgWydib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnc3RyaWtlJ10sICAvLyB0b2dnbGVkIGJ1dHRvbnNcbiAgICAgIC8vIFsnYmxvY2txdW90ZScsICdjb2RlLWJsb2NrJ10sXG5cbiAgICAgIFt7J2hlYWRlcic6IDF9LCB7J2hlYWRlcic6IDJ9XSwgIC8vIGN1c3RvbSBidXR0b24gdmFsdWVzXG4gICAgICBbeydsaXN0JzogJ29yZGVyZWQnfSwgeydsaXN0JzogJ2J1bGxldCd9XSxcbiAgICAgIFt7J3NjcmlwdCc6ICdzdWInfSwgeydzY3JpcHQnOiAnc3VwZXInfV0sICAvLyBzdXBlcnNjcmlwdC9zdWJzY3JpcHRcbiAgICAgIC8vIFt7ICdpbmRlbnQnOiAnLTEnfSwgeyAnaW5kZW50JzogJysxJyB9XSwgICAgICAgICAgLy8gb3V0ZGVudC9pbmRlbnRcbiAgICAgIC8vIFt7ICdkaXJlY3Rpb24nOiAncnRsJyB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGV4dCBkaXJlY3Rpb25cblxuICAgICAgW3snc2l6ZSc6IFsnc21hbGwnLCBmYWxzZSwgJ2xhcmdlJywgJ2h1Z2UnXX1dLCAgLy8gY3VzdG9tIGRyb3Bkb3duXG4gICAgICBbeydoZWFkZXInOiBbMSwgMiwgMywgNCwgNSwgNiwgZmFsc2VdfV0sXG5cbiAgICAgIFt7J2NvbG9yJzogdGhpcy5jb2xvcnN9LCB7J2JhY2tncm91bmQnOiB0aGlzLmNvbG9yc31dLCAgLy8gZHJvcGRvd24gd2l0aCBkZWZhdWx0cyBmcm9tIHRoZW1lXG4gICAgICBbeydmb250JzogdGhpcy5mb250c31dLCBbeydhbGlnbic6IHRoaXMuYWxpZ259XSxcblxuICAgICAgWydjbGVhbiddLCAgLy8gcmVtb3ZlIGZvcm1hdHRpbmcgYnV0dG9uXG5cbiAgICAgIC8vIFsnbGluaycsICdjbGFzcycsICd2aWRlbyddICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmsgYW5kIGltYWdlLCB2aWRlb1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQ0hBUlRcbiAgICovXG5cblxuICBnZXRDaGFydFlMYWJlbHM6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuXG4gIGNoYXJ0Qm9yZGVyQ29sb3I6IHN0cmluZ1tdID0gW107XG4gIGNoYXJ0Qm9yZGVyV2lkdGggPSAzO1xuXG4gIC8qKlxuICAgKlxuICAgKiBJTUFHRVxuICAgKi9cblxuICBpbWFnZVVybCA9ICdodHRwczovL2FuZ3VsYXIuaW8vcmVzb3VyY2VzL2ltYWdlcy9sb2dvcy9hbmd1bGFyMi9hbmd1bGFyLnBuZyc7XG5cbiAgLyoqXG4gICAqXG4gICAqIFRFWFRcbiAgICovXG5cbiAgaHRtbFRleHQgPSAnJztcblxuXG4gIC8qKlxuICAgKiB0aGVzZSB2YXJpYWJsZXMgaW5kaWNhdGUgdGhhdCB0aGUgdXNlciB3YW50IHRvIGNoYW5nZSBzZWN0aW9uXG4gICAqL1xuICByZXBvcnRTdHlsZXMgPSBmYWxzZTtcbiAgc2VjdGlvblN0eWxlcyA9IGZhbHNlO1xuICB3aWRnZXRTdHlsZXMgPSB0cnVlO1xuICBzZWN0aW9uQ29sb3IgPSBmYWxzZTtcbiAgd2lkZ2V0Q29sb3IgPSBmYWxzZTtcbiAgdmlzaWJpbGl0eVNlY3Rpb24gPSBmYWxzZTtcbiAgY3VycmVudENvbG9yID0gJyc7XG5cbiAgcHJpdmF0ZSBfaWNvbjoge2ZvbnRTZXQ6IHN0cmluZywgZm9udEljb246IHN0cmluZ318bnVsbCA9IG51bGw7XG4gIGdldCBpY29uKCk6IHtmb250U2V0OiBzdHJpbmcsIGZvbnRJY29uOiBzdHJpbmd9fG51bGwge1xuICAgIHJldHVybiB0aGlzLl9pY29uO1xuICB9XG5cbiAgaWNvblNldDogYW55ID0geydpY29uJzogJ3RydWUnLCAndGl0bGUnOiAncmVwb3J0JywgJ2RhdGEnOiBudWxsfTtcblxuICBmbGFnU2V0OiBhbnkgPSB7XG4gICAgJ2ljb24nOiAnZmFsc2UnLFxuICAgICdjbGFzcyc6IFsnZmxhZy1pY29uJ10sXG4gICAgJ3ByZWZpeENsYXNzJzogJ2ZsYWctaWNvbi0nLFxuICAgICd0aXRsZSc6ICdmbGFncycsXG4gICAgJ2RhdGEnOlxuICAgICAgICBbXG4gICAgICAgICAgeydjbGFzcyc6ICdkeicsICdpbmZvJzogJ0FsZ2VyaWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2FvJywgJ2luZm8nOiAnQW5nb2xhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdiaicsICdpbmZvJzogJ0JlbmluJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdidycsICdpbmZvJzogJ0JvdHN3YW5hJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdiZicsICdpbmZvJzogJ0J1cmtpbmEgRmFzbyd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnYmknLCAnaW5mbyc6ICdCdXJ1bmRpJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdjbScsICdpbmZvJzogJ0NhbWVyb29uJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdjdicsICdpbmZvJzogJ0NhYm8gVmVyZGUnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2NmJywgJ2luZm8nOiAnVGhlIENlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAndGQnLCAnaW5mbyc6ICdDaGFkJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdrbScsICdpbmZvJzogJ1RoZSBDb21vcm9zJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdjaScsICdpbmZvJzogJ0NvdGUgRFxcJ2F2b2lyZSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnY2QnLCAnaW5mbyc6ICdUaGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBDb25nbyd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZGonLCAnaW5mbyc6ICdEaWppYm91dGknfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2VnJywgJ2luZm8nOiAnRWd5cHQnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2dxJywgJ2luZm8nOiAnRXF1YXRvcmlhbCBHdWluZWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2VyJywgJ2luZm8nOiAnRXJpdHJlYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZXQnLCAnaW5mbyc6ICdFdGhpb3BpYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAndGYnLCAnaW5mbyc6ICdGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2dhJywgJ2luZm8nOiAnR2Fib24nfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2dtJywgJ2luZm8nOiAnVGhlIEdhbWJpYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZ2gnLCAnaW5mbyc6ICdHaGFuYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZ24nLCAnaW5mbyc6ICdHdWluZWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2d3JywgJ2luZm8nOiAnR3VpbmVhLUJpc3NhdSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAna2UnLCAnaW5mbyc6ICdLZW55YSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbHMnLCAnaW5mbyc6ICdMZXNob3Robyd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbHInLCAnaW5mbyc6ICdMaWJlcmlhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdseScsICdpbmZvJzogJ0xpYnlhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdtZycsICdpbmZvJzogJ01hZGFnYXNjYXInfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ213JywgJ2luZm8nOiAnTWFsYXd5J30sXG4gICAgICAgICAgeydjbGFzcyc6ICdtbCcsICdpbmZvJzogJ01hbGknfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ21yJywgJ2luZm8nOiAnTWF1cml0YW5pYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbXUnLCAnaW5mbyc6ICdNYXVyaXRpdXMnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ3l0JywgJ2luZm8nOiAnTWF5b3R0ZSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbWEnLCAnaW5mbyc6ICdNYXJvY2NvJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdteicsICdpbmZvJzogJ01vemFtYmlxdWUnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ25hJywgJ2luZm8nOiAnTmFtaWJpYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbmUnLCAnaW5mbyc6ICdOaWdlcid9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbmcnLCAnaW5mbyc6ICdOaWdlcmlhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdjZycsICdpbmZvJzogJ1JlcHVibGljIG9mIHRoZSBDb25nbyd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAncncnLCAnaW5mbyc6ICdSd25kYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAncmUnLCAnaW5mbyc6ICdyw6h1bmlvbid9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnc2gnLCAnaW5mbyc6ICdTYWludCBIZWxlbmEsIEFzY2Vuc2lvbiBhbmQgVHJpc3RhbiBkYSBDdW5oYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnc3QnLCAnaW5mbyc6ICdTYW8gVG9tZSBhbmQgUHJpbmNpcGUnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ3NuJywgJ2luZm8nOiAnU2VuZWdhbCd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnc2MnLCAnaW5mbyc6ICdTZXljaGVsbGVzJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdzbCcsICdpbmZvJzogJ1NpZXJyYSBMZW9uZSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnc28nLCAnaW5mbyc6ICdTb21hbGlhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICd6YScsICdpbmZvJzogJ1NvdXRoIEFmcmljYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnc3MnLCAnaW5mbyc6ICdTb3V0aCBTdWRhbid9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnc2QnLCAnaW5mbyc6ICdTdWRhbid9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnc3onLCAnaW5mbyc6ICdTd2F6aWxhbmQnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ3R6JywgJ2luZm8nOiAnVGFuemFuaWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ3RnJywgJ2luZm8nOiAnVG9nbyd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAndG4nLCAnaW5mbyc6ICdUdW5pc2lhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICd1ZycsICdpbmZvJzogJ1VnYW5kYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZWgnLCAnaW5mbyc6ICdXZXN0ZXJuIFNhaGFyYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnem0nLCAnaW5mbyc6ICdaYW1iaWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ3p3JywgJ2luZm8nOiAnWmltYmF3ZSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnaXEnLCAnaW5mbyc6ICdJcmFxJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdsYicsICdpbmZvJzogJ0xlYmFub24nfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2JkJywgJ2luZm8nOiAnQmFuZ2xhZGVzaCd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnaXInLCAnaW5mbyc6ICdJcmFuIChJc2xhbWljIFJlcHVibGljIG9mKSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbXknLCAnaW5mbyc6ICdNYWxheXNpYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbnAnLCAnaW5mbyc6ICdOZXBhbCd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAncGsnLCAnaW5mbyc6ICdQYWtpc3Rhbid9LFxuICAgICAgICAgIHsnY2xhc3MnOiAndGgnLCAnaW5mbyc6ICdUaGFpbGFuZCd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnam8nLCAnaW5mbyc6ICdKb3JkYW4nfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ3llJywgJ2luZm8nOiAnWWVtZW4nfVxuICAgICAgICBdXG4gIH07XG5cbiAgcHJpdmF0ZSBfY3VycmVudFdpZGdldFN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9mb3Jtc1N1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9jb2xvclN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9oZWFkZXJTdHlsZVN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9jb250ZW50U3R5bGVzU3ViOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgX2Zvb3RlclN0eWxlc1N1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9vcmlnaW5TdWI6IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBfc3R5bGVzVXBkYXRlc1N1YnM6IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICBwcml2YXRlIF91cGRhdGVXaWRnZXRNYXJnaW5FdnQ6IEV2ZW50RW1pdHRlcjx7aWR4OiBudW1iZXIsIHZhbHVlOiBhbnl9PiA9XG4gICAgICBuZXcgRXZlbnRFbWl0dGVyPHtpZHg6IG51bWJlciwgdmFsdWU6IGFueX0+KCk7XG4gIHByaXZhdGUgX3VwZGF0ZVdpZGdldFBhZGRpbmdFdnQ6IEV2ZW50RW1pdHRlcjx7aWR4OiBudW1iZXIsIHZhbHVlOiBhbnl9PiA9XG4gICAgICBuZXcgRXZlbnRFbWl0dGVyPHtpZHg6IG51bWJlciwgdmFsdWU6IGFueX0+KCk7XG4gIHByaXZhdGUgX3VwZGF0ZVdpZGdldEJvcmRlcldpZHRoRXZ0OiBFdmVudEVtaXR0ZXI8e2lkeDogbnVtYmVyLCB2YWx1ZTogYW55fT4gPVxuICAgICAgbmV3IEV2ZW50RW1pdHRlcjx7aWR4OiBudW1iZXIsIHZhbHVlOiBhbnl9PigpO1xuICBwcml2YXRlIF91cGRhdGVXaWRnZXRCb3JkZXJSYWRpdXNFdnQ6IEV2ZW50RW1pdHRlcjx7aWR4OiBudW1iZXIsIHZhbHVlOiBhbnl9PiA9XG4gICAgICBuZXcgRXZlbnRFbWl0dGVyPHtpZHg6IG51bWJlciwgdmFsdWU6IGFueX0+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgX3NlcnZpY2U6IEFqZlJlcG9ydEJ1aWxkZXJTZXJ2aWNlKSB7XG4gICAgdGhpcy5zZXRGb3JtcygpO1xuXG4gICAgdGhpcy5pY29uU2V0LmRhdGEgPSBPYmplY3Qua2V5cyhfc2VydmljZS5pY29uU2V0cykuZmlsdGVyKHggPT4geCAhPSAnYWpmLWljb24nKS5tYXAoaSA9PiB7XG4gICAgICByZXR1cm4ge25hbWU6IGksIGljb25zOiBfc2VydmljZS5pY29uU2V0c1tpXX07XG4gICAgfSk7XG5cbiAgICB0aGlzLl9oZWFkZXJTdHlsZVN1YiA9IHRoaXMuX3NlcnZpY2UuaGVhZGVyU3R5bGVzLnN1YnNjcmliZShzID0+IHtcbiAgICAgIGlmIChzWydiYWNrZ3JvdW5kLWNvbG9yJ10gIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0eWxlQmFja2dyb3VuZENvbG9yID0gc1snYmFja2dyb3VuZC1jb2xvciddO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX2NvbnRlbnRTdHlsZXNTdWIgPSB0aGlzLl9zZXJ2aWNlLmNvbnRlbnRTdHlsZXMuc3Vic2NyaWJlKHMgPT4ge1xuICAgICAgaWYgKHNbJ2JhY2tncm91bmQtY29sb3InXSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3R5bGVCYWNrZ3JvdW5kQ29sb3IgPSBzWydiYWNrZ3JvdW5kLWNvbG9yJ107XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fZm9vdGVyU3R5bGVzU3ViID0gdGhpcy5fc2VydmljZS5mb290ZXJTdHlsZXMuc3Vic2NyaWJlKHMgPT4ge1xuICAgICAgaWYgKHNbJ2JhY2tncm91bmQtY29sb3InXSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3R5bGVCYWNrZ3JvdW5kQ29sb3IgPSBzWydiYWNrZ3JvdW5kLWNvbG9yJ107XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fb3JpZ2luU3ViID0gdGhpcy5fc2VydmljZS5vcmlnaW4uc3Vic2NyaWJlKHMgPT4ge1xuICAgICAgdGhpcy5vcmlnaW4gPSBzO1xuICAgIH0pO1xuICB9XG5cblxuICAvKipcbiAgICpcbiAgICogVVRJTFNcbiAgICovXG5cblxuICAvKipcbiAgICogcmV0dXJuIGEgbnVtYmVyIHZhbHVlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIHRvTnVtYmVyKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGxldCBudW1iZXJQYXR0ZXJuID0gL14oLSk/XFxkKy9nO1xuXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gdmFsdWUubWF0Y2gobnVtYmVyUGF0dGVybik7XG4gICAgICBpZiAobWF0Y2hlcyA9PSBudWxsIHx8IG1hdGNoZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gTnVtYmVyKG1hdGNoZXNbMF0pO1xuICAgIH1cbiAgfVxuXG4gIHRvTnVtYmVyQXJyYXkodmFsdWU6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHZhbHVlIHx8ICcnKVxuICAgICAgICAgIC5yZXBsYWNlKCdweCcsICcnKVxuICAgICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgICAgLmZpbHRlcih2ID0+IHYgIT09ICcnICYmIHYgIT0gbnVsbClcbiAgICAgICAgICAubWFwKHYgPT4gdGhpcy50b051bWJlcih2KSk7XG4gICAgfVxuICB9XG5cbiAgZmlsbFB4TnVtYmVyQXJyYXkodmFsdWU6IG51bWJlcltdKSB7XG4gICAgY29uc3QgdmwgPSB2YWx1ZS5sZW5ndGg7XG4gICAgc3dpdGNoICh2bCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gWzAsIDAsIDAsIDBdO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBjb25zdCB2ID0gdmFsdWVbMF07XG4gICAgICAgIHJldHVybiBbdiwgdiwgdiwgdl07XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGNvbnN0IHYyMSA9IHZhbHVlWzBdO1xuICAgICAgICBjb25zdCB2MjIgPSB2YWx1ZVsxXTtcbiAgICAgICAgcmV0dXJuIFt2MjEsIHYyMiwgdjIxLCB2MjJdO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBjb25zdCB2MzEgPSB2YWx1ZVswXTtcbiAgICAgICAgY29uc3QgdjMyID0gdmFsdWVbMV07XG4gICAgICAgIGNvbnN0IHYzMyA9IHZhbHVlWzJdO1xuICAgICAgICByZXR1cm4gW3YzMSwgdjMyLCB2MzMsIHYzMl07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcGVyY2VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgbGV0IHRlbXAgPSB0aGlzLnJvdW5kVG8odmFsdWUgKiAxMDAsIDMpO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcm91bmRUbyh2YWx1ZTogbnVtYmVyLCBkZWNpbWFsUG9zaXRpb25zOiBudW1iZXIpIHtcbiAgICBsZXQgaSA9IHZhbHVlICogTWF0aC5wb3coMTAsIGRlY2ltYWxQb3NpdGlvbnMpO1xuXG4gICAgaSA9IE1hdGguZmxvb3IoaSk7XG5cbiAgICByZXR1cm4gaSAvIE1hdGgucG93KDEwLCBkZWNpbWFsUG9zaXRpb25zKTtcbiAgfVxuICAvKipcbiAgICogY2FsbCB0byBzZXJ2aWNlIHRvIHNldCB0aGUgZm9ybXNcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuXG4gIHNldEZvcm1zKCk6IHZvaWQge1xuICAgIGxldCBmb3JtczogQWpmRm9ybVtdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5mb3Jtc0pzb24uZm9ybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9ybXMucHVzaChkZWVwQ29weSh0aGlzLmZvcm1zSnNvbi5mb3Jtc1tpXSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2VydmljZS5zZXRSZXBvcnRGb3Jtcyhmb3Jtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsIHRvIHNlcnZpY2UgdG8gc2V0IHRoZSB3aWR0aCBvZiB0aGUgaWR4IGNvbHVtbiBvZiBsYXlvdXQgd2lkZ2V0XG4gICAqXG4gICAqIEBwYXJhbSBjb2xcbiAgICogQHBhcmFtIGlkeFxuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIGluc3RhbnRDb2x1bW5WYWx1ZShjb2w6IG51bWJlcnxudWxsLCBpZHg6IG51bWJlcikge1xuICAgIGlmIChjb2wgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2VydmljZS5pbnN0YW50Q29sdW1uVmFsdWUoY29sLCBpZHgpO1xuICB9XG5cbiAgLyoqXG4gICAqICBmb3JjZSBjb3B5IG9mIHN0eWxlXG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgLy8gVE9ETyBkZWxldGUgdGhpc1xuICBzZXRTdHlsZSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50V2lkZ2V0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50V2lkZ2V0LnN0eWxlcyA9IGRlZXBDb3B5KHRoaXMuY3VycmVudFdpZGdldC5zdHlsZXMpO1xuICAgIHRoaXMuX3NlcnZpY2UudXBkYXRlQ3VycmVudFdpZGdldCh0aGlzLmN1cnJlbnRXaWRnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwgdG8gc2VydmljZSB0byBhZGQgbmV3IHN0eWxlIHRvIHdpZGdldFxuICAgKlxuICAgKiBAcGFyYW0gbGFiZWxcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgc2V0V2lkZ2V0U3R5bGVzKGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl9zZXJ2aWNlLnNldFdpZGdldFN0eWxlcyhsYWJlbCwgdmFsdWUpO1xuICAgIHRoaXMuY3VycmVudENvbG9yID0gdmFsdWU7XG4gICAgdGhpcy5zZXRTdHlsZSgpO1xuICB9XG5cbiAgc2V0V2lkZ2V0TWFyZ2luKGlkeDogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlV2lkZ2V0TWFyZ2luRXZ0LmVtaXQoe2lkeCwgdmFsdWV9KTtcbiAgfVxuXG4gIHNldFdpZGdldFBhZGRpbmcoaWR4OiBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVXaWRnZXRQYWRkaW5nRXZ0LmVtaXQoe2lkeCwgdmFsdWV9KTtcbiAgfVxuXG4gIHNldFdpZGdldEJvcmRlcldpZHRoKGlkeDogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlV2lkZ2V0Qm9yZGVyV2lkdGhFdnQuZW1pdCh7aWR4LCB2YWx1ZX0pO1xuICB9XG5cbiAgc2V0V2lkZ2V0Qm9yZGVyUmFkaXVzKGlkeDogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlV2lkZ2V0Qm9yZGVyUmFkaXVzRXZ0LmVtaXQoe2lkeCwgdmFsdWV9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsIHRvIHNlcnZpY2UgdG8gYWRkIG5ldyBzdHlsZSB0byBzZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBsYWJlbFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBzZXRTZWN0aW9uU3R5bGVzKGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl9zZXJ2aWNlLnNldFNlY3Rpb25TdHlsZXModGhpcy5vcmlnaW4sIGxhYmVsLCB2YWx1ZSk7XG4gICAgdGhpcy5zdHlsZUNvbG9yID0gdmFsdWU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBjYWxsIHRvIHNlcnZpY2UgdG8gYWRkIG5ldyBzdHlsZSB0byByZXBvcnRcbiAgICpcbiAgICogQHBhcmFtIGxhYmVsXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIHNldFJlcG9ydFN0eWxlcyhsYWJlbDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fc2VydmljZS5zZXRSZXBvcnRTdHlsZXMobGFiZWwsIHZhbHVlKTtcbiAgICB0aGlzLnN0eWxlQmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogYWRkIGN1c3RvbSBjb2xvclxuICAgKlxuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIGFkZEN1c3RvbUNvbG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2UuYWRkQ3VzdG9tQ29sb3IodGhpcy5jdXJyZW50Q29sb3IpO1xuICAgIHRoaXMuX3NlcnZpY2UudXBkYXRlQ3VycmVudFdpZGdldCh0aGlzLmN1cnJlbnRXaWRnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgbW9kdWxlIGV4cGxvaXQgdG8gcXVpbGwgdGV4dCBlZGl0b3JcbiAgICpcbiAgICogQHJldHVybnNcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBnZXRNb2R1bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVpbGxNb2R1bGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIHRydWUgaXMgdGhlIGlucHV0IHR5cGUgdmFsdWUgaXMgZXF1YWwgdG8gY3VycmVudCB3aWRnZXQgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHJldHVybnNcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBpc0NoYXJ0VHlwZVNlbGVjdGVkKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5pbml0Q2hhcnRUeXBlID09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG15T2JqID0gPEFqZkNoYXJ0V2lkZ2V0PnRoaXMuY3VycmVudFdpZGdldDtcbiAgICBpZiAodmFsdWUgPT09IG15T2JqLmNoYXJ0VHlwZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuXG4gIC8qIGxheW91dCBmdW5jdGlvbnMgKi9cblxuICAvKipcbiAgICogY2FsbCB0byBzZXJ2aWNlIHRvIGFkZCBhIGNvbHVtbiB0byBjdXJyZW50IGxheW91dCB3aWRnZXRcbiAgICpcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBhZGRDb2x1bW4oKSB7XG4gICAgdGhpcy5fc2VydmljZS5hZGRDb2x1bW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsIHRvIHNlcnZpY2UgdG8gYWRkIGEgb2JqIHRvIGN1cnJlbnQgbGF5b3V0IHdpZGdldFxuICAgKlxuICAgKiBAcGFyYW0gaWR4XG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgZml4ZWRDb2x1bW4oaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9zZXJ2aWNlLmZpeGVkQ29sdW1uKGlkeCk7XG4gIH1cblxuICAvKipcbiAgICogY2FsbCB0byBzZXJ2aWNlIHRvIHJlbW92ZSBvYmogb2YgY3VycmVudCBsYXlvdXQgd2lkZ2V0XG4gICAqXG4gICAqIEBwYXJhbSBpZHhcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICB1bmZpeGVkQ29sdW1uKGlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2VydmljZS5yZW1vdmUoJ3VuZml4ZWRDb2x1bW4nLCBpZHgpO1xuICB9XG5cbiAgLyogaW1hZ2UgZnVuY3Rpb25zICovXG5cbiAgLyoqXG4gICAqIGNhbGwgdG8gc2VydmljZSB0byBzZXQgaW1hZ2UgdXJsXG4gICAqXG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgc2V0SW1hZ2VVcmwoKSB7XG4gICAgdGhpcy5fc2VydmljZS5zZXRJbWFnZVVybCh0aGlzLmltYWdlVXJsKTtcbiAgfVxuXG4gIHNldEljb24oaWNvbjoge2ZvbnRTZXQ6IHN0cmluZywgZm9udEljb246IHN0cmluZ30pIHtcbiAgICB0aGlzLl9pY29uID0gaWNvbjtcbiAgICB0aGlzLl9zZXJ2aWNlLnNldEljb24oaWNvbik7XG4gIH1cblxuICAvKiBjaGFydCBmdW5jdGlvbnMgKi9cblxuICAvKipcbiAgICogY2FsbCB0byBzZXJ2aWNlIHRvIHNldCB0aGUgdHlwZSBvZiBjaGFydFxuICAgKlxuICAgKiBAcGFyYW0gdHlwZVxuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIHNldENoYXJ0VHlwZSh0eXBlOiBudW1iZXIpIHtcbiAgICB0aGlzLmluaXRDaGFydFR5cGUgPSB0cnVlO1xuICAgIHRoaXMuX3NlcnZpY2Uuc2V0Q2hhcnRUeXBlKHR5cGUpO1xuICB9XG5cbiAgc2V0Q2hhcnRCb3JkZXJDb2xvcih2YWx1ZTogbnVtYmVyfG51bGwpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXJ2aWNlLnNldENoYXJ0Qm9yZGVyV2lkdGgodmFsdWUpO1xuICB9XG5cbiAgdGFiVmFsdWU6IHN0cmluZyA9ICdiYWNrZ3JvdW5kQ29sb3InO1xuICBzZXRUYWIoZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudC5pbmRleCA9PT0gMCkge1xuICAgICAgdGhpcy50YWJWYWx1ZSA9ICdiYWNrZ3JvdW5kQ29sb3InO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhYlZhbHVlID0gJ2JvcmRlckNvbG9yJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2FsbCB0byBzZXJ2aWNlIHRvIHJlbW92ZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIGN1cnJlbnQgY2hhcnRcbiAgICpcbiAgICogQHBhcmFtIGluZGV4XG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgcmVtb3ZlQ2hhcnRCYWNrZ3JvdW5kQ29sb3IoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX3NlcnZpY2UucmVtb3ZlQ2hhcnRCYWNrZ3JvdW5kQ29sb3IoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwgdG8gc2VydmljZSB0byByZW1vdmUgYm9yZGVyIGNvbG9yIHRvIGN1cnJlbnQgY2hhcnRcbiAgICpcbiAgICogQHBhcmFtIGluZGV4XG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgcmVtb3ZlQ2hhcnRCb3JkZXJDb2xvcihpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2VydmljZS5yZW1vdmVDaGFydEJvcmRlckNvbG9yKGluZGV4KTtcbiAgfVxuXG4gIGhpZGVNZW51KCkge1xuICAgIHRoaXMuX3NlcnZpY2UudXBkYXRlQ3VycmVudFdpZGdldChudWxsKTtcbiAgfVxuXG4gIG9wZW5Gb3JtdWxhRGlhbG9nKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuKEFqZlJlcG9ydEJ1aWxkZXJGb3Jtc0FuYWx5emVyRGlhbG9nKTtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5hZ2dyZWdhdGlvbiA9IEFqZkFnZ3JlZ2F0aW9uVHlwZS5Ob25lO1xuICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmlzRm9ybXVsYSA9IHRydWU7XG4gICAgaWYgKGV2ZW50ICE9IG51bGwgJiYgZXZlbnQucmVmZXJlbmNlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmZvcm11bGEgPSBldmVudC5mb3JtdWxhO1xuICAgICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UucmVmZXJlbmNlID0gZXZlbnQucmVmZXJlbmNlO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2Zvcm1zU3ViID0gdGhpcy5fc2VydmljZS5yZXBvcnRGb3Jtcy5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICB0aGlzLmZvcm1zID0geCB8fCBbXTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2N1cnJlbnRXaWRnZXRTdWIgPSB0aGlzLl9zZXJ2aWNlLmN1cnJlbnRXaWRnZXQuc3Vic2NyaWJlKHggPT4ge1xuICAgICAgaWYgKHggIT0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50V2lkZ2V0ICE9PSB4KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50V2lkZ2V0ID0geDtcbiAgICAgICAgICB0aGlzLndpZGdldE5hbWUgPSBBamZXaWRnZXRUeXBlW3gud2lkZ2V0VHlwZV07XG4gICAgICAgICAgdGhpcy5yZXBvcnRTdHlsZXMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnNlY3Rpb25TdHlsZXMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLndpZGdldFN0eWxlcyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuc2VjdGlvbkNvbG9yID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy53aWRnZXRDb2xvciA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudmlzaWJpbGl0eVNlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50V2lkZ2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy53aWRnZXROYW1lID0gJyc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fY29sb3JTdWIgPSB0aGlzLl9zZXJ2aWNlLmNvbG9ycy5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICBpZiAoeCAmJiB4Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb2xvcnMgPSB4O1xuXG4gICAgICAgIHRoaXMucXVpbGxNb2R1bGVzID0ge1xuICAgICAgICAgIHRvb2xiYXI6IFtcbiAgICAgICAgICAgIFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ3N0cmlrZSddLCAgLy8gdG9nZ2xlZCBidXR0b25zXG4gICAgICAgICAgICAvLyBbJ2Jsb2NrcXVvdGUnLCAnY29kZS1ibG9jayddLFxuICAgICAgICAgICAgW3snaGVhZGVyJzogMX0sIHsnaGVhZGVyJzogMn1dLCAgLy8gY3VzdG9tIGJ1dHRvbiB2YWx1ZXNcbiAgICAgICAgICAgIFt7J2xpc3QnOiAnb3JkZXJlZCd9LCB7J2xpc3QnOiAnYnVsbGV0J31dLFxuICAgICAgICAgICAgW3snc2NyaXB0JzogJ3N1Yid9LCB7J3NjcmlwdCc6ICdzdXBlcid9XSwgIC8vIHN1cGVyc2NyaXB0L3N1YnNjcmlwdFxuICAgICAgICAgICAgLy8gW3sgJ2luZGVudCc6ICctMSd9LCB7ICdpbmRlbnQnOiAnKzEnIH1dLCAgICAgICAgICAvLyBvdXRkZW50L2luZGVudFxuICAgICAgICAgICAgLy8gW3sgJ2RpcmVjdGlvbic6ICdydGwnIH1dLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGRpcmVjdGlvblxuXG4gICAgICAgICAgICBbeydzaXplJzogWydzbWFsbCcsIGZhbHNlLCAnbGFyZ2UnLCAnaHVnZSddfV0sICAvLyBjdXN0b20gZHJvcGRvd25cbiAgICAgICAgICAgIFt7J2hlYWRlcic6IFsxLCAyLCAzLCA0LCA1LCA2LCBmYWxzZV19XSxcblxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7J2NvbG9yJzogdGhpcy5jb2xvcnN9LCB7J2JhY2tncm91bmQnOiB0aGlzLmNvbG9yc31cbiAgICAgICAgICAgIF0sICAvLyBkcm9wZG93biB3aXRoIGRlZmF1bHRzIGZyb20gdGhlbWVcbiAgICAgICAgICAgIFt7J2ZvbnQnOiB0aGlzLmZvbnRzfV0sIFt7J2FsaWduJzogdGhpcy5hbGlnbn1dLCBbJ2Zvcm11bGEnXSxcbiAgICAgICAgICAgIFsnY2xlYW4nXSwgIC8vIHJlbW92ZSBmb3JtYXR0aW5nIGJ1dHRvblxuXG4gICAgICAgICAgICAvLyBbJ2xpbmsnLCAnY2xhc3MnLCAndmlkZW8nXSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rIGFuZCBpbWFnZSwgdmlkZW9cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIHRoaXMuZ2V0SFRNTCA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5waXBlKFxuICAgICAgICBtYXAoKHdpZGdldDogQWpmV2lkZ2V0fG51bGwpID0+IHtcbiAgICAgICAgICBpZiAod2lkZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG15T2JqID0gPEFqZlRleHRXaWRnZXQ+dGhpcy5jdXJyZW50V2lkZ2V0O1xuICAgICAgICAgICAgcmV0dXJuIG15T2JqLmh0bWxUZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzdGFydFdpdGgoJzxwPjxicj48L3A+JykpO1xuXG5cbiAgICB0aGlzLmdldEhlaWdodFdpZGdldCA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5waXBlKFxuICAgICAgICBmaWx0ZXIoeCA9PiB4ICE9IG51bGwpLCBtYXAoKG15T2JqOiBBamZXaWRnZXR8bnVsbCkgPT4ge1xuICAgICAgICAgIGlmIChteU9iaiAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnRvTnVtYmVyKG15T2JqLnN0eWxlc1snaGVpZ2h0J10pO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgfHwgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAgIHRoaXMuZ2V0Rm9udFNpemVXaWRnZXQgPSB0aGlzLl9zZXJ2aWNlLmN1cnJlbnRXaWRnZXQucGlwZShcbiAgICAgICAgbWFwKChteU9iajogQWpmV2lkZ2V0fG51bGwpID0+IHtcbiAgICAgICAgICBpZiAobXlPYmogIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnRvTnVtYmVyKG15T2JqLnN0eWxlc1snZm9udC1zaXplJ10pIHx8IDEyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuXG4gICAgdGhpcy5nZXRGb250QWxpZ25XaWRnZXQgPSB0aGlzLl9zZXJ2aWNlLmN1cnJlbnRXaWRnZXQucGlwZShcbiAgICAgICAgbWFwKChteU9iajogQWpmV2lkZ2V0fG51bGwpID0+IHtcbiAgICAgICAgICBpZiAobXlPYmogIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICgobXlPYmouc3R5bGVzWyd0ZXh0LWFsaWduJ10pIHx8ICdjZW50ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuXG4gICAgdGhpcy5nZXRCb3JkZXJXaWR0aFdpZGdldCA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5waXBlKFxuICAgICAgICBtYXAoKG15T2JqOiBBamZXaWRnZXR8bnVsbCkgPT4ge1xuICAgICAgICAgIGlmIChteU9iaiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxsUHhOdW1iZXJBcnJheSh0aGlzLnRvTnVtYmVyQXJyYXkobXlPYmouc3R5bGVzWydib3JkZXItd2lkdGgnXSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgc3RhcnRXaXRoKFswLCAwLCAwLCAwXSkpO1xuICAgIHRoaXMuZ2V0Qm9yZGVyV2lkdGhXaWRnZXRUb3AgPVxuICAgICAgICB0aGlzLmdldEJvcmRlcldpZHRoV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMF0pKTtcbiAgICB0aGlzLmdldEJvcmRlcldpZHRoV2lkZ2V0UmlnaHQgPVxuICAgICAgICB0aGlzLmdldEJvcmRlcldpZHRoV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMV0pKTtcbiAgICB0aGlzLmdldEJvcmRlcldpZHRoV2lkZ2V0Qm90dG9tID1cbiAgICAgICAgdGhpcy5nZXRCb3JkZXJXaWR0aFdpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzJdKSk7XG4gICAgdGhpcy5nZXRCb3JkZXJXaWR0aFdpZGdldExlZnQgPVxuICAgICAgICB0aGlzLmdldEJvcmRlcldpZHRoV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbM10pKTtcblxuICAgIHRoaXMuZ2V0Qm9yZGVyUmFkaXVzV2lkZ2V0ID0gdGhpcy5fc2VydmljZS5jdXJyZW50V2lkZ2V0LnBpcGUoXG4gICAgICAgIG1hcCgobXlPYmo6IEFqZldpZGdldHxudWxsKSA9PiB7XG4gICAgICAgICAgaWYgKG15T2JqICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGxQeE51bWJlckFycmF5KHRoaXMudG9OdW1iZXJBcnJheShteU9iai5zdHlsZXNbJ2JvcmRlci1yYWRpdXMnXSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgc3RhcnRXaXRoKFswLCAwLCAwLCAwXSkpO1xuICAgIHRoaXMuZ2V0Qm9yZGVyUmFkaXVzV2lkZ2V0VG9wTGVmdCA9XG4gICAgICAgIHRoaXMuZ2V0Qm9yZGVyUmFkaXVzV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMF0pKTtcbiAgICB0aGlzLmdldEJvcmRlclJhZGl1c1dpZGdldFRvcFJpZ2h0ID1cbiAgICAgICAgdGhpcy5nZXRCb3JkZXJSYWRpdXNXaWRnZXQucGlwZShmaWx0ZXIobSA9PiBtICE9IG51bGwpLCBtYXAobSA9PiBtIVsxXSkpO1xuICAgIHRoaXMuZ2V0Qm9yZGVyUmFkaXVzV2lkZ2V0Qm90dG9tUmlnaHQgPVxuICAgICAgICB0aGlzLmdldEJvcmRlclJhZGl1c1dpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzJdKSk7XG4gICAgdGhpcy5nZXRCb3JkZXJSYWRpdXNXaWRnZXRCb3R0b21MZWZ0ID1cbiAgICAgICAgdGhpcy5nZXRCb3JkZXJSYWRpdXNXaWRnZXQucGlwZShmaWx0ZXIobSA9PiBtICE9IG51bGwpLCBtYXAobSA9PiBtIVszXSkpO1xuXG4gICAgdGhpcy5nZXRNYXJnaW5XaWRnZXQgPSB0aGlzLl9zZXJ2aWNlLmN1cnJlbnRXaWRnZXQucGlwZShcbiAgICAgICAgbWFwKChteU9iajogQWpmV2lkZ2V0fG51bGwpID0+IHtcbiAgICAgICAgICBpZiAobXlPYmogIT0gbnVsbCAmJiBteU9iai5zdHlsZXMgIT0gbnVsbCAmJiBteU9iai5zdHlsZXNbJ21hcmdpbiddICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGxQeE51bWJlckFycmF5KHRoaXMudG9OdW1iZXJBcnJheShteU9iai5zdHlsZXNbJ21hcmdpbiddKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzdGFydFdpdGgoWzAsIDAsIDAsIDBdKSk7XG4gICAgdGhpcy5nZXRNYXJnaW5XaWRnZXRUb3AgPSB0aGlzLmdldE1hcmdpbldpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzBdKSk7XG4gICAgdGhpcy5nZXRNYXJnaW5XaWRnZXRSaWdodCA9IHRoaXMuZ2V0TWFyZ2luV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMV0pKTtcbiAgICB0aGlzLmdldE1hcmdpbldpZGdldEJvdHRvbSA9IHRoaXMuZ2V0TWFyZ2luV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMl0pKTtcbiAgICB0aGlzLmdldE1hcmdpbldpZGdldExlZnQgPSB0aGlzLmdldE1hcmdpbldpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzNdKSk7XG5cbiAgICB0aGlzLmdldFBhZGRpbmdXaWRnZXQgPSB0aGlzLl9zZXJ2aWNlLmN1cnJlbnRXaWRnZXQucGlwZShcbiAgICAgICAgbWFwKChteU9iajogQWpmV2lkZ2V0fG51bGwpID0+IHtcbiAgICAgICAgICBpZiAobXlPYmogIT0gbnVsbCAmJiBteU9iai5zdHlsZXMgIT0gbnVsbCAmJiBteU9iai5zdHlsZXNbJ3BhZGRpbmcnXSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxsUHhOdW1iZXJBcnJheSh0aGlzLnRvTnVtYmVyQXJyYXkobXlPYmouc3R5bGVzWydwYWRkaW5nJ10pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIHRoaXMuZ2V0UGFkZGluZ1dpZGdldFRvcCA9IHRoaXMuZ2V0UGFkZGluZ1dpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzBdKSk7XG4gICAgdGhpcy5nZXRQYWRkaW5nV2lkZ2V0UmlnaHQgPVxuICAgICAgICB0aGlzLmdldFBhZGRpbmdXaWRnZXQucGlwZShmaWx0ZXIobSA9PiBtICE9IG51bGwpLCBtYXAobSA9PiBtIVsxXSkpO1xuICAgIHRoaXMuZ2V0UGFkZGluZ1dpZGdldEJvdHRvbSA9XG4gICAgICAgIHRoaXMuZ2V0UGFkZGluZ1dpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzJdKSk7XG4gICAgdGhpcy5nZXRQYWRkaW5nV2lkZ2V0TGVmdCA9IHRoaXMuZ2V0UGFkZGluZ1dpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzNdKSk7XG5cbiAgICB0aGlzLmdldEJhY2tncm91bmRDb2xvcldpZGdldCA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5waXBlKFxuICAgICAgICBtYXAoKG15T2JqOiBBamZXaWRnZXR8bnVsbCkgPT4ge1xuICAgICAgICAgIGlmIChteU9iaiAhPSBudWxsICYmIG15T2JqLnN0eWxlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbXlPYmouc3R5bGVzWydiYWNrZ3JvdW5kQ29sb3InXSB8fCAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAgIHRoaXMuZ2V0Q29sb3JXaWRnZXQgPSB0aGlzLl9zZXJ2aWNlLmN1cnJlbnRXaWRnZXQucGlwZShcbiAgICAgICAgbWFwKChteU9iajogQWpmV2lkZ2V0fG51bGwpID0+IHtcbiAgICAgICAgICBpZiAobXlPYmogIT0gbnVsbCAmJiBteU9iai5zdHlsZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG15T2JqLnN0eWxlc1snY29sb3InXSB8fCAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAgIHRoaXMuX3N0eWxlc1VwZGF0ZXNTdWJzID0gdGhpcy5fdXBkYXRlV2lkZ2V0TWFyZ2luRXZ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuZ2V0TWFyZ2luV2lkZ2V0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUociA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHJbMF0uaWR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IChyWzFdIHx8IFswLCAwLCAwLCAwXSkgYXMgbnVtYmVyW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsIHx8IHYubGVuZ3RoIDwgaWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRXaWRnZXRTdHlsZXMoJ21hcmdpbicsIHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgdGhpcy5fc3R5bGVzVXBkYXRlc1N1YnMuYWRkKHRoaXMuX3VwZGF0ZVdpZGdldFBhZGRpbmdFdnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuZ2V0UGFkZGluZ1dpZGdldCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSByWzBdLmlkeDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gKHJbMV0gfHwgWzAsIDAsIDAsIDBdKSBhcyBudW1iZXJbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2Lmxlbmd0aCA8IGlkeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2W2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRXaWRnZXRTdHlsZXMoJ3BhZGRpbmcnLCB2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgIHRoaXMuX3N0eWxlc1VwZGF0ZXNTdWJzLmFkZCh0aGlzLl91cGRhdGVXaWRnZXRCb3JkZXJXaWR0aEV2dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5nZXRCb3JkZXJXaWR0aFdpZGdldCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSByWzBdLmlkeDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gKHJbMV0gfHwgWzAsIDAsIDAsIDBdKSBhcyBudW1iZXJbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2Lmxlbmd0aCA8IGlkeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2W2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRXaWRnZXRTdHlsZXMoJ2JvcmRlci13aWR0aCcsIHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgdGhpcy5fc3R5bGVzVXBkYXRlc1N1YnMuYWRkKHRoaXMuX3VwZGF0ZVdpZGdldEJvcmRlclJhZGl1c0V2dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5nZXRCb3JkZXJSYWRpdXNXaWRnZXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUociA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gclswXS5pZHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gclswXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IChyWzFdIHx8IFswLCAwLCAwLCAwXSkgYXMgbnVtYmVyW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IG51bGwgfHwgdi5sZW5ndGggPCBpZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdltpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0V2lkZ2V0U3R5bGVzKCdib3JkZXItcmFkaXVzJywgdik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRXaWRnZXQgPSBjaGFuZ2VzLndpZGdldC5jdXJyZW50VmFsdWU7XG4gICAgaWYgKHRoaXMuY3VycmVudFdpZGdldCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMud2lkZ2V0TmFtZSA9IEFqZldpZGdldFR5cGVbdGhpcy5jdXJyZW50V2lkZ2V0LndpZGdldFR5cGVdO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFdpZGdldFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2Zvcm1zU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fY29sb3JTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9oZWFkZXJTdHlsZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2NvbnRlbnRTdHlsZXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9mb290ZXJTdHlsZXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9vcmlnaW5TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zdHlsZXNVcGRhdGVzU3Vicy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
|