@universis/ngx-tables 6.0.0 → 15.0.2
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/esm2020/lib/actions/table.actions.mjs +27 -0
- package/esm2020/lib/advanced-aggregator.mjs +2 -0
- package/esm2020/lib/components/add-items/add-items.component.mjs +138 -0
- package/esm2020/lib/components/advanced-aggregator/advanced-aggregator.component.mjs +126 -0
- package/esm2020/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.mjs +53 -0
- package/esm2020/lib/components/advanced-list/advanced-list.component.mjs +184 -0
- package/esm2020/lib/components/advanced-row-action/advanced-row-action.component.mjs +178 -0
- package/esm2020/lib/components/advanced-search-form/advanced-search-form.component.mjs +154 -0
- package/esm2020/lib/components/advanced-select/advanced-select.component.mjs +42 -0
- package/esm2020/lib/components/advanced-select/advanced-select.service.mjs +38 -0
- package/esm2020/lib/components/advanced-table/advanced-filter-value-provider.service.mjs +31 -0
- package/esm2020/lib/components/advanced-table/advanced-table-resolvers.mjs +40 -0
- package/esm2020/lib/components/advanced-table/advanced-table-search-base.mjs +31 -0
- package/esm2020/lib/components/advanced-table/advanced-table-search.component.mjs +525 -0
- package/esm2020/lib/components/advanced-table/advanced-table-settings.component.mjs +108 -0
- package/esm2020/lib/components/advanced-table/advanced-table.component.mjs +1599 -0
- package/esm2020/lib/components/advanced-table/advanced-table.formatters.interface.mjs +17 -0
- package/esm2020/lib/components/advanced-table/advanced-table.formatters.mjs +429 -0
- package/esm2020/lib/components/advanced-table/advanced-table.interfaces.mjs +2 -0
- package/esm2020/lib/components/advanced-table-modal/advanced-table-modal-base.component.mjs +420 -0
- package/esm2020/lib/components/column-selector/column-selector.component.mjs +205 -0
- package/esm2020/lib/components/column-selector/column-selector.service.mjs +45 -0
- package/esm2020/lib/components/table-simple-header/table-simple-header.component.mjs +52 -0
- package/esm2020/lib/directives/advance-search-state.directive.mjs +111 -0
- package/esm2020/lib/directives/advance-table-state.directive.mjs +63 -0
- package/esm2020/lib/directives/advanced-search-router-state.directive.mjs +64 -0
- package/esm2020/lib/directives/advanced-table-editor.directive.mjs +154 -0
- package/esm2020/lib/directives/btnexp.directive.mjs +222 -0
- package/esm2020/lib/i18n/tables.el.mjs +129 -0
- package/esm2020/lib/i18n/tables.en.mjs +128 -0
- package/esm2020/lib/pipes/advanced-aggregator.pipe.mjs +38 -0
- package/esm2020/lib/pipes/advansed-aggregator-list-title-parse.pipe.mjs +45 -0
- package/esm2020/lib/reducers/index.mjs +37 -0
- package/esm2020/lib/services/advanced-aggregator/advanced-aggregator.service.mjs +119 -0
- package/esm2020/lib/tables.activated-table.service.mjs +46 -0
- package/esm2020/lib/tables.module.mjs +218 -0
- package/esm2020/public_api.mjs +37 -0
- package/esm2020/universis-ngx-tables.mjs +5 -0
- package/fesm2015/universis-ngx-tables.mjs +5642 -0
- package/fesm2015/universis-ngx-tables.mjs.map +1 -0
- package/fesm2020/universis-ngx-tables.mjs +5609 -0
- package/fesm2020/universis-ngx-tables.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/actions/table.actions.d.ts +4 -4
- package/lib/components/add-items/add-items.component.d.ts +5 -5
- package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +10 -4
- package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +4 -1
- package/lib/components/advanced-list/advanced-list.component.d.ts +6 -3
- package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +9 -7
- package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +4 -1
- package/lib/components/advanced-select/advanced-select.component.d.ts +3 -1
- package/lib/components/advanced-select/advanced-select.service.d.ts +3 -0
- package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +3 -0
- package/lib/components/advanced-table/advanced-table-resolvers.d.ts +5 -0
- package/lib/components/advanced-table/advanced-table-search-base.d.ts +6 -2
- package/lib/components/advanced-table/advanced-table-search.component.d.ts +6 -2
- package/lib/components/advanced-table/advanced-table-settings.component.d.ts +3 -0
- package/lib/components/advanced-table/advanced-table.component.d.ts +21 -12
- package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +4 -1
- package/lib/components/column-selector/column-selector.component.d.ts +5 -2
- package/lib/components/column-selector/column-selector.service.d.ts +3 -0
- package/lib/components/table-simple-header/table-simple-header.component.d.ts +5 -0
- package/lib/directives/advance-search-state.directive.d.ts +3 -0
- package/lib/directives/advance-table-state.directive.d.ts +3 -0
- package/lib/directives/advanced-search-router-state.directive.d.ts +3 -0
- package/lib/directives/advanced-table-editor.directive.d.ts +4 -1
- package/lib/directives/btnexp.directive.d.ts +3 -0
- package/lib/i18n/tables.el.d.ts +107 -107
- package/lib/i18n/tables.en.d.ts +106 -106
- package/lib/pipes/advanced-aggregator.pipe.d.ts +4 -1
- package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +4 -1
- package/lib/reducers/index.d.ts +5 -3
- package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +3 -0
- package/lib/tables.activated-table.service.d.ts +5 -1
- package/lib/tables.module.d.ts +36 -0
- package/package.json +44 -42
- package/public_api.d.ts +3 -0
- package/bundles/universis-ngx-tables.umd.js +0 -8161
- package/bundles/universis-ngx-tables.umd.js.map +0 -1
- package/bundles/universis-ngx-tables.umd.min.js +0 -2
- package/bundles/universis-ngx-tables.umd.min.js.map +0 -1
- package/esm2015/lib/actions/table.actions.js +0 -69
- package/esm2015/lib/advanced-aggregator.js +0 -6
- package/esm2015/lib/components/add-items/add-items.component.js +0 -209
- package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -190
- package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -80
- package/esm2015/lib/components/advanced-list/advanced-list.component.js +0 -245
- package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +0 -265
- package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +0 -213
- package/esm2015/lib/components/advanced-select/advanced-select.component.js +0 -97
- package/esm2015/lib/components/advanced-select/advanced-select.service.js +0 -57
- package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -58
- package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +0 -72
- package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +0 -49
- package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +0 -718
- package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +0 -191
- package/esm2015/lib/components/advanced-table/advanced-table.component.js +0 -1973
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -53
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +0 -642
- package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +0 -6
- package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -553
- package/esm2015/lib/components/column-selector/column-selector.component.js +0 -296
- package/esm2015/lib/components/column-selector/column-selector.service.js +0 -64
- package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +0 -76
- package/esm2015/lib/directives/advance-search-state.directive.js +0 -147
- package/esm2015/lib/directives/advance-table-state.directive.js +0 -86
- package/esm2015/lib/directives/advanced-search-router-state.directive.js +0 -90
- package/esm2015/lib/directives/advanced-table-editor.directive.js +0 -186
- package/esm2015/lib/directives/btnexp.directive.js +0 -272
- package/esm2015/lib/i18n/tables.el.js +0 -133
- package/esm2015/lib/i18n/tables.en.js +0 -132
- package/esm2015/lib/pipes/advanced-aggregator.pipe.js +0 -39
- package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -58
- package/esm2015/lib/reducers/index.js +0 -63
- package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -142
- package/esm2015/lib/tables.activated-table.service.js +0 -85
- package/esm2015/lib/tables.module.js +0 -163
- package/esm2015/public_api.js +0 -37
- package/esm2015/universis-ngx-tables.js +0 -13
- package/esm5/lib/actions/table.actions.js +0 -64
- package/esm5/lib/advanced-aggregator.js +0 -6
- package/esm5/lib/components/add-items/add-items.component.js +0 -243
- package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -265
- package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -99
- package/esm5/lib/components/advanced-list/advanced-list.component.js +0 -273
- package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +0 -288
- package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +0 -232
- package/esm5/lib/components/advanced-select/advanced-select.component.js +0 -103
- package/esm5/lib/components/advanced-select/advanced-select.service.js +0 -61
- package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -82
- package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +0 -80
- package/esm5/lib/components/advanced-table/advanced-table-search-base.js +0 -59
- package/esm5/lib/components/advanced-table/advanced-table-search.component.js +0 -828
- package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +0 -212
- package/esm5/lib/components/advanced-table/advanced-table.component.js +0 -2145
- package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -53
- package/esm5/lib/components/advanced-table/advanced-table.formatters.js +0 -815
- package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +0 -6
- package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -555
- package/esm5/lib/components/column-selector/column-selector.component.js +0 -389
- package/esm5/lib/components/column-selector/column-selector.service.js +0 -68
- package/esm5/lib/components/table-simple-header/table-simple-header.component.js +0 -92
- package/esm5/lib/directives/advance-search-state.directive.js +0 -169
- package/esm5/lib/directives/advance-table-state.directive.js +0 -87
- package/esm5/lib/directives/advanced-search-router-state.directive.js +0 -98
- package/esm5/lib/directives/advanced-table-editor.directive.js +0 -244
- package/esm5/lib/directives/btnexp.directive.js +0 -389
- package/esm5/lib/i18n/tables.el.js +0 -133
- package/esm5/lib/i18n/tables.en.js +0 -132
- package/esm5/lib/pipes/advanced-aggregator.pipe.js +0 -65
- package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -75
- package/esm5/lib/reducers/index.js +0 -65
- package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -196
- package/esm5/lib/tables.activated-table.service.js +0 -88
- package/esm5/lib/tables.module.js +0 -168
- package/esm5/public_api.js +0 -37
- package/esm5/universis-ngx-tables.js +0 -13
- package/fesm2015/universis-ngx-tables.js +0 -6745
- package/fesm2015/universis-ngx-tables.js.map +0 -1
- package/fesm5/universis-ngx-tables.js +0 -7837
- package/fesm5/universis-ngx-tables.js.map +0 -1
- package/universis-ngx-tables.d.ts +0 -8
- package/universis-ngx-tables.metadata.json +0 -1
|
@@ -1,2145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
|
|
4
|
-
*/
|
|
5
|
-
import * as tslib_1 from "tslib";
|
|
6
|
-
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, InjectionToken, Injector, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
7
|
-
import { AngularDataContext } from '@themost/angular';
|
|
8
|
-
import { TranslatePipe, TranslateService } from '@ngx-translate/core';
|
|
9
|
-
import { ActivatedRoute } from '@angular/router';
|
|
10
|
-
import { AdvancedColumnFormatter } from './advanced-table.formatters';
|
|
11
|
-
import { ClientDataQueryable } from '@themost/client';
|
|
12
|
-
import { AdvancedFilterValueProvider } from './advanced-filter-value-provider.service';
|
|
13
|
-
import { BehaviorSubject } from 'rxjs';
|
|
14
|
-
import { TemplatePipe, LoadingService, ConfigurationService, ModalService, DIALOG_BUTTONS, ErrorService, ExportSpreadsheetService } from '@universis/common';
|
|
15
|
-
import * as jQuery_ from 'jquery';
|
|
16
|
-
import 'datatables.net';
|
|
17
|
-
import { template } from 'lodash';
|
|
18
|
-
import 'datatables.net-scroller';
|
|
19
|
-
import 'datatables.net-colreorder';
|
|
20
|
-
import 'datatables.net-buttons';
|
|
21
|
-
import { HttpClient } from '@angular/common/http';
|
|
22
|
-
import { ColumnSelectorService } from '../column-selector/column-selector.service';
|
|
23
|
-
import { MAX_EXPORT_ITEMS } from '../../directives/btnexp.directive';
|
|
24
|
-
/** @type {?} */
|
|
25
|
-
var jQuery = jQuery_;
|
|
26
|
-
/**
|
|
27
|
-
* @record
|
|
28
|
-
*/
|
|
29
|
-
export function AdvancedTableDataResult() { }
|
|
30
|
-
/** @type {?} */
|
|
31
|
-
AdvancedTableDataResult.prototype.recordsTotal;
|
|
32
|
-
/** @type {?} */
|
|
33
|
-
AdvancedTableDataResult.prototype.recordsFiltered;
|
|
34
|
-
/** @type {?} */
|
|
35
|
-
AdvancedTableDataResult.prototype.data;
|
|
36
|
-
/** @type {?} */
|
|
37
|
-
var DataTablesApi = jQuery.fn.dataTable.Api;
|
|
38
|
-
DataTablesApi.register('processing()', function (show) {
|
|
39
|
-
return this.iterator('table', function (ctx) {
|
|
40
|
-
ctx.oApi._fnProcessingDisplay(ctx, show);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
var ɵ0 = [];
|
|
44
|
-
/** @type {?} */
|
|
45
|
-
var EMPTY_DATASET = {
|
|
46
|
-
recordsTotal: 0,
|
|
47
|
-
recordsFiltered: 0,
|
|
48
|
-
data: ɵ0,
|
|
49
|
-
};
|
|
50
|
-
var TableTranslationChangeDetector = /** @class */ (function (_super) {
|
|
51
|
-
tslib_1.__extends(TableTranslationChangeDetector, _super);
|
|
52
|
-
function TableTranslationChangeDetector() {
|
|
53
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* @return {?}
|
|
57
|
-
*/
|
|
58
|
-
TableTranslationChangeDetector.prototype.checkNoChanges = /**
|
|
59
|
-
* @return {?}
|
|
60
|
-
*/
|
|
61
|
-
function () {
|
|
62
|
-
};
|
|
63
|
-
/**
|
|
64
|
-
* @return {?}
|
|
65
|
-
*/
|
|
66
|
-
TableTranslationChangeDetector.prototype.detach = /**
|
|
67
|
-
* @return {?}
|
|
68
|
-
*/
|
|
69
|
-
function () {
|
|
70
|
-
};
|
|
71
|
-
/**
|
|
72
|
-
* @return {?}
|
|
73
|
-
*/
|
|
74
|
-
TableTranslationChangeDetector.prototype.detectChanges = /**
|
|
75
|
-
* @return {?}
|
|
76
|
-
*/
|
|
77
|
-
function () {
|
|
78
|
-
};
|
|
79
|
-
/**
|
|
80
|
-
* @return {?}
|
|
81
|
-
*/
|
|
82
|
-
TableTranslationChangeDetector.prototype.markForCheck = /**
|
|
83
|
-
* @return {?}
|
|
84
|
-
*/
|
|
85
|
-
function () {
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* @return {?}
|
|
89
|
-
*/
|
|
90
|
-
TableTranslationChangeDetector.prototype.reattach = /**
|
|
91
|
-
* @return {?}
|
|
92
|
-
*/
|
|
93
|
-
function () {
|
|
94
|
-
};
|
|
95
|
-
return TableTranslationChangeDetector;
|
|
96
|
-
}(ChangeDetectorRef));
|
|
97
|
-
/** @type {?} */
|
|
98
|
-
export var COLUMN_FORMATTERS = new InjectionToken('column.formatters');
|
|
99
|
-
var ExportLimitExceededError = /** @class */ (function (_super) {
|
|
100
|
-
tslib_1.__extends(ExportLimitExceededError, _super);
|
|
101
|
-
function ExportLimitExceededError(message) {
|
|
102
|
-
var _this = _super.call(this, message) || this;
|
|
103
|
-
_this.name = 'ExportLimitExceededError';
|
|
104
|
-
return _this;
|
|
105
|
-
}
|
|
106
|
-
return ExportLimitExceededError;
|
|
107
|
-
}(RangeError));
|
|
108
|
-
export { ExportLimitExceededError };
|
|
109
|
-
var ColumnFormatter = /** @class */ (function (_super) {
|
|
110
|
-
tslib_1.__extends(ColumnFormatter, _super);
|
|
111
|
-
function ColumnFormatter(injector) {
|
|
112
|
-
var _this = _super.call(this) || this;
|
|
113
|
-
_this.injector = injector;
|
|
114
|
-
_this.title = '';
|
|
115
|
-
return _this;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* @param {?} data
|
|
119
|
-
* @param {?} type
|
|
120
|
-
* @param {?} row
|
|
121
|
-
* @param {?} meta
|
|
122
|
-
* @return {?}
|
|
123
|
-
*/
|
|
124
|
-
ColumnFormatter.prototype.render = /**
|
|
125
|
-
* @param {?} data
|
|
126
|
-
* @param {?} type
|
|
127
|
-
* @param {?} row
|
|
128
|
-
* @param {?} meta
|
|
129
|
-
* @return {?}
|
|
130
|
-
*/
|
|
131
|
-
function (data, type, row, meta) {
|
|
132
|
-
//
|
|
133
|
-
};
|
|
134
|
-
return ColumnFormatter;
|
|
135
|
-
}(AdvancedColumnFormatter));
|
|
136
|
-
if (false) {
|
|
137
|
-
/** @type {?} */
|
|
138
|
-
ColumnFormatter.prototype.class;
|
|
139
|
-
/** @type {?} */
|
|
140
|
-
ColumnFormatter.prototype.className;
|
|
141
|
-
/** @type {?} */
|
|
142
|
-
ColumnFormatter.prototype.defaultContent;
|
|
143
|
-
/** @type {?} */
|
|
144
|
-
ColumnFormatter.prototype.formatString;
|
|
145
|
-
/** @type {?} */
|
|
146
|
-
ColumnFormatter.prototype.formatter;
|
|
147
|
-
/** @type {?} */
|
|
148
|
-
ColumnFormatter.prototype.hidden;
|
|
149
|
-
/** @type {?} */
|
|
150
|
-
ColumnFormatter.prototype.name;
|
|
151
|
-
/** @type {?} */
|
|
152
|
-
ColumnFormatter.prototype.order;
|
|
153
|
-
/** @type {?} */
|
|
154
|
-
ColumnFormatter.prototype.property;
|
|
155
|
-
/** @type {?} */
|
|
156
|
-
ColumnFormatter.prototype.sortable;
|
|
157
|
-
/** @type {?} */
|
|
158
|
-
ColumnFormatter.prototype.title;
|
|
159
|
-
/** @type {?} */
|
|
160
|
-
ColumnFormatter.prototype.injector;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* @template T
|
|
164
|
-
* @param {?} input
|
|
165
|
-
* @return {?}
|
|
166
|
-
*/
|
|
167
|
-
function forceCast(input) {
|
|
168
|
-
return input;
|
|
169
|
-
}
|
|
170
|
-
var AdvancedTableConfiguration = /** @class */ (function () {
|
|
171
|
-
function AdvancedTableConfiguration() {
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* @param {?} input
|
|
175
|
-
* @param {?=} clone
|
|
176
|
-
* @return {?}
|
|
177
|
-
*/
|
|
178
|
-
AdvancedTableConfiguration.cast = /**
|
|
179
|
-
* @param {?} input
|
|
180
|
-
* @param {?=} clone
|
|
181
|
-
* @return {?}
|
|
182
|
-
*/
|
|
183
|
-
function (input, clone) {
|
|
184
|
-
if (clone) {
|
|
185
|
-
return forceCast(JSON.parse(JSON.stringify(input)));
|
|
186
|
-
}
|
|
187
|
-
return forceCast(input);
|
|
188
|
-
};
|
|
189
|
-
return AdvancedTableConfiguration;
|
|
190
|
-
}());
|
|
191
|
-
export { AdvancedTableConfiguration };
|
|
192
|
-
/**
|
|
193
|
-
* @return {?}
|
|
194
|
-
*/
|
|
195
|
-
function getRandomIdentifier() {
|
|
196
|
-
return (Number(String(Math.random()).slice(2))).toString(36);
|
|
197
|
-
}
|
|
198
|
-
var AdvancedTableComponent = /** @class */ (function () {
|
|
199
|
-
function AdvancedTableComponent(_context, _columnFormatters, _activatedRoute, _translateService, _injector, _advancedFilterValueProvider, _element, _template, _loading, _http, _columnSelector, _configuration, _exportSpreadsheet, _modalService, _errorService) {
|
|
200
|
-
var _this = this;
|
|
201
|
-
this._context = _context;
|
|
202
|
-
this._columnFormatters = _columnFormatters;
|
|
203
|
-
this._activatedRoute = _activatedRoute;
|
|
204
|
-
this._translateService = _translateService;
|
|
205
|
-
this._injector = _injector;
|
|
206
|
-
this._advancedFilterValueProvider = _advancedFilterValueProvider;
|
|
207
|
-
this._element = _element;
|
|
208
|
-
this._template = _template;
|
|
209
|
-
this._loading = _loading;
|
|
210
|
-
this._http = _http;
|
|
211
|
-
this._columnSelector = _columnSelector;
|
|
212
|
-
this._configuration = _configuration;
|
|
213
|
-
this._exportSpreadsheet = _exportSpreadsheet;
|
|
214
|
-
this._modalService = _modalService;
|
|
215
|
-
this._errorService = _errorService;
|
|
216
|
-
this._firstLoad = true;
|
|
217
|
-
this._showFooter = false;
|
|
218
|
-
this._showHeader = true;
|
|
219
|
-
this._showPaging = false;
|
|
220
|
-
this._id = getRandomIdentifier();
|
|
221
|
-
this.smartSelect = false;
|
|
222
|
-
this.configChanges = new BehaviorSubject(null);
|
|
223
|
-
this.height = 800;
|
|
224
|
-
this.showActions = true;
|
|
225
|
-
this.autoLoad = true;
|
|
226
|
-
this.load = new EventEmitter();
|
|
227
|
-
this.init = new EventEmitter();
|
|
228
|
-
this.reload = new EventEmitter();
|
|
229
|
-
this.select = new EventEmitter();
|
|
230
|
-
this.draw = new EventEmitter();
|
|
231
|
-
this.page = new EventEmitter();
|
|
232
|
-
this.order = new EventEmitter();
|
|
233
|
-
this.scroll = new EventEmitter();
|
|
234
|
-
this.selectedItems = new EventEmitter();
|
|
235
|
-
this.loading = new EventEmitter();
|
|
236
|
-
this.scrollable = true;
|
|
237
|
-
this.serverSide = true;
|
|
238
|
-
this.lengthMenu = [50, 100, 200, 500];
|
|
239
|
-
this.paging = true;
|
|
240
|
-
this.pageLength = 25;
|
|
241
|
-
this.columnOrdering = false;
|
|
242
|
-
this.stateSave = false;
|
|
243
|
-
this.scrollY = 800;
|
|
244
|
-
this.scrollX = true;
|
|
245
|
-
/**
|
|
246
|
-
* Enables row selection. The defaulr value is false
|
|
247
|
-
*/
|
|
248
|
-
this.selectable = false;
|
|
249
|
-
/**
|
|
250
|
-
* Enables or disable multiple selection. The default values is true.
|
|
251
|
-
*/
|
|
252
|
-
this.multipleSelect = true;
|
|
253
|
-
/**
|
|
254
|
-
* Enables custom selection and hides select column. The default value is false
|
|
255
|
-
*/
|
|
256
|
-
this.customSelect = false;
|
|
257
|
-
this.selected = [];
|
|
258
|
-
this.unselected = [];
|
|
259
|
-
this._lastQueryTotalItems = 0;
|
|
260
|
-
// initialize translate pipe
|
|
261
|
-
this.translator = new TranslatePipe(this._translateService, new TableTranslationChangeDetector());
|
|
262
|
-
jQuery.fn.dataTable.ext.classes.sPageButton = 'btn';
|
|
263
|
-
jQuery.fn.dataTable.ext.classes.sPageButtonActive = 'btn btn-light';
|
|
264
|
-
this.reloadSubscription = this.reload.subscribe(function (data) {
|
|
265
|
-
_this.fetch();
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
Object.defineProperty(AdvancedTableComponent.prototype, "config", {
|
|
269
|
-
get: /**
|
|
270
|
-
* @return {?}
|
|
271
|
-
*/
|
|
272
|
-
function () {
|
|
273
|
-
return /** @type {?} */ (this._config);
|
|
274
|
-
},
|
|
275
|
-
/**
|
|
276
|
-
* Gets or sets table configuration
|
|
277
|
-
*/
|
|
278
|
-
set: /**
|
|
279
|
-
* Gets or sets table configuration
|
|
280
|
-
* @param {?} value
|
|
281
|
-
* @return {?}
|
|
282
|
-
*/
|
|
283
|
-
function (value) {
|
|
284
|
-
this._config = value;
|
|
285
|
-
// raise subscription
|
|
286
|
-
this.configChanges.next(this._config);
|
|
287
|
-
},
|
|
288
|
-
enumerable: true,
|
|
289
|
-
configurable: true
|
|
290
|
-
});
|
|
291
|
-
Object.defineProperty(AdvancedTableComponent.prototype, "lastQueryTotalItems", {
|
|
292
|
-
get: /**
|
|
293
|
-
* @return {?}
|
|
294
|
-
*/
|
|
295
|
-
function () {
|
|
296
|
-
return this._lastQueryTotalItems;
|
|
297
|
-
},
|
|
298
|
-
enumerable: true,
|
|
299
|
-
configurable: true
|
|
300
|
-
});
|
|
301
|
-
Object.defineProperty(AdvancedTableComponent.prototype, "showFooter", {
|
|
302
|
-
get: /**
|
|
303
|
-
* @return {?}
|
|
304
|
-
*/
|
|
305
|
-
function () {
|
|
306
|
-
return this._showFooter;
|
|
307
|
-
},
|
|
308
|
-
/**
|
|
309
|
-
* Indicates whether table footer will be visible or not
|
|
310
|
-
*/
|
|
311
|
-
set: /**
|
|
312
|
-
* Indicates whether table footer will be visible or not
|
|
313
|
-
* @param {?} value
|
|
314
|
-
* @return {?}
|
|
315
|
-
*/
|
|
316
|
-
function (value) {
|
|
317
|
-
this._showFooter = value;
|
|
318
|
-
// show or hide footer
|
|
319
|
-
if (this._element && this._element.nativeElement) {
|
|
320
|
-
/** @type {?} */
|
|
321
|
-
var element = (/** @type {?} */ (this._element.nativeElement))
|
|
322
|
-
.querySelector('.dataTables_info');
|
|
323
|
-
if (element == null) {
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
if (value) {
|
|
327
|
-
element.classList.remove('d-none');
|
|
328
|
-
}
|
|
329
|
-
else {
|
|
330
|
-
element.classList.add('d-none');
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
},
|
|
334
|
-
enumerable: true,
|
|
335
|
-
configurable: true
|
|
336
|
-
});
|
|
337
|
-
Object.defineProperty(AdvancedTableComponent.prototype, "showHeader", {
|
|
338
|
-
get: /**
|
|
339
|
-
* @return {?}
|
|
340
|
-
*/
|
|
341
|
-
function () {
|
|
342
|
-
return this._showHeader;
|
|
343
|
-
},
|
|
344
|
-
/**
|
|
345
|
-
* Indicates whether table footer will be visible or not
|
|
346
|
-
*/
|
|
347
|
-
set: /**
|
|
348
|
-
* Indicates whether table footer will be visible or not
|
|
349
|
-
* @param {?} value
|
|
350
|
-
* @return {?}
|
|
351
|
-
*/
|
|
352
|
-
function (value) {
|
|
353
|
-
this._showHeader = value;
|
|
354
|
-
// show or hide footer
|
|
355
|
-
if (this._element && this._element.nativeElement) {
|
|
356
|
-
/** @type {?} */
|
|
357
|
-
var element = (/** @type {?} */ (this._element.nativeElement))
|
|
358
|
-
.querySelector('.dataTable>thead');
|
|
359
|
-
if (element == null) {
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
/** @type {?} */
|
|
363
|
-
var dataTable = (/** @type {?} */ (this._element.nativeElement)).querySelector('.dataTable');
|
|
364
|
-
if (dataTable == null) {
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
if (value) {
|
|
368
|
-
element.classList.remove('d-none');
|
|
369
|
-
// add top margin
|
|
370
|
-
dataTable.classList.remove('mt-2');
|
|
371
|
-
}
|
|
372
|
-
else {
|
|
373
|
-
element.classList.add('d-none');
|
|
374
|
-
// remove top margin
|
|
375
|
-
dataTable.classList.add('mt-2');
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
},
|
|
379
|
-
enumerable: true,
|
|
380
|
-
configurable: true
|
|
381
|
-
});
|
|
382
|
-
Object.defineProperty(AdvancedTableComponent.prototype, "showPaging", {
|
|
383
|
-
get: /**
|
|
384
|
-
* @return {?}
|
|
385
|
-
*/
|
|
386
|
-
function () {
|
|
387
|
-
return this._showPaging;
|
|
388
|
-
},
|
|
389
|
-
/**
|
|
390
|
-
* Indicates whether paging information will be visible or not
|
|
391
|
-
*/
|
|
392
|
-
set: /**
|
|
393
|
-
* Indicates whether paging information will be visible or not
|
|
394
|
-
* @param {?} value
|
|
395
|
-
* @return {?}
|
|
396
|
-
*/
|
|
397
|
-
function (value) {
|
|
398
|
-
this._showPaging = value;
|
|
399
|
-
// show or hide footer
|
|
400
|
-
if (this._element && this._element.nativeElement) {
|
|
401
|
-
/** @type {?} */
|
|
402
|
-
var element = (/** @type {?} */ (this._element.nativeElement))
|
|
403
|
-
.querySelector('.dataTables_paginate');
|
|
404
|
-
if (element == null) {
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
|
-
if (value) {
|
|
408
|
-
jQuery(element).show();
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
jQuery(element).hide();
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
},
|
|
415
|
-
enumerable: true,
|
|
416
|
-
configurable: true
|
|
417
|
-
});
|
|
418
|
-
Object.defineProperty(AdvancedTableComponent.prototype, "query", {
|
|
419
|
-
get: /**
|
|
420
|
-
* @return {?}
|
|
421
|
-
*/
|
|
422
|
-
function () {
|
|
423
|
-
return /** @type {?} */ (this._query);
|
|
424
|
-
},
|
|
425
|
-
/**
|
|
426
|
-
* Gets or sets an active query for this table
|
|
427
|
-
*/
|
|
428
|
-
set: /**
|
|
429
|
-
* Gets or sets an active query for this table
|
|
430
|
-
* @param {?} value
|
|
431
|
-
* @return {?}
|
|
432
|
-
*/
|
|
433
|
-
function (value) {
|
|
434
|
-
this._query = value;
|
|
435
|
-
},
|
|
436
|
-
enumerable: true,
|
|
437
|
-
configurable: true
|
|
438
|
-
});
|
|
439
|
-
/**
|
|
440
|
-
* @param {?} searchText
|
|
441
|
-
* @return {?}
|
|
442
|
-
*/
|
|
443
|
-
AdvancedTableComponent.prototype.search = /**
|
|
444
|
-
* @param {?} searchText
|
|
445
|
-
* @return {?}
|
|
446
|
-
*/
|
|
447
|
-
function (searchText) {
|
|
448
|
-
var _this = this;
|
|
449
|
-
this.query = this.query || this._context.model(this.config.model).asQueryable();
|
|
450
|
-
if (this.serverSide) {
|
|
451
|
-
if (searchText && this.config.searchExpression) {
|
|
452
|
-
// validate search text in double quotes
|
|
453
|
-
if (/^"(.*?)"$/.test(searchText)) {
|
|
454
|
-
this.query.setParam('$filter', this._template.transform(this.config.searchExpression, {
|
|
455
|
-
text: searchText.replace(/^"|"$/g, ''),
|
|
456
|
-
}));
|
|
457
|
-
}
|
|
458
|
-
else {
|
|
459
|
-
/** @type {?} */
|
|
460
|
-
var words = searchText.split(' ');
|
|
461
|
-
/** @type {?} */
|
|
462
|
-
var filter = words.map(function (word) {
|
|
463
|
-
return _this._template.transform(/** @type {?} */ ((_this.config && _this.config.searchExpression)), {
|
|
464
|
-
text: word,
|
|
465
|
-
});
|
|
466
|
-
}).join(' and ');
|
|
467
|
-
// set filter
|
|
468
|
-
this.query.setParam('$filter', filter);
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
else {
|
|
472
|
-
// clear filter
|
|
473
|
-
this.query.setParam('$filter', null);
|
|
474
|
-
}
|
|
475
|
-
this._firstLoad = false;
|
|
476
|
-
this.dataTable.draw();
|
|
477
|
-
}
|
|
478
|
-
else {
|
|
479
|
-
// ensure empty table layout
|
|
480
|
-
this.resetEmptyTable();
|
|
481
|
-
// search locally
|
|
482
|
-
this.dataTable.search(searchText.trim()).draw();
|
|
483
|
-
/** @type {?} */
|
|
484
|
-
var indexes = Array.from(this.dataTable.context[0].aiDisplay);
|
|
485
|
-
/** @type {?} */
|
|
486
|
-
var recordsFiltered = indexes.length;
|
|
487
|
-
/** @type {?} */
|
|
488
|
-
var recordsTotal = indexes.length;
|
|
489
|
-
/** @type {?} */
|
|
490
|
-
var rows_1 = Array.from(this.dataTable.rows().data());
|
|
491
|
-
/** @type {?} */
|
|
492
|
-
var data = indexes.map(function (index) { return rows_1[/** @type {?} */ (index)]; });
|
|
493
|
-
// emit results to load output
|
|
494
|
-
this.load.emit({
|
|
495
|
-
data: data,
|
|
496
|
-
recordsFiltered: recordsFiltered,
|
|
497
|
-
recordsTotal: recordsTotal
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
};
|
|
501
|
-
/**
|
|
502
|
-
* @param {?=} clearSelected
|
|
503
|
-
* @return {?}
|
|
504
|
-
*/
|
|
505
|
-
AdvancedTableComponent.prototype.fetch = /**
|
|
506
|
-
* @param {?=} clearSelected
|
|
507
|
-
* @return {?}
|
|
508
|
-
*/
|
|
509
|
-
function (clearSelected) {
|
|
510
|
-
// if data table is null
|
|
511
|
-
if (this.dataTable == null) {
|
|
512
|
-
// initialize data table
|
|
513
|
-
return this.ngOnInit();
|
|
514
|
-
}
|
|
515
|
-
// clear selection if parameter is not declared or it's true
|
|
516
|
-
if (clearSelected == null || clearSelected === true) {
|
|
517
|
-
// set smart select to false
|
|
518
|
-
this.smartSelect = false;
|
|
519
|
-
// clear selected items
|
|
520
|
-
if (this.selected.length) {
|
|
521
|
-
this.selected.splice(0, this.selected.length);
|
|
522
|
-
}
|
|
523
|
-
// clear unselected items
|
|
524
|
-
if (this.unselected.length) {
|
|
525
|
-
this.unselected.splice(0, this.unselected.length);
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
// otherwise load data only
|
|
529
|
-
this.dataTable.draw();
|
|
530
|
-
};
|
|
531
|
-
/**
|
|
532
|
-
* @return {?}
|
|
533
|
-
*/
|
|
534
|
-
AdvancedTableComponent.prototype.destroy = /**
|
|
535
|
-
* @return {?}
|
|
536
|
-
*/
|
|
537
|
-
function () {
|
|
538
|
-
if (this.dataTable) {
|
|
539
|
-
this.dataTable.destroy();
|
|
540
|
-
this._firstLoad = true;
|
|
541
|
-
if (this.table) {
|
|
542
|
-
jQuery(this.table.nativeElement).empty();
|
|
543
|
-
}
|
|
544
|
-
this.dataTable = null;
|
|
545
|
-
// clear selected items
|
|
546
|
-
if (this.selected.length) {
|
|
547
|
-
this.selected.splice(0, this.selected.length);
|
|
548
|
-
}
|
|
549
|
-
// clear unselected items
|
|
550
|
-
if (this.unselected.length) {
|
|
551
|
-
this.unselected.splice(0, this.unselected.length);
|
|
552
|
-
}
|
|
553
|
-
// set smart select to false
|
|
554
|
-
this.smartSelect = false;
|
|
555
|
-
}
|
|
556
|
-
};
|
|
557
|
-
/**
|
|
558
|
-
* Selects the specified data row
|
|
559
|
-
* @param {?} row
|
|
560
|
-
* @param {?=} silent
|
|
561
|
-
* @return {?}
|
|
562
|
-
*/
|
|
563
|
-
AdvancedTableComponent.prototype.selectRow = /**
|
|
564
|
-
* Selects the specified data row
|
|
565
|
-
* @param {?} row
|
|
566
|
-
* @param {?=} silent
|
|
567
|
-
* @return {?}
|
|
568
|
-
*/
|
|
569
|
-
function (row, silent) {
|
|
570
|
-
if (row) {
|
|
571
|
-
/** @type {?} */
|
|
572
|
-
var rowNode_1 = row.node();
|
|
573
|
-
// if multiple select is false
|
|
574
|
-
if (this.multipleSelect === false) {
|
|
575
|
-
if (this.customSelect === false) {
|
|
576
|
-
// enumerate row
|
|
577
|
-
this.dataTable.rows().nodes().each(function (node) {
|
|
578
|
-
if (node !== rowNode_1) {
|
|
579
|
-
jQuery(node).find(':checkbox').prop('checked', false);
|
|
580
|
-
}
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
else {
|
|
584
|
-
this.dataTable.rows('.selected').nodes().each(function (node) {
|
|
585
|
-
if (node !== rowNode_1) {
|
|
586
|
-
jQuery(node).removeClass('selected');
|
|
587
|
-
}
|
|
588
|
-
});
|
|
589
|
-
}
|
|
590
|
-
// clear selected
|
|
591
|
-
this.selected.splice(0, this.selected.length);
|
|
592
|
-
}
|
|
593
|
-
// if custom select mode is off
|
|
594
|
-
if (this.customSelect === false) {
|
|
595
|
-
jQuery(rowNode_1).find(':checkbox').prop('checked', true);
|
|
596
|
-
}
|
|
597
|
-
else {
|
|
598
|
-
// otherwise add class
|
|
599
|
-
jQuery(row.node()).addClass('selected');
|
|
600
|
-
}
|
|
601
|
-
/** @type {?} */
|
|
602
|
-
var key_1 = this.config.columns[0].property || this.config.columns[0].name || '';
|
|
603
|
-
/** @type {?} */
|
|
604
|
-
var data_1 = row.data();
|
|
605
|
-
/** @type {?} */
|
|
606
|
-
var findIndex = this.selected.findIndex(function (x) {
|
|
607
|
-
return x[key_1] === data_1[key_1];
|
|
608
|
-
});
|
|
609
|
-
if (findIndex >= 0) {
|
|
610
|
-
// remove previously selected row
|
|
611
|
-
this.selected.splice(findIndex, 1);
|
|
612
|
-
}
|
|
613
|
-
this.selected.push(data_1);
|
|
614
|
-
// validate unselected data
|
|
615
|
-
findIndex = this.unselected.findIndex(function (x) {
|
|
616
|
-
return x[key_1] === data_1[key_1];
|
|
617
|
-
});
|
|
618
|
-
if (findIndex >= 0) {
|
|
619
|
-
// remove previously selected row
|
|
620
|
-
this.unselected.splice(findIndex, 1);
|
|
621
|
-
}
|
|
622
|
-
if (silent) {
|
|
623
|
-
return;
|
|
624
|
-
}
|
|
625
|
-
this.selectedItems.emit(this.selected);
|
|
626
|
-
}
|
|
627
|
-
};
|
|
628
|
-
/**
|
|
629
|
-
* Unselects the specified data row if it's selected
|
|
630
|
-
* @param {?} row
|
|
631
|
-
* @param {?=} silent
|
|
632
|
-
* @return {?}
|
|
633
|
-
*/
|
|
634
|
-
AdvancedTableComponent.prototype.unSelectRow = /**
|
|
635
|
-
* Unselects the specified data row if it's selected
|
|
636
|
-
* @param {?} row
|
|
637
|
-
* @param {?=} silent
|
|
638
|
-
* @return {?}
|
|
639
|
-
*/
|
|
640
|
-
function (row, silent) {
|
|
641
|
-
if (row) {
|
|
642
|
-
// if custom select mode is off
|
|
643
|
-
if (this.customSelect === false) {
|
|
644
|
-
jQuery(row.node()).find(':checkbox').prop('checked', false);
|
|
645
|
-
}
|
|
646
|
-
else {
|
|
647
|
-
// otherwise add class
|
|
648
|
-
jQuery(row.node()).removeClass('selected');
|
|
649
|
-
}
|
|
650
|
-
/** @type {?} */
|
|
651
|
-
var key_2 = this.config.columns[0].property || this.config.columns[0].name || '';
|
|
652
|
-
/** @type {?} */
|
|
653
|
-
var data = row.data();
|
|
654
|
-
/** @type {?} */
|
|
655
|
-
var id_1 = data[key_2];
|
|
656
|
-
/** @type {?} */
|
|
657
|
-
var findIndex = this.selected.findIndex(function (x) {
|
|
658
|
-
return x[key_2] === id_1;
|
|
659
|
-
});
|
|
660
|
-
if (findIndex >= 0) {
|
|
661
|
-
this.selected.splice(findIndex, 1);
|
|
662
|
-
if (this.smartSelect) {
|
|
663
|
-
// add this row to unselected rows
|
|
664
|
-
findIndex = this.unselected.findIndex(function (x) {
|
|
665
|
-
return x[key_2] === id_1;
|
|
666
|
-
});
|
|
667
|
-
if (findIndex < 0) {
|
|
668
|
-
this.unselected.push(data);
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
if (silent) {
|
|
672
|
-
return;
|
|
673
|
-
}
|
|
674
|
-
this.selectedItems.emit(this.selected);
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
};
|
|
678
|
-
/**
|
|
679
|
-
* @return {?}
|
|
680
|
-
*/
|
|
681
|
-
AdvancedTableComponent.prototype.selectAny = /**
|
|
682
|
-
* @return {?}
|
|
683
|
-
*/
|
|
684
|
-
function () {
|
|
685
|
-
var _this = this;
|
|
686
|
-
if (this.dataTable && this.selectable) {
|
|
687
|
-
// set smart select flag
|
|
688
|
-
this.smartSelect = true;
|
|
689
|
-
// select any row
|
|
690
|
-
this.dataTable.rows().every(function (index) {
|
|
691
|
-
/** @type {?} */
|
|
692
|
-
var row = _this.dataTable.row(index);
|
|
693
|
-
_this.selectRow(row, true);
|
|
694
|
-
});
|
|
695
|
-
// emit selection event
|
|
696
|
-
this.selectedItems.emit(this.selected);
|
|
697
|
-
}
|
|
698
|
-
};
|
|
699
|
-
/**
|
|
700
|
-
* @return {?}
|
|
701
|
-
*/
|
|
702
|
-
AdvancedTableComponent.prototype.selectNone = /**
|
|
703
|
-
* @return {?}
|
|
704
|
-
*/
|
|
705
|
-
function () {
|
|
706
|
-
var _this = this;
|
|
707
|
-
if (this.dataTable && this.selectable) {
|
|
708
|
-
// set smart select flag
|
|
709
|
-
this.smartSelect = false;
|
|
710
|
-
this.unselected.splice(0, this.unselected.length);
|
|
711
|
-
// select any row
|
|
712
|
-
this.dataTable.rows().every(function (index) {
|
|
713
|
-
/** @type {?} */
|
|
714
|
-
var row = _this.dataTable.row(index);
|
|
715
|
-
_this.unSelectRow(row, true);
|
|
716
|
-
});
|
|
717
|
-
this.selected.splice(0, this.selected.length);
|
|
718
|
-
// emit selection event
|
|
719
|
-
this.selectedItems.emit(this.selected);
|
|
720
|
-
}
|
|
721
|
-
};
|
|
722
|
-
/**
|
|
723
|
-
* @param {?} row
|
|
724
|
-
* @return {?}
|
|
725
|
-
*/
|
|
726
|
-
AdvancedTableComponent.prototype.toggleSelectRow = /**
|
|
727
|
-
* @param {?} row
|
|
728
|
-
* @return {?}
|
|
729
|
-
*/
|
|
730
|
-
function (row) {
|
|
731
|
-
if (row) {
|
|
732
|
-
/** @type {?} */
|
|
733
|
-
var data = row.data();
|
|
734
|
-
/** @type {?} */
|
|
735
|
-
var key_3 = this.config.columns[0].property || this.config.columns[0].name || '';
|
|
736
|
-
/** @type {?} */
|
|
737
|
-
var id_2 = data[key_3];
|
|
738
|
-
/** @type {?} */
|
|
739
|
-
var findIndex = this.selected.find(function (x) {
|
|
740
|
-
return x[key_3] === id_2;
|
|
741
|
-
});
|
|
742
|
-
// if row is selected
|
|
743
|
-
if (findIndex >= 0) {
|
|
744
|
-
// unselect
|
|
745
|
-
this.unSelectRow(row);
|
|
746
|
-
}
|
|
747
|
-
else {
|
|
748
|
-
this.selectRow(row);
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
};
|
|
752
|
-
/**
|
|
753
|
-
* Datatables column renderer for select checkbox
|
|
754
|
-
* @param {?} data
|
|
755
|
-
* @param {?} type
|
|
756
|
-
* @param {?} row
|
|
757
|
-
* @param {?} meta
|
|
758
|
-
* @return {?}
|
|
759
|
-
*/
|
|
760
|
-
AdvancedTableComponent.prototype._renderSelect = /**
|
|
761
|
-
* Datatables column renderer for select checkbox
|
|
762
|
-
* @param {?} data
|
|
763
|
-
* @param {?} type
|
|
764
|
-
* @param {?} row
|
|
765
|
-
* @param {?} meta
|
|
766
|
-
* @return {?}
|
|
767
|
-
*/
|
|
768
|
-
function (data, type, row, meta) {
|
|
769
|
-
/** @type {?} */
|
|
770
|
-
var column = meta.settings.aoColumns[meta.col];
|
|
771
|
-
if (typeof column.selectTemplate !== 'function') {
|
|
772
|
-
Object.assign(column, {
|
|
773
|
-
selectTemplate: template("<input class=\"checkbox checkbox-theme s-row\" type=\"checkbox\"\n id=\"s-" + this._id + "-${meta.row}\" data-id=\"${data}\" /><label for=\"s-" + this._id + "-${meta.row}\"> </label>\n "),
|
|
774
|
-
});
|
|
775
|
-
}
|
|
776
|
-
// render template
|
|
777
|
-
return column.selectTemplate({
|
|
778
|
-
meta: meta,
|
|
779
|
-
data: data,
|
|
780
|
-
});
|
|
781
|
-
};
|
|
782
|
-
/**
|
|
783
|
-
* @return {?}
|
|
784
|
-
*/
|
|
785
|
-
AdvancedTableComponent.prototype.ngOnInit = /**
|
|
786
|
-
* @return {?}
|
|
787
|
-
*/
|
|
788
|
-
function () {
|
|
789
|
-
var _this = this;
|
|
790
|
-
/** @type {?} */
|
|
791
|
-
var self = this;
|
|
792
|
-
if (this.dataTable) {
|
|
793
|
-
this.destroy();
|
|
794
|
-
}
|
|
795
|
-
if (this.config) {
|
|
796
|
-
this.loading.emit({
|
|
797
|
-
target: this
|
|
798
|
-
});
|
|
799
|
-
// parse properties
|
|
800
|
-
if (Object.prototype.hasOwnProperty.call(this.config, 'selectable')) {
|
|
801
|
-
this.selectable = this.config.selectable;
|
|
802
|
-
}
|
|
803
|
-
if (Object.prototype.hasOwnProperty.call(this.config, 'multipleSelect')) {
|
|
804
|
-
this.multipleSelect = this.config.multipleSelect;
|
|
805
|
-
}
|
|
806
|
-
/** @type {?} */
|
|
807
|
-
var tableColumns_1 = this.config.columns
|
|
808
|
-
// filter action link column
|
|
809
|
-
.filter(function (column) {
|
|
810
|
-
if (column.formatter && column.formatter === 'ActionLinkFormatter' && _this.showActions === false) {
|
|
811
|
-
return false;
|
|
812
|
-
}
|
|
813
|
-
return true;
|
|
814
|
-
}).map(function (column) {
|
|
815
|
-
// convert column to advance table column
|
|
816
|
-
return Object.assign(new ColumnFormatter(_this._injector), column);
|
|
817
|
-
}).map(function (column) {
|
|
818
|
-
/** @type {?} */
|
|
819
|
-
var columnDefinition = {
|
|
820
|
-
data: column.property || column.name,
|
|
821
|
-
defaultContent: column.hasOwnProperty('defaultContent') ? column.defaultContent : '',
|
|
822
|
-
title: _this.translator.transform(column.title),
|
|
823
|
-
sortable: column.hasOwnProperty('sortable') ? column.sortable : true,
|
|
824
|
-
visible: column.hasOwnProperty('hidden') ? !column.hidden : true,
|
|
825
|
-
name: column.name,
|
|
826
|
-
};
|
|
827
|
-
if (column.className) {
|
|
828
|
-
Object.assign(columnDefinition, {
|
|
829
|
-
className: column.className,
|
|
830
|
-
});
|
|
831
|
-
}
|
|
832
|
-
else {
|
|
833
|
-
Object.assign(columnDefinition, {
|
|
834
|
-
className: '',
|
|
835
|
-
});
|
|
836
|
-
}
|
|
837
|
-
if (column.formatters) {
|
|
838
|
-
Object.assign(columnDefinition, {
|
|
839
|
-
render: /**
|
|
840
|
-
* @param {?} data
|
|
841
|
-
* @param {?} type
|
|
842
|
-
* @param {?} row
|
|
843
|
-
* @param {?} meta
|
|
844
|
-
* @return {?}
|
|
845
|
-
*/
|
|
846
|
-
function (data, type, row, meta) {
|
|
847
|
-
/** @type {?} */
|
|
848
|
-
var result = data;
|
|
849
|
-
(/** @type {?} */ (column.formatters)).forEach(function (columnFormatter) {
|
|
850
|
-
/** @type {?} */
|
|
851
|
-
var formatter = self._columnFormatters[columnFormatter.formatter];
|
|
852
|
-
if (formatter && typeof formatter.render === 'function') {
|
|
853
|
-
column.formatString = columnFormatter.formatString;
|
|
854
|
-
column.formatOptions = columnFormatter.formatOptions;
|
|
855
|
-
}
|
|
856
|
-
result = formatter.render.bind(column)(result, type, row, meta);
|
|
857
|
-
});
|
|
858
|
-
delete column.formatString;
|
|
859
|
-
delete column.formatOptions;
|
|
860
|
-
return result;
|
|
861
|
-
},
|
|
862
|
-
});
|
|
863
|
-
/** @type {?} */
|
|
864
|
-
var items_1 = column.formatters.filter(function (columnFormatter) {
|
|
865
|
-
return typeof columnFormatter.afterRender === 'function';
|
|
866
|
-
});
|
|
867
|
-
if (items_1.length > 0) {
|
|
868
|
-
Object.assign(columnDefinition, {
|
|
869
|
-
createdCell: /**
|
|
870
|
-
* @param {?} cell
|
|
871
|
-
* @param {?} cellData
|
|
872
|
-
* @param {?} rowData
|
|
873
|
-
* @param {?} rowIndex
|
|
874
|
-
* @param {?} colIndex
|
|
875
|
-
* @return {?}
|
|
876
|
-
*/
|
|
877
|
-
function (cell, cellData, rowData, rowIndex, colIndex) {
|
|
878
|
-
items_1.forEach(function (columnFormatter) {
|
|
879
|
-
/** @type {?} */
|
|
880
|
-
var formatter = self._columnFormatters[columnFormatter.formatter];
|
|
881
|
-
if (formatter && typeof formatter.afterRender === 'function') {
|
|
882
|
-
formatter.afterRender.bind(column)(cell, cellData, rowData, rowIndex, colIndex);
|
|
883
|
-
}
|
|
884
|
-
});
|
|
885
|
-
},
|
|
886
|
-
});
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
|
-
if (column.formatter) {
|
|
890
|
-
/** @type {?} */
|
|
891
|
-
var formatter = self._columnFormatters[column.formatter];
|
|
892
|
-
if (formatter && typeof formatter.render === 'function') {
|
|
893
|
-
Object.assign(columnDefinition, {
|
|
894
|
-
render: formatter.render.bind(column),
|
|
895
|
-
});
|
|
896
|
-
}
|
|
897
|
-
if (formatter && typeof formatter.afterRender === 'function') {
|
|
898
|
-
Object.assign(columnDefinition, {
|
|
899
|
-
render: formatter.render.bind(column),
|
|
900
|
-
});
|
|
901
|
-
Object.assign(columnDefinition, {
|
|
902
|
-
createdCell: formatter.afterRender.bind(column),
|
|
903
|
-
});
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
return columnDefinition;
|
|
907
|
-
});
|
|
908
|
-
/** @type {?} */
|
|
909
|
-
var tableElement_1 = jQuery(this.table && this.table.nativeElement);
|
|
910
|
-
jQuery(window).on('resize', function () {
|
|
911
|
-
setTimeout(function () {
|
|
912
|
-
if (_this.dataTable) {
|
|
913
|
-
_this.dataTable.columns.adjust();
|
|
914
|
-
}
|
|
915
|
-
}, 1);
|
|
916
|
-
});
|
|
917
|
-
// tslint:disable-next-line: no-shadowed-variable
|
|
918
|
-
// tslint:disable-next-line: no-shadowed-variable
|
|
919
|
-
tableElement_1.on('processing.dt', function (event, settings, processing) {
|
|
920
|
-
if (processing) {
|
|
921
|
-
// clear empty table element
|
|
922
|
-
// clear empty table element
|
|
923
|
-
tableElement_1.find('.dataTables_empty').html('');
|
|
924
|
-
setTimeout(function () {
|
|
925
|
-
tableElement_1.addClass('processing');
|
|
926
|
-
}, 0);
|
|
927
|
-
}
|
|
928
|
-
else {
|
|
929
|
-
setTimeout(function () {
|
|
930
|
-
tableElement_1.removeClass('processing');
|
|
931
|
-
}, 0);
|
|
932
|
-
}
|
|
933
|
-
});
|
|
934
|
-
/** @type {?} */
|
|
935
|
-
var drawIndex_1 = 1;
|
|
936
|
-
tableElement_1.on('order.dt', function (event) {
|
|
937
|
-
if (_this.dataTable) {
|
|
938
|
-
/** @type {?} */
|
|
939
|
-
var order = _this.dataTable.order();
|
|
940
|
-
/** @type {?} */
|
|
941
|
-
var columns = tableColumns_1;
|
|
942
|
-
if (order && order.length) {
|
|
943
|
-
_this.order.emit(order);
|
|
944
|
-
}
|
|
945
|
-
}
|
|
946
|
-
}).on('draw.dt', function (event) {
|
|
947
|
-
_this.draw.emit();
|
|
948
|
-
if (_this.dataTable) {
|
|
949
|
-
/** @type {?} */
|
|
950
|
-
var info = _this.dataTable.page.info();
|
|
951
|
-
_this.page.emit(info);
|
|
952
|
-
if (drawIndex_1 > 1) {
|
|
953
|
-
return;
|
|
954
|
-
}
|
|
955
|
-
try {
|
|
956
|
-
drawIndex_1++;
|
|
957
|
-
setTimeout(function () { _this.dataTable.columns.adjust(); }, 1);
|
|
958
|
-
}
|
|
959
|
-
catch (err) {
|
|
960
|
-
console.error('ERROR', 'An error occurred while adjusting table columns');
|
|
961
|
-
console.error(err);
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
});
|
|
965
|
-
// allow selection
|
|
966
|
-
if (this.selectable) {
|
|
967
|
-
/** @type {?} */
|
|
968
|
-
var firstColumn = this.config.columns[0];
|
|
969
|
-
/** @type {?} */
|
|
970
|
-
var selectColumnDefinition = {
|
|
971
|
-
className: 'text-center pl-4 pr-0',
|
|
972
|
-
data: firstColumn.property || firstColumn.name,
|
|
973
|
-
defaultContent: '',
|
|
974
|
-
title: '',
|
|
975
|
-
sortable: false,
|
|
976
|
-
visible: !this.customSelect,
|
|
977
|
-
name: firstColumn.name,
|
|
978
|
-
};
|
|
979
|
-
// assign renderer
|
|
980
|
-
Object.assign(selectColumnDefinition, {
|
|
981
|
-
render: this._renderSelect.bind(this),
|
|
982
|
-
});
|
|
983
|
-
// and finally add column
|
|
984
|
-
// and finally add column
|
|
985
|
-
tableColumns_1.unshift(selectColumnDefinition);
|
|
986
|
-
// user interface additions
|
|
987
|
-
// handle page change event (a trick for firing draw.dt events)
|
|
988
|
-
// user interface additions
|
|
989
|
-
// handle page change event (a trick for firing draw.dt events)
|
|
990
|
-
tableElement_1
|
|
991
|
-
// handle draw events
|
|
992
|
-
.on('draw.dt', function () {
|
|
993
|
-
if (_this.customSelect) {
|
|
994
|
-
// enable row selection event
|
|
995
|
-
// enable row selection event
|
|
996
|
-
tableElement_1.find('tbody').on('click', 'tr', function () {
|
|
997
|
-
/** @type {?} */
|
|
998
|
-
var row = self.dataTable.row(this);
|
|
999
|
-
// add row
|
|
1000
|
-
self.select.emit(row);
|
|
1001
|
-
});
|
|
1002
|
-
}
|
|
1003
|
-
/** @type {?} */
|
|
1004
|
-
var elements = tableElement_1.find('input.s-row');
|
|
1005
|
-
elements.off('click').on('click', _this.onSelectionChange.bind(_this));
|
|
1006
|
-
/** @type {?} */
|
|
1007
|
-
var key = _this.config.columns[0].property || '';
|
|
1008
|
-
if (_this.selected.length > 0) {
|
|
1009
|
-
// enumerate selected items
|
|
1010
|
-
// enumerate selected items
|
|
1011
|
-
_this.selected.forEach(function (item) {
|
|
1012
|
-
/** @type {?} */
|
|
1013
|
-
var id = item[key];
|
|
1014
|
-
// if identifier is defined
|
|
1015
|
-
if (id != null) {
|
|
1016
|
-
// try to find check element with this identifier in attribute data-id
|
|
1017
|
-
// try to find check element with this identifier in attribute data-id
|
|
1018
|
-
tableElement_1.find("input[data-id='" + id + "']").prop('checked', true);
|
|
1019
|
-
}
|
|
1020
|
-
});
|
|
1021
|
-
}
|
|
1022
|
-
if (_this.smartSelect) {
|
|
1023
|
-
// select rows that are not selected
|
|
1024
|
-
// and do not included in unselected collection
|
|
1025
|
-
// select rows that are not selected
|
|
1026
|
-
// and do not included in unselected collection
|
|
1027
|
-
tableElement_1.find('input[data-id]').each(function (index, element) {
|
|
1028
|
-
// get data id
|
|
1029
|
-
if (_this.unselected.findIndex(function (x) {
|
|
1030
|
-
// tslint:disable-next-line:triple-equals
|
|
1031
|
-
return x[key] == jQuery(element).attr('data-id');
|
|
1032
|
-
}) < 0) {
|
|
1033
|
-
_this.selectRow(_this.dataTable.row(index));
|
|
1034
|
-
}
|
|
1035
|
-
});
|
|
1036
|
-
}
|
|
1037
|
-
else if (_this.selected.length === 0) {
|
|
1038
|
-
tableElement_1.find('input[data-id]').prop('checked', false);
|
|
1039
|
-
}
|
|
1040
|
-
});
|
|
1041
|
-
}
|
|
1042
|
-
/** @type {?} */
|
|
1043
|
-
var settings = {
|
|
1044
|
-
// set length menu
|
|
1045
|
-
lengthMenu: [5, 10, 50, 100, 200, 500],
|
|
1046
|
-
// hide length menu
|
|
1047
|
-
lengthChange: false,
|
|
1048
|
-
// enable search but hide search box (css)
|
|
1049
|
-
searching: true,
|
|
1050
|
-
// enable data processing
|
|
1051
|
-
processing: true,
|
|
1052
|
-
// enable getting server side data
|
|
1053
|
-
serverSide: this.serverSide,
|
|
1054
|
-
// enumerate table columns
|
|
1055
|
-
columns: tableColumns_1,
|
|
1056
|
-
colReorder: this.columnOrdering,
|
|
1057
|
-
order: [],
|
|
1058
|
-
// set scroll x
|
|
1059
|
-
scrollX: this.scrollX,
|
|
1060
|
-
dom: 'Bfrtip',
|
|
1061
|
-
autoWidth: false,
|
|
1062
|
-
buttons: [
|
|
1063
|
-
{
|
|
1064
|
-
extend: 'excel',
|
|
1065
|
-
filename: this.config.title,
|
|
1066
|
-
className: 'd-none',
|
|
1067
|
-
exportOptions: {
|
|
1068
|
-
columns: 'th:not(:first-child)',
|
|
1069
|
-
},
|
|
1070
|
-
},
|
|
1071
|
-
],
|
|
1072
|
-
// define server data callback
|
|
1073
|
-
fnServerData: /**
|
|
1074
|
-
* @param {?} sSource
|
|
1075
|
-
* @param {?} aoData
|
|
1076
|
-
* @param {?} fnCallback
|
|
1077
|
-
* @param {?} oSettings
|
|
1078
|
-
* @return {?}
|
|
1079
|
-
*/
|
|
1080
|
-
function (sSource, aoData, fnCallback, oSettings) {
|
|
1081
|
-
// if method is invoked for the first time
|
|
1082
|
-
if (self._firstLoad) {
|
|
1083
|
-
// disabled first load flag
|
|
1084
|
-
self._firstLoad = false;
|
|
1085
|
-
// if auto load is disabled
|
|
1086
|
-
if (self.autoLoad === false) {
|
|
1087
|
-
/** @type {?} */
|
|
1088
|
-
var emptyDataSet = {
|
|
1089
|
-
recordsTotal: 0,
|
|
1090
|
-
recordsFiltered: 0,
|
|
1091
|
-
data: [],
|
|
1092
|
-
};
|
|
1093
|
-
self._lastQueryTotalItems = 0;
|
|
1094
|
-
// emit empty data
|
|
1095
|
-
self.load.emit(emptyDataSet);
|
|
1096
|
-
// return empty data
|
|
1097
|
-
return fnCallback(emptyDataSet);
|
|
1098
|
-
}
|
|
1099
|
-
}
|
|
1100
|
-
// reset error
|
|
1101
|
-
self.toggleError();
|
|
1102
|
-
/** @type {?} */
|
|
1103
|
-
var queryParams = self._activatedRoute.snapshot.queryParams;
|
|
1104
|
-
/** @type {?} */
|
|
1105
|
-
var columns = aoData[1].value;
|
|
1106
|
-
/** @type {?} */
|
|
1107
|
-
var order = aoData[2].value;
|
|
1108
|
-
/** @type {?} */
|
|
1109
|
-
var skip = aoData[3].value;
|
|
1110
|
-
/** @type {?} */
|
|
1111
|
-
var top = aoData[4].value;
|
|
1112
|
-
/** @type {?} */
|
|
1113
|
-
var search = aoData[5].value;
|
|
1114
|
-
/** @type {?} */
|
|
1115
|
-
var q = self._query instanceof ClientDataQueryable ? self._query : self._context.model(self.config.model).asQueryable();
|
|
1116
|
-
// apply paging params
|
|
1117
|
-
if (top) {
|
|
1118
|
-
q.take(top).skip(skip);
|
|
1119
|
-
}
|
|
1120
|
-
// apply order params
|
|
1121
|
-
if (order && order.length) {
|
|
1122
|
-
/** @type {?} */
|
|
1123
|
-
var orderByStr = order.map(function (expr) {
|
|
1124
|
-
/** @type {?} */
|
|
1125
|
-
var columnIndex;
|
|
1126
|
-
if (self.columnOrdering === false) {
|
|
1127
|
-
columnIndex = expr.column;
|
|
1128
|
-
}
|
|
1129
|
-
else {
|
|
1130
|
-
/** @type {?} */
|
|
1131
|
-
var columnOrder = self.dataTable.colReorder.order();
|
|
1132
|
-
// and match the dataTable index to the config columns index
|
|
1133
|
-
// expr.column should always be valid (e.g. in range), but perform a minor validation
|
|
1134
|
-
if (expr.column >= 0 && expr.column < columnOrder.length) {
|
|
1135
|
-
columnIndex = columnOrder[expr.column];
|
|
1136
|
-
}
|
|
1137
|
-
else {
|
|
1138
|
-
// use the first column as a fallback (won't happen, just for safety)
|
|
1139
|
-
columnIndex = 0;
|
|
1140
|
-
}
|
|
1141
|
-
}
|
|
1142
|
-
return tableColumns_1[columnIndex].name + ' ' + expr.dir || 'asc';
|
|
1143
|
-
}).join(',');
|
|
1144
|
-
// set order
|
|
1145
|
-
q.setParam('$orderby', orderByStr);
|
|
1146
|
-
}
|
|
1147
|
-
// ensure self.stateLoadCallback
|
|
1148
|
-
if (self.stateLoadCallback == null) {
|
|
1149
|
-
self.stateLoadCallback = (function (_, callback) {
|
|
1150
|
-
return callback(null);
|
|
1151
|
-
});
|
|
1152
|
-
}
|
|
1153
|
-
self.stateLoadCallback(null, function (state) {
|
|
1154
|
-
/** @type {?} */
|
|
1155
|
-
var select = self.config.columns.filter(function (column) {
|
|
1156
|
-
if (column.virtual === true) {
|
|
1157
|
-
return false;
|
|
1158
|
-
}
|
|
1159
|
-
if (column.optional === true) {
|
|
1160
|
-
if (state && state.columns) {
|
|
1161
|
-
/** @type {?} */
|
|
1162
|
-
var index = tableColumns_1.findIndex(function (tableColumn) { return tableColumn.name === column.name; });
|
|
1163
|
-
if (index >= 0) {
|
|
1164
|
-
return state.columns[index].visible;
|
|
1165
|
-
}
|
|
1166
|
-
}
|
|
1167
|
-
return false;
|
|
1168
|
-
}
|
|
1169
|
-
return true;
|
|
1170
|
-
}).map(function (column) {
|
|
1171
|
-
if (column.property) {
|
|
1172
|
-
return column.name + ' as ' + column.property;
|
|
1173
|
-
}
|
|
1174
|
-
else {
|
|
1175
|
-
return column.name;
|
|
1176
|
-
}
|
|
1177
|
-
});
|
|
1178
|
-
q.select.apply(q, select);
|
|
1179
|
-
// configure $filter
|
|
1180
|
-
if (queryParams["$filter"] && queryParams["$filter"].length) {
|
|
1181
|
-
/** @type {?} */
|
|
1182
|
-
var qParams = q.getParams();
|
|
1183
|
-
q.setParam('$filter', null);
|
|
1184
|
-
/** @type {?} */
|
|
1185
|
-
var expressions = [queryParams["$filter"]];
|
|
1186
|
-
if (qParams.$filter) {
|
|
1187
|
-
expressions.push('(' + qParams.$filter + ')');
|
|
1188
|
-
}
|
|
1189
|
-
q.filter(expressions.join(' and '));
|
|
1190
|
-
}
|
|
1191
|
-
// check if query parameters contain filter
|
|
1192
|
-
if (queryParams["$expand"] && queryParams["$expand"].length) {
|
|
1193
|
-
// set route $expand
|
|
1194
|
-
q.setParam('$expand', queryParams["$expand"]);
|
|
1195
|
-
}
|
|
1196
|
-
else if (self.config && self.config.defaults && self.config.defaults.expand) {
|
|
1197
|
-
q.setParam('$expand', self.config.defaults.expand);
|
|
1198
|
-
}
|
|
1199
|
-
if (!q.getParams()['$orderby'] && self.config && self.config.defaults && self.config.defaults.orderBy) {
|
|
1200
|
-
q.setParam('$orderby', self.config.defaults.orderBy);
|
|
1201
|
-
}
|
|
1202
|
-
if (self.config && self.config.defaults && self.config.defaults.groupBy) {
|
|
1203
|
-
q.setParam('$groupby', self.config.defaults.groupBy);
|
|
1204
|
-
}
|
|
1205
|
-
// append default filter
|
|
1206
|
-
if (self.config && self.config.defaults && self.config.defaults.filter) {
|
|
1207
|
-
return self._advancedFilterValueProvider.asyncBuildFilter(self.config.defaults.filter).then(function (defaultFilterString) {
|
|
1208
|
-
if (defaultFilterString) {
|
|
1209
|
-
/** @type {?} */
|
|
1210
|
-
var qParams = q.getParams();
|
|
1211
|
-
q.setParam('$filter', null);
|
|
1212
|
-
/** @type {?} */
|
|
1213
|
-
var expressions = [defaultFilterString];
|
|
1214
|
-
if (qParams.$filter) {
|
|
1215
|
-
expressions.push('(' + qParams.$filter + ')');
|
|
1216
|
-
}
|
|
1217
|
-
q.filter(expressions.join(' and '));
|
|
1218
|
-
}
|
|
1219
|
-
self.lastQueryParams = q.getParams();
|
|
1220
|
-
return q.getList().then(function (items) {
|
|
1221
|
-
/** @type {?} */
|
|
1222
|
-
var dataSet = {
|
|
1223
|
-
recordsTotal: items.total,
|
|
1224
|
-
recordsFiltered: items.total,
|
|
1225
|
-
data: items.value,
|
|
1226
|
-
};
|
|
1227
|
-
self._lastQueryTotalItems = items.total;
|
|
1228
|
-
if (items.total === 0) {
|
|
1229
|
-
self.resetEmptyTable();
|
|
1230
|
-
}
|
|
1231
|
-
// emit load event
|
|
1232
|
-
self.load.emit(dataSet);
|
|
1233
|
-
// return data
|
|
1234
|
-
return fnCallback(dataSet);
|
|
1235
|
-
});
|
|
1236
|
-
}).catch(function (err) {
|
|
1237
|
-
// log error to console
|
|
1238
|
-
console.error('TABLES', err);
|
|
1239
|
-
// show error
|
|
1240
|
-
self.toggleError(err);
|
|
1241
|
-
self._lastQueryTotalItems = 0;
|
|
1242
|
-
// by returning empty dataset
|
|
1243
|
-
self.load.emit(EMPTY_DATASET);
|
|
1244
|
-
return fnCallback(EMPTY_DATASET);
|
|
1245
|
-
});
|
|
1246
|
-
}
|
|
1247
|
-
self.lastQueryParams = q.getParams();
|
|
1248
|
-
q.getList().then(function (items) {
|
|
1249
|
-
/** @type {?} */
|
|
1250
|
-
var dataSet = {
|
|
1251
|
-
recordsTotal: items.total,
|
|
1252
|
-
recordsFiltered: items.total,
|
|
1253
|
-
data: items.value,
|
|
1254
|
-
};
|
|
1255
|
-
self._lastQueryTotalItems = items.total;
|
|
1256
|
-
if (items.total === 0) {
|
|
1257
|
-
self.resetEmptyTable();
|
|
1258
|
-
}
|
|
1259
|
-
// emit load event
|
|
1260
|
-
self.load.emit(dataSet);
|
|
1261
|
-
// return data
|
|
1262
|
-
return fnCallback(dataSet);
|
|
1263
|
-
}).catch(function (err) {
|
|
1264
|
-
// log error to console
|
|
1265
|
-
console.error('TABLES', err);
|
|
1266
|
-
// show error
|
|
1267
|
-
self.toggleError(err);
|
|
1268
|
-
// by returning empty dataset
|
|
1269
|
-
self.load.emit(EMPTY_DATASET);
|
|
1270
|
-
return fnCallback(EMPTY_DATASET);
|
|
1271
|
-
});
|
|
1272
|
-
});
|
|
1273
|
-
},
|
|
1274
|
-
language: Object.assign({}, self.translator.transform('Tables.DataTable'), { emptyTable: ' ' }),
|
|
1275
|
-
};
|
|
1276
|
-
/** @type {?} */
|
|
1277
|
-
var stateSettings = {
|
|
1278
|
-
stateSave: this.stateSave
|
|
1279
|
-
};
|
|
1280
|
-
if (this.stateLoadCallback) {
|
|
1281
|
-
Object.assign(stateSettings, {
|
|
1282
|
-
stateLoadCallback: this.stateLoadCallback
|
|
1283
|
-
});
|
|
1284
|
-
}
|
|
1285
|
-
if (this.stateSaveCallback) {
|
|
1286
|
-
Object.assign(stateSettings, {
|
|
1287
|
-
stateSaveCallback: this.stateSaveCallback
|
|
1288
|
-
});
|
|
1289
|
-
}
|
|
1290
|
-
Object.assign(settings, stateSettings);
|
|
1291
|
-
if (this.scrollable) {
|
|
1292
|
-
// set continuous scrolling
|
|
1293
|
-
Object.assign(settings, {
|
|
1294
|
-
scrollY: this.scrollY,
|
|
1295
|
-
scrollCollapse: false,
|
|
1296
|
-
scroller: {
|
|
1297
|
-
loadingIndicator: false,
|
|
1298
|
-
displayBuffer: 10,
|
|
1299
|
-
},
|
|
1300
|
-
});
|
|
1301
|
-
}
|
|
1302
|
-
else {
|
|
1303
|
-
Object.assign(settings, {
|
|
1304
|
-
scrollY: this.scrollY,
|
|
1305
|
-
paging: this.paging,
|
|
1306
|
-
pageLength: this.pageLength,
|
|
1307
|
-
});
|
|
1308
|
-
}
|
|
1309
|
-
if (this.selectable) {
|
|
1310
|
-
}
|
|
1311
|
-
// handle init.dt event and emit local event
|
|
1312
|
-
this.dataTable = tableElement_1.on('init.dt', function (event) {
|
|
1313
|
-
/** @type {?} */
|
|
1314
|
-
var scroller = jQuery(event.target).parent();
|
|
1315
|
-
// handle scrolling
|
|
1316
|
-
scroller.on('scroll', function (scrollEvent) {
|
|
1317
|
-
/** @type {?} */
|
|
1318
|
-
var target = jQuery(scrollEvent.target);
|
|
1319
|
-
/** @type {?} */
|
|
1320
|
-
var top = /** @type {?} */ (target.scrollTop());
|
|
1321
|
-
/** @type {?} */
|
|
1322
|
-
var left = /** @type {?} */ (target.scrollLeft());
|
|
1323
|
-
if (_this.dataTable) {
|
|
1324
|
-
_this.scroll.emit({
|
|
1325
|
-
top: top,
|
|
1326
|
-
left: left
|
|
1327
|
-
});
|
|
1328
|
-
}
|
|
1329
|
-
});
|
|
1330
|
-
}).DataTable(settings);
|
|
1331
|
-
this.init.emit();
|
|
1332
|
-
// show or hide header
|
|
1333
|
-
if (!this.showHeader && this._element && this._element.nativeElement) {
|
|
1334
|
-
/** @type {?} */
|
|
1335
|
-
var hideSelector = (/** @type {?} */ (this._element.nativeElement))
|
|
1336
|
-
.querySelector('.dataTable>thead');
|
|
1337
|
-
if (hideSelector) {
|
|
1338
|
-
hideSelector.classList.add('d-none');
|
|
1339
|
-
}
|
|
1340
|
-
/** @type {?} */
|
|
1341
|
-
var adjustSelector = (/** @type {?} */ (this._element.nativeElement))
|
|
1342
|
-
.querySelector('.dataTable');
|
|
1343
|
-
if (adjustSelector) {
|
|
1344
|
-
adjustSelector.classList.add('mt-2');
|
|
1345
|
-
}
|
|
1346
|
-
}
|
|
1347
|
-
// show or hide footer
|
|
1348
|
-
if (!this.showFooter && this._element && this._element.nativeElement) {
|
|
1349
|
-
/** @type {?} */
|
|
1350
|
-
var infoSelector = (/** @type {?} */ (this._element.nativeElement))
|
|
1351
|
-
.querySelector('.dataTables_info');
|
|
1352
|
-
if (infoSelector) {
|
|
1353
|
-
infoSelector.classList.add('d-none');
|
|
1354
|
-
}
|
|
1355
|
-
}
|
|
1356
|
-
// show or hide pager
|
|
1357
|
-
if (this.showPaging) {
|
|
1358
|
-
this.showPaging = true;
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
};
|
|
1362
|
-
/**
|
|
1363
|
-
* @param {?} value
|
|
1364
|
-
* @return {?}
|
|
1365
|
-
*/
|
|
1366
|
-
AdvancedTableComponent.prototype.scrollTop = /**
|
|
1367
|
-
* @param {?} value
|
|
1368
|
-
* @return {?}
|
|
1369
|
-
*/
|
|
1370
|
-
function (value) {
|
|
1371
|
-
if (this.dataTable) {
|
|
1372
|
-
this.dataTable.parent().scrollTop(value);
|
|
1373
|
-
}
|
|
1374
|
-
};
|
|
1375
|
-
/**
|
|
1376
|
-
* @param {?} value
|
|
1377
|
-
* @return {?}
|
|
1378
|
-
*/
|
|
1379
|
-
AdvancedTableComponent.prototype.scrollLeft = /**
|
|
1380
|
-
* @param {?} value
|
|
1381
|
-
* @return {?}
|
|
1382
|
-
*/
|
|
1383
|
-
function (value) {
|
|
1384
|
-
if (this.dataTable) {
|
|
1385
|
-
this.dataTable.parent().scrollLeft(value);
|
|
1386
|
-
}
|
|
1387
|
-
};
|
|
1388
|
-
Object.defineProperty(AdvancedTableComponent.prototype, "lastQuery", {
|
|
1389
|
-
get: /**
|
|
1390
|
-
* @return {?}
|
|
1391
|
-
*/
|
|
1392
|
-
function () {
|
|
1393
|
-
var _this = this;
|
|
1394
|
-
if (this.config == null) {
|
|
1395
|
-
return;
|
|
1396
|
-
}
|
|
1397
|
-
if (this.lastQueryParams == null) {
|
|
1398
|
-
return;
|
|
1399
|
-
}
|
|
1400
|
-
/** @type {?} */
|
|
1401
|
-
var q = this._context.model(this.config.model).asQueryable();
|
|
1402
|
-
Object.keys(this.lastQueryParams).forEach(function (key) {
|
|
1403
|
-
q.setParam(key, _this.lastQueryParams && _this.lastQueryParams[key]);
|
|
1404
|
-
});
|
|
1405
|
-
// return query
|
|
1406
|
-
return q;
|
|
1407
|
-
},
|
|
1408
|
-
enumerable: true,
|
|
1409
|
-
configurable: true
|
|
1410
|
-
});
|
|
1411
|
-
/**
|
|
1412
|
-
* Fetches and updates a single row
|
|
1413
|
-
* @param {?} find - Any object which is being converted to a query
|
|
1414
|
-
* @return {?}
|
|
1415
|
-
*/
|
|
1416
|
-
AdvancedTableComponent.prototype.fetchOne = /**
|
|
1417
|
-
* Fetches and updates a single row
|
|
1418
|
-
* @param {?} find - Any object which is being converted to a query
|
|
1419
|
-
* @return {?}
|
|
1420
|
-
*/
|
|
1421
|
-
function (find) {
|
|
1422
|
-
var _this = this;
|
|
1423
|
-
if (find == null) {
|
|
1424
|
-
return;
|
|
1425
|
-
}
|
|
1426
|
-
if (this.dataTable == null) {
|
|
1427
|
-
return;
|
|
1428
|
-
}
|
|
1429
|
-
if (this.lastQueryParams == null) {
|
|
1430
|
-
return;
|
|
1431
|
-
}
|
|
1432
|
-
/** @type {?} */
|
|
1433
|
-
var rows = Array.from(this.dataTable.rows().data());
|
|
1434
|
-
if (rows && rows.length) {
|
|
1435
|
-
/** @type {?} */
|
|
1436
|
-
var findKeys_1 = Object.keys(find);
|
|
1437
|
-
if (findKeys_1.length === 0) {
|
|
1438
|
-
// do nothing
|
|
1439
|
-
return;
|
|
1440
|
-
}
|
|
1441
|
-
/** @type {?} */
|
|
1442
|
-
var rowIndex_1 = rows.findIndex(function (row) {
|
|
1443
|
-
return findKeys_1.map(function (key) {
|
|
1444
|
-
return row[key] === find[key];
|
|
1445
|
-
}).filter(function (res) {
|
|
1446
|
-
return res === false;
|
|
1447
|
-
}).length === 0;
|
|
1448
|
-
});
|
|
1449
|
-
// if row has been found
|
|
1450
|
-
if (rowIndex_1 >= 0) {
|
|
1451
|
-
/** @type {?} */
|
|
1452
|
-
var query_1 = this._context.model(this.config.model).asQueryable();
|
|
1453
|
-
// select attributes
|
|
1454
|
-
// select attributes
|
|
1455
|
-
query_1.setParam('$select', this.lastQueryParams.$select);
|
|
1456
|
-
if (this.lastQueryParams.$expand) {
|
|
1457
|
-
// apply expand attributes
|
|
1458
|
-
// apply expand attributes
|
|
1459
|
-
query_1.setParam('$expand', this.lastQueryParams.$expand);
|
|
1460
|
-
}
|
|
1461
|
-
// apply filter for row
|
|
1462
|
-
// apply filter for row
|
|
1463
|
-
findKeys_1.forEach(function (key) {
|
|
1464
|
-
/** @type {?} */
|
|
1465
|
-
var column = _this.config.columns.find(function (col) {
|
|
1466
|
-
return col.property === key || col.name === key;
|
|
1467
|
-
});
|
|
1468
|
-
if (column) {
|
|
1469
|
-
/** @type {?} */
|
|
1470
|
-
var property = column.property || column.name;
|
|
1471
|
-
query_1.and(/** @type {?} */ (property)).equal(find[key]);
|
|
1472
|
-
}
|
|
1473
|
-
else {
|
|
1474
|
-
query_1.and(key).equal(find[key]);
|
|
1475
|
-
}
|
|
1476
|
-
});
|
|
1477
|
-
// and finally get item
|
|
1478
|
-
return query_1.getItem().then(function (item) {
|
|
1479
|
-
/** @type {?} */
|
|
1480
|
-
var row = _this.dataTable.row(rowIndex_1);
|
|
1481
|
-
/** @type {?} */
|
|
1482
|
-
var checked = jQuery(row.node()).find(':checkbox').prop('checked');
|
|
1483
|
-
if (item) {
|
|
1484
|
-
// redraw row
|
|
1485
|
-
row.data(item);
|
|
1486
|
-
jQuery(row.node()).find(':checkbox').off('click').on('click', _this.onSelectionChange.bind(_this));
|
|
1487
|
-
// if row is already selected
|
|
1488
|
-
if (checked) {
|
|
1489
|
-
_this.selectRow(row, true);
|
|
1490
|
-
}
|
|
1491
|
-
}
|
|
1492
|
-
return Promise.resolve();
|
|
1493
|
-
});
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
return Promise.resolve();
|
|
1497
|
-
};
|
|
1498
|
-
/**
|
|
1499
|
-
* @return {?}
|
|
1500
|
-
*/
|
|
1501
|
-
AdvancedTableComponent.prototype.ngOnDestroy = /**
|
|
1502
|
-
* @return {?}
|
|
1503
|
-
*/
|
|
1504
|
-
function () {
|
|
1505
|
-
if (this.reloadSubscription) {
|
|
1506
|
-
this.reloadSubscription.unsubscribe();
|
|
1507
|
-
}
|
|
1508
|
-
};
|
|
1509
|
-
/**
|
|
1510
|
-
* Handle selection change
|
|
1511
|
-
* @param {?} $event
|
|
1512
|
-
* @return {?}
|
|
1513
|
-
*/
|
|
1514
|
-
AdvancedTableComponent.prototype.onSelectionChange = /**
|
|
1515
|
-
* Handle selection change
|
|
1516
|
-
* @param {?} $event
|
|
1517
|
-
* @return {?}
|
|
1518
|
-
*/
|
|
1519
|
-
function ($event) {
|
|
1520
|
-
/** @type {?} */
|
|
1521
|
-
var input = /** @type {?} */ ($event.target);
|
|
1522
|
-
/** @type {?} */
|
|
1523
|
-
var execRegex = /-(\d+)$/g.exec(input.id);
|
|
1524
|
-
/** @type {?} */
|
|
1525
|
-
var rowIndex = parseInt(/** @type {?} */ ((execRegex && execRegex[1])), 10);
|
|
1526
|
-
/** @type {?} */
|
|
1527
|
-
var row = this.dataTable.row(rowIndex).data();
|
|
1528
|
-
// get row identifier
|
|
1529
|
-
if (row) {
|
|
1530
|
-
/** @type {?} */
|
|
1531
|
-
var key_4 = this.config.columns[0].property || '';
|
|
1532
|
-
/** @type {?} */
|
|
1533
|
-
var id_3 = row[key_4];
|
|
1534
|
-
/** @type {?} */
|
|
1535
|
-
var findItemIndex = this.selected.findIndex(function (item) {
|
|
1536
|
-
return item[key_4] === id_3;
|
|
1537
|
-
});
|
|
1538
|
-
if (input.checked) {
|
|
1539
|
-
if (findItemIndex < 0) {
|
|
1540
|
-
// add row to selected rows
|
|
1541
|
-
this.selected.push(row);
|
|
1542
|
-
this.selectedItems.emit(this.selected);
|
|
1543
|
-
}
|
|
1544
|
-
}
|
|
1545
|
-
else {
|
|
1546
|
-
if (findItemIndex >= 0) {
|
|
1547
|
-
// remove selected item
|
|
1548
|
-
this.selected.splice(findItemIndex, 1);
|
|
1549
|
-
if (this.smartSelect) {
|
|
1550
|
-
// add row to unselected rows
|
|
1551
|
-
findItemIndex = this.unselected.findIndex(function (item) {
|
|
1552
|
-
return item[key_4] === id_3;
|
|
1553
|
-
});
|
|
1554
|
-
if (findItemIndex < 0) {
|
|
1555
|
-
this.unselected.push(row);
|
|
1556
|
-
this.selectedItems.emit(this.selected);
|
|
1557
|
-
}
|
|
1558
|
-
}
|
|
1559
|
-
}
|
|
1560
|
-
}
|
|
1561
|
-
}
|
|
1562
|
-
};
|
|
1563
|
-
/**
|
|
1564
|
-
* @return {?}
|
|
1565
|
-
*/
|
|
1566
|
-
AdvancedTableComponent.prototype.resetEmptyTable = /**
|
|
1567
|
-
* @return {?}
|
|
1568
|
-
*/
|
|
1569
|
-
function () {
|
|
1570
|
-
// this operation is important
|
|
1571
|
-
// due to ng data binding
|
|
1572
|
-
// empty table template has no translated text during ngOnInit()
|
|
1573
|
-
if (this.dataTable && this.dataTable.context[0]) {
|
|
1574
|
-
this.dataTable.context[0].oLanguage.sEmptyTable =
|
|
1575
|
-
this.dataTable.context[0].oLanguage.sZeroRecords = this.emptyTable && this.emptyTable.nativeElement.innerHTML;
|
|
1576
|
-
}
|
|
1577
|
-
};
|
|
1578
|
-
/**
|
|
1579
|
-
* @param {?=} err
|
|
1580
|
-
* @return {?}
|
|
1581
|
-
*/
|
|
1582
|
-
AdvancedTableComponent.prototype.toggleError = /**
|
|
1583
|
-
* @param {?=} err
|
|
1584
|
-
* @return {?}
|
|
1585
|
-
*/
|
|
1586
|
-
function (err) {
|
|
1587
|
-
if (this.dataTable && this.dataTable.context[0]) {
|
|
1588
|
-
/** @type {?} */
|
|
1589
|
-
var element = (this.errorTemplate && /** @type {?} */ (this.errorTemplate.nativeElement));
|
|
1590
|
-
/** @type {?} */
|
|
1591
|
-
var innerMessage = void 0;
|
|
1592
|
-
if (element) {
|
|
1593
|
-
innerMessage = element.getElementsByTagName('small').item(0);
|
|
1594
|
-
}
|
|
1595
|
-
if (err) {
|
|
1596
|
-
this.lastError = err;
|
|
1597
|
-
if (innerMessage) {
|
|
1598
|
-
innerMessage.innerHTML = err.error && err.error.message ? err.error.message : err.message;
|
|
1599
|
-
}
|
|
1600
|
-
this.dataTable.context[0].oLanguage.sEmptyTable =
|
|
1601
|
-
this.dataTable.context[0].oLanguage.sZeroRecords = this.errorTemplate && this.errorTemplate.nativeElement.innerHTML;
|
|
1602
|
-
}
|
|
1603
|
-
else {
|
|
1604
|
-
if (innerMessage) {
|
|
1605
|
-
innerMessage.innerHTML = '';
|
|
1606
|
-
}
|
|
1607
|
-
this.dataTable.context[0].oLanguage.sEmptyTable = this.dataTable.context[0].oLanguage.sZeroRecords = '';
|
|
1608
|
-
}
|
|
1609
|
-
}
|
|
1610
|
-
};
|
|
1611
|
-
/**
|
|
1612
|
-
* @return {?}
|
|
1613
|
-
*/
|
|
1614
|
-
AdvancedTableComponent.prototype.clearEmptyTable = /**
|
|
1615
|
-
* @return {?}
|
|
1616
|
-
*/
|
|
1617
|
-
function () {
|
|
1618
|
-
if (this.dataTable && this.dataTable.context[0]) {
|
|
1619
|
-
this.dataTable.context[0].oLanguage.sEmptyTable = this.dataTable.context[0].oLanguage.sZeroRecords = '';
|
|
1620
|
-
}
|
|
1621
|
-
};
|
|
1622
|
-
/**
|
|
1623
|
-
* @return {?}
|
|
1624
|
-
*/
|
|
1625
|
-
AdvancedTableComponent.prototype.export = /**
|
|
1626
|
-
* @return {?}
|
|
1627
|
-
*/
|
|
1628
|
-
function () {
|
|
1629
|
-
/** @type {?} */
|
|
1630
|
-
var element = /** @type {?} */ (document.querySelector('.dt-buttons .buttons-excel'));
|
|
1631
|
-
element.click();
|
|
1632
|
-
};
|
|
1633
|
-
/**
|
|
1634
|
-
* @param {?} columnsToShow
|
|
1635
|
-
* @return {?}
|
|
1636
|
-
*/
|
|
1637
|
-
AdvancedTableComponent.prototype.handleColumns = /**
|
|
1638
|
-
* @param {?} columnsToShow
|
|
1639
|
-
* @return {?}
|
|
1640
|
-
*/
|
|
1641
|
-
function (columnsToShow) {
|
|
1642
|
-
/** @type {?} */
|
|
1643
|
-
var table = this.dataTable;
|
|
1644
|
-
this.config.columns.slice(1).forEach(function (column, i) {
|
|
1645
|
-
if (!column.hidden) {
|
|
1646
|
-
if (columnsToShow.includes(column.name)) {
|
|
1647
|
-
// noinspection TypeScriptValidateJSTypes
|
|
1648
|
-
table.column(column.name + ':name').visible(true);
|
|
1649
|
-
}
|
|
1650
|
-
else {
|
|
1651
|
-
// noinspection TypeScriptValidateJSTypes
|
|
1652
|
-
table.column(column.name + ':name').visible(false);
|
|
1653
|
-
}
|
|
1654
|
-
}
|
|
1655
|
-
});
|
|
1656
|
-
};
|
|
1657
|
-
/**
|
|
1658
|
-
* @return {?}
|
|
1659
|
-
*/
|
|
1660
|
-
AdvancedTableComponent.prototype.getConfig = /**
|
|
1661
|
-
* @return {?}
|
|
1662
|
-
*/
|
|
1663
|
-
function () {
|
|
1664
|
-
return this.config;
|
|
1665
|
-
};
|
|
1666
|
-
/**
|
|
1667
|
-
* @param {?} changes
|
|
1668
|
-
* @return {?}
|
|
1669
|
-
*/
|
|
1670
|
-
AdvancedTableComponent.prototype.ngOnChanges = /**
|
|
1671
|
-
* @param {?} changes
|
|
1672
|
-
* @return {?}
|
|
1673
|
-
*/
|
|
1674
|
-
function (changes) {
|
|
1675
|
-
var _this = this;
|
|
1676
|
-
if (Object.prototype.hasOwnProperty.call(changes, 'configSrc')) {
|
|
1677
|
-
if (changes["configSrc"] != null) {
|
|
1678
|
-
// load table configuration on change
|
|
1679
|
-
// tslint:disable-next-line: triple-equals
|
|
1680
|
-
if (changes["configSrc"].currentValue && (changes["configSrc"].currentValue != changes["configSrc"].previousValue)) {
|
|
1681
|
-
this._http.get(changes["configSrc"].currentValue).toPromise().then(function (config) {
|
|
1682
|
-
// set configuration
|
|
1683
|
-
// set configuration
|
|
1684
|
-
_this.config = config;
|
|
1685
|
-
_this.destroy();
|
|
1686
|
-
// fetch and redraw
|
|
1687
|
-
// fetch and redraw
|
|
1688
|
-
_this.fetch();
|
|
1689
|
-
}).catch(function (err) {
|
|
1690
|
-
console.error('TABLES', 'An error occurred while loading table configuration.');
|
|
1691
|
-
console.error(err);
|
|
1692
|
-
});
|
|
1693
|
-
}
|
|
1694
|
-
}
|
|
1695
|
-
}
|
|
1696
|
-
};
|
|
1697
|
-
/**
|
|
1698
|
-
* @param {?=} load
|
|
1699
|
-
* @return {?}
|
|
1700
|
-
*/
|
|
1701
|
-
AdvancedTableComponent.prototype.reset = /**
|
|
1702
|
-
* @param {?=} load
|
|
1703
|
-
* @return {?}
|
|
1704
|
-
*/
|
|
1705
|
-
function (load) {
|
|
1706
|
-
this.query = undefined;
|
|
1707
|
-
this.destroy();
|
|
1708
|
-
this.autoLoad = !!load;
|
|
1709
|
-
this.ngOnInit();
|
|
1710
|
-
};
|
|
1711
|
-
/**
|
|
1712
|
-
* @return {?}
|
|
1713
|
-
*/
|
|
1714
|
-
AdvancedTableComponent.prototype.selectColumns = /**
|
|
1715
|
-
* @return {?}
|
|
1716
|
-
*/
|
|
1717
|
-
function () {
|
|
1718
|
-
var _this = this;
|
|
1719
|
-
/** @type {?} */
|
|
1720
|
-
var columnOrder = this.dataTable.colReorder.order();
|
|
1721
|
-
/** @type {?} */
|
|
1722
|
-
var columnDefs = this.dataTable.settings().init().columns;
|
|
1723
|
-
/** @type {?} */
|
|
1724
|
-
var columns = columnDefs.map(function (columnDef, i) {
|
|
1725
|
-
/** @type {?} */
|
|
1726
|
-
var key = "column-" + i;
|
|
1727
|
-
/** @type {?} */
|
|
1728
|
-
var title = columnDef.title;
|
|
1729
|
-
/** @type {?} */
|
|
1730
|
-
var index = columnOrder.indexOf(i);
|
|
1731
|
-
/** @type {?} */
|
|
1732
|
-
var visible = _this.dataTable.column(index).visible();
|
|
1733
|
-
// set title for select column
|
|
1734
|
-
if (i === 0 && _this.selectable) {
|
|
1735
|
-
title = '<' + _this._translateService.instant('Tables.SelectColumn') + '>';
|
|
1736
|
-
}
|
|
1737
|
-
// get column title
|
|
1738
|
-
if (title != null && title.length === 0) {
|
|
1739
|
-
title = undefined;
|
|
1740
|
-
}
|
|
1741
|
-
if (title == null) {
|
|
1742
|
-
/** @type {?} */
|
|
1743
|
-
var placeholder = void 0;
|
|
1744
|
-
if (_this.selectable) {
|
|
1745
|
-
if (i > 0) {
|
|
1746
|
-
placeholder = _this.config.columns[i - 1].placeholder;
|
|
1747
|
-
}
|
|
1748
|
-
}
|
|
1749
|
-
else {
|
|
1750
|
-
placeholder = _this.config.columns[i].placeholder;
|
|
1751
|
-
}
|
|
1752
|
-
if (placeholder != null) {
|
|
1753
|
-
title = '<' + _this._translateService.instant(placeholder) + '>';
|
|
1754
|
-
}
|
|
1755
|
-
}
|
|
1756
|
-
if (title == null) {
|
|
1757
|
-
title = '<' + _this._translateService.instant('Tables.UnknownColumn') + '>';
|
|
1758
|
-
}
|
|
1759
|
-
return {
|
|
1760
|
-
key: key,
|
|
1761
|
-
title: title,
|
|
1762
|
-
visible: visible,
|
|
1763
|
-
index: index
|
|
1764
|
-
};
|
|
1765
|
-
});
|
|
1766
|
-
this._columnSelector.selectColumns(columns).then(function (event) {
|
|
1767
|
-
if (event.result === 'ok') {
|
|
1768
|
-
/** @type {?} */
|
|
1769
|
-
var sorted = (/** @type {?} */ (event.columns))
|
|
1770
|
-
.map(function (col) {
|
|
1771
|
-
return {
|
|
1772
|
-
key: col.key,
|
|
1773
|
-
index: col.index
|
|
1774
|
-
};
|
|
1775
|
-
})
|
|
1776
|
-
.sort(function (a, b) { return a.index - b.index; });
|
|
1777
|
-
/** @type {?} */
|
|
1778
|
-
var indexes = sorted
|
|
1779
|
-
.map(function (item) {
|
|
1780
|
-
return (/** @type {?} */ (event.columns)).findIndex(function (next) { return item.key === next.key; });
|
|
1781
|
-
});
|
|
1782
|
-
// reset column visibilty
|
|
1783
|
-
for (var index = 0; index < (/** @type {?} */ (event.columns)).length; index++) {
|
|
1784
|
-
/** @type {?} */
|
|
1785
|
-
var element = (/** @type {?} */ (event.columns))[index];
|
|
1786
|
-
/** @type {?} */
|
|
1787
|
-
var colIndex = columnOrder.indexOf(index);
|
|
1788
|
-
// set visibilty with redraw (=true)
|
|
1789
|
-
// set visibilty with redraw (=true)
|
|
1790
|
-
_this.dataTable.column(colIndex).visible(element.visible, true);
|
|
1791
|
-
}
|
|
1792
|
-
// finally apply column order
|
|
1793
|
-
// finally apply column order
|
|
1794
|
-
_this.dataTable.colReorder.order(indexes, true);
|
|
1795
|
-
// simply redraw the table
|
|
1796
|
-
// simply redraw the table
|
|
1797
|
-
_this.dataTable.draw();
|
|
1798
|
-
}
|
|
1799
|
-
});
|
|
1800
|
-
};
|
|
1801
|
-
/**
|
|
1802
|
-
*
|
|
1803
|
-
* @param {?=} options to pass an errorHandler callback, if desired
|
|
1804
|
-
* @return {?} void
|
|
1805
|
-
*/
|
|
1806
|
-
AdvancedTableComponent.prototype.exportView = /**
|
|
1807
|
-
*
|
|
1808
|
-
* @param {?=} options to pass an errorHandler callback, if desired
|
|
1809
|
-
* @return {?} void
|
|
1810
|
-
*/
|
|
1811
|
-
function (options) {
|
|
1812
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
1813
|
-
var exportSettings, exportLimit, totalDisplayedItems, _a, body, header, previousDataState, targetDataState, _b, body, header, err_1;
|
|
1814
|
-
return tslib_1.__generator(this, function (_c) {
|
|
1815
|
-
switch (_c.label) {
|
|
1816
|
-
case 0:
|
|
1817
|
-
_c.trys.push([0, 4, 5, 6]);
|
|
1818
|
-
this._loading.showLoading();
|
|
1819
|
-
// validate query items and config
|
|
1820
|
-
if (!(this.lastQuery && this._lastQueryTotalItems && this.config)) {
|
|
1821
|
-
// do nothing
|
|
1822
|
-
return [2 /*return*/];
|
|
1823
|
-
}
|
|
1824
|
-
exportSettings = /** @type {?} */ (this._configuration.settings);
|
|
1825
|
-
exportLimit = (exportSettings && exportSettings.tables && exportSettings.tables.exportLimit && exportSettings.tables.exportLimit > 0)
|
|
1826
|
-
? exportSettings.tables.exportLimit : MAX_EXPORT_ITEMS;
|
|
1827
|
-
// and validate it
|
|
1828
|
-
if (this._lastQueryTotalItems > exportLimit) {
|
|
1829
|
-
// call error handler
|
|
1830
|
-
// provide a recognizible error type
|
|
1831
|
-
if (options && options.errorHandler) {
|
|
1832
|
-
options.errorHandler(new ExportLimitExceededError('Export limit exceeded'));
|
|
1833
|
-
return [2 /*return*/];
|
|
1834
|
-
}
|
|
1835
|
-
// or show warning modal and exit
|
|
1836
|
-
this._modalService.showWarningDialog(this._translateService.instant('Tables.ExportList'), this._translateService.instant('Tables.ExportLimitExceeded', { dataLength: this._lastQueryTotalItems, exportLimit: exportLimit }), DIALOG_BUTTONS.Ok);
|
|
1837
|
-
return [2 /*return*/];
|
|
1838
|
-
}
|
|
1839
|
-
totalDisplayedItems = Array.from(this.dataTable.context[0].aiDisplay).length;
|
|
1840
|
-
if (!(totalDisplayedItems === this._lastQueryTotalItems)) return [3 /*break*/, 1];
|
|
1841
|
-
_a = this.getExportableData(), body = _a.body, header = _a.header;
|
|
1842
|
-
// and export them to excel
|
|
1843
|
-
this._exportSpreadsheet.export(body, this._translateService.instant(this.config.title || 'Tables.ExportResults') + ".xlsx", {
|
|
1844
|
-
header: header,
|
|
1845
|
-
skipHeader: false
|
|
1846
|
-
});
|
|
1847
|
-
return [3 /*break*/, 3];
|
|
1848
|
-
case 1:
|
|
1849
|
-
previousDataState = this.dataTable.rows().data().toArray();
|
|
1850
|
-
return [4 /*yield*/, this.lastQuery.take(exportLimit).getItems()];
|
|
1851
|
-
case 2:
|
|
1852
|
-
targetDataState = _c.sent();
|
|
1853
|
-
// change table data on the fly, but do not redraw
|
|
1854
|
-
this.dataTable.clear().rows.add(targetDataState);
|
|
1855
|
-
_b = this.getExportableData(), body = _b.body, header = _b.header;
|
|
1856
|
-
// reset table data
|
|
1857
|
-
this.dataTable.clear().rows.add(previousDataState);
|
|
1858
|
-
// and export target data to excel
|
|
1859
|
-
this._exportSpreadsheet.export(body, this._translateService.instant(this.config.title || 'Tables.ExportResults') + ".xlsx", {
|
|
1860
|
-
header: header,
|
|
1861
|
-
skipHeader: false
|
|
1862
|
-
});
|
|
1863
|
-
_c.label = 3;
|
|
1864
|
-
case 3:
|
|
1865
|
-
// exit
|
|
1866
|
-
return [2 /*return*/];
|
|
1867
|
-
case 4:
|
|
1868
|
-
err_1 = _c.sent();
|
|
1869
|
-
// log error
|
|
1870
|
-
console.error(err_1);
|
|
1871
|
-
// call error handler, if defined
|
|
1872
|
-
if (options && options.errorHandler) {
|
|
1873
|
-
options.errorHandler(err_1);
|
|
1874
|
-
}
|
|
1875
|
-
else {
|
|
1876
|
-
// use default error service
|
|
1877
|
-
this._errorService.showError(err_1, {
|
|
1878
|
-
continueLink: '.'
|
|
1879
|
-
});
|
|
1880
|
-
}
|
|
1881
|
-
return [3 /*break*/, 6];
|
|
1882
|
-
case 5:
|
|
1883
|
-
this._loading.hideLoading();
|
|
1884
|
-
return [7 /*endfinally*/];
|
|
1885
|
-
case 6: return [2 /*return*/];
|
|
1886
|
-
}
|
|
1887
|
-
});
|
|
1888
|
-
});
|
|
1889
|
-
};
|
|
1890
|
-
/**
|
|
1891
|
-
* @return {?}
|
|
1892
|
-
*/
|
|
1893
|
-
AdvancedTableComponent.prototype.getExportableData = /**
|
|
1894
|
-
* @return {?}
|
|
1895
|
-
*/
|
|
1896
|
-
function () {
|
|
1897
|
-
var _this = this;
|
|
1898
|
-
if (!(this.dataTable && this.dataTable.buttons
|
|
1899
|
-
&& typeof this.dataTable.buttons.exportData === 'function' && this.config)) {
|
|
1900
|
-
return { body: [], header: [] };
|
|
1901
|
-
}
|
|
1902
|
-
var _a = this.dataTable.buttons.exportData(), body = _a.body, header = _a.header;
|
|
1903
|
-
/** @type {?} */
|
|
1904
|
-
var cleanupIndexes = [];
|
|
1905
|
-
// clean up headers
|
|
1906
|
-
header = header.filter(function (headerItem, index) {
|
|
1907
|
-
// exclude empty headers
|
|
1908
|
-
if (headerItem.trim().length === 0) {
|
|
1909
|
-
cleanupIndexes.push(index);
|
|
1910
|
-
return false;
|
|
1911
|
-
}
|
|
1912
|
-
// exclude hidden columns
|
|
1913
|
-
// note: use the datatable visible() function
|
|
1914
|
-
// instead of the hidden config property, to satisfy the column selector
|
|
1915
|
-
if (!_this.dataTable.column(index).visible()) {
|
|
1916
|
-
cleanupIndexes.push(index);
|
|
1917
|
-
return false;
|
|
1918
|
-
}
|
|
1919
|
-
return true;
|
|
1920
|
-
});
|
|
1921
|
-
// clean up body
|
|
1922
|
-
body = body.map(function (row) {
|
|
1923
|
-
return row.filter(function (_, rowIndex) {
|
|
1924
|
-
return cleanupIndexes.indexOf(rowIndex) === -1;
|
|
1925
|
-
});
|
|
1926
|
-
});
|
|
1927
|
-
return { body: body, header: header };
|
|
1928
|
-
};
|
|
1929
|
-
AdvancedTableComponent.decorators = [
|
|
1930
|
-
{ type: Component, args: [{
|
|
1931
|
-
// tslint:disable-next-line: component-selector
|
|
1932
|
-
selector: 'app-advanced-table',
|
|
1933
|
-
template: "\n <table #table class=\"dataTable\">\n </table>\n <div #emptyTable class=\"d-none\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n <div #errorTemplate class=\"d-none error-message\">\n <div class=\"text-center\">\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-danger border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-secondary\" [translate]=\"'Tables.DataError.Title'\"></h4>\n <p class=\"font-lg text-secondary mb-1\" [translate]=\"'Tables.DataError.Message'\"></p>\n <p class=\"font-lg text-secondary error-inner-message\">\n <small></small>\n </p>\n </div>\n </div>\n </div>\n ",
|
|
1934
|
-
encapsulation: ViewEncapsulation.None,
|
|
1935
|
-
styles: ["table.dataTable thead .sorting{background-image:none}table.dataTable thead .sorting_asc{background-position:95% 60%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAsSAAALEgHS3X78AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAEtJREFUKJFjYBgywAOKMQALFjE/BgaGTCibjYGBYRM+kz0ZGBh2MTAw8DAwMHAxMDBsY2BgCCBGMQzg1IRNMV5NuVAJXIALqmYwAgBBkAlPRCLcLwAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc{background-position:95% 60%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAArzAAAK8wHvFRX1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAFNJREFUKJHVzTEKgDAQRNGHZfBg2sSTeDMLKwXPYuVJbBKQQEyrH6bZ+cPyWWaElz4kR5cOJ1b0FXnBVRYjjmIUsGGqvX6OmnImYk+JLTkzpPyBGwrtCvfBe56nAAAAAElFTkSuQmCC)}table.dataTable thead th{color:#73818e;font-size:.75rem;font-weight:600;padding-top:16px;padding-bottom:4px;border-bottom:none;padding-left:8px}table.dataTable tbody tr:first-child td:first-child{border-radius:6px 0}table.dataTable tbody tr:first-child td:last-child{border-radius:0 6px}table.dataTable tbody tr{border-radius:6px}table.dataTable tbody tr td:first-child{border-left:1px solid #c2cfd6}table.dataTable tbody tr td:last-child{border-right:1px solid #c2cfd6}table.dataTable tbody tr td{padding-top:8px;padding-bottom:8px;border-top:1px solid #c2cfd6}table.dataTable tbody tr:last-child td:first-child{border-radius:0 0 0 6px}table.dataTable tbody tr:last-child td:last-child{border-radius:0 0 6px}table.dataTable tbody tr:last-child td{border-bottom:1px solid #c2cfd6}table.dataTable td.dataTables_empty{border:none!important}table.dataTable .error-inner-message>small{overflow-wrap:break-word}table.dataTable.no-footer{border-bottom:none}.dataTables_paginate .btn.previous{margin-right:8px}.dataTables_paginate .btn.next{margin-left:8px}.dataTables_info,.dataTables_paginate{margin-top:1rem}.dataTables_paginate span .btn{border-radius:1.5rem}.dataTables_filter{display:none}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:0;overflow:auto}.dataTables_paginate{display:none}.dataTable.processing{opacity:15%}.dataTables_wrapper .dataTables_processing{background:0 0;position:absolute;display:inline-block;top:25%;z-index:5;color:#73818e}.text-decoration-line-through{text-decoration:line-through!important}tr.removed .checkbox+label{visibility:hidden}"]
|
|
1936
|
-
}] }
|
|
1937
|
-
];
|
|
1938
|
-
/** @nocollapse */
|
|
1939
|
-
AdvancedTableComponent.ctorParameters = function () { return [
|
|
1940
|
-
{ type: AngularDataContext },
|
|
1941
|
-
{ type: undefined, decorators: [{ type: Inject, args: [COLUMN_FORMATTERS,] }] },
|
|
1942
|
-
{ type: ActivatedRoute },
|
|
1943
|
-
{ type: TranslateService },
|
|
1944
|
-
{ type: Injector },
|
|
1945
|
-
{ type: AdvancedFilterValueProvider },
|
|
1946
|
-
{ type: ElementRef },
|
|
1947
|
-
{ type: TemplatePipe },
|
|
1948
|
-
{ type: LoadingService },
|
|
1949
|
-
{ type: HttpClient },
|
|
1950
|
-
{ type: ColumnSelectorService },
|
|
1951
|
-
{ type: ConfigurationService },
|
|
1952
|
-
{ type: ExportSpreadsheetService },
|
|
1953
|
-
{ type: ModalService },
|
|
1954
|
-
{ type: ErrorService }
|
|
1955
|
-
]; };
|
|
1956
|
-
AdvancedTableComponent.propDecorators = {
|
|
1957
|
-
table: [{ type: ViewChild, args: ['table',] }],
|
|
1958
|
-
emptyTable: [{ type: ViewChild, args: ['emptyTable',] }],
|
|
1959
|
-
errorTemplate: [{ type: ViewChild, args: ['errorTemplate',] }],
|
|
1960
|
-
loadingTable: [{ type: ViewChild, args: ['loadingTable',] }],
|
|
1961
|
-
height: [{ type: Input }],
|
|
1962
|
-
showActions: [{ type: Input }],
|
|
1963
|
-
autoLoad: [{ type: Input }],
|
|
1964
|
-
load: [{ type: Output, args: ['load',] }],
|
|
1965
|
-
init: [{ type: Output, args: ['init',] }],
|
|
1966
|
-
reload: [{ type: Input, args: ['reload',] }],
|
|
1967
|
-
select: [{ type: Output, args: ['select',] }],
|
|
1968
|
-
draw: [{ type: Output, args: ['draw',] }],
|
|
1969
|
-
page: [{ type: Output, args: ['page',] }],
|
|
1970
|
-
order: [{ type: Output, args: ['order',] }],
|
|
1971
|
-
scroll: [{ type: Output, args: ['scroll',] }],
|
|
1972
|
-
selectedItems: [{ type: Output, args: ['selectedItems',] }],
|
|
1973
|
-
loading: [{ type: Output, args: ['loading',] }],
|
|
1974
|
-
scrollable: [{ type: Input }],
|
|
1975
|
-
serverSide: [{ type: Input }],
|
|
1976
|
-
lengthMenu: [{ type: Input }],
|
|
1977
|
-
paging: [{ type: Input }],
|
|
1978
|
-
pageLength: [{ type: Input }],
|
|
1979
|
-
columnOrdering: [{ type: Input }],
|
|
1980
|
-
stateSave: [{ type: Input }],
|
|
1981
|
-
stateLoadCallback: [{ type: Input }],
|
|
1982
|
-
stateSaveCallback: [{ type: Input }],
|
|
1983
|
-
scrollY: [{ type: Input }],
|
|
1984
|
-
scrollX: [{ type: Input }],
|
|
1985
|
-
selectable: [{ type: Input }],
|
|
1986
|
-
multipleSelect: [{ type: Input }],
|
|
1987
|
-
customSelect: [{ type: Input }],
|
|
1988
|
-
selected: [{ type: Input }],
|
|
1989
|
-
configSrc: [{ type: Input }],
|
|
1990
|
-
config: [{ type: Input, args: ['config',] }],
|
|
1991
|
-
showFooter: [{ type: Input, args: ['showFooter',] }],
|
|
1992
|
-
showHeader: [{ type: Input, args: ['showHeader',] }],
|
|
1993
|
-
showPaging: [{ type: Input, args: ['showPaging',] }],
|
|
1994
|
-
query: [{ type: Input, args: ['query',] }]
|
|
1995
|
-
};
|
|
1996
|
-
return AdvancedTableComponent;
|
|
1997
|
-
}());
|
|
1998
|
-
export { AdvancedTableComponent };
|
|
1999
|
-
if (false) {
|
|
2000
|
-
/** @type {?} */
|
|
2001
|
-
AdvancedTableComponent.prototype._query;
|
|
2002
|
-
/** @type {?} */
|
|
2003
|
-
AdvancedTableComponent.prototype._config;
|
|
2004
|
-
/** @type {?} */
|
|
2005
|
-
AdvancedTableComponent.prototype._firstLoad;
|
|
2006
|
-
/** @type {?} */
|
|
2007
|
-
AdvancedTableComponent.prototype._showFooter;
|
|
2008
|
-
/** @type {?} */
|
|
2009
|
-
AdvancedTableComponent.prototype._showHeader;
|
|
2010
|
-
/** @type {?} */
|
|
2011
|
-
AdvancedTableComponent.prototype._showPaging;
|
|
2012
|
-
/** @type {?} */
|
|
2013
|
-
AdvancedTableComponent.prototype._id;
|
|
2014
|
-
/** @type {?} */
|
|
2015
|
-
AdvancedTableComponent.prototype.smartSelect;
|
|
2016
|
-
/** @type {?} */
|
|
2017
|
-
AdvancedTableComponent.prototype.configChanges;
|
|
2018
|
-
/** @type {?} */
|
|
2019
|
-
AdvancedTableComponent.prototype.table;
|
|
2020
|
-
/** @type {?} */
|
|
2021
|
-
AdvancedTableComponent.prototype.emptyTable;
|
|
2022
|
-
/** @type {?} */
|
|
2023
|
-
AdvancedTableComponent.prototype.errorTemplate;
|
|
2024
|
-
/** @type {?} */
|
|
2025
|
-
AdvancedTableComponent.prototype.loadingTable;
|
|
2026
|
-
/** @type {?} */
|
|
2027
|
-
AdvancedTableComponent.prototype.height;
|
|
2028
|
-
/** @type {?} */
|
|
2029
|
-
AdvancedTableComponent.prototype.showActions;
|
|
2030
|
-
/** @type {?} */
|
|
2031
|
-
AdvancedTableComponent.prototype.autoLoad;
|
|
2032
|
-
/** @type {?} */
|
|
2033
|
-
AdvancedTableComponent.prototype.load;
|
|
2034
|
-
/** @type {?} */
|
|
2035
|
-
AdvancedTableComponent.prototype.init;
|
|
2036
|
-
/** @type {?} */
|
|
2037
|
-
AdvancedTableComponent.prototype.reload;
|
|
2038
|
-
/** @type {?} */
|
|
2039
|
-
AdvancedTableComponent.prototype.select;
|
|
2040
|
-
/** @type {?} */
|
|
2041
|
-
AdvancedTableComponent.prototype.draw;
|
|
2042
|
-
/** @type {?} */
|
|
2043
|
-
AdvancedTableComponent.prototype.page;
|
|
2044
|
-
/** @type {?} */
|
|
2045
|
-
AdvancedTableComponent.prototype.order;
|
|
2046
|
-
/** @type {?} */
|
|
2047
|
-
AdvancedTableComponent.prototype.scroll;
|
|
2048
|
-
/** @type {?} */
|
|
2049
|
-
AdvancedTableComponent.prototype.selectedItems;
|
|
2050
|
-
/** @type {?} */
|
|
2051
|
-
AdvancedTableComponent.prototype.loading;
|
|
2052
|
-
/** @type {?} */
|
|
2053
|
-
AdvancedTableComponent.prototype.scrollable;
|
|
2054
|
-
/** @type {?} */
|
|
2055
|
-
AdvancedTableComponent.prototype.serverSide;
|
|
2056
|
-
/** @type {?} */
|
|
2057
|
-
AdvancedTableComponent.prototype.lengthMenu;
|
|
2058
|
-
/** @type {?} */
|
|
2059
|
-
AdvancedTableComponent.prototype.paging;
|
|
2060
|
-
/** @type {?} */
|
|
2061
|
-
AdvancedTableComponent.prototype.pageLength;
|
|
2062
|
-
/** @type {?} */
|
|
2063
|
-
AdvancedTableComponent.prototype.columnOrdering;
|
|
2064
|
-
/** @type {?} */
|
|
2065
|
-
AdvancedTableComponent.prototype.stateSave;
|
|
2066
|
-
/** @type {?} */
|
|
2067
|
-
AdvancedTableComponent.prototype.stateLoadCallback;
|
|
2068
|
-
/** @type {?} */
|
|
2069
|
-
AdvancedTableComponent.prototype.stateSaveCallback;
|
|
2070
|
-
/** @type {?} */
|
|
2071
|
-
AdvancedTableComponent.prototype.scrollY;
|
|
2072
|
-
/** @type {?} */
|
|
2073
|
-
AdvancedTableComponent.prototype.scrollX;
|
|
2074
|
-
/**
|
|
2075
|
-
* Enables row selection. The defaulr value is false
|
|
2076
|
-
* @type {?}
|
|
2077
|
-
*/
|
|
2078
|
-
AdvancedTableComponent.prototype.selectable;
|
|
2079
|
-
/**
|
|
2080
|
-
* Enables or disable multiple selection. The default values is true.
|
|
2081
|
-
* @type {?}
|
|
2082
|
-
*/
|
|
2083
|
-
AdvancedTableComponent.prototype.multipleSelect;
|
|
2084
|
-
/**
|
|
2085
|
-
* Enables custom selection and hides select column. The default value is false
|
|
2086
|
-
* @type {?}
|
|
2087
|
-
*/
|
|
2088
|
-
AdvancedTableComponent.prototype.customSelect;
|
|
2089
|
-
/** @type {?} */
|
|
2090
|
-
AdvancedTableComponent.prototype.selected;
|
|
2091
|
-
/** @type {?} */
|
|
2092
|
-
AdvancedTableComponent.prototype.unselected;
|
|
2093
|
-
/**
|
|
2094
|
-
* Gets or sets a URL to load table configuration from
|
|
2095
|
-
* @type {?}
|
|
2096
|
-
*/
|
|
2097
|
-
AdvancedTableComponent.prototype.configSrc;
|
|
2098
|
-
/** @type {?} */
|
|
2099
|
-
AdvancedTableComponent.prototype.lastError;
|
|
2100
|
-
/** @type {?} */
|
|
2101
|
-
AdvancedTableComponent.prototype.translator;
|
|
2102
|
-
/** @type {?} */
|
|
2103
|
-
AdvancedTableComponent.prototype.dataTable;
|
|
2104
|
-
/** @type {?} */
|
|
2105
|
-
AdvancedTableComponent.prototype.dtOptions;
|
|
2106
|
-
/** @type {?} */
|
|
2107
|
-
AdvancedTableComponent.prototype.lastQueryParams;
|
|
2108
|
-
/** @type {?} */
|
|
2109
|
-
AdvancedTableComponent.prototype._lastQueryTotalItems;
|
|
2110
|
-
/** @type {?} */
|
|
2111
|
-
AdvancedTableComponent.prototype.reloadSubscription;
|
|
2112
|
-
/** @type {?} */
|
|
2113
|
-
AdvancedTableComponent.prototype._context;
|
|
2114
|
-
/** @type {?} */
|
|
2115
|
-
AdvancedTableComponent.prototype._columnFormatters;
|
|
2116
|
-
/** @type {?} */
|
|
2117
|
-
AdvancedTableComponent.prototype._activatedRoute;
|
|
2118
|
-
/** @type {?} */
|
|
2119
|
-
AdvancedTableComponent.prototype._translateService;
|
|
2120
|
-
/** @type {?} */
|
|
2121
|
-
AdvancedTableComponent.prototype._injector;
|
|
2122
|
-
/** @type {?} */
|
|
2123
|
-
AdvancedTableComponent.prototype._advancedFilterValueProvider;
|
|
2124
|
-
/** @type {?} */
|
|
2125
|
-
AdvancedTableComponent.prototype._element;
|
|
2126
|
-
/** @type {?} */
|
|
2127
|
-
AdvancedTableComponent.prototype._template;
|
|
2128
|
-
/** @type {?} */
|
|
2129
|
-
AdvancedTableComponent.prototype._loading;
|
|
2130
|
-
/** @type {?} */
|
|
2131
|
-
AdvancedTableComponent.prototype._http;
|
|
2132
|
-
/** @type {?} */
|
|
2133
|
-
AdvancedTableComponent.prototype._columnSelector;
|
|
2134
|
-
/** @type {?} */
|
|
2135
|
-
AdvancedTableComponent.prototype._configuration;
|
|
2136
|
-
/** @type {?} */
|
|
2137
|
-
AdvancedTableComponent.prototype._exportSpreadsheet;
|
|
2138
|
-
/** @type {?} */
|
|
2139
|
-
AdvancedTableComponent.prototype._modalService;
|
|
2140
|
-
/** @type {?} */
|
|
2141
|
-
AdvancedTableComponent.prototype._errorService;
|
|
2142
|
-
}
|
|
2143
|
-
export { ɵ0 };
|
|
2144
|
-
|
|
2145
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVuaXZlcnNpcy9uZ3gtdGFibGVzLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUFFLFlBQVksRUFDeEIsTUFBTSxFQUNOLGNBQWMsRUFDZCxRQUFRLEVBQ1IsS0FBSyxFQUNHLE1BQU0sRUFDZCxTQUFTLEVBQ1QsaUJBQWlCLEVBR2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHL0MsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDckYsT0FBTyxFQUFlLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFDeEQsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsd0JBQXdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUdqRyxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBNEIsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7QUFHL0YsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7QUFPdkIsSUFBTSxhQUFhLEdBQVEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO0FBQ25ELGFBQWEsQ0FBQyxRQUFRLENBQUUsY0FBYyxFQUFFLFVBQVUsSUFBUztJQUN2RCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFVBQUUsR0FBUTtRQUNwQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFFLEdBQUcsRUFBRSxJQUFJLENBQUUsQ0FBQztLQUM5QyxDQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7U0FLSyxFQUFFOztBQUhWLElBQU0sYUFBYSxHQUFHO0lBQ3BCLFlBQVksRUFBRSxDQUFDO0lBQ2YsZUFBZSxFQUFFLENBQUM7SUFDbEIsSUFBSSxJQUFJO0NBQ1QsQ0FBQztBQUVGLElBQUE7SUFBNkMsMERBQWlCOzs7Ozs7O0lBQ3JELHVEQUFjOzs7Ozs7OztJQUdkLCtDQUFNOzs7Ozs7OztJQUdOLHNEQUFhOzs7Ozs7OztJQUdiLHFEQUFZOzs7Ozs7OztJQUdaLGlEQUFROzs7Ozt5Q0F2RWpCO0VBMEQ2QyxpQkFBaUIsRUFnQjdELENBQUE7O0FBRUQsV0FBVyxpQkFBaUIsR0FBRyxJQUFJLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXZFLElBQUE7SUFBOEMsb0RBQVU7SUFDdEQsa0NBQVksT0FBZTtRQUEzQixZQUNFLGtCQUFNLE9BQU8sQ0FBQyxTQUVmO1FBREMsS0FBSSxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQzs7S0FDeEM7bUNBbEZIO0VBOEU4QyxVQUFVLEVBS3ZELENBQUE7QUFMRCxvQ0FLQztBQUVELElBQUE7SUFBOEIsMkNBQXVCO0lBQ25ELHlCQUFzQixRQUFrQjtRQUF4QyxZQUNFLGlCQUFPLFNBQ1I7UUFGcUIsY0FBUSxHQUFSLFFBQVEsQ0FBVTtzQkFjekIsRUFBRTs7S0FaaEI7Ozs7Ozs7O0lBY00sZ0NBQU07Ozs7Ozs7Y0FBQyxJQUFTLEVBQUUsSUFBUyxFQUFFLEdBQVEsRUFBRSxJQUFTOzs7MEJBdEd6RDtFQXFGOEIsdUJBQXVCLEVBb0JwRCxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVELG1CQUFzQixLQUFVO0lBQzlCLE9BQU8sS0FBSyxDQUFDO0NBQ2Q7QUFFRCxJQUFBOzs7Ozs7OztJQUNnQiwrQkFBSTs7Ozs7Y0FBQyxLQUFVLEVBQUUsS0FBZTtRQUM1QyxJQUFJLEtBQUssRUFBRTtZQUNULE9BQU8sU0FBUyxDQUFxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsT0FBTyxTQUFTLENBQXFCLEtBQUssQ0FBQyxDQUFDOztxQ0FwSGhEO0lBc0hDLENBQUE7QUFQRCxzQ0FPQzs7OztBQUVEO0lBQ0UsT0FBTyxDQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3ZDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ2hCOztJQStOQyxnQ0FBb0IsUUFBNEIsRUFDRCxpQkFBMkMsRUFDdEUsaUJBQ0EsbUJBQ0EsV0FDQSw4QkFDQSxVQUNBLFdBQ0EsVUFDQSxPQUNBLGlCQUNBLGdCQUNBLG9CQUNBLGVBQ0E7UUFkcEIsaUJBc0JDO1FBdEJtQixhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUNELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBMEI7UUFDdEUsb0JBQWUsR0FBZixlQUFlO1FBQ2Ysc0JBQWlCLEdBQWpCLGlCQUFpQjtRQUNqQixjQUFTLEdBQVQsU0FBUztRQUNULGlDQUE0QixHQUE1Qiw0QkFBNEI7UUFDNUIsYUFBUSxHQUFSLFFBQVE7UUFDUixjQUFTLEdBQVQsU0FBUztRQUNULGFBQVEsR0FBUixRQUFRO1FBQ1IsVUFBSyxHQUFMLEtBQUs7UUFDTCxvQkFBZSxHQUFmLGVBQWU7UUFDZixtQkFBYyxHQUFkLGNBQWM7UUFDZCx1QkFBa0IsR0FBbEIsa0JBQWtCO1FBQ2xCLGtCQUFhLEdBQWIsYUFBYTtRQUNiLGtCQUFhLEdBQWIsYUFBYTswQkFwTVosSUFBSTsyQkFDSCxLQUFLOzJCQUNMLElBQUk7MkJBQ0osS0FBSzttQkFDYixtQkFBbUIsRUFBRTsyQkFDZCxLQUFLOzZCQUNILElBQUksZUFBZSxDQUFNLElBQUksQ0FBQztzQkFNNUIsR0FBRzsyQkFDRSxJQUFJO3dCQUNQLElBQUk7b0JBQ3NDLElBQUksWUFBWSxFQUEyQjtvQkFDL0QsSUFBSSxZQUFZLEVBQU87c0JBQ3BCLElBQUksWUFBWSxFQUFPO3NCQUN0QixJQUFJLFlBQVksRUFBTztvQkFDM0IsSUFBSSxZQUFZLEVBQU87b0JBQ3ZCLElBQUksWUFBWSxFQUFPO3FCQUNqQixJQUFJLFlBQVksRUFBVztzQkFDSCxJQUFJLFlBQVksRUFBaUM7NkJBQzdELElBQUksWUFBWSxFQUFPO3VCQUdyRixJQUFJLFlBQVksRUFFakI7MEJBRXlCLElBQUk7MEJBQ0osSUFBSTswQkFDSixDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztzQkFDdkIsSUFBSTswQkFDQSxFQUFFOzhCQUNFLEtBQUs7eUJBQ1YsS0FBSzt1QkFJUCxHQUFHO3VCQUNILElBQUk7Ozs7MEJBSW9CLEtBQUs7Ozs7OEJBSUQsSUFBSTs7Ozs0QkFJM0IsS0FBSzt3QkFDRixFQUFFOzBCQUNULEVBQUU7b0NBNEhFLENBQUM7O1FBbUI5QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLDhCQUE4QixFQUFFLENBQUMsQ0FBQztRQUNsRyxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxlQUFlLENBQUM7UUFDcEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQUMsSUFBSTtZQUNuRCxLQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZCxDQUFDLENBQUM7S0FDSjtJQTNJRCxzQkFDVywwQ0FBTTs7Ozs7WUFPZix5QkFBTyxJQUFJLENBQUMsT0FBNkIsRUFBQzs7UUFYNUM7O1dBRUc7Ozs7OztRQUNILFVBQ2tCLEtBQXlCO1lBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDOztZQUVyQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdkM7OztPQUFBOzBCQU1VLHVEQUFtQjs7Ozs7WUFDNUIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7Ozs7O0lBTW5DLHNCQUNXLDhDQUFVOzs7OztZQWtCbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDOztRQXRCMUI7O1dBRUc7Ozs7OztRQUNILFVBQ3NCLEtBQWM7WUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O1lBRXpCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRTs7Z0JBQ2hELElBQU0sT0FBTyxHQUFHLG1CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBK0IsRUFBQztxQkFDN0QsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3JDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtvQkFDbkIsT0FBTztpQkFDUjtnQkFDRCxJQUFJLEtBQUssRUFBRTtvQkFDVCxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDcEM7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ2pDO2FBQ0Y7U0FDRjs7O09BQUE7SUFTQSxzQkFDVyw4Q0FBVTs7Ozs7WUEwQm5CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQzs7UUE5QjNCOztXQUVHOzs7Ozs7UUFDRixVQUNzQixLQUFjO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDOztZQUV6QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7O2dCQUNoRCxJQUFNLE9BQU8sR0FBRyxtQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQStCLEVBQUM7cUJBQzdELGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7b0JBQ25CLE9BQU87aUJBQ1I7O2dCQUNELElBQU0sU0FBUyxHQUFHLG1CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBK0IsRUFBQyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDL0YsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO29CQUN0QixPQUFPO2lCQUNQO2dCQUNELElBQUksS0FBSyxFQUFFO29CQUNULE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztvQkFFbkMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3BDO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztvQkFFaEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ2pDO2FBQ0Y7U0FDRjs7O09BQUE7SUFTRixzQkFDVyw4Q0FBVTs7Ozs7WUFrQm5CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQzs7UUF0QjFCOztXQUVHOzs7Ozs7UUFDSCxVQUNzQixLQUFjO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDOztZQUV6QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7O2dCQUNoRCxJQUFNLE9BQU8sR0FBRyxtQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQStCLEVBQUM7cUJBQzdELGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7b0JBQ25CLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUN4QjtxQkFBTTtvQkFDTCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3hCO2FBQ0Y7U0FDRjs7O09BQUE7SUFTRCxzQkFDVyx5Q0FBSzs7Ozs7WUFLZCx5QkFBTyxJQUFJLENBQUMsTUFBNkIsRUFBQzs7UUFUNUM7O1dBRUc7Ozs7OztRQUNILFVBQ2lCLEtBQXNDO1lBQ3JELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3JCOzs7T0FBQTs7Ozs7SUFzQ00sdUNBQU07Ozs7Y0FBQyxVQUFVOztRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTs7Z0JBRTlDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO3dCQUNyRCxJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO3FCQUN2QyxDQUFDLENBQUMsQ0FBQztpQkFDUDtxQkFBTTs7b0JBRUwsSUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7b0JBRXBDLElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBQyxJQUFJO3dCQUM1QixPQUFPLEtBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxtQkFBQyxDQUFDLEtBQUksQ0FBQyxNQUFNLElBQUksS0FBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBVyxHQUFFOzRCQUN2RixJQUFJLEVBQUUsSUFBSTt5QkFDWCxDQUFDLENBQUM7cUJBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs7b0JBRWpCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDeEM7YUFDRjtpQkFBTTs7Z0JBRUwsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3RDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN2QjthQUFNOztZQUVMLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7WUFFdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7O1lBRWhELElBQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7O1lBRWhFLElBQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7O1lBRXZDLElBQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7O1lBRXBDLElBQU0sTUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDOztZQUN0RCxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsTUFBSSxtQkFBUyxLQUFLLEVBQUMsRUFBbkIsQ0FBbUIsQ0FBQyxDQUFDOztZQUV2RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDYixJQUFJLEVBQUUsSUFBSTtnQkFDVixlQUFlLEVBQUUsZUFBZTtnQkFDaEMsWUFBWSxFQUFFLFlBQVk7YUFDM0IsQ0FBQyxDQUFDO1NBQ0o7Ozs7OztJQUdJLHNDQUFLOzs7O2NBQUMsYUFBdUI7O1FBRWxDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7O1lBRTFCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3hCOztRQUVELElBQUksYUFBYSxJQUFJLElBQUksSUFBSSxhQUFhLEtBQUssSUFBSSxFQUFFOztZQUVuRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7WUFFekIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0M7O1lBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbkQ7U0FDRjs7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDOzs7OztJQUdqQix3Q0FBTzs7OztRQUNaLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUMxQztZQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOztZQUV0QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMvQzs7WUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO2dCQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNuRDs7WUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztTQUMxQjs7Ozs7Ozs7SUFNSSwwQ0FBUzs7Ozs7O2NBQUMsR0FBUSxFQUFFLE1BQWdCO1FBQ3pDLElBQUksR0FBRyxFQUFFOztZQUVQLElBQU0sU0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7WUFFM0IsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRTtnQkFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRTs7b0JBRS9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUMsSUFBUzt3QkFDM0MsSUFBSSxJQUFJLEtBQUssU0FBTyxFQUFFOzRCQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7eUJBQ3ZEO3FCQUNGLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxJQUFTO3dCQUN0RCxJQUFJLElBQUksS0FBSyxTQUFPLEVBQUU7NEJBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7eUJBQ3RDO3FCQUNGLENBQUMsQ0FBQztpQkFDSjs7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0M7O1lBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRTtnQkFDL0IsTUFBTSxDQUFDLFNBQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3pEO2lCQUFNOztnQkFFTCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDOztZQUVELElBQU0sS0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDOztZQUNqRixJQUFNLE1BQUksR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7O1lBRXhCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQUMsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLENBQUMsS0FBRyxDQUFDLEtBQUssTUFBSSxDQUFDLEtBQUcsQ0FBQyxDQUFDO2FBQzdCLENBQUMsQ0FBQztZQUNILElBQUksU0FBUyxJQUFJLENBQUMsRUFBRTs7Z0JBRWxCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNwQztZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQUksQ0FBQyxDQUFDOztZQUV6QixTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBQyxDQUFDO2dCQUN0QyxPQUFPLENBQUMsQ0FBQyxLQUFHLENBQUMsS0FBSyxNQUFJLENBQUMsS0FBRyxDQUFDLENBQUM7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFOztnQkFFbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3RDO1lBQ0QsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hDOzs7Ozs7OztJQU1JLDRDQUFXOzs7Ozs7Y0FBQyxHQUFRLEVBQUUsTUFBZ0I7UUFDM0MsSUFBSSxHQUFHLEVBQUU7O1lBRVAsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRTtnQkFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzdEO2lCQUFNOztnQkFFTCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzVDOztZQUVELElBQU0sS0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDOztZQUNqRixJQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7O1lBQ3hCLElBQU0sSUFBRSxHQUFHLElBQUksQ0FBQyxLQUFHLENBQUMsQ0FBQzs7WUFDckIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBQyxDQUFDO2dCQUN4QyxPQUFPLENBQUMsQ0FBQyxLQUFHLENBQUMsS0FBSyxJQUFFLENBQUM7YUFDdEIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFO2dCQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTs7b0JBRXBCLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFDLENBQUM7d0JBQ3RDLE9BQU8sQ0FBQyxDQUFDLEtBQUcsQ0FBQyxLQUFLLElBQUUsQ0FBQztxQkFDdEIsQ0FBQyxDQUFDO29CQUNILElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTt3QkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzVCO2lCQUNGO2dCQUNELElBQUksTUFBTSxFQUFFO29CQUNWLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3hDO1NBQ0Y7Ozs7O0lBR0ksMENBQVM7Ozs7O1FBQ2QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7O1lBRXJDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztZQUV4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFDLEtBQVU7O2dCQUNyQyxJQUFNLEdBQUcsR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBRSxLQUFLLENBQUUsQ0FBQztnQkFDeEMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDM0IsQ0FBQyxDQUFDOztZQUVILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4Qzs7Ozs7SUFHSSwyQ0FBVTs7Ozs7UUFDZixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTs7WUFFckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7O1lBRWxELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQUMsS0FBVTs7Z0JBQ3JDLElBQU0sR0FBRyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFFLEtBQUssQ0FBRSxDQUFDO2dCQUN4QyxLQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM3QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7WUFFOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hDOzs7Ozs7SUFHSSxnREFBZTs7OztjQUFDLEdBQVE7UUFDN0IsSUFBSSxHQUFHLEVBQUU7O1lBQ1AsSUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDOztZQUV4QixJQUFNLEtBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQzs7WUFFakYsSUFBTSxJQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUcsQ0FBQyxDQUFDOztZQUVyQixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUM7Z0JBQ3JDLE9BQU8sQ0FBQyxDQUFDLEtBQUcsQ0FBQyxLQUFLLElBQUUsQ0FBQzthQUN0QixDQUFDLENBQUM7O1lBRUgsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFOztnQkFFbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN2QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3JCO1NBQ0Y7Ozs7Ozs7Ozs7SUFXSyw4Q0FBYTs7Ozs7Ozs7Y0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJOztRQUV6QyxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUFFO1lBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUNwQixjQUFjLEVBQUUsUUFBUSxDQUFDLHNGQUNqQixJQUFJLENBQUMsR0FBRyw0REFBcUQsSUFBSSxDQUFDLEdBQUcsNENBQzVFLENBQUM7YUFDSCxDQUFDLENBQUM7U0FDSjs7UUFFRCxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUM7WUFDM0IsSUFBSSxNQUFBO1lBQ0osSUFBSSxNQUFBO1NBQ0wsQ0FBQyxDQUFDOzs7OztJQUdFLHlDQUFROzs7Ozs7UUFDYixJQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNoQjtRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNoQixNQUFNLEVBQUUsSUFBSTthQUNiLENBQUMsQ0FBQzs7WUFFSCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFO2dCQUNuRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2FBQzFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUN2RSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO2FBQ2xEOztZQUVELElBQU0sY0FBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDdEMsNEJBQTRCO2lCQUMzQixNQUFNLENBQUMsVUFBQyxNQUFNO2dCQUNiLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLHFCQUFxQixJQUFJLEtBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxFQUFFO29CQUNoRyxPQUFPLEtBQUssQ0FBQztpQkFDZDtnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNiLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNOztnQkFFWixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ25FLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNOztnQkFDWixJQUFNLGdCQUFnQixHQUFHO29CQUN2QixJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSTtvQkFDcEMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDcEYsS0FBSyxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQzlDLFFBQVEsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJO29CQUNwRSxPQUFPLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJO29CQUNoRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7aUJBQ2xCLENBQUM7Z0JBRUYsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO29CQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO3dCQUM5QixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7cUJBQzVCLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO3dCQUM5QixTQUFTLEVBQUUsRUFBRTtxQkFDZCxDQUFDLENBQUM7aUJBQ0o7Z0JBRUQsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO3dCQUM5QixNQUFNOzs7Ozs7O2tDQUFDLElBQVMsRUFBRSxJQUFZLEVBQUUsR0FBUSxFQUFFLElBQVM7OzRCQUNqRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7NEJBQ2xCLG1CQUFDLE1BQU0sQ0FBQyxVQUFtQixFQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsZUFBZTs7Z0NBQ25ELElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7Z0NBQ3BFLElBQUksU0FBUyxJQUFJLE9BQU8sU0FBUyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7b0NBQ3ZELE1BQU0sQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQztvQ0FDbkQsTUFBTSxDQUFDLGFBQWEsR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDO2lDQUN0RDtnQ0FDRCxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7NkJBQ2pFLENBQUMsQ0FBQzs0QkFDSCxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUM7NEJBQzNCLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQzs0QkFDNUIsT0FBTyxNQUFNLENBQUM7eUJBQ2Y7cUJBQ0YsQ0FBQyxDQUFDOztvQkFFSCxJQUFNLE9BQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFDLGVBQWU7d0JBQ25ELE9BQU8sT0FBTyxlQUFlLENBQUMsV0FBVyxLQUFLLFVBQVUsQ0FBQztxQkFDNUQsQ0FBQyxDQUFDO29CQUNILElBQUksT0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7NEJBQzlCLFdBQVc7Ozs7Ozs7O3NDQUFDLElBQVMsRUFBRSxRQUFhLEVBQUUsT0FBWSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0I7Z0NBQ3BGLE9BQUssQ0FBQyxPQUFPLENBQUMsVUFBQyxlQUFlOztvQ0FDNUIsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQ0FDcEUsSUFBSSxTQUFTLElBQUksT0FBTyxTQUFTLENBQUMsV0FBVyxLQUFLLFVBQVUsRUFBRTt3Q0FDNUQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3FDQUNqRjtpQ0FDRixDQUFDLENBQUM7NkJBQ0o7eUJBQ0YsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO2dCQUNELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTs7b0JBQ3BCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzNELElBQUksU0FBUyxJQUFJLE9BQU8sU0FBUyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7d0JBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7NEJBQzlCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7eUJBQ3RDLENBQUMsQ0FBQztxQkFDSjtvQkFDRCxJQUFJLFNBQVMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFO3dCQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFOzRCQUM5QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3lCQUN0QyxDQUFDLENBQUM7d0JBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTs0QkFDOUIsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzt5QkFDaEQsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO2dCQUNELE9BQU8sZ0JBQWdCLENBQUM7YUFDekIsQ0FBQyxDQUFDOztZQUVMLElBQU0sY0FBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDcEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzFCLFVBQVUsQ0FBQztvQkFDVCxJQUFJLEtBQUksQ0FBQyxTQUFTLEVBQUU7d0JBQ2xCLEtBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO3FCQUNqQztpQkFDRixFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1AsQ0FBQyxDQUFDOztZQUVILEFBREEsaURBQWlEO1lBQ2pELGNBQVksQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLFVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVO2dCQUMzRCxJQUFJLFVBQVUsRUFBRTs7b0JBRWQsQUFEQSw0QkFBNEI7b0JBQzVCLGNBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2hELFVBQVUsQ0FBQzt3QkFDVCxjQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUNyQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNQO3FCQUFNO29CQUNMLFVBQVUsQ0FBQzt3QkFDVCxjQUFZLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUN4QyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNQO2FBQ0YsQ0FBQyxDQUFDOztZQUNILElBQUksV0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQixjQUFZLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFDLEtBQVU7Z0JBQ3JDLElBQUksS0FBSSxDQUFDLFNBQVMsRUFBRTs7b0JBQ2xCLElBQU0sS0FBSyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7O29CQUNyQyxJQUFNLE9BQU8sR0FBRyxjQUFZLENBQUM7b0JBQzdCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7d0JBQ3pCLEtBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUN4QjtpQkFDRjthQUNGLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQUMsS0FBSztnQkFDckIsS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxLQUFJLENBQUMsU0FBUyxFQUFFOztvQkFDbEIsSUFBTSxJQUFJLEdBQW9DLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUN6RSxLQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckIsSUFBSSxXQUFTLEdBQUcsQ0FBQyxFQUFFO3dCQUNqQixPQUFPO3FCQUNSO29CQUNELElBQUk7d0JBQ0YsV0FBUyxFQUFFLENBQUM7d0JBQ1osVUFBVSxDQUFDLGNBQU8sS0FBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUMxRDtvQkFBQyxPQUFPLEdBQUcsRUFBRTt3QkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxpREFBaUQsQ0FBQyxDQUFDO3dCQUMxRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNwQjtpQkFDRjthQUNGLENBQUMsQ0FBQzs7WUFHSCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7O2dCQUduQixJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRTNDLElBQU0sc0JBQXNCLEdBQUc7b0JBQzdCLFNBQVMsRUFBRSx1QkFBdUI7b0JBQ2xDLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxJQUFJO29CQUM5QyxjQUFjLEVBQUUsRUFBRTtvQkFDbEIsS0FBSyxFQUFFLEVBQUU7b0JBQ1QsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVk7b0JBQzNCLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtpQkFDdkIsQ0FBQzs7Z0JBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRTtvQkFDcEMsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDdEMsQ0FBQyxDQUFDOztnQkFFSCxBQURBLHlCQUF5QjtnQkFDekIsY0FBWSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDOzs7Z0JBRzdDLEFBRkEsMkJBQTJCO2dCQUMzQiwrREFBK0Q7Z0JBQy9ELGNBQVk7b0JBQ1YscUJBQXFCO3FCQUNwQixFQUFFLENBQUMsU0FBUyxFQUFFO29CQUViLElBQUksS0FBSSxDQUFDLFlBQVksRUFBRTs7d0JBRXJCLEFBREEsNkJBQTZCO3dCQUM3QixjQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFOzs0QkFFM0MsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7OzRCQUVyQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDdkIsQ0FBQyxDQUFDO3FCQUNKOztvQkFDRCxJQUFNLFFBQVEsR0FBRyxjQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNsRCxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsQ0FBQyxDQUFDOztvQkFFckUsSUFBTSxHQUFHLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztvQkFDbEQsSUFBSSxLQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O3dCQUU1QixBQURBLDJCQUEyQjt3QkFDM0IsS0FBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQyxJQUFJOzs0QkFFekIsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs0QkFFckIsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFOztnQ0FFZCxBQURBLHNFQUFzRTtnQ0FDdEUsY0FBWSxDQUFDLElBQUksQ0FBQyxvQkFBa0IsRUFBRSxPQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDOzZCQUNuRTt5QkFDRixDQUFDLENBQUM7cUJBQ0o7b0JBQ0QsSUFBSSxLQUFJLENBQUMsV0FBVyxFQUFFOzs7d0JBR3BCLEFBRkEsb0NBQW9DO3dCQUNwQywrQ0FBK0M7d0JBQy9DLGNBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQyxLQUFLLEVBQUUsT0FBTzs7NEJBRXRELElBQUksS0FBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBQyxDQUFDOztnQ0FFOUIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs2QkFDbEQsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQ0FDTixLQUFJLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7NkJBQzNDO3lCQUNGLENBQUMsQ0FBQztxQkFDSjt5QkFBTSxJQUFJLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTt3QkFDckMsY0FBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQzVEO2lCQUNGLENBQUMsQ0FBQzthQUNOOztZQUVELElBQU0sUUFBUSxHQUFHOztnQkFFZixVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQzs7Z0JBRXRDLFlBQVksRUFBRSxLQUFLOztnQkFFbkIsU0FBUyxFQUFFLElBQUk7O2dCQUVmLFVBQVUsRUFBRSxJQUFJOztnQkFFaEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVOztnQkFFM0IsT0FBTyxFQUFFLGNBQVk7Z0JBQ3JCLFVBQVUsRUFBRyxJQUFJLENBQUMsY0FBYztnQkFDaEMsS0FBSyxFQUFFLEVBQUU7O2dCQUVULE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxNQUFNLEVBQUUsT0FBTzt3QkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLO3dCQUMzQixTQUFTLEVBQUUsUUFBUTt3QkFDbkIsYUFBYSxFQUFFOzRCQUNiLE9BQU8sRUFBRSxzQkFBc0I7eUJBQ2hDO3FCQUNGO2lCQUNGO2dCQUNELDhCQUE4QjtnQkFDOUIsWUFBWTs7Ozs7OzswQkFBQyxPQUFZLEVBQUUsTUFBVyxFQUFFLFVBQWUsRUFBRSxTQUFjOztvQkFFckUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFOzt3QkFFbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7O3dCQUV4QixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFOzs0QkFDM0IsSUFBTSxZQUFZLEdBQUc7Z0NBQ25CLFlBQVksRUFBRSxDQUFDO2dDQUNmLGVBQWUsRUFBRSxDQUFDO2dDQUNsQixJQUFJLEVBQUUsRUFBRTs2QkFDVCxDQUFDOzRCQUNGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7OzRCQUU5QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzs7NEJBRTdCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO3lCQUNqQztxQkFDRjs7b0JBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztvQkFFbkIsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDOztvQkFFOUQsSUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7b0JBRWhDLElBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7O29CQUU5QixJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDOztvQkFFN0IsSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7b0JBRTVCLElBQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7O29CQUUvQixJQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxZQUFZLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDOztvQkFFMUgsSUFBSSxHQUFHLEVBQUU7d0JBQ1AsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3hCOztvQkFFRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFOzt3QkFFekIsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFDLElBQVM7OzRCQUNyQyxJQUFJLFdBQVcsQ0FBUzs0QkFDeEIsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRTtnQ0FDakMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7NkJBQzNCO2lDQUFNOztnQ0FFTCxJQUFNLFdBQVcsR0FBYSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7O2dDQUdoRSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRTtvQ0FDeEQsV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7aUNBQ3hDO3FDQUFNOztvQ0FFTCxXQUFXLEdBQUcsQ0FBQyxDQUFDO2lDQUNqQjs2QkFDRjs0QkFDRCxPQUFPLGNBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO3lCQUNqRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzt3QkFFYixDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztxQkFDcEM7O29CQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksRUFBRTt3QkFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsVUFBQyxDQUFDLEVBQUUsUUFBUTs0QkFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ3ZCLENBQUMsQ0FBQztxQkFDSjtvQkFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFVBQUMsS0FBSzs7d0JBRWpDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBRSxVQUFDLE1BQU07NEJBQ2hELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0NBQzNCLE9BQU8sS0FBSyxDQUFDOzZCQUNkOzRCQUNELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0NBQzVCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7O29DQUMxQixJQUFNLEtBQUssR0FBRyxjQUFZLENBQUMsU0FBUyxDQUFDLFVBQUMsV0FBVyxJQUFLLE9BQUEsV0FBVyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFoQyxDQUFnQyxDQUFDLENBQUM7b0NBQ3hGLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTt3Q0FDZCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO3FDQUNyQztpQ0FDRjtnQ0FDRCxPQUFPLEtBQUssQ0FBQzs2QkFDZDs0QkFDRCxPQUFPLElBQUksQ0FBQzt5QkFDYixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUMsTUFBTTs0QkFDWixJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0NBQ25CLE9BQU8sTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs2QkFDL0M7aUNBQU07Z0NBQ0wsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDOzZCQUNwQjt5QkFDRixDQUFDLENBQUM7d0JBQ0gsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDOzt3QkFFMUIsSUFBSSxXQUFXLGVBQVksV0FBVyxZQUFTLE1BQU0sRUFBRTs7NEJBRXJELElBQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDOUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7OzRCQUM1QixJQUFNLFdBQVcsR0FBRyxDQUFFLFdBQVcsWUFBVSxDQUFDOzRCQUM1QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0NBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUUsQ0FBQzs2QkFBRTs0QkFDeEUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7eUJBQ3JDOzt3QkFFRCxJQUFJLFdBQVcsZUFBWSxXQUFXLFlBQVMsTUFBTSxFQUFFOzs0QkFFckQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxZQUFTLENBQUM7eUJBQzVDOzZCQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7NEJBQzdFLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3lCQUNwRDt3QkFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFOzRCQUNyRyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzt5QkFDdEQ7d0JBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTs0QkFDdkUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3REOzt3QkFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFOzRCQUN0RSxPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQyxtQkFBbUI7Z0NBQzlHLElBQUksbUJBQW1CLEVBQUU7O29DQUN2QixJQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7b0NBQzlCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDOztvQ0FDNUIsSUFBTSxXQUFXLEdBQUcsQ0FBRSxtQkFBbUIsQ0FBRSxDQUFDO29DQUM1QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7d0NBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUUsQ0FBQztxQ0FBRTtvQ0FDeEUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUNBQ3JDO2dDQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dDQUNyQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxLQUFLOztvQ0FDMUIsSUFBTSxPQUFPLEdBQUc7d0NBQ2QsWUFBWSxFQUFFLEtBQUssQ0FBQyxLQUFLO3dDQUN6QixlQUFlLEVBQUUsS0FBSyxDQUFDLEtBQUs7d0NBQzVCLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSztxQ0FDbEIsQ0FBQztvQ0FDRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztvQ0FDeEMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRTt3Q0FDckIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO3FDQUN4Qjs7b0NBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7O29DQUV4QixPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQ0FDOUIsQ0FBQyxDQUFDOzZCQUNKLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQyxHQUFHOztnQ0FFWCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Z0NBRTdCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ3RCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7O2dDQUU5QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQ0FDOUIsT0FBTyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7NkJBQ2xDLENBQUMsQ0FBQzt5QkFDSjt3QkFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDckMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFDLEtBQUs7OzRCQUNyQixJQUFNLE9BQU8sR0FBRztnQ0FDZCxZQUFZLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0NBQ3pCLGVBQWUsRUFBRSxLQUFLLENBQUMsS0FBSztnQ0FDNUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLOzZCQUNsQixDQUFDOzRCQUNGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOzRCQUN4QyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO2dDQUNyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7NkJBQ3hCOzs0QkFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs7NEJBRXhCLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3lCQUM1QixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUMsR0FBRzs7NEJBRVgsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7OzRCQUU3QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs0QkFFdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7NEJBQzlCLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3lCQUNsQyxDQUFDLENBQUM7cUJBQ0osQ0FBQyxDQUFDO2lCQUNKO2dCQUNELFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUN4RSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQzthQUN0QixDQUFDOztZQUVGLElBQU0sYUFBYSxHQUFHO2dCQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtvQkFDM0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtpQkFDMUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7b0JBQzNCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7aUJBQzFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFdkMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFOztnQkFFbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7b0JBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDckIsY0FBYyxFQUFFLEtBQUs7b0JBQ3JCLFFBQVEsRUFBRTt3QkFDUixnQkFBZ0IsRUFBRSxLQUFLO3dCQUN2QixhQUFhLEVBQUUsRUFBRTtxQkFDbEI7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7b0JBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO29CQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7aUJBQzVCLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2FBRXBCOztZQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBWSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsVUFBQyxLQUFLOztnQkFDaEQsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Z0JBRS9DLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQUMsV0FBVzs7b0JBQ2hDLElBQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7O29CQUMxQyxJQUFNLEdBQUcscUJBQUcsTUFBTSxDQUFDLFNBQVMsRUFBWSxFQUFDOztvQkFDekMsSUFBTSxJQUFJLHFCQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQVksRUFBQztvQkFDM0MsSUFBSSxLQUFJLENBQUMsU0FBUyxFQUFFO3dCQUNsQixLQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQzs0QkFDZixHQUFHLEtBQUE7NEJBQ0gsSUFBSSxNQUFBO3lCQUNMLENBQUMsQ0FBQztxQkFDSjtpQkFDRixDQUFDLENBQUM7YUFDSixDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7O1lBRWpCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7O2dCQUNwRSxJQUFNLFlBQVksR0FBRyxtQkFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQStCLEVBQUM7cUJBQ2pFLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLFlBQVksRUFBRTtvQkFDaEIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3RDOztnQkFDRCxJQUFNLGNBQWMsR0FBSSxtQkFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQStCLEVBQUM7cUJBQ3BFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxjQUFjLEVBQUU7b0JBQ2xCLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN0QzthQUNGOztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7O2dCQUNwRSxJQUFNLFlBQVksR0FBRyxtQkFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQStCLEVBQUM7cUJBQ2pFLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLFlBQVksRUFBRTtvQkFDaEIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3RDO2FBQ0Y7O1lBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzthQUN4QjtTQUNGOzs7Ozs7SUFHSCwwQ0FBUzs7OztJQUFULFVBQVUsS0FBYTtRQUNyQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUM7S0FDRjs7Ozs7SUFFRCwyQ0FBVTs7OztJQUFWLFVBQVcsS0FBYTtRQUN0QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0M7S0FDRjtJQUVELHNCQUFJLDZDQUFTOzs7O1FBQWI7WUFBQSxpQkFhQztZQVpDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLE9BQU87YUFDUjtZQUNELElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLEVBQUU7Z0JBQ2hDLE9BQU87YUFDUjs7WUFDRCxJQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBRSxVQUFDLEdBQUc7Z0JBQzdDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEtBQUksQ0FBQyxlQUFlLElBQUksS0FBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3BFLENBQUMsQ0FBQzs7WUFFSCxPQUFPLENBQUMsQ0FBQztTQUNWOzs7T0FBQTs7Ozs7O0lBTU0seUNBQVE7Ozs7O2NBQUMsSUFBUzs7UUFDdkIsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2hCLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDM0IsT0FBTztTQUNQO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksRUFBRTtZQUNoQyxPQUFPO1NBQ1I7O1FBRUQsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTs7WUFFdkIsSUFBTSxVQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLFVBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFOztnQkFFekIsT0FBTzthQUNSOztZQUVELElBQU0sVUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQyxHQUFRO2dCQUN2QyxPQUFPLFVBQVEsQ0FBQyxHQUFHLENBQUUsVUFBQyxHQUFHO29CQUN2QixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUUsVUFBQyxHQUFHO29CQUNiLE9BQU8sR0FBRyxLQUFLLEtBQUssQ0FBQztpQkFDdEIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7YUFDakIsQ0FBQyxDQUFDOztZQUVILElBQUksVUFBUSxJQUFJLENBQUMsRUFBRTs7Z0JBQ2pCLElBQU0sT0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7O2dCQUVuRSxBQURBLG9CQUFvQjtnQkFDcEIsT0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRTs7b0JBRWhDLEFBREEsMEJBQTBCO29CQUMxQixPQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN6RDs7Z0JBRUQsQUFEQSx1QkFBdUI7Z0JBQ3ZCLFVBQVEsQ0FBQyxPQUFPLENBQUUsVUFBQyxHQUFHOztvQkFDcEIsSUFBTSxNQUFNLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFFLFVBQUMsR0FBRzt3QkFDM0MsT0FBTyxHQUFHLENBQUMsUUFBUSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQztxQkFDakQsQ0FBQyxDQUFDO29CQUNILElBQUksTUFBTSxFQUFFOzt3QkFFVixJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUM7d0JBQ2hELE9BQUssQ0FBQyxHQUFHLG1CQUFDLFFBQWtCLEVBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQ2hEO3lCQUFNO3dCQUNMLE9BQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUNqQztpQkFDRixDQUFDLENBQUM7O2dCQUVILE9BQU8sT0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBRSxVQUFDLElBQUk7O29CQUVoQyxJQUFNLEdBQUcsR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFRLENBQUMsQ0FBQzs7b0JBQ3pDLElBQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNyRSxJQUFJLElBQUksRUFBRTs7d0JBRVIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDZixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLENBQUMsQ0FBQzs7d0JBRWpHLElBQUksT0FBTyxFQUFFOzRCQUNYLEtBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUMzQjtxQkFDRjtvQkFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDMUIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDOzs7OztJQUdwQiw0Q0FBVzs7OztRQUNoQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdkM7Ozs7Ozs7SUFPSSxrREFBaUI7Ozs7O2NBQUMsTUFBTTs7UUFDN0IsSUFBTSxLQUFLLHFCQUFJLE1BQU0sQ0FBQyxNQUEwQixFQUFDOztRQUNqRCxJQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzs7UUFFNUMsSUFBTSxRQUFRLEdBQUcsUUFBUSxtQkFBQyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQVcsR0FBRSxFQUFFLENBQUMsQ0FBQzs7UUFFckUsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7O1FBRWhELElBQUksR0FBRyxFQUFFOztZQUNQLElBQU0sS0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7O1lBQ2xELElBQU0sSUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFHLENBQUMsQ0FBQzs7WUFDcEIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBQyxJQUFJO2dCQUMvQyxPQUFPLElBQUksQ0FBQyxLQUFHLENBQUMsS0FBSyxJQUFFLENBQUM7YUFDekIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUNqQixJQUFJLGFBQWEsR0FBRyxDQUFDLEVBQUU7O29CQUVyQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN4QzthQUNGO2lCQUFNO2dCQUNMLElBQUksYUFBYSxJQUFJLENBQUMsRUFBRTs7b0JBRXRCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFOzt3QkFFcEIsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQUMsSUFBSTs0QkFDN0MsT0FBTyxJQUFJLENBQUMsS0FBRyxDQUFDLEtBQUssSUFBRSxDQUFDO3lCQUN6QixDQUFDLENBQUM7d0JBQ0gsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFOzRCQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUN4QztxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7Ozs7O0lBR0ssZ0RBQWU7Ozs7Ozs7UUFJckIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXO2dCQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1NBQy9HOzs7Ozs7SUFHSyw0Q0FBVzs7OztjQUFDLEdBQVM7UUFDM0IsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFOztZQUMvQyxJQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLHNCQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBK0IsQ0FBQSxDQUFDLENBQUM7O1lBQzNGLElBQUksWUFBWSxVQUFNO1lBQ3RCLElBQUksT0FBTyxFQUFFO2dCQUNYLFlBQVksR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzlEO1lBQ0QsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7Z0JBQ3JCLElBQUksWUFBWSxFQUFFO29CQUNoQixZQUFZLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO2lCQUMzRjtnQkFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVztvQkFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQzthQUNySDtpQkFBTTtnQkFDTCxJQUFJLFlBQVksRUFBRTtvQkFDaEIsWUFBWSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7aUJBQzdCO2dCQUNELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7YUFDekc7U0FDRjs7Ozs7SUFHSyxnREFBZTs7OztRQUNyQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztTQUN6Rzs7Ozs7SUFHSSx1Q0FBTTs7Ozs7UUFDWCxJQUFNLE9BQU8scUJBQWdCLFFBQVEsQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQWdCLEVBQUM7UUFDakcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDOzs7Ozs7SUFHWCw4Q0FBYTs7OztjQUFDLGFBQWE7O1FBQ2hDLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUNsQixJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFOztvQkFFdkMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbkQ7cUJBQU07O29CQUVMLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0Y7U0FDRixDQUFDLENBQUM7Ozs7O0lBR0UsMENBQVM7Ozs7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7OztJQUdkLDRDQUFXOzs7O2NBQUMsT0FBc0I7O1FBQ3ZDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRTtZQUM5RCxJQUFJLE9BQU8saUJBQWMsSUFBSSxFQUFFOzs7Z0JBRzdCLElBQUksT0FBTyxjQUFXLFlBQVksSUFBSSxDQUFDLE9BQU8sY0FBVyxZQUFZLElBQUksT0FBTyxjQUFXLGFBQWEsQ0FBQyxFQUFFO29CQUN6RyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLGNBQVcsWUFBWSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUMsTUFBMEI7O3dCQUV6RixBQURBLG9CQUFvQjt3QkFDcEIsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7d0JBQ3JCLEtBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7d0JBRWYsQUFEQSxtQkFBbUI7d0JBQ25CLEtBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDZCxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUMsR0FBRzt3QkFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxzREFBc0QsQ0FBQyxDQUFDO3dCQUNoRixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNwQixDQUFDLENBQUM7aUJBQ0o7YUFDRjtTQUNGOzs7Ozs7SUFHSSxzQ0FBSzs7OztjQUFDLElBQWM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Ozs7SUFHbEIsOENBQWE7OztJQUFiO1FBQUEsaUJBeUVDOztRQXZFQyxJQUFNLFdBQVcsR0FBYSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7UUFFaEUsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUM7O1FBQzVELElBQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFDN0IsU0FDb0MsRUFBRSxDQUFTOztZQUMvQyxJQUFNLEdBQUcsR0FBRyxZQUFVLENBQUcsQ0FBQzs7WUFDMUIsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQzs7WUFFNUIsSUFBTSxLQUFLLEdBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFDdEMsSUFBTSxPQUFPLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7O1lBRXZELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFJLENBQUMsVUFBVSxFQUFFO2dCQUM5QixLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDM0U7O1lBRUQsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN2QyxLQUFLLEdBQUcsU0FBUyxDQUFDO2FBQ25CO1lBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFOztnQkFFakIsSUFBSSxXQUFXLFVBQXFCO2dCQUNwQyxJQUFJLEtBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDVCxXQUFXLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztxQkFDdEQ7aUJBQ0Y7cUJBQU07b0JBQ0wsV0FBVyxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztpQkFDbEQ7Z0JBQ0QsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO29CQUN2QixLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUNqRTthQUNGO1lBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO2dCQUNqQixLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDNUU7WUFDRCxPQUFPO2dCQUNMLEdBQUcsS0FBQTtnQkFDSCxLQUFLLE9BQUE7Z0JBQ0wsT0FBTyxTQUFBO2dCQUNQLEtBQUssT0FBQTthQUNOLENBQUM7U0FDSCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQyxLQUFLO1lBQ3JELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7O2dCQUN6QixJQUFNLE1BQU0sR0FBRyxtQkFBQyxLQUFLLENBQUMsT0FBZ0IsRUFBQztxQkFDcEMsR0FBRyxDQUFDLFVBQUMsR0FBRztvQkFDUCxPQUFPO3dCQUNMLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRzt3QkFDWixLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7cUJBQ2pCLENBQUM7aUJBQ0gsQ0FBQztxQkFDRCxJQUFJLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFqQixDQUFpQixDQUFDLENBQUM7O2dCQUVyQyxJQUFNLE9BQU8sR0FBRyxNQUFNO3FCQUNyQixHQUFHLENBQUMsVUFBQyxJQUFJO29CQUNSLE9BQU8sbUJBQUMsS0FBSyxDQUFDLE9BQWdCLEVBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQXJCLENBQXFCLENBQUMsQ0FBQztpQkFDNUUsQ0FBQyxDQUFDOztnQkFFSCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsbUJBQUMsS0FBSyxDQUFDLE9BQWdCLEVBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7O29CQUNwRSxJQUFNLE9BQU8sR0FBRyxtQkFBQyxLQUFLLENBQUMsT0FBZ0IsRUFBQyxDQUFDLEtBQUssQ0FBQyxDQUFDOztvQkFDaEQsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBRTVDLEFBREEsb0NBQW9DO29CQUNwQyxLQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDaEU7O2dCQUVELEFBREEsNkJBQTZCO2dCQUM3QixLQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDOztnQkFFL0MsQUFEQSwwQkFBMEI7Z0JBQzFCLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDdkI7U0FDRixDQUFDLENBQUM7S0FDSjs7Ozs7O0lBT1ksMkNBQVU7Ozs7O2NBQUMsT0FBZ0Q7Ozs7Ozs7d0JBRXBFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7O3dCQUU1QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBQ2pFLGFBQWE7NEJBQ2Isc0JBQU87eUJBQ1I7d0JBRUssY0FBYyxxQkFBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQW9DLEVBQUM7d0JBRTFFLFdBQVcsR0FDZixDQUFDLGNBQWMsSUFBSSxjQUFjLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQzs0QkFDdkgsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQzs7d0JBRXpELElBQUksSUFBSSxDQUFDLG9CQUFvQixHQUFHLFdBQVcsRUFBRTs7OzRCQUczQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO2dDQUNuQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksd0JBQXdCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO2dDQUM1RSxzQkFBTzs2QkFDUjs7NEJBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQ3RGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQ3pELEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxXQUFXLGFBQUEsRUFBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUM5RSxzQkFBTzt5QkFDUjt3QkFFSyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzs2QkFFL0UsQ0FBQSxtQkFBbUIsS0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQUEsRUFBakQsd0JBQWlEO3dCQUVuRCxLQUF1QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBeEMsSUFBSSxVQUFBLEVBQUUsTUFBTSxZQUFBLENBQTZCOzt3QkFFaEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxzQkFBc0IsQ0FBQyxVQUFPLEVBQUU7NEJBQ3hILE1BQU0sUUFBQTs0QkFDTixVQUFVLEVBQUUsS0FBSzt5QkFDcEIsQ0FBQyxDQUFDOzs7d0JBSUcsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFJekMscUJBQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUE7O3dCQUFuRSxlQUFlLEdBQUcsU0FBaUQ7O3dCQUV6RSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBRWpELEtBQXVCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUF4QyxJQUFJLFVBQUEsRUFBRSxNQUFNLFlBQUEsQ0FBNkI7O3dCQUVoRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7d0JBRW5ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksc0JBQXNCLENBQUMsVUFBTyxFQUFFOzRCQUN4SCxNQUFNLFFBQUE7NEJBQ04sVUFBVSxFQUFFLEtBQUs7eUJBQ3BCLENBQUMsQ0FBQzs7O29CQUVMLE9BQU87b0JBQ1Asc0JBQU87Ozs7d0JBR1AsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFHLENBQUMsQ0FBQzs7d0JBRW5CLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7NEJBQ25DLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBRyxDQUFDLENBQUM7eUJBQzNCOzZCQUFNOzs0QkFFTCxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFHLEVBQUU7Z0NBQ2hDLFlBQVksRUFBRSxHQUFHOzZCQUNsQixDQUFDLENBQUM7eUJBQ0o7Ozt3QkFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7Ozs7Ozs7O0lBSXpCLGtEQUFpQjs7Ozs7UUFDdEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87ZUFDekMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1RSxPQUFPLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFDLENBQUM7U0FDL0I7UUFFRCw4Q0FBSyxjQUFJLEVBQUUsa0JBQU0sQ0FBd0M7O1FBQ3pELElBQU0sY0FBYyxHQUFhLEVBQUUsQ0FBQzs7UUFFcEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBQyxVQUFrQixFQUFFLEtBQWE7O1lBRXZELElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ2xDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7Ozs7WUFJRCxJQUFJLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzNDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxPQUFPLElBQUksQ0FBQztTQUNiLENBQUMsQ0FBQzs7UUFFSCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLEdBQVc7WUFDMUIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQUMsQ0FBQyxFQUFFLFFBQWdCO2dCQUNwQyxPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDaEQsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsT0FBTyxFQUFDLElBQUksTUFBQSxFQUFFLE1BQU0sUUFBQSxFQUFDLENBQUM7OztnQkEvNkN6QixTQUFTLFNBQUM7O29CQUVULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFFBQVEsRUFBRSxtakNBNEJUO29CQUNELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOztpQkFFdEM7Ozs7Z0JBbEpPLGtCQUFrQjtnREE4VVgsTUFBTSxTQUFDLGlCQUFpQjtnQkE1VS9CLGNBQWM7Z0JBREMsZ0JBQWdCO2dCQVRyQyxRQUFRO2dCQWVGLDJCQUEyQjtnQkFsQmpDLFVBQVU7Z0JBb0JKLFlBQVk7Z0JBQUUsY0FBYztnQkFVM0IsVUFBVTtnQkFDVixxQkFBcUI7Z0JBWFEsb0JBQW9CO2dCQUNaLHdCQUF3QjtnQkFBcEUsWUFBWTtnQkFBa0IsWUFBWTs7O3dCQXFKekMsU0FBUyxTQUFDLE9BQU87NkJBQ2pCLFNBQVMsU0FBQyxZQUFZO2dDQUN0QixTQUFTLFNBQUMsZUFBZTsrQkFDekIsU0FBUyxTQUFDLGNBQWM7eUJBQ3hCLEtBQUs7OEJBQ0wsS0FBSzsyQkFDTCxLQUFLO3VCQUNMLE1BQU0sU0FBQyxNQUFNO3VCQUNiLE1BQU0sU0FBQyxNQUFNO3lCQUNiLEtBQUssU0FBQyxRQUFRO3lCQUNkLE1BQU0sU0FBQyxRQUFRO3VCQUNmLE1BQU0sU0FBQyxNQUFNO3VCQUNiLE1BQU0sU0FBQyxNQUFNO3dCQUNiLE1BQU0sU0FBQyxPQUFPO3lCQUNkLE1BQU0sU0FBQyxRQUFRO2dDQUNmLE1BQU0sU0FBQyxlQUFlOzBCQUN0QixNQUFNLFNBQUMsU0FBUzs2QkFNaEIsS0FBSzs2QkFDTCxLQUFLOzZCQUNMLEtBQUs7eUJBQ0wsS0FBSzs2QkFDTCxLQUFLO2lDQUNMLEtBQUs7NEJBQ0wsS0FBSztvQ0FDTCxLQUFLO29DQUNMLEtBQUs7MEJBRUwsS0FBSzswQkFDTCxLQUFLOzZCQUlMLEtBQUs7aUNBSUwsS0FBSzsrQkFJTCxLQUFLOzJCQUNMLEtBQUs7NEJBS0wsS0FBSzt5QkFNTCxLQUFLLFNBQUMsUUFBUTs2QkFrQmQsS0FBSyxTQUFDLFlBQVk7NkJBeUJqQixLQUFLLFNBQUMsWUFBWTs2QkFpQ25CLEtBQUssU0FBQyxZQUFZO3dCQXlCbEIsS0FBSyxTQUFDLE9BQU87O2lDQTNVaEI7O1NBaUthLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIElucHV0LCBPbkRlc3Ryb3ksXG4gIE9uSW5pdCwgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FuZ3VsYXJEYXRhQ29udGV4dH0gZnJvbSAnQHRoZW1vc3QvYW5ndWxhcic7XG5pbXBvcnQge1RyYW5zbGF0ZVBpcGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VGFibGVDb25maWd1cmF0aW9ufSBmcm9tICcuL2FkdmFuY2VkLXRhYmxlLmludGVyZmFjZXMnO1xuaW1wb3J0IHtEYXRhU2VydmljZVF1ZXJ5UGFyYW1zfSBmcm9tICdAdGhlbW9zdC9jbGllbnQnO1xuaW1wb3J0IHtBZHZhbmNlZENvbHVtbkZvcm1hdHRlcn0gZnJvbSAnLi9hZHZhbmNlZC10YWJsZS5mb3JtYXR0ZXJzJztcbmltcG9ydCB7Q2xpZW50RGF0YVF1ZXJ5YWJsZX0gZnJvbSAnQHRoZW1vc3QvY2xpZW50JztcbmltcG9ydCB7QWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyfSBmcm9tICcuL2FkdmFuY2VkLWZpbHRlci12YWx1ZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7U3Vic2NyaXB0aW9uLCBCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtUZW1wbGF0ZVBpcGUsIExvYWRpbmdTZXJ2aWNlLCBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgTW9kYWxTZXJ2aWNlLCBESUFMT0dfQlVUVE9OUywgRXJyb3JTZXJ2aWNlLCBFeHBvcnRTcHJlYWRzaGVldFNlcnZpY2V9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uJztcbmltcG9ydCB7SUFkdmFuY2VkVGFibGVGb3JtYXR0ZXJzfSBmcm9tICcuL2FkdmFuY2VkLXRhYmxlLmZvcm1hdHRlcnMuaW50ZXJmYWNlJztcbi8vIGltcG9ydGFudCBub3RlOiB1c2UgdGhpcyBpbXBvcnQgdG8gYXZvaWQgQ2Fubm90IGNhbGwgYSBuYW1lc3BhY2UgKCdqcXVlcnknKSBlcnJvclxuaW1wb3J0ICogYXMgalF1ZXJ5XyBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldCc7XG5pbXBvcnQge3RlbXBsYXRlfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1zY3JvbGxlcic7XG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LWNvbHJlb3JkZXInO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1idXR0b25zJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb2x1bW5TZWxlY3RvclNlcnZpY2UgfSBmcm9tICcuLi9jb2x1bW4tc2VsZWN0b3IvY29sdW1uLXNlbGVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXhwb3J0TGltaXRDb25maWd1cmF0aW9uLCBNQVhfRVhQT1JUX0lURU1TIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9idG5leHAuZGlyZWN0aXZlJztcblxuLy8gcmVzdG9yZSBqcXVlcnkgaW1wb3J0IHRvIGF2b2lkIENhbm5vdCBjYWxsIGEgbmFtZXNwYWNlICgnanF1ZXJ5JykgZXJyb3JcbmNvbnN0IGpRdWVyeSA9IGpRdWVyeV87XG5leHBvcnQgaW50ZXJmYWNlIEFkdmFuY2VkVGFibGVEYXRhUmVzdWx0IHtcbiAgcmVjb3Jkc1RvdGFsOiBudW1iZXI7XG4gIHJlY29yZHNGaWx0ZXJlZDogbnVtYmVyO1xuICBkYXRhOiBBcnJheTxhbnk+O1xufVxuXG5jb25zdCBEYXRhVGFibGVzQXBpOiBhbnkgPSBqUXVlcnkuZm4uZGF0YVRhYmxlLkFwaTtcbkRhdGFUYWJsZXNBcGkucmVnaXN0ZXIoICdwcm9jZXNzaW5nKCknLCBmdW5jdGlvbiggc2hvdzogYW55ICkge1xuICAgIHJldHVybiB0aGlzLml0ZXJhdG9yKCd0YWJsZScsICggY3R4OiBhbnkgKSA9PiB7XG4gICAgICAgIGN0eC5vQXBpLl9mblByb2Nlc3NpbmdEaXNwbGF5KCBjdHgsIHNob3cgKTtcbiAgICB9ICk7XG59KTtcblxuY29uc3QgRU1QVFlfREFUQVNFVCA9IHtcbiAgcmVjb3Jkc1RvdGFsOiAwLFxuICByZWNvcmRzRmlsdGVyZWQ6IDAsXG4gIGRhdGE6IFtdLFxufTtcblxuY2xhc3MgVGFibGVUcmFuc2xhdGlvbkNoYW5nZURldGVjdG9yIGV4dGVuZHMgQ2hhbmdlRGV0ZWN0b3JSZWYge1xuICBwdWJsaWMgY2hlY2tOb0NoYW5nZXMoKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgZGV0YWNoKCk6IHZvaWQge1xuICB9XG5cbiAgcHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgbWFya0ZvckNoZWNrKCk6IHZvaWQge1xuICB9XG5cbiAgcHVibGljIHJlYXR0YWNoKCk6IHZvaWQge1xuICB9XG5cbn1cblxuZXhwb3J0IGxldCBDT0xVTU5fRk9STUFUVEVSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignY29sdW1uLmZvcm1hdHRlcnMnKTtcblxuZXhwb3J0IGNsYXNzIEV4cG9ydExpbWl0RXhjZWVkZWRFcnJvciBleHRlbmRzIFJhbmdlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnRXhwb3J0TGltaXRFeGNlZWRlZEVycm9yJztcbiAgfVxufVxuXG5jbGFzcyBDb2x1bW5Gb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGNsYXNzPzogc3RyaW5nO1xuICBwdWJsaWMgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBwdWJsaWMgZGVmYXVsdENvbnRlbnQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtYXRTdHJpbmc/OiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtYXR0ZXI/OiBzdHJpbmc7XG4gIHB1YmxpYyBoaWRkZW4/OiBib29sZWFuO1xuICBwdWJsaWMgbmFtZT86IHN0cmluZztcbiAgcHVibGljIG9yZGVyPzogc3RyaW5nO1xuICBwdWJsaWMgcHJvcGVydHk/OiBzdHJpbmc7XG4gIHB1YmxpYyBzb3J0YWJsZT86IGJvb2xlYW47XG4gIHB1YmxpYyB0aXRsZSA9ICcnO1xuXG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBhbnksIHJvdzogYW55LCBtZXRhOiBhbnkpIHtcbiAgICAvL1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlQ2FzdDxUPihpbnB1dDogYW55KTogVCB7XG4gIHJldHVybiBpbnB1dDtcbn1cblxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkVGFibGVDb25maWd1cmF0aW9uIHtcbiAgcHVibGljIHN0YXRpYyBjYXN0KGlucHV0OiBhbnksIGNsb25lPzogYm9vbGVhbik6IFRhYmxlQ29uZmlndXJhdGlvbiB7XG4gICAgaWYgKGNsb25lKSB7XG4gICAgICByZXR1cm4gZm9yY2VDYXN0PFRhYmxlQ29uZmlndXJhdGlvbj4oSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpbnB1dCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcmNlQ2FzdDxUYWJsZUNvbmZpZ3VyYXRpb24+KGlucHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSYW5kb21JZGVudGlmaWVyKCkge1xuICByZXR1cm4gKFxuICAgIE51bWJlcihTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMikpXG4gICkudG9TdHJpbmcoMzYpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdhcHAtYWR2YW5jZWQtdGFibGUnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDx0YWJsZSAjdGFibGUgY2xhc3M9XCJkYXRhVGFibGVcIj5cbiAgICA8L3RhYmxlPlxuICAgIDxkaXYgI2VtcHR5VGFibGUgY2xhc3M9XCJkLW5vbmVcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY2lyY2xlIGJnLWdyYXktMzAwIGJvcmRlci1ncmF5LTEwMFwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICA8aDQgY2xhc3M9XCJmb250LTN4bCB0ZXh0LWRhcmtcIiBbdHJhbnNsYXRlXT1cIidUYWJsZXMuRW1wdHlUYWJsZVRpdGxlJ1wiPjwvaDQ+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmb250LWxnIHRleHQtZGFya1wiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5FbXB0eVRhYmxlTWVzc2FnZSdcIj48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAjZXJyb3JUZW1wbGF0ZSBjbGFzcz1cImQtbm9uZSBlcnJvci1tZXNzYWdlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jaXJjbGUgYmctZGFuZ2VyIGJvcmRlci1ncmF5LTEwMFwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICA8aDQgY2xhc3M9XCJmb250LTN4bCB0ZXh0LXNlY29uZGFyeVwiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5EYXRhRXJyb3IuVGl0bGUnXCI+PC9oND5cbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbGcgdGV4dC1zZWNvbmRhcnkgbWItMVwiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5EYXRhRXJyb3IuTWVzc2FnZSdcIj48L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmb250LWxnIHRleHQtc2Vjb25kYXJ5IGVycm9yLWlubmVyLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgIDxzbWFsbD48L3NtYWxsPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3R5bGVVcmxzOiBbJy4vYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIHByaXZhdGUgX3F1ZXJ5PzogQ2xpZW50RGF0YVF1ZXJ5YWJsZTtcbiAgcHJpdmF0ZSBfY29uZmlnPzogVGFibGVDb25maWd1cmF0aW9uO1xuICBwcml2YXRlIF9maXJzdExvYWQgPSB0cnVlO1xuICBwcml2YXRlIF9zaG93Rm9vdGVyID0gZmFsc2U7XG4gIHByaXZhdGUgX3Nob3dIZWFkZXIgPSB0cnVlO1xuICBwcml2YXRlIF9zaG93UGFnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX2lkID0gZ2V0UmFuZG9tSWRlbnRpZmllcigpO1xuICBwdWJsaWMgc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgcHVibGljIGNvbmZpZ0NoYW5nZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG5cbiAgQFZpZXdDaGlsZCgndGFibGUnKSBwdWJsaWMgdGFibGU/OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdlbXB0eVRhYmxlJykgcHVibGljIGVtcHR5VGFibGU/OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdlcnJvclRlbXBsYXRlJykgcHVibGljIGVycm9yVGVtcGxhdGU/OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdsb2FkaW5nVGFibGUnKSBwdWJsaWMgbG9hZGluZ1RhYmxlPzogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgcHVibGljIGhlaWdodCA9IDgwMDtcbiAgQElucHV0KCkgcHVibGljIHNob3dBY3Rpb25zID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGF1dG9Mb2FkID0gdHJ1ZTtcbiAgQE91dHB1dCgnbG9hZCcpIHB1YmxpYyBsb2FkOiBFdmVudEVtaXR0ZXI8QWR2YW5jZWRUYWJsZURhdGFSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBZHZhbmNlZFRhYmxlRGF0YVJlc3VsdD4oKTtcbiAgQE91dHB1dCgnaW5pdCcpIHB1YmxpYyBpbml0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoJ3JlbG9hZCcpIHB1YmxpYyByZWxvYWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ3NlbGVjdCcpIHB1YmxpYyBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ2RyYXcnKSBwdWJsaWMgZHJhdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgncGFnZScpIHB1YmxpYyBwYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdvcmRlcicpIHB1YmxpYyBvcmRlcjogRXZlbnRFbWl0dGVyPGFueVtdW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXVtdPigpO1xuICBAT3V0cHV0KCdzY3JvbGwnKSBwdWJsaWMgc2Nyb2xsOiBFdmVudEVtaXR0ZXI8eyB0b3A6IG51bWJlcjsgbGVmdDogbnVtYmVyIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgnc2VsZWN0ZWRJdGVtcycpIHB1YmxpYyBzZWxlY3RlZEl0ZW1zOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdsb2FkaW5nJykgcHVibGljIGxvYWRpbmc6IEV2ZW50RW1pdHRlcjx7XG4gICAgdGFyZ2V0OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50XG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgdGFyZ2V0OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50XG4gIH0+KCk7XG5cbiAgQElucHV0KCkgcHVibGljIHNjcm9sbGFibGUgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgc2VydmVyU2lkZSA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBsZW5ndGhNZW51ID0gWzUwLCAxMDAsIDIwMCwgNTAwXTtcbiAgQElucHV0KCkgcHVibGljIHBhZ2luZyA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBwYWdlTGVuZ3RoID0gMjU7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb2x1bW5PcmRlcmluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgc3RhdGVTYXZlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBzdGF0ZUxvYWRDYWxsYmFjaz86IChzZXR0aW5nczogYW55LCBjYWxsYmFjazogKHN0YXRlOiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIHB1YmxpYyBzdGF0ZVNhdmVDYWxsYmFjaz86IChzZXR0aW5nczogYW55LCBzdGF0ZTogYW55KSA9PiB2b2lkO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBzY3JvbGxZID0gODAwO1xuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsWCA9IHRydWU7XG4gIC8qKlxuICAgKiBFbmFibGVzIHJvdyBzZWxlY3Rpb24uIFRoZSBkZWZhdWxyIHZhbHVlIGlzIGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0YWJsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlIG11bHRpcGxlIHNlbGVjdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWVzIGlzIHRydWUuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGVTZWxlY3Q6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB0cnVlO1xuICAvKipcbiAgICogRW5hYmxlcyBjdXN0b20gc2VsZWN0aW9uIGFuZCBoaWRlcyBzZWxlY3QgY29sdW1uLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21TZWxlY3QgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgdW5zZWxlY3RlZDogYW55W10gPSBbXTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIFVSTCB0byBsb2FkIHRhYmxlIGNvbmZpZ3VyYXRpb24gZnJvbVxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGNvbmZpZ1NyYz86IHN0cmluZztcbiAgcHVibGljIGxhc3RFcnJvcjogYW55O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGFibGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQElucHV0KCdjb25maWcnKVxuICBwdWJsaWMgc2V0IGNvbmZpZyh2YWx1ZTogVGFibGVDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fY29uZmlnID0gdmFsdWU7XG4gICAgLy8gcmFpc2Ugc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5jb25maWdDaGFuZ2VzLm5leHQodGhpcy5fY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcgYXMgVGFibGVDb25maWd1cmF0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBsYXN0UXVlcnlUb3RhbEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9sYXN0UXVlcnlUb3RhbEl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYmxlIGZvb3RlciB3aWxsIGJlIHZpc2libGUgb3Igbm90XG4gICAqL1xuICBASW5wdXQoJ3Nob3dGb290ZXInKVxuICBwdWJsaWMgc2V0IHNob3dGb290ZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93Rm9vdGVyID0gdmFsdWU7XG4gICAgLy8gc2hvdyBvciBoaWRlIGZvb3RlclxuICAgIGlmICh0aGlzLl9lbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZXNfaW5mbycpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzaG93Rm9vdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93Rm9vdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYmxlIGZvb3RlciB3aWxsIGJlIHZpc2libGUgb3Igbm90XG4gICAqL1xuICAgQElucHV0KCdzaG93SGVhZGVyJylcbiAgIHB1YmxpYyBzZXQgc2hvd0hlYWRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgICB0aGlzLl9zaG93SGVhZGVyID0gdmFsdWU7XG4gICAgIC8vIHNob3cgb3IgaGlkZSBmb290ZXJcbiAgICAgaWYgKHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgY29uc3QgZWxlbWVudCA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGU+dGhlYWQnKTtcbiAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICAgfVxuICAgICAgIGNvbnN0IGRhdGFUYWJsZSA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KS5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlJyk7XG4gICAgICAgaWYgKGRhdGFUYWJsZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgICB9XG4gICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xuICAgICAgICAgLy8gYWRkIHRvcCBtYXJnaW5cbiAgICAgICAgIGRhdGFUYWJsZS5jbGFzc0xpc3QucmVtb3ZlKCdtdC0yJyk7XG4gICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICAvLyByZW1vdmUgdG9wIG1hcmdpblxuICAgICAgICAgZGF0YVRhYmxlLmNsYXNzTGlzdC5hZGQoJ210LTInKTtcbiAgICAgICB9XG4gICAgIH1cbiAgIH1cblxuICAgcHVibGljIGdldCBzaG93SGVhZGVyKCkge1xuICAgICByZXR1cm4gdGhpcy5fc2hvd0hlYWRlcjtcbiAgIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgcGFnaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgdmlzaWJsZSBvciBub3RcbiAgICovXG4gIEBJbnB1dCgnc2hvd1BhZ2luZycpXG4gIHB1YmxpYyBzZXQgc2hvd1BhZ2luZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dQYWdpbmcgPSB2YWx1ZTtcbiAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlc19wYWdpbmF0ZScpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgalF1ZXJ5KGVsZW1lbnQpLnNob3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpRdWVyeShlbGVtZW50KS5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzaG93UGFnaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93UGFnaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhbiBhY3RpdmUgcXVlcnkgZm9yIHRoaXMgdGFibGVcbiAgICovXG4gIEBJbnB1dCgncXVlcnknKVxuICBwdWJsaWMgc2V0IHF1ZXJ5KHZhbHVlOiBDbGllbnREYXRhUXVlcnlhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5IGFzIENsaWVudERhdGFRdWVyeWFibGU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdHJhbnNsYXRvcjogVHJhbnNsYXRlUGlwZTtcbiAgcHVibGljIGRhdGFUYWJsZTogYW55O1xuICBwdWJsaWMgZHRPcHRpb25zOiBhbnk7XG4gIHByaXZhdGUgbGFzdFF1ZXJ5UGFyYW1zPzogRGF0YVNlcnZpY2VRdWVyeVBhcmFtcztcbiAgcHJpdmF0ZSBfbGFzdFF1ZXJ5VG90YWxJdGVtcyA9IDA7XG4gIHByaXZhdGUgcmVsb2FkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY29udGV4dDogQW5ndWxhckRhdGFDb250ZXh0LFxuICAgICAgICAgICAgICBASW5qZWN0KENPTFVNTl9GT1JNQVRURVJTKSBwcml2YXRlIF9jb2x1bW5Gb3JtYXR0ZXJzOiBJQWR2YW5jZWRUYWJsZUZvcm1hdHRlcnMsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2FjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIF9hZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXI6IEFkdmFuY2VkRmlsdGVyVmFsdWVQcm92aWRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdGVtcGxhdGU6IFRlbXBsYXRlUGlwZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9hZGluZzogTG9hZGluZ1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbHVtblNlbGVjdG9yOiBDb2x1bW5TZWxlY3RvclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9leHBvcnRTcHJlYWRzaGVldDogRXhwb3J0U3ByZWFkc2hlZXRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9tb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2UpIHtcbiAgICAvLyBpbml0aWFsaXplIHRyYW5zbGF0ZSBwaXBlXG4gICAgdGhpcy50cmFuc2xhdG9yID0gbmV3IFRyYW5zbGF0ZVBpcGUodGhpcy5fdHJhbnNsYXRlU2VydmljZSwgbmV3IFRhYmxlVHJhbnNsYXRpb25DaGFuZ2VEZXRlY3RvcigpKTtcbiAgICBqUXVlcnkuZm4uZGF0YVRhYmxlLmV4dC5jbGFzc2VzLnNQYWdlQnV0dG9uID0gJ2J0bic7XG4gICAgalF1ZXJ5LmZuLmRhdGFUYWJsZS5leHQuY2xhc3Nlcy5zUGFnZUJ1dHRvbkFjdGl2ZSA9ICdidG4gYnRuLWxpZ2h0JztcbiAgICB0aGlzLnJlbG9hZFN1YnNjcmlwdGlvbiA9IHRoaXMucmVsb2FkLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5mZXRjaCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gc2ltcGxlIHNlYXJjaFxuICBwdWJsaWMgc2VhcmNoKHNlYXJjaFRleHQpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB0aGlzLl9jb250ZXh0Lm1vZGVsKHRoaXMuY29uZmlnLm1vZGVsKS5hc1F1ZXJ5YWJsZSgpO1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGUpIHtcbiAgICAgIGlmIChzZWFyY2hUZXh0ICYmIHRoaXMuY29uZmlnLnNlYXJjaEV4cHJlc3Npb24pIHtcbiAgICAgICAgLy8gdmFsaWRhdGUgc2VhcmNoIHRleHQgaW4gZG91YmxlIHF1b3Rlc1xuICAgICAgICBpZiAoL15cIiguKj8pXCIkLy50ZXN0KHNlYXJjaFRleHQpKSB7XG4gICAgICAgICAgdGhpcy5xdWVyeS5zZXRQYXJhbSgnJGZpbHRlcicsXG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZS50cmFuc2Zvcm0odGhpcy5jb25maWcuc2VhcmNoRXhwcmVzc2lvbiwge1xuICAgICAgICAgICAgICB0ZXh0OiBzZWFyY2hUZXh0LnJlcGxhY2UoL15cInxcIiQvZywgJycpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRyeSB0byBzcGxpdCB3b3Jkc1xuICAgICAgICAgIGNvbnN0IHdvcmRzID0gc2VhcmNoVGV4dC5zcGxpdCgnICcpO1xuICAgICAgICAgIC8vIGpvaW4gd29yZHMgdG8gYSBzaW5nbGUgZmlsdGVyXG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gd29yZHMubWFwKCh3b3JkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGUudHJhbnNmb3JtKCh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5zZWFyY2hFeHByZXNzaW9uKSBhcyBzdHJpbmcsIHtcbiAgICAgICAgICAgICAgdGV4dDogd29yZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLmpvaW4oJyBhbmQgJyk7XG4gICAgICAgICAgLy8gc2V0IGZpbHRlclxuICAgICAgICAgIHRoaXMucXVlcnkuc2V0UGFyYW0oJyRmaWx0ZXInLCBmaWx0ZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjbGVhciBmaWx0ZXJcbiAgICAgICAgdGhpcy5xdWVyeS5zZXRQYXJhbSgnJGZpbHRlcicsIG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmlyc3RMb2FkID0gZmFsc2U7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5kcmF3KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVuc3VyZSBlbXB0eSB0YWJsZSBsYXlvdXRcbiAgICAgIHRoaXMucmVzZXRFbXB0eVRhYmxlKCk7XG4gICAgICAvLyBzZWFyY2ggbG9jYWxseVxuICAgICAgdGhpcy5kYXRhVGFibGUuc2VhcmNoKHNlYXJjaFRleHQudHJpbSgpKS5kcmF3KCk7XG4gICAgICAvLyBnZXQgaW5kZXhlcyBvZiBmaWx0ZXJlZCByb3dzXG4gICAgICBjb25zdCBpbmRleGVzID0gQXJyYXkuZnJvbSh0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLmFpRGlzcGxheSk7XG4gICAgICAvLyBzZXQgcmVjb3Jkc0ZpbHRlcmVkXG4gICAgICBjb25zdCByZWNvcmRzRmlsdGVyZWQgPSBpbmRleGVzLmxlbmd0aDtcbiAgICAgIC8vIHNldCByZWNvcmRzVG90YWxcbiAgICAgIGNvbnN0IHJlY29yZHNUb3RhbCA9IGluZGV4ZXMubGVuZ3RoO1xuICAgICAgLy8gcmV0cmlldmUgZGF0YSBmcm9tIGluZGV4ZXNcbiAgICAgIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCkpO1xuICAgICAgY29uc3QgZGF0YSA9IGluZGV4ZXMubWFwKGluZGV4ID0+IHJvd3NbPG51bWJlcj5pbmRleF0pO1xuICAgICAgLy8gZW1pdCByZXN1bHRzIHRvIGxvYWQgb3V0cHV0XG4gICAgICB0aGlzLmxvYWQuZW1pdCh7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIHJlY29yZHNGaWx0ZXJlZDogcmVjb3Jkc0ZpbHRlcmVkLFxuICAgICAgICByZWNvcmRzVG90YWw6IHJlY29yZHNUb3RhbFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZldGNoKGNsZWFyU2VsZWN0ZWQ/OiBib29sZWFuKSB7XG4gICAgLy8gaWYgZGF0YSB0YWJsZSBpcyBudWxsXG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlID09IG51bGwpIHtcbiAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZVxuICAgICAgcmV0dXJuIHRoaXMubmdPbkluaXQoKTtcbiAgICB9XG4gICAgLy8gY2xlYXIgc2VsZWN0aW9uIGlmIHBhcmFtZXRlciBpcyBub3QgZGVjbGFyZWQgb3IgaXQncyB0cnVlXG4gICAgaWYgKGNsZWFyU2VsZWN0ZWQgPT0gbnVsbCB8fCBjbGVhclNlbGVjdGVkID09PSB0cnVlKSB7XG4gICAgICAvLyBzZXQgc21hcnQgc2VsZWN0IHRvIGZhbHNlXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gZmFsc2U7XG4gICAgICAvLyBjbGVhciBzZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIC8vIGNsZWFyIHVuc2VsZWN0ZWQgaXRlbXNcbiAgICAgIGlmICh0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudW5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy51bnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG90aGVyd2lzZSBsb2FkIGRhdGEgb25seVxuICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZmlyc3RMb2FkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLnRhYmxlKSB7XG4gICAgICAgIGpRdWVyeSh0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQpLmVtcHR5KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFUYWJsZSA9IG51bGw7XG4gICAgICAvLyBjbGVhciBzZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIC8vIGNsZWFyIHVuc2VsZWN0ZWQgaXRlbXNcbiAgICAgIGlmICh0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudW5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy51bnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICAvLyBzZXQgc21hcnQgc2VsZWN0IHRvIGZhbHNlXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIHNwZWNpZmllZCBkYXRhIHJvd1xuICAgKi9cbiAgcHVibGljIHNlbGVjdFJvdyhyb3c6IGFueSwgc2lsZW50PzogYm9vbGVhbikge1xuICAgIGlmIChyb3cpIHtcbiAgICAgIC8vIGdldCByb3dcbiAgICAgIGNvbnN0IHJvd05vZGUgPSByb3cubm9kZSgpO1xuICAgICAgLy8gaWYgbXVsdGlwbGUgc2VsZWN0IGlzIGZhbHNlXG4gICAgICBpZiAodGhpcy5tdWx0aXBsZVNlbGVjdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tU2VsZWN0ID09PSBmYWxzZSkge1xuICAgICAgICAgIC8vIGVudW1lcmF0ZSByb3dcbiAgICAgICAgICB0aGlzLmRhdGFUYWJsZS5yb3dzKCkubm9kZXMoKS5lYWNoKChub2RlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlICE9PSByb3dOb2RlKSB7XG4gICAgICAgICAgICAgIGpRdWVyeShub2RlKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoJy5zZWxlY3RlZCcpLm5vZGVzKCkuZWFjaCgobm9kZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gcm93Tm9kZSkge1xuICAgICAgICAgICAgICBqUXVlcnkobm9kZSkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xlYXIgc2VsZWN0ZWRcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gaWYgY3VzdG9tIHNlbGVjdCBtb2RlIGlzIG9mZlxuICAgICAgaWYgKHRoaXMuY3VzdG9tU2VsZWN0ID09PSBmYWxzZSkge1xuICAgICAgICBqUXVlcnkocm93Tm9kZSkuZmluZCgnOmNoZWNrYm94JykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGFkZCBjbGFzc1xuICAgICAgICBqUXVlcnkocm93Lm5vZGUoKSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgICAvLyBnZXQgcm93IGRhdGFcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ucHJvcGVydHkgfHwgdGhpcy5jb25maWcuY29sdW1uc1swXS5uYW1lIHx8ICcnO1xuICAgICAgY29uc3QgZGF0YSA9IHJvdy5kYXRhKCk7XG4gICAgICAvLyBzZWFyY2ggc2VsZWN0ZWQgaXRlbXNcbiAgICAgIGxldCBmaW5kSW5kZXggPSB0aGlzLnNlbGVjdGVkLmZpbmRJbmRleCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4geFtrZXldID09PSBkYXRhW2tleV07XG4gICAgICB9KTtcbiAgICAgIGlmIChmaW5kSW5kZXggPj0gMCkge1xuICAgICAgICAvLyByZW1vdmUgcHJldmlvdXNseSBzZWxlY3RlZCByb3dcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoZmluZEluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWQucHVzaChkYXRhKTtcbiAgICAgIC8vIHZhbGlkYXRlIHVuc2VsZWN0ZWQgZGF0YVxuICAgICAgZmluZEluZGV4ID0gdGhpcy51bnNlbGVjdGVkLmZpbmRJbmRleCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4geFtrZXldID09PSBkYXRhW2tleV07XG4gICAgICB9KTtcbiAgICAgIGlmIChmaW5kSW5kZXggPj0gMCkge1xuICAgICAgICAvLyByZW1vdmUgcHJldmlvdXNseSBzZWxlY3RlZCByb3dcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZShmaW5kSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5zZWxlY3RzIHRoZSBzcGVjaWZpZWQgZGF0YSByb3cgaWYgaXQncyBzZWxlY3RlZFxuICAgKi9cbiAgcHVibGljIHVuU2VsZWN0Um93KHJvdzogYW55LCBzaWxlbnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKHJvdykge1xuICAgICAgLy8gaWYgY3VzdG9tIHNlbGVjdCBtb2RlIGlzIG9mZlxuICAgICAgaWYgKHRoaXMuY3VzdG9tU2VsZWN0ID09PSBmYWxzZSkge1xuICAgICAgICBqUXVlcnkocm93Lm5vZGUoKSkuZmluZCgnOmNoZWNrYm94JykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSBhZGQgY2xhc3NcbiAgICAgICAgalF1ZXJ5KHJvdy5ub2RlKCkpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IGZpcnN0IGNvbHVtbiBrZXlcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ucHJvcGVydHkgfHwgdGhpcy5jb25maWcuY29sdW1uc1swXS5uYW1lIHx8ICcnO1xuICAgICAgY29uc3QgZGF0YSA9IHJvdy5kYXRhKCk7XG4gICAgICBjb25zdCBpZCA9IGRhdGFba2V5XTtcbiAgICAgIGxldCBmaW5kSW5kZXggPSB0aGlzLnNlbGVjdGVkLmZpbmRJbmRleCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4geFtrZXldID09PSBpZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuc3BsaWNlKGZpbmRJbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLnNtYXJ0U2VsZWN0KSB7XG4gICAgICAgICAgLy8gYWRkIHRoaXMgcm93IHRvIHVuc2VsZWN0ZWQgcm93c1xuICAgICAgICAgIGZpbmRJbmRleCA9IHRoaXMudW5zZWxlY3RlZC5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB4W2tleV0gPT09IGlkO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChmaW5kSW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLnVuc2VsZWN0ZWQucHVzaChkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0QW55KCkge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgZmxhZ1xuICAgICAgdGhpcy5zbWFydFNlbGVjdCA9IHRydWU7XG4gICAgICAvLyBzZWxlY3QgYW55IHJvd1xuICAgICAgdGhpcy5kYXRhVGFibGUucm93cygpLmV2ZXJ5KChpbmRleDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZGF0YVRhYmxlLnJvdyggaW5kZXggKTtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3cocm93LCB0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gZW1pdCBzZWxlY3Rpb24gZXZlbnRcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3ROb25lKCkge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgZmxhZ1xuICAgICAgdGhpcy5zbWFydFNlbGVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIC8vIHNlbGVjdCBhbnkgcm93XG4gICAgICB0aGlzLmRhdGFUYWJsZS5yb3dzKCkuZXZlcnkoKGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhVGFibGUucm93KCBpbmRleCApO1xuICAgICAgICB0aGlzLnVuU2VsZWN0Um93KHJvdywgdHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIC8vIGVtaXQgc2VsZWN0aW9uIGV2ZW50XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0Um93KHJvdzogYW55KSB7XG4gICAgaWYgKHJvdykge1xuICAgICAgY29uc3QgZGF0YSA9IHJvdy5kYXRhKCk7XG4gICAgICAvLyBnZXQgZmlyc3QgY29sdW1uIGtleVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWUgfHwgJyc7XG4gICAgICAvLyBnZXQgaWRcbiAgICAgIGNvbnN0IGlkID0gZGF0YVtrZXldO1xuICAgICAgLy8gZmluZCBpZiByb3cgaXMgc2VsZWN0ZWRcbiAgICAgIGNvbnN0IGZpbmRJbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4geFtrZXldID09PSBpZDtcbiAgICAgIH0pO1xuICAgICAgLy8gaWYgcm93IGlzIHNlbGVjdGVkXG4gICAgICBpZiAoZmluZEluZGV4ID49IDApIHtcbiAgICAgICAgLy8gdW5zZWxlY3RcbiAgICAgICAgdGhpcy51blNlbGVjdFJvdyhyb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3cocm93KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNNZXRob2RDYW5CZVN0YXRpY1xuICAvKipcbiAgICogRGF0YXRhYmxlcyBjb2x1bW4gcmVuZGVyZXIgZm9yIHNlbGVjdCBjaGVja2JveFxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gdHlwZVxuICAgKiBAcGFyYW0gcm93XG4gICAqIEBwYXJhbSBtZXRhXG4gICAqL1xuICBwcml2YXRlIF9yZW5kZXJTZWxlY3QoZGF0YSwgdHlwZSwgcm93LCBtZXRhKSB7XG4gICAgLy8gZ2V0IGNvbHVtblxuICAgIGNvbnN0IGNvbHVtbiA9IG1ldGEuc2V0dGluZ3MuYW9Db2x1bW5zW21ldGEuY29sXTtcbiAgICBpZiAodHlwZW9mIGNvbHVtbi5zZWxlY3RUZW1wbGF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHtcbiAgICAgICAgc2VsZWN0VGVtcGxhdGU6IHRlbXBsYXRlKGA8aW5wdXQgY2xhc3M9XCJjaGVja2JveCBjaGVja2JveC10aGVtZSBzLXJvd1wiIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIGlkPVwicy0ke3RoaXMuX2lkfS1cXCR7bWV0YS5yb3d9XCIgZGF0YS1pZD1cIlxcJHtkYXRhfVwiIC8+PGxhYmVsIGZvcj1cInMtJHt0aGlzLl9pZH0tXFwke21ldGEucm93fVwiPiZuYnNwOzwvbGFiZWw+XG4gICAgICAgIGApLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIHJlbmRlciB0ZW1wbGF0ZVxuICAgIHJldHVybiBjb2x1bW4uc2VsZWN0VGVtcGxhdGUoe1xuICAgICAgbWV0YSxcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmxvYWRpbmcuZW1pdCh7XG4gICAgICAgIHRhcmdldDogdGhpc1xuICAgICAgfSk7XG4gICAgICAvLyBwYXJzZSBwcm9wZXJ0aWVzXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29uZmlnLCAnc2VsZWN0YWJsZScpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZSA9IHRoaXMuY29uZmlnLnNlbGVjdGFibGU7XG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29uZmlnLCAnbXVsdGlwbGVTZWxlY3QnKSkge1xuICAgICAgICB0aGlzLm11bHRpcGxlU2VsZWN0ID0gdGhpcy5jb25maWcubXVsdGlwbGVTZWxlY3Q7XG4gICAgICB9XG4gICAgICAvLyBwcmVwYXJlIGNvbmZpZ3VyYXRpb24gZm9yIGNvbHVtbnNcbiAgICAgIGNvbnN0IHRhYmxlQ29sdW1ucyA9IHRoaXMuY29uZmlnLmNvbHVtbnNcbiAgICAgICAgLy8gZmlsdGVyIGFjdGlvbiBsaW5rIGNvbHVtblxuICAgICAgICAuZmlsdGVyKChjb2x1bW4pID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uLmZvcm1hdHRlciAmJiBjb2x1bW4uZm9ybWF0dGVyID09PSAnQWN0aW9uTGlua0Zvcm1hdHRlcicgJiYgdGhpcy5zaG93QWN0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgLy8gY29udmVydCBjb2x1bW4gdG8gYWR2YW5jZSB0YWJsZSBjb2x1bW5cbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgQ29sdW1uRm9ybWF0dGVyKHRoaXMuX2luamVjdG9yKSwgY29sdW1uKTtcbiAgICAgICAgfSkubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5EZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgZGF0YTogY29sdW1uLnByb3BlcnR5IHx8IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgZGVmYXVsdENvbnRlbnQ6IGNvbHVtbi5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdENvbnRlbnQnKSA/IGNvbHVtbi5kZWZhdWx0Q29udGVudCA6ICcnLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRvci50cmFuc2Zvcm0oY29sdW1uLnRpdGxlKSxcbiAgICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uaGFzT3duUHJvcGVydHkoJ3NvcnRhYmxlJykgPyBjb2x1bW4uc29ydGFibGUgOiB0cnVlLFxuICAgICAgICAgICAgdmlzaWJsZTogY29sdW1uLmhhc093blByb3BlcnR5KCdoaWRkZW4nKSA/ICFjb2x1bW4uaGlkZGVuIDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoY29sdW1uLmNsYXNzTmFtZSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogY29sdW1uLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVycykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgIHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IHN0cmluZywgcm93OiBhbnksIG1ldGE6IGFueSkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBkYXRhO1xuICAgICAgICAgICAgICAgIChjb2x1bW4uZm9ybWF0dGVycyBhcyBhbnlbXSkuZm9yRWFjaCgoY29sdW1uRm9ybWF0dGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBzZWxmLl9jb2x1bW5Gb3JtYXR0ZXJzW2NvbHVtbkZvcm1hdHRlci5mb3JtYXR0ZXJdO1xuICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0U3RyaW5nID0gY29sdW1uRm9ybWF0dGVyLmZvcm1hdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdE9wdGlvbnMgPSBjb2x1bW5Gb3JtYXR0ZXIuZm9ybWF0T3B0aW9ucztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdHRlci5yZW5kZXIuYmluZChjb2x1bW4pKHJlc3VsdCwgdHlwZSwgcm93LCBtZXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZvcm1hdFN0cmluZztcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZvcm1hdE9wdGlvbnM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29sdW1uIGZvcm1hdHRlcnMgZXhwb3J0IGNyZWF0ZWRDZWxsIGV2ZW50XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGNvbHVtbi5mb3JtYXR0ZXJzLmZpbHRlcigoY29sdW1uRm9ybWF0dGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBjb2x1bW5Gb3JtYXR0ZXIuYWZ0ZXJSZW5kZXIgPT09ICdmdW5jdGlvbic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgIGNyZWF0ZWRDZWxsKGNlbGw6IGFueSwgY2VsbERhdGE6IGFueSwgcm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKChjb2x1bW5Gb3JtYXR0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gc2VsZi5fY29sdW1uRm9ybWF0dGVyc1tjb2x1bW5Gb3JtYXR0ZXIuZm9ybWF0dGVyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLmFmdGVyUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyLmFmdGVyUmVuZGVyLmJpbmQoY29sdW1uKShjZWxsLCBjZWxsRGF0YSwgcm93RGF0YSwgcm93SW5kZXgsIGNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBzZWxmLl9jb2x1bW5Gb3JtYXR0ZXJzW2NvbHVtbi5mb3JtYXR0ZXJdO1xuICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZvcm1hdHRlci5yZW5kZXIuYmluZChjb2x1bW4pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIgJiYgdHlwZW9mIGZvcm1hdHRlci5hZnRlclJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZvcm1hdHRlci5yZW5kZXIuYmluZChjb2x1bW4pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgICAgY3JlYXRlZENlbGw6IGZvcm1hdHRlci5hZnRlclJlbmRlci5iaW5kKGNvbHVtbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29sdW1uRGVmaW5pdGlvbjtcbiAgICAgICAgfSk7XG4gICAgICAvLyBnZXQgdGFibGUgZWxlbWVudFxuICAgICAgY29uc3QgdGFibGVFbGVtZW50ID0galF1ZXJ5KHRoaXMudGFibGUgJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGUuY29sdW1ucy5hZGp1c3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEpO1xuICAgICAgfSk7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXNoYWRvd2VkLXZhcmlhYmxlXG4gICAgICB0YWJsZUVsZW1lbnQub24oJ3Byb2Nlc3NpbmcuZHQnLCAoZXZlbnQsIHNldHRpbmdzLCBwcm9jZXNzaW5nKSA9PiB7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nKSB7XG4gICAgICAgICAgLy8gY2xlYXIgZW1wdHkgdGFibGUgZWxlbWVudFxuICAgICAgICAgIHRhYmxlRWxlbWVudC5maW5kKCcuZGF0YVRhYmxlc19lbXB0eScpLmh0bWwoJycpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGFibGVFbGVtZW50LmFkZENsYXNzKCdwcm9jZXNzaW5nJyk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0YWJsZUVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3Byb2Nlc3NpbmcnKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgZHJhd0luZGV4ID0gMTtcbiAgICAgIHRhYmxlRWxlbWVudC5vbignb3JkZXIuZHQnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgICAgICBjb25zdCBvcmRlciA9IHRoaXMuZGF0YVRhYmxlLm9yZGVyKCk7XG4gICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRhYmxlQ29sdW1ucztcbiAgICAgICAgICBpZiAob3JkZXIgJiYgb3JkZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm9yZGVyLmVtaXQob3JkZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkub24oJ2RyYXcuZHQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5kcmF3LmVtaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICAgICAgY29uc3QgaW5mbzogeyBwYWdlOiBudW1iZXI7IHBhZ2VzOiBudW1iZXIgfSA9IHRoaXMuZGF0YVRhYmxlLnBhZ2UuaW5mbygpO1xuICAgICAgICAgIHRoaXMucGFnZS5lbWl0KGluZm8pO1xuICAgICAgICAgIGlmIChkcmF3SW5kZXggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkcmF3SW5kZXgrKztcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge3RoaXMuZGF0YVRhYmxlLmNvbHVtbnMuYWRqdXN0KCk7IH0sIDEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRVJST1InLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRqdXN0aW5nIHRhYmxlIGNvbHVtbnMnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBhbGxvdyBzZWxlY3Rpb25cbiAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgICAgLy8gZ2V0IGZpcnN0IGNvbHVtbiAoYXMgcm93IHByaW1hcnkga2V5KVxuICAgICAgICAvLyB0b2RvOjphbGxvdyByb3cgcHJpbWFyeSBrZXkgY29uZmlndXJhdGlvblxuICAgICAgICBjb25zdCBmaXJzdENvbHVtbiA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF07XG4gICAgICAgIC8vIGFkZCBzZWxlY3QgY29sdW1uXG4gICAgICAgIGNvbnN0IHNlbGVjdENvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAndGV4dC1jZW50ZXIgcGwtNCBwci0wJyxcbiAgICAgICAgICBkYXRhOiBmaXJzdENvbHVtbi5wcm9wZXJ0eSB8fCBmaXJzdENvbHVtbi5uYW1lLFxuICAgICAgICAgIGRlZmF1bHRDb250ZW50OiAnJyxcbiAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZpc2libGU6ICF0aGlzLmN1c3RvbVNlbGVjdCxcbiAgICAgICAgICBuYW1lOiBmaXJzdENvbHVtbi5uYW1lLFxuICAgICAgICB9O1xuICAgICAgICAvLyBhc3NpZ24gcmVuZGVyZXJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RDb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgcmVuZGVyOiB0aGlzLl9yZW5kZXJTZWxlY3QuYmluZCh0aGlzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFuZCBmaW5hbGx5IGFkZCBjb2x1bW5cbiAgICAgICAgdGFibGVDb2x1bW5zLnVuc2hpZnQoc2VsZWN0Q29sdW1uRGVmaW5pdGlvbik7XG4gICAgICAgIC8vIHVzZXIgaW50ZXJmYWNlIGFkZGl0aW9uc1xuICAgICAgICAvLyBoYW5kbGUgcGFnZSBjaGFuZ2UgZXZlbnQgKGEgdHJpY2sgZm9yIGZpcmluZyBkcmF3LmR0IGV2ZW50cylcbiAgICAgICAgdGFibGVFbGVtZW50XG4gICAgICAgICAgLy8gaGFuZGxlIGRyYXcgZXZlbnRzXG4gICAgICAgICAgLm9uKCdkcmF3LmR0JywgKCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QpIHtcbiAgICAgICAgICAgICAgLy8gZW5hYmxlIHJvdyBzZWxlY3Rpb24gZXZlbnRcbiAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoJ3Rib2R5Jykub24oJ2NsaWNrJywgJ3RyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0IHJvd1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNlbGYuZGF0YVRhYmxlLnJvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICAvLyBhZGQgcm93XG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3QuZW1pdChyb3cpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFibGVFbGVtZW50LmZpbmQoJ2lucHV0LnMtcm93Jyk7XG4gICAgICAgICAgICBlbGVtZW50cy5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc2VsZWN0aW9uIG9uIGN1cnJlbnQgcGFnZVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCAnJztcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gZW51bWVyYXRlIHNlbGVjdGVkIGl0ZW1zXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGZpbmQgcm93IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1ba2V5XTtcbiAgICAgICAgICAgICAgICAvLyBpZiBpZGVudGlmaWVyIGlzIGRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgY2hlY2sgZWxlbWVudCB3aXRoIHRoaXMgaWRlbnRpZmllciBpbiBhdHRyaWJ1dGUgZGF0YS1pZFxuICAgICAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoYGlucHV0W2RhdGEtaWQ9JyR7aWR9J11gKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNtYXJ0U2VsZWN0KSB7XG4gICAgICAgICAgICAgIC8vIHNlbGVjdCByb3dzIHRoYXQgYXJlIG5vdCBzZWxlY3RlZFxuICAgICAgICAgICAgICAvLyBhbmQgZG8gbm90IGluY2x1ZGVkIGluIHVuc2VsZWN0ZWQgY29sbGVjdGlvblxuICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnaW5wdXRbZGF0YS1pZF0nKS5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGdldCBkYXRhIGlkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG4gICAgICAgICAgICAgICAgICByZXR1cm4geFtrZXldID09IGpRdWVyeShlbGVtZW50KS5hdHRyKCdkYXRhLWlkJyk7XG4gICAgICAgICAgICAgICAgfSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyh0aGlzLmRhdGFUYWJsZS5yb3coaW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnaW5wdXRbZGF0YS1pZF0nKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIHRhYmxlXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICAgICAgLy8gc2V0IGxlbmd0aCBtZW51XG4gICAgICAgIGxlbmd0aE1lbnU6IFs1LCAxMCwgNTAsIDEwMCwgMjAwLCA1MDBdLFxuICAgICAgICAvLyBoaWRlIGxlbmd0aCBtZW51XG4gICAgICAgIGxlbmd0aENoYW5nZTogZmFsc2UsXG4gICAgICAgIC8vIGVuYWJsZSBzZWFyY2ggYnV0IGhpZGUgc2VhcmNoIGJveCAoY3NzKVxuICAgICAgICBzZWFyY2hpbmc6IHRydWUsXG4gICAgICAgIC8vIGVuYWJsZSBkYXRhIHByb2Nlc3NpbmdcbiAgICAgICAgcHJvY2Vzc2luZzogdHJ1ZSxcbiAgICAgICAgLy8gZW5hYmxlIGdldHRpbmcgc2VydmVyIHNpZGUgZGF0YVxuICAgICAgICBzZXJ2ZXJTaWRlOiB0aGlzLnNlcnZlclNpZGUsXG4gICAgICAgIC8vIGVudW1lcmF0ZSB0YWJsZSBjb2x1bW5zXG4gICAgICAgIGNvbHVtbnM6IHRhYmxlQ29sdW1ucyxcbiAgICAgICAgY29sUmVvcmRlcjogIHRoaXMuY29sdW1uT3JkZXJpbmcsXG4gICAgICAgIG9yZGVyOiBbXSxcbiAgICAgICAgLy8gc2V0IHNjcm9sbCB4XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc2Nyb2xsWCxcbiAgICAgICAgZG9tOiAnQmZydGlwJyxcbiAgICAgICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4dGVuZDogJ2V4Y2VsJyxcbiAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmNvbmZpZy50aXRsZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2Qtbm9uZScsXG4gICAgICAgICAgICBleHBvcnRPcHRpb25zOiB7XG4gICAgICAgICAgICAgIGNvbHVtbnM6ICd0aDpub3QoOmZpcnN0LWNoaWxkKScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIC8vIGRlZmluZSBzZXJ2ZXIgZGF0YSBjYWxsYmFja1xuICAgICAgICBmblNlcnZlckRhdGEoc1NvdXJjZTogYW55LCBhb0RhdGE6IGFueSwgZm5DYWxsYmFjazogYW55LCBvU2V0dGluZ3M6IGFueSkge1xuICAgICAgICAgIC8vIGlmIG1ldGhvZCBpcyBpbnZva2VkIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICAgIGlmIChzZWxmLl9maXJzdExvYWQpIHtcbiAgICAgICAgICAgIC8vIGRpc2FibGVkIGZpcnN0IGxvYWQgZmxhZ1xuICAgICAgICAgICAgc2VsZi5fZmlyc3RMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBpZiBhdXRvIGxvYWQgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgIGlmIChzZWxmLmF1dG9Mb2FkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICBjb25zdCBlbXB0eURhdGFTZXQgPSB7XG4gICAgICAgICAgICAgICAgcmVjb3Jkc1RvdGFsOiAwLFxuICAgICAgICAgICAgICAgIHJlY29yZHNGaWx0ZXJlZDogMCxcbiAgICAgICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgc2VsZi5fbGFzdFF1ZXJ5VG90YWxJdGVtcyA9IDA7XG4gICAgICAgICAgICAgIC8vIGVtaXQgZW1wdHkgZGF0YVxuICAgICAgICAgICAgICBzZWxmLmxvYWQuZW1pdChlbXB0eURhdGFTZXQpO1xuICAgICAgICAgICAgICAvLyByZXR1cm4gZW1wdHkgZGF0YVxuICAgICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhlbXB0eURhdGFTZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyByZXNldCBlcnJvclxuICAgICAgICAgIHNlbGYudG9nZ2xlRXJyb3IoKTtcbiAgICAgICAgICAvLyBnZXQgYWN0aXZhdGVkIHJvdXRlIHBhcmFtc1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gc2VsZi5fYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XG4gICAgICAgICAgLy8gZ2V0IGNvbHVtbnNcbiAgICAgICAgICBjb25zdCBjb2x1bW5zID0gYW9EYXRhWzFdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBvcmRlciBleHByZXNzaW9uXG4gICAgICAgICAgY29uc3Qgb3JkZXIgPSBhb0RhdGFbMl0udmFsdWU7XG4gICAgICAgICAgLy8gZ2V0IHNraXAgcmVjb3JkcyBwYXJhbVxuICAgICAgICAgIGNvbnN0IHNraXAgPSBhb0RhdGFbM10udmFsdWU7XG4gICAgICAgICAgLy8gZ2V0IHBhZ2Ugc2l6ZSBwYXJhbVxuICAgICAgICAgIGNvbnN0IHRvcCA9IGFvRGF0YVs0XS52YWx1ZTtcbiAgICAgICAgICAvLyBnZXQgc2VhcmNoIHZhbHVlXG4gICAgICAgICAgY29uc3Qgc2VhcmNoID0gYW9EYXRhWzVdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBkYXRhIHF1ZXJ5YWJsZVxuICAgICAgICAgIGNvbnN0IHEgPSBzZWxmLl9xdWVyeSBpbnN0YW5jZW9mIENsaWVudERhdGFRdWVyeWFibGUgPyBzZWxmLl9xdWVyeSA6IHNlbGYuX2NvbnRleHQubW9kZWwoc2VsZi5jb25maWcubW9kZWwpLmFzUXVlcnlhYmxlKCk7XG4gICAgICAgICAgLy8gYXBwbHkgcGFnaW5nIHBhcmFtc1xuICAgICAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgICAgIHEudGFrZSh0b3ApLnNraXAoc2tpcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGFwcGx5IG9yZGVyIHBhcmFtc1xuICAgICAgICAgIGlmIChvcmRlciAmJiBvcmRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGdldCBvcmRlciBxdWVyeSBleHByZXNzaW9uXG4gICAgICAgICAgICBjb25zdCBvcmRlckJ5U3RyID0gb3JkZXIubWFwKChleHByOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGNvbHVtbkluZGV4OiBudW1iZXI7XG4gICAgICAgICAgICAgIGlmIChzZWxmLmNvbHVtbk9yZGVyaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ID0gZXhwci5jb2x1bW47XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGNvbHVtbiBvcmRlciAoZnJvbSBjb2xSZW9yZGVyKVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbk9yZGVyOiBudW1iZXJbXSA9IHNlbGYuZGF0YVRhYmxlLmNvbFJlb3JkZXIub3JkZXIoKTtcbiAgICAgICAgICAgICAgICAvLyBhbmQgbWF0Y2ggdGhlIGRhdGFUYWJsZSBpbmRleCB0byB0aGUgY29uZmlnIGNvbHVtbnMgaW5kZXhcbiAgICAgICAgICAgICAgICAvLyBleHByLmNvbHVtbiBzaG91bGQgYWx3YXlzIGJlIHZhbGlkIChlLmcuIGluIHJhbmdlKSwgYnV0IHBlcmZvcm0gYSBtaW5vciB2YWxpZGF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGV4cHIuY29sdW1uID49IDAgJiYgZXhwci5jb2x1bW4gPCBjb2x1bW5PcmRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ID0gY29sdW1uT3JkZXJbZXhwci5jb2x1bW5dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGZpcnN0IGNvbHVtbiBhcyBhIGZhbGxiYWNrICh3b24ndCBoYXBwZW4sIGp1c3QgZm9yIHNhZmV0eSlcbiAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlQ29sdW1uc1tjb2x1bW5JbmRleF0ubmFtZSArICcgJyArIGV4cHIuZGlyIHx8ICdhc2MnO1xuICAgICAgICAgICAgfSkuam9pbignLCcpO1xuICAgICAgICAgICAgLy8gc2V0IG9yZGVyXG4gICAgICAgICAgICBxLnNldFBhcmFtKCckb3JkZXJieScsIG9yZGVyQnlTdHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBlbnN1cmUgc2VsZi5zdGF0ZUxvYWRDYWxsYmFja1xuICAgICAgICAgIGlmIChzZWxmLnN0YXRlTG9hZENhbGxiYWNrID09IG51bGwpIHtcbiAgICAgICAgICAgIHNlbGYuc3RhdGVMb2FkQ2FsbGJhY2sgPSAoKF8sIGNhbGxiYWNrKSAgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5zdGF0ZUxvYWRDYWxsYmFjayhudWxsLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSAkc2VsZWN0IHBhcmFtZXRlclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gc2VsZi5jb25maWcuY29sdW1ucy5maWx0ZXIoIChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi52aXJ0dWFsID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2x1bW4ub3B0aW9uYWwgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0YWJsZUNvbHVtbnMuZmluZEluZGV4KCh0YWJsZUNvbHVtbikgPT4gdGFibGVDb2x1bW4ubmFtZSA9PT0gY29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmNvbHVtbnNbaW5kZXhdLnZpc2libGU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb2x1bW4ucHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLm5hbWUgKyAnIGFzICcgKyBjb2x1bW4ucHJvcGVydHk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5uYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHEuc2VsZWN0LmFwcGx5KHEsIHNlbGVjdCk7XG4gICAgICAgICAgICAvLyBjb25maWd1cmUgJGZpbHRlclxuICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLiRmaWx0ZXIgJiYgcXVlcnlQYXJhbXMuJGZpbHRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gc2V0IHJvdXRlIGZpbHRlclxuICAgICAgICAgICAgICBjb25zdCBxUGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGZpbHRlcicsIG51bGwpO1xuICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9ucyA9IFsgcXVlcnlQYXJhbXMuJGZpbHRlciBdO1xuICAgICAgICAgICAgICBpZiAocVBhcmFtcy4kZmlsdGVyKSB7IGV4cHJlc3Npb25zLnB1c2goJygnICsgcVBhcmFtcy4kZmlsdGVyICsgJyknICk7IH1cbiAgICAgICAgICAgICAgcS5maWx0ZXIoZXhwcmVzc2lvbnMuam9pbignIGFuZCAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBxdWVyeSBwYXJhbWV0ZXJzIGNvbnRhaW4gZmlsdGVyXG4gICAgICAgICAgICBpZiAocXVlcnlQYXJhbXMuJGV4cGFuZCAmJiBxdWVyeVBhcmFtcy4kZXhwYW5kLmxlbmd0aCkge1xuICAgICAgICAgICAgICAvLyBzZXQgcm91dGUgJGV4cGFuZFxuICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZXhwYW5kJywgcXVlcnlQYXJhbXMuJGV4cGFuZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYuY29uZmlnICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzLmV4cGFuZCkge1xuICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZXhwYW5kJywgc2VsZi5jb25maWcuZGVmYXVsdHMuZXhwYW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcS5nZXRQYXJhbXMoKVsnJG9yZGVyYnknXSAmJiBzZWxmLmNvbmZpZyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cy5vcmRlckJ5KSB7XG4gICAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRvcmRlcmJ5Jywgc2VsZi5jb25maWcuZGVmYXVsdHMub3JkZXJCeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VsZi5jb25maWcgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMuZ3JvdXBCeSkge1xuICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZ3JvdXBieScsIHNlbGYuY29uZmlnLmRlZmF1bHRzLmdyb3VwQnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXBwZW5kIGRlZmF1bHQgZmlsdGVyXG4gICAgICAgICAgICBpZiAoc2VsZi5jb25maWcgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMuZmlsdGVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXIuYXN5bmNCdWlsZEZpbHRlcihzZWxmLmNvbmZpZy5kZWZhdWx0cy5maWx0ZXIpLnRoZW4oKGRlZmF1bHRGaWx0ZXJTdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEZpbHRlclN0cmluZykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcVBhcmFtcyA9IHEuZ2V0UGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZmlsdGVyJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9ucyA9IFsgZGVmYXVsdEZpbHRlclN0cmluZyBdO1xuICAgICAgICAgICAgICAgICAgaWYgKHFQYXJhbXMuJGZpbHRlcikgeyBleHByZXNzaW9ucy5wdXNoKCcoJyArIHFQYXJhbXMuJGZpbHRlciArICcpJyApOyB9XG4gICAgICAgICAgICAgICAgICBxLmZpbHRlcihleHByZXNzaW9ucy5qb2luKCcgYW5kICcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZi5sYXN0UXVlcnlQYXJhbXMgPSBxLmdldFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBxLmdldExpc3QoKS50aGVuKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHNUb3RhbDogaXRlbXMudG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtcy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdFF1ZXJ5VG90YWxJdGVtcyA9IGl0ZW1zLnRvdGFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXMudG90YWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc2V0RW1wdHlUYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtaXQgbG9hZCBldmVudFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWQuZW1pdChkYXRhU2V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soZGF0YVNldCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBsb2cgZXJyb3IgdG8gY29uc29sZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RBQkxFUycsIGVycik7XG4gICAgICAgICAgICAgICAgLy8gc2hvdyBlcnJvclxuICAgICAgICAgICAgICAgIHNlbGYudG9nZ2xlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9sYXN0UXVlcnlUb3RhbEl0ZW1zID0gMDtcbiAgICAgICAgICAgICAgICAvLyBieSByZXR1cm5pbmcgZW1wdHkgZGF0YXNldFxuICAgICAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KEVNUFRZX0RBVEFTRVQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmbkNhbGxiYWNrKEVNUFRZX0RBVEFTRVQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYubGFzdFF1ZXJ5UGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgIHEuZ2V0TGlzdCgpLnRoZW4oKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXQgPSB7XG4gICAgICAgICAgICAgICAgcmVjb3Jkc1RvdGFsOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW1zLnZhbHVlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBzZWxmLl9sYXN0UXVlcnlUb3RhbEl0ZW1zID0gaXRlbXMudG90YWw7XG4gICAgICAgICAgICAgIGlmIChpdGVtcy50b3RhbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHNlbGYucmVzZXRFbXB0eVRhYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZW1pdCBsb2FkIGV2ZW50XG4gICAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KGRhdGFTZXQpO1xuICAgICAgICAgICAgICAvLyByZXR1cm4gZGF0YVxuICAgICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhkYXRhU2V0KTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgLy8gbG9nIGVycm9yIHRvIGNvbnNvbGVcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVEFCTEVTJywgZXJyKTtcbiAgICAgICAgICAgICAgLy8gc2hvdyBlcnJvclxuICAgICAgICAgICAgICBzZWxmLnRvZ2dsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgIC8vIGJ5IHJldHVybmluZyBlbXB0eSBkYXRhc2V0XG4gICAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KEVNUFRZX0RBVEFTRVQpO1xuICAgICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhFTVBUWV9EQVRBU0VUKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBsYW5ndWFnZTogT2JqZWN0LmFzc2lnbih7IH0sIHNlbGYudHJhbnNsYXRvci50cmFuc2Zvcm0oJ1RhYmxlcy5EYXRhVGFibGUnKSxcbiAgICAgICAgICB7ZW1wdHlUYWJsZTogJyAnIH0pLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc3RhdGVTZXR0aW5ncyA9IHtcbiAgICAgICAgc3RhdGVTYXZlOiB0aGlzLnN0YXRlU2F2ZVxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLnN0YXRlTG9hZENhbGxiYWNrKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGVTZXR0aW5ncywge1xuICAgICAgICAgIHN0YXRlTG9hZENhbGxiYWNrOiB0aGlzLnN0YXRlTG9hZENhbGxiYWNrXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdGVTYXZlQ2FsbGJhY2spIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZVNldHRpbmdzLCB7XG4gICAgICAgICAgc3RhdGVTYXZlQ2FsbGJhY2s6IHRoaXMuc3RhdGVTYXZlQ2FsbGJhY2tcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzLCBzdGF0ZVNldHRpbmdzKTtcblxuICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZSkge1xuICAgICAgICAvLyBzZXQgY29udGludW91cyBzY3JvbGxpbmdcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5ncywge1xuICAgICAgICAgIHNjcm9sbFk6IHRoaXMuc2Nyb2xsWSxcbiAgICAgICAgICBzY3JvbGxDb2xsYXBzZTogZmFsc2UsXG4gICAgICAgICAgc2Nyb2xsZXI6IHtcbiAgICAgICAgICAgIGxvYWRpbmdJbmRpY2F0b3I6IGZhbHNlLFxuICAgICAgICAgICAgZGlzcGxheUJ1ZmZlcjogMTAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzLCB7XG4gICAgICAgICAgc2Nyb2xsWTogdGhpcy5zY3JvbGxZLFxuICAgICAgICAgIHBhZ2luZzogdGhpcy5wYWdpbmcsXG4gICAgICAgICAgcGFnZUxlbmd0aDogdGhpcy5wYWdlTGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcblxuICAgICAgfVxuICAgICAgLy8gaGFuZGxlIGluaXQuZHQgZXZlbnQgYW5kIGVtaXQgbG9jYWwgZXZlbnRcbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gdGFibGVFbGVtZW50Lm9uKCdpbml0LmR0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHNjcm9sbGVyID0galF1ZXJ5KGV2ZW50LnRhcmdldCkucGFyZW50KCk7XG4gICAgICAgIC8vIGhhbmRsZSBzY3JvbGxpbmdcbiAgICAgICAgc2Nyb2xsZXIub24oJ3Njcm9sbCcsIChzY3JvbGxFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGpRdWVyeShzY3JvbGxFdmVudC50YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IHRvcCA9IHRhcmdldC5zY3JvbGxUb3AoKSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgbGVmdCA9IHRhcmdldC5zY3JvbGxMZWZ0KCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGwuZW1pdCh7XG4gICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgbGVmdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pLkRhdGFUYWJsZShzZXR0aW5ncyk7XG4gICAgICB0aGlzLmluaXQuZW1pdCgpO1xuICAgICAgLy8gc2hvdyBvciBoaWRlIGhlYWRlclxuICAgICAgaWYgKCF0aGlzLnNob3dIZWFkZXIgJiYgdGhpcy5fZWxlbWVudCAmJiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaGlkZVNlbGVjdG9yID0gKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudClcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZT50aGVhZCcpO1xuICAgICAgICBpZiAoaGlkZVNlbGVjdG9yKSB7XG4gICAgICAgICAgaGlkZVNlbGVjdG9yLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkanVzdFNlbGVjdG9yID0gICh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGUnKTtcbiAgICAgICAgaWYgKGFkanVzdFNlbGVjdG9yKSB7XG4gICAgICAgICAgYWRqdXN0U2VsZWN0b3IuY2xhc3NMaXN0LmFkZCgnbXQtMicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgICBpZiAoIXRoaXMuc2hvd0Zvb3RlciAmJiB0aGlzLl9lbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBjb25zdCBpbmZvU2VsZWN0b3IgPSAodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlc19pbmZvJyk7XG4gICAgICAgIGlmIChpbmZvU2VsZWN0b3IpIHtcbiAgICAgICAgICBpbmZvU2VsZWN0b3IuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHNob3cgb3IgaGlkZSBwYWdlclxuICAgICAgaWYgKHRoaXMuc2hvd1BhZ2luZykge1xuICAgICAgICB0aGlzLnNob3dQYWdpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNjcm9sbFRvcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5wYXJlbnQoKS5zY3JvbGxUb3AodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbExlZnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUucGFyZW50KCkuc2Nyb2xsTGVmdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxhc3RRdWVyeSgpOiBDbGllbnREYXRhUXVlcnlhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5jb25maWcgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0UXVlcnlQYXJhbXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBxID0gdGhpcy5fY29udGV4dC5tb2RlbCh0aGlzLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmxhc3RRdWVyeVBhcmFtcykuZm9yRWFjaCggKGtleSkgPT4ge1xuICAgICAgcS5zZXRQYXJhbShrZXksIHRoaXMubGFzdFF1ZXJ5UGFyYW1zICYmIHRoaXMubGFzdFF1ZXJ5UGFyYW1zW2tleV0pO1xuICAgIH0pO1xuICAgIC8vIHJldHVybiBxdWVyeVxuICAgIHJldHVybiBxO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHVwZGF0ZXMgYSBzaW5nbGUgcm93XG4gICAqIEBwYXJhbSBmaW5kIC0gQW55IG9iamVjdCB3aGljaCBpcyBiZWluZyBjb252ZXJ0ZWQgdG8gYSBxdWVyeVxuICAgKi9cbiAgcHVibGljIGZldGNoT25lKGZpbmQ6IGFueSkge1xuICAgIGlmIChmaW5kID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlID09IG51bGwpIHtcbiAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0UXVlcnlQYXJhbXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBnZXQgcm93c1xuICAgIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCkpO1xuICAgIGlmIChyb3dzICYmIHJvd3MubGVuZ3RoKSB7XG4gICAgICAvLyBmaW5kIHJlc3VsdFxuICAgICAgY29uc3QgZmluZEtleXMgPSBPYmplY3Qua2V5cyhmaW5kKTtcbiAgICAgIGlmIChmaW5kS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBmaW5kIHJvdyBpbmRleCBieSBzZWFyY2hpbmcgZWFjaCBwcm9wZXJ0eVxuICAgICAgY29uc3Qgcm93SW5kZXggPSByb3dzLmZpbmRJbmRleCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbmRLZXlzLm1hcCggKGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiByb3dba2V5XSA9PT0gZmluZFtrZXldO1xuICAgICAgICB9KS5maWx0ZXIoIChyZXMpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzID09PSBmYWxzZTtcbiAgICAgICAgfSkubGVuZ3RoID09PSAwO1xuICAgICAgfSk7XG4gICAgICAvLyBpZiByb3cgaGFzIGJlZW4gZm91bmRcbiAgICAgIGlmIChyb3dJbmRleCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5fY29udGV4dC5tb2RlbCh0aGlzLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICAgICAgLy8gc2VsZWN0IGF0dHJpYnV0ZXNcbiAgICAgICAgcXVlcnkuc2V0UGFyYW0oJyRzZWxlY3QnLCB0aGlzLmxhc3RRdWVyeVBhcmFtcy4kc2VsZWN0KTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFF1ZXJ5UGFyYW1zLiRleHBhbmQpIHtcbiAgICAgICAgICAvLyBhcHBseSBleHBhbmQgYXR0cmlidXRlc1xuICAgICAgICAgIHF1ZXJ5LnNldFBhcmFtKCckZXhwYW5kJywgdGhpcy5sYXN0UXVlcnlQYXJhbXMuJGV4cGFuZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXBwbHkgZmlsdGVyIGZvciByb3dcbiAgICAgICAgZmluZEtleXMuZm9yRWFjaCggKGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29uZmlnLmNvbHVtbnMuZmluZCggKGNvbCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbC5wcm9wZXJ0eSA9PT0ga2V5IHx8IGNvbC5uYW1lID09PSBrZXk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgLy8gZ2V0IHByb3BlcnR5IG9yIG5hbWVcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gY29sdW1uLnByb3BlcnR5IHx8IGNvbHVtbi5uYW1lO1xuICAgICAgICAgICAgcXVlcnkuYW5kKHByb3BlcnR5IGFzIHN0cmluZykuZXF1YWwoZmluZFtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkuYW5kKGtleSkuZXF1YWwoZmluZFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhbmQgZmluYWxseSBnZXQgaXRlbVxuICAgICAgICByZXR1cm4gcXVlcnkuZ2V0SXRlbSgpLnRoZW4oIChpdGVtKSA9PiB7XG4gICAgICAgICAgLy8gaWYgaXRlbSBleGlzdHNcbiAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3cocm93SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBqUXVlcnkocm93Lm5vZGUoKSkuZmluZCgnOmNoZWNrYm94JykucHJvcCgnY2hlY2tlZCcpO1xuICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAvLyByZWRyYXcgcm93XG4gICAgICAgICAgICByb3cuZGF0YShpdGVtKTtcbiAgICAgICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5maW5kKCc6Y2hlY2tib3gnKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIC8vIGlmIHJvdyBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3csIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlbG9hZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0aW9uIGNoYW5nZVxuICAgKiBAcGFyYW0gJGV2ZW50XG4gICAqL1xuICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSAgJGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGV4ZWNSZWdleCA9IC8tKFxcZCspJC9nLmV4ZWMoaW5wdXQuaWQpO1xuICAgIC8vIGdldCByb3cgZnJvbSBpZFxuICAgIGNvbnN0IHJvd0luZGV4ID0gcGFyc2VJbnQoKGV4ZWNSZWdleCAmJiBleGVjUmVnZXhbMV0pIGFzIHN0cmluZywgMTApO1xuICAgIC8vIGdldCByb3dcbiAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3cocm93SW5kZXgpLmRhdGEoKTtcbiAgICAvLyBnZXQgcm93IGlkZW50aWZpZXJcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8ICcnO1xuICAgICAgY29uc3QgaWQgPSByb3dba2V5XTtcbiAgICAgIGxldCBmaW5kSXRlbUluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1ba2V5XSA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChpbnB1dC5jaGVja2VkKSB7XG4gICAgICAgIGlmIChmaW5kSXRlbUluZGV4IDwgMCkge1xuICAgICAgICAgIC8vIGFkZCByb3cgdG8gc2VsZWN0ZWQgcm93c1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQucHVzaChyb3cpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmluZEl0ZW1JbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIGl0ZW1cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZShmaW5kSXRlbUluZGV4LCAxKTtcbiAgICAgICAgICBpZiAodGhpcy5zbWFydFNlbGVjdCkge1xuICAgICAgICAgICAgLy8gYWRkIHJvdyB0byB1bnNlbGVjdGVkIHJvd3NcbiAgICAgICAgICAgIGZpbmRJdGVtSW5kZXggPSB0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtW2tleV0gPT09IGlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZmluZEl0ZW1JbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdGVkLnB1c2gocm93KTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEVtcHR5VGFibGUoKSB7XG4gICAgLy8gdGhpcyBvcGVyYXRpb24gaXMgaW1wb3J0YW50XG4gICAgLy8gZHVlIHRvIG5nIGRhdGEgYmluZGluZ1xuICAgIC8vIGVtcHR5IHRhYmxlIHRlbXBsYXRlIGhhcyBubyB0cmFuc2xhdGVkIHRleHQgZHVyaW5nIG5nT25Jbml0KClcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgJiYgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc0VtcHR5VGFibGUgPVxuICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gdGhpcy5lbXB0eVRhYmxlICYmIHRoaXMuZW1wdHlUYWJsZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZUVycm9yKGVycj86IGFueSkge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gKHRoaXMuZXJyb3JUZW1wbGF0ZSAmJiB0aGlzLmVycm9yVGVtcGxhdGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudCk7XG4gICAgICBsZXQgaW5uZXJNZXNzYWdlOiBhbnk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBpbm5lck1lc3NhZ2UgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzbWFsbCcpLml0ZW0oMCk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHRoaXMubGFzdEVycm9yID0gZXJyO1xuICAgICAgICBpZiAoaW5uZXJNZXNzYWdlKSB7XG4gICAgICAgICAgaW5uZXJNZXNzYWdlLmlubmVySFRNTCA9IGVyci5lcnJvciAmJiBlcnIuZXJyb3IubWVzc2FnZSA/IGVyci5lcnJvci5tZXNzYWdlIDogZXJyLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc0VtcHR5VGFibGUgPVxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zWmVyb1JlY29yZHMgPSB0aGlzLmVycm9yVGVtcGxhdGUgJiYgdGhpcy5lcnJvclRlbXBsYXRlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlubmVyTWVzc2FnZSkge1xuICAgICAgICAgIGlubmVyTWVzc2FnZS5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zRW1wdHlUYWJsZSA9IHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNaZXJvUmVjb3JkcyA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJFbXB0eVRhYmxlKCkge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zRW1wdHlUYWJsZSA9IHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNaZXJvUmVjb3JkcyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBleHBvcnQoKSB7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZHQtYnV0dG9ucyAuYnV0dG9ucy1leGNlbCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDb2x1bW5zKGNvbHVtbnNUb1Nob3cpIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZGF0YVRhYmxlO1xuICAgIHRoaXMuY29uZmlnLmNvbHVtbnMuc2xpY2UoMSkuZm9yRWFjaCgoY29sdW1uLCBpKSA9PiB7XG4gICAgICBpZiAoIWNvbHVtbi5oaWRkZW4pIHtcbiAgICAgICAgaWYgKGNvbHVtbnNUb1Nob3cuaW5jbHVkZXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIFR5cGVTY3JpcHRWYWxpZGF0ZUpTVHlwZXNcbiAgICAgICAgICB0YWJsZS5jb2x1bW4oY29sdW1uLm5hbWUgKyAnOm5hbWUnKS52aXNpYmxlKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBUeXBlU2NyaXB0VmFsaWRhdGVKU1R5cGVzXG4gICAgICAgICAgdGFibGUuY29sdW1uKGNvbHVtbi5uYW1lICsgJzpuYW1lJykudmlzaWJsZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZXMsICdjb25maWdTcmMnKSkge1xuICAgICAgaWYgKGNoYW5nZXMuY29uZmlnU3JjICE9IG51bGwpIHtcbiAgICAgICAgLy8gbG9hZCB0YWJsZSBjb25maWd1cmF0aW9uIG9uIGNoYW5nZVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHRyaXBsZS1lcXVhbHNcbiAgICAgICAgaWYgKGNoYW5nZXMuY29uZmlnU3JjLmN1cnJlbnRWYWx1ZSAmJiAoY2hhbmdlcy5jb25maWdTcmMuY3VycmVudFZhbHVlICE9IGNoYW5nZXMuY29uZmlnU3JjLnByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5faHR0cC5nZXQoY2hhbmdlcy5jb25maWdTcmMuY3VycmVudFZhbHVlKS50b1Byb21pc2UoKS50aGVuKChjb25maWc6IFRhYmxlQ29uZmlndXJhdGlvbikgPT4ge1xuICAgICAgICAgICAgLy8gc2V0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICAvLyBmZXRjaCBhbmQgcmVkcmF3XG4gICAgICAgICAgICB0aGlzLmZldGNoKCk7XG4gICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVEFCTEVTJywgJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGFibGUgY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldChsb2FkPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucXVlcnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5hdXRvTG9hZCA9ICEhbG9hZDtcbiAgICB0aGlzLm5nT25Jbml0KCk7XG4gIH1cblxuICBzZWxlY3RDb2x1bW5zKCkge1xuICAgIC8vIGdldCBjb2x1bW4gb3JkZXIgZS5nLiBbMCwgNCwgMSwgMiwgM11cbiAgICBjb25zdCBjb2x1bW5PcmRlcjogbnVtYmVyW10gPSB0aGlzLmRhdGFUYWJsZS5jb2xSZW9yZGVyLm9yZGVyKCk7XG4gICAgLy8gZ2V0IGNvbHVtbiBkZWZpbml0aW9uc1xuICAgIGNvbnN0IGNvbHVtbkRlZnMgPSB0aGlzLmRhdGFUYWJsZS5zZXR0aW5ncygpLmluaXQoKS5jb2x1bW5zO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBjb2x1bW5EZWZzLm1hcCgoXG4gICAgICBjb2x1bW5EZWY6IHsga2V5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHZpc2libGU6IGJvb2xlYW4sXG4gICAgICAgIHNvcnRhYmxlOiBib29sZWFuLCBpbmRleDogbnVtYmVyIH0sIGk6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYGNvbHVtbi0ke2l9YDtcbiAgICAgIGxldCB0aXRsZSA9IGNvbHVtbkRlZi50aXRsZTtcbiAgICAgIC8vIGdldCBjb2x1bW4gaW5kZXhcbiAgICAgIGNvbnN0IGluZGV4ID0gIGNvbHVtbk9yZGVyLmluZGV4T2YoaSk7XG4gICAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5kYXRhVGFibGUuY29sdW1uKGluZGV4KS52aXNpYmxlKCk7XG4gICAgICAvLyBzZXQgdGl0bGUgZm9yIHNlbGVjdCBjb2x1bW5cbiAgICAgIGlmIChpID09PSAwICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgICB0aXRsZSA9ICc8JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLlNlbGVjdENvbHVtbicpICsgJz4nO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IGNvbHVtbiB0aXRsZVxuICAgICAgaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRpdGxlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHRpdGxlID09IG51bGwpIHtcbiAgICAgICAgLy8gdHJ5IHRvIGZpbmQgY29sdW1uIHBsYWNlaG9sZGVyXG4gICAgICAgIGxldCBwbGFjZWhvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmNvbHVtbnNbaSAtIDFdLnBsYWNlaG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmNvbHVtbnNbaV0ucGxhY2Vob2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyICE9IG51bGwpIHtcbiAgICAgICAgICB0aXRsZSA9ICc8JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChwbGFjZWhvbGRlcikgKyAnPic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7XG4gICAgICAgIHRpdGxlID0gJzwnICsgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuVW5rbm93bkNvbHVtbicpICsgJz4nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgaW5kZXhcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5fY29sdW1uU2VsZWN0b3Iuc2VsZWN0Q29sdW1ucyhjb2x1bW5zKS50aGVuKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnJlc3VsdCA9PT0gJ29rJykge1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSAoZXZlbnQuY29sdW1ucyBhcyBhbnlbXSlcbiAgICAgICAgICAubWFwKChjb2wpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGtleTogY29sLmtleSxcbiAgICAgICAgICAgICAgaW5kZXg6IGNvbC5pbmRleFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICAgIC8vIGdldCBjb2x1bW4gb3JkZXIgZS5nLiBbMywgMSwgMiwgMCwgNF1cbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IHNvcnRlZFxuICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChldmVudC5jb2x1bW5zIGFzIGFueVtdKS5maW5kSW5kZXgoKG5leHQpID0+IGl0ZW0ua2V5ID09PSBuZXh0LmtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyByZXNldCBjb2x1bW4gdmlzaWJpbHR5XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAoZXZlbnQuY29sdW1ucyBhcyBhbnlbXSkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IChldmVudC5jb2x1bW5zIGFzIGFueVtdKVtpbmRleF07XG4gICAgICAgICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5PcmRlci5pbmRleE9mKGluZGV4KTtcbiAgICAgICAgICAvLyBzZXQgdmlzaWJpbHR5IHdpdGggcmVkcmF3ICg9dHJ1ZSlcbiAgICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb2x1bW4oY29sSW5kZXgpLnZpc2libGUoZWxlbWVudC52aXNpYmxlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5hbGx5IGFwcGx5IGNvbHVtbiBvcmRlclxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb2xSZW9yZGVyLm9yZGVyKGluZGV4ZXMsIHRydWUpO1xuICAgICAgICAvLyBzaW1wbHkgcmVkcmF3IHRoZSB0YWJsZVxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5kcmF3KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgdG8gcGFzcyBhbiBlcnJvckhhbmRsZXIgY2FsbGJhY2ssIGlmIGRlc2lyZWRcbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4cG9ydFZpZXcob3B0aW9ucz86IHtlcnJvckhhbmRsZXI/OiAocmVhc29uPzogYW55KSA9PiBhbnl9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2xvYWRpbmcuc2hvd0xvYWRpbmcoKTtcbiAgICAgIC8vIHZhbGlkYXRlIHF1ZXJ5IGl0ZW1zIGFuZCBjb25maWdcbiAgICAgIGlmICghKHRoaXMubGFzdFF1ZXJ5ICYmIHRoaXMuX2xhc3RRdWVyeVRvdGFsSXRlbXMgJiYgdGhpcy5jb25maWcpKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IGV4cG9ydCBzZXR0aW5nc1xuICAgICAgY29uc3QgZXhwb3J0U2V0dGluZ3MgPSB0aGlzLl9jb25maWd1cmF0aW9uLnNldHRpbmdzIGFzIEV4cG9ydExpbWl0Q29uZmlndXJhdGlvbjtcbiAgICAgIC8vIGFuZCBleHBvcnQgbGltaXRcbiAgICAgIGNvbnN0IGV4cG9ydExpbWl0ID1cbiAgICAgICAgKGV4cG9ydFNldHRpbmdzICYmIGV4cG9ydFNldHRpbmdzLnRhYmxlcyAmJiBleHBvcnRTZXR0aW5ncy50YWJsZXMuZXhwb3J0TGltaXQgJiYgZXhwb3J0U2V0dGluZ3MudGFibGVzLmV4cG9ydExpbWl0ID4gMClcbiAgICAgICAgPyBleHBvcnRTZXR0aW5ncy50YWJsZXMuZXhwb3J0TGltaXQgOiBNQVhfRVhQT1JUX0lURU1TO1xuICAgICAgLy8gYW5kIHZhbGlkYXRlIGl0XG4gICAgICBpZiAodGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcyA+IGV4cG9ydExpbWl0KSB7XG4gICAgICAgIC8vIGNhbGwgZXJyb3IgaGFuZGxlclxuICAgICAgICAvLyBwcm92aWRlIGEgcmVjb2duaXppYmxlIGVycm9yIHR5cGVcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lcnJvckhhbmRsZXIpIHtcbiAgICAgICAgICBvcHRpb25zLmVycm9ySGFuZGxlcihuZXcgRXhwb3J0TGltaXRFeGNlZWRlZEVycm9yKCdFeHBvcnQgbGltaXQgZXhjZWVkZWQnKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9yIHNob3cgd2FybmluZyBtb2RhbCBhbmQgZXhpdFxuICAgICAgICB0aGlzLl9tb2RhbFNlcnZpY2Uuc2hvd1dhcm5pbmdEaWFsb2codGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuRXhwb3J0TGlzdCcpLFxuICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLkV4cG9ydExpbWl0RXhjZWVkZWQnLFxuICAgICAgICAgICAge2RhdGFMZW5ndGg6IHRoaXMuX2xhc3RRdWVyeVRvdGFsSXRlbXMsIGV4cG9ydExpbWl0fSksIERJQUxPR19CVVRUT05TLk9rKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IHRvdGFsIGRpc3BsYXllZCBpdGVtc1xuICAgICAgY29uc3QgdG90YWxEaXNwbGF5ZWRJdGVtcyA9IEFycmF5LmZyb20odGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5haURpc3BsYXkpLmxlbmd0aDtcbiAgICAgIC8vIGlmIHRoZXkgYWxyZWFkeSBzYXRpc2Z5IHRoZSBsYXN0IHF1ZXJ5IHRvdGFsXG4gICAgICBpZiAodG90YWxEaXNwbGF5ZWRJdGVtcyA9PT0gdGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcykge1xuICAgICAgICAvLyBwcmVwYXJlIGV4Y2VsIGRhdGEgaW1tZWRpYXRlbHlcbiAgICAgICAgY29uc3Qge2JvZHksIGhlYWRlcn0gPSB0aGlzLmdldEV4cG9ydGFibGVEYXRhKCk7XG4gICAgICAgIC8vIGFuZCBleHBvcnQgdGhlbSB0byBleGNlbFxuICAgICAgICB0aGlzLl9leHBvcnRTcHJlYWRzaGVldC5leHBvcnQoYm9keSwgYCR7dGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnLnRpdGxlIHx8ICdUYWJsZXMuRXhwb3J0UmVzdWx0cycpfS54bHN4YCwge1xuICAgICAgICAgICAgaGVhZGVyLFxuICAgICAgICAgICAgc2tpcEhlYWRlcjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCBtb3JlIGRhdGEgbmVlZCB0byBiZSBmZXRjaGVkXG4gICAgICAgIC8vIGhvbGQgcHJldmlvdXMgZGF0YSBzdGF0ZVxuICAgICAgICBjb25zdCBwcmV2aW91c0RhdGFTdGF0ZSA9IHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCkudG9BcnJheSgpO1xuICAgICAgICAvLyBnZXQgdGFyZ2V0IGRhdGEgc3RhdGUgYnkgZXhlY3V0aW5nIHRoZSBsYXN0IHF1ZXJ5XG4gICAgICAgIC8vIG5vdGU6IHRha2luZyB0aGUgZXhwb3J0TGltaXQgYW1vdW50IG9mIGl0ZW1zIHdpbGwgYWx3YXlzIHNhdGlzZnkgdGhlIHJlc3VsdHMsXG4gICAgICAgIC8vIGJlY2F1c2UgaXQgaGFzIGJlZW4gdmFsaWRhdGVkXG4gICAgICAgIGNvbnN0IHRhcmdldERhdGFTdGF0ZSA9IGF3YWl0IHRoaXMubGFzdFF1ZXJ5LnRha2UoZXhwb3J0TGltaXQpLmdldEl0ZW1zKCk7XG4gICAgICAgIC8vIGNoYW5nZSB0YWJsZSBkYXRhIG9uIHRoZSBmbHksIGJ1dCBkbyBub3QgcmVkcmF3XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNsZWFyKCkucm93cy5hZGQodGFyZ2V0RGF0YVN0YXRlKTtcbiAgICAgICAgLy8gcHJlcGFyZSBleGNlbCBkYXRhXG4gICAgICAgIGNvbnN0IHtib2R5LCBoZWFkZXJ9ID0gdGhpcy5nZXRFeHBvcnRhYmxlRGF0YSgpO1xuICAgICAgICAvLyByZXNldCB0YWJsZSBkYXRhXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNsZWFyKCkucm93cy5hZGQocHJldmlvdXNEYXRhU3RhdGUpO1xuICAgICAgICAvLyBhbmQgZXhwb3J0IHRhcmdldCBkYXRhIHRvIGV4Y2VsXG4gICAgICAgIHRoaXMuX2V4cG9ydFNwcmVhZHNoZWV0LmV4cG9ydChib2R5LCBgJHt0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jb25maWcudGl0bGUgfHwgJ1RhYmxlcy5FeHBvcnRSZXN1bHRzJyl9Lnhsc3hgLCB7XG4gICAgICAgICAgICBoZWFkZXIsXG4gICAgICAgICAgICBza2lwSGVhZGVyOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGV4aXRcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGxvZyBlcnJvclxuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgLy8gY2FsbCBlcnJvciBoYW5kbGVyLCBpZiBkZWZpbmVkXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVycm9ySGFuZGxlcikge1xuICAgICAgICBvcHRpb25zLmVycm9ySGFuZGxlcihlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGRlZmF1bHQgZXJyb3Igc2VydmljZVxuICAgICAgICB0aGlzLl9lcnJvclNlcnZpY2Uuc2hvd0Vycm9yKGVyciwge1xuICAgICAgICAgIGNvbnRpbnVlTGluazogJy4nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLmhpZGVMb2FkaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydGFibGVEYXRhKCk6IHtib2R5OiBhbnlbXSwgaGVhZGVyOiBhbnlbXX0ge1xuICAgIGlmICghKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmJ1dHRvbnNcbiAgICAgICYmIHR5cGVvZiB0aGlzLmRhdGFUYWJsZS5idXR0b25zLmV4cG9ydERhdGEgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5jb25maWcpKSB7XG4gICAgICByZXR1cm4ge2JvZHk6IFtdLCBoZWFkZXI6IFtdfTtcbiAgICB9XG4gICAgLy8gZmV0Y2ggZXhwb3J0YWJsZSBleGNlbCBkYXRhXG4gICAgbGV0IHtib2R5LCBoZWFkZXJ9ID0gdGhpcy5kYXRhVGFibGUuYnV0dG9ucy5leHBvcnREYXRhKCk7XG4gICAgY29uc3QgY2xlYW51cEluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgLy8gY2xlYW4gdXAgaGVhZGVyc1xuICAgIGhlYWRlciA9IGhlYWRlci5maWx0ZXIoKGhlYWRlckl0ZW06IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gZXhjbHVkZSBlbXB0eSBoZWFkZXJzXG4gICAgICBpZiAoaGVhZGVySXRlbS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNsZWFudXBJbmRleGVzLnB1c2goaW5kZXgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBleGNsdWRlIGhpZGRlbiBjb2x1bW5zXG4gICAgICAvLyBub3RlOiB1c2UgdGhlIGRhdGF0YWJsZSB2aXNpYmxlKCkgZnVuY3Rpb25cbiAgICAgIC8vIGluc3RlYWQgb2YgdGhlIGhpZGRlbiBjb25maWcgcHJvcGVydHksIHRvIHNhdGlzZnkgdGhlIGNvbHVtbiBzZWxlY3RvclxuICAgICAgaWYgKCF0aGlzLmRhdGFUYWJsZS5jb2x1bW4oaW5kZXgpLnZpc2libGUoKSkge1xuICAgICAgICBjbGVhbnVwSW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgLy8gY2xlYW4gdXAgYm9keVxuICAgIGJvZHkgPSBib2R5Lm1hcCgocm93OiBhbnkgW10pID0+IHtcbiAgICAgIHJldHVybiByb3cuZmlsdGVyKChfLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjbGVhbnVwSW5kZXhlcy5pbmRleE9mKHJvd0luZGV4KSA9PT0gLTE7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge2JvZHksIGhlYWRlcn07XG4gIH1cbn1cbiJdfQ==
|