cloud-ide-element 1.0.2 → 1.0.5
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/README.md +63 -271
- package/fesm2022/cloud-ide-element.mjs +614 -618
- package/fesm2022/cloud-ide-element.mjs.map +1 -1
- package/index.d.ts +1362 -3
- package/package.json +4 -31
- package/esm2022/cloud-ide-element.mjs +0 -5
- package/esm2022/lib/components/confirmation-modal/confirmation-modal.component.mjs +0 -182
- package/esm2022/lib/components/data-grid/data-grid.component.mjs +0 -1363
- package/esm2022/lib/components/data-grid/data-grid.types.mjs +0 -37
- package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -396
- package/esm2022/lib/components/global-notifications/global-notifications.component.mjs +0 -30
- package/esm2022/lib/components/json-editor/json-editor.component.mjs +0 -521
- package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +0 -33
- package/esm2022/lib/components/toast-notification/toast-notification.component.mjs +0 -152
- package/esm2022/lib/elements/button/cide-ele-button.component.mjs +0 -249
- package/esm2022/lib/elements/file-input/file-input.component.mjs +0 -83
- package/esm2022/lib/elements/icon/icon.component.mjs +0 -26
- package/esm2022/lib/elements/input/input.component.mjs +0 -467
- package/esm2022/lib/elements/select/select.component.mjs +0 -471
- package/esm2022/lib/elements/spinner/spinner.component.mjs +0 -32
- package/esm2022/lib/elements/tab/cide-ele-tab.component.mjs +0 -74
- package/esm2022/lib/elements/textarea/textarea.component.mjs +0 -157
- package/esm2022/lib/services/confirmation.service.mjs +0 -151
- package/esm2022/lib/services/dropdown-manager.service.mjs +0 -93
- package/esm2022/lib/services/notification.service.mjs +0 -196
- package/esm2022/lib/utils/directives/resizer/resizer.directive.mjs +0 -231
- package/esm2022/lib/utils/directives/tooltip/tooltip.directive.mjs +0 -294
- package/esm2022/lib/utils/pipes/capitalize/capitalize.pipe.mjs +0 -38
- package/esm2022/lib/utils/services/elements/elements.service.mjs +0 -39
- package/esm2022/public-api.mjs +0 -31
- package/lib/components/confirmation-modal/confirmation-modal.component.d.ts +0 -16
- package/lib/components/data-grid/data-grid.component.d.ts +0 -244
- package/lib/components/data-grid/data-grid.types.d.ts +0 -146
- package/lib/components/dropdown/dropdown.component.d.ts +0 -75
- package/lib/components/global-notifications/global-notifications.component.d.ts +0 -5
- package/lib/components/json-editor/json-editor.component.d.ts +0 -116
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +0 -11
- package/lib/components/toast-notification/toast-notification.component.d.ts +0 -13
- package/lib/elements/button/cide-ele-button.component.d.ts +0 -85
- package/lib/elements/file-input/file-input.component.d.ts +0 -25
- package/lib/elements/icon/icon.component.d.ts +0 -9
- package/lib/elements/input/input.component.d.ts +0 -182
- package/lib/elements/select/select.component.d.ts +0 -91
- package/lib/elements/spinner/spinner.component.d.ts +0 -19
- package/lib/elements/tab/cide-ele-tab.component.d.ts +0 -26
- package/lib/elements/textarea/textarea.component.d.ts +0 -47
- package/lib/services/confirmation.service.d.ts +0 -65
- package/lib/services/dropdown-manager.service.d.ts +0 -22
- package/lib/services/notification.service.d.ts +0 -81
- package/lib/utils/directives/resizer/resizer.directive.d.ts +0 -44
- package/lib/utils/directives/tooltip/tooltip.directive.d.ts +0 -43
- package/lib/utils/pipes/capitalize/capitalize.pipe.d.ts +0 -7
- package/lib/utils/services/elements/elements.service.d.ts +0 -12
- package/public-api.d.ts +0 -22
|
@@ -1,467 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, EventEmitter, Input, Output, forwardRef, inject } from '@angular/core';
|
|
3
|
-
import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
-
import { CapitalizePipe } from '../../utils/pipes/capitalize/capitalize.pipe';
|
|
5
|
-
import { CideElementsService } from '../../utils/services/elements/elements.service';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common";
|
|
8
|
-
import * as i2 from "@angular/forms";
|
|
9
|
-
export class CideInputComponent {
|
|
10
|
-
constructor() {
|
|
11
|
-
// Modern Angular v20 dependency injection pattern
|
|
12
|
-
this.capitalizePipe = inject(CapitalizePipe);
|
|
13
|
-
this.elementService = inject(CideElementsService);
|
|
14
|
-
/*=======Set custom controls inputs to set components=========*/
|
|
15
|
-
/**
|
|
16
|
-
* @description to se the visual of control like solid control offerd by material design or outline with a border
|
|
17
|
-
* @options solid | outline | standard
|
|
18
|
-
*/
|
|
19
|
-
this.fill = 'outline';
|
|
20
|
-
/** @description Lable of control (Title), Like Name, Email */
|
|
21
|
-
this.label = "";
|
|
22
|
-
/** @description to hide and show label */
|
|
23
|
-
this.labelHide = false;
|
|
24
|
-
/** @description is control Editable or Disabled */
|
|
25
|
-
this.disabled = false;
|
|
26
|
-
/** @description Is Clear Input Cross button is visible or not */
|
|
27
|
-
this.clearInput = false;
|
|
28
|
-
/** @description Position of Label 'floating' | 'fixed' */
|
|
29
|
-
this.labelPlacement = "fixed";
|
|
30
|
-
/** @description Lable direction from start of contrl or end of control */
|
|
31
|
-
this.labelDir = "start";
|
|
32
|
-
/** @description Place holder for control to display if there is no value */
|
|
33
|
-
this.placeholder = "";
|
|
34
|
-
/** @description it is to set leading icon, at the start of control */
|
|
35
|
-
this.leadingIcon = "";
|
|
36
|
-
/** @description it is to set trailing icon, at the end of control, for password type control eye is the trailing icon */
|
|
37
|
-
this.trailingIcon = "";
|
|
38
|
-
/** @description to display below the control for suggestion, if there is any error then error will bw the first to shoe in place of help text */
|
|
39
|
-
this.helperText = "";
|
|
40
|
-
/** @description default true to collapse when there is no help text or error text, if false then element area in DOM will be reserved never detroy */
|
|
41
|
-
this.helperTextCollapse = true;
|
|
42
|
-
/** @description show and hide helper text its forecfull */
|
|
43
|
-
this.hideHelperAndErrorText = false;
|
|
44
|
-
/** @description if found any error in control the error thext will be used to display error message, if there is help text still error text is having higher priority then helptext */
|
|
45
|
-
this.errorText = "";
|
|
46
|
-
/** @description maxlength for control */
|
|
47
|
-
this.maxlength = 0;
|
|
48
|
-
/** @description minlength for control */
|
|
49
|
-
this.minlength = 0;
|
|
50
|
-
/** @description is control is required or not input type is true | false */
|
|
51
|
-
this.required = false;
|
|
52
|
-
/** @description Auto capatalization for the value and applicable to word or to complete sentance */
|
|
53
|
-
this.autocapitalize = "off";
|
|
54
|
-
/** @description auto complete type to help reader what is the type of value */
|
|
55
|
-
this.autocomplete = "off";
|
|
56
|
-
/** @description type of control */
|
|
57
|
-
this.type = 'text';
|
|
58
|
-
/** @description width of control, default width is 100% */
|
|
59
|
-
this.width = '100%';
|
|
60
|
-
/** @description uniq id of control, used to differenciat the value also prevent value should not effect another values */
|
|
61
|
-
this.id = '';
|
|
62
|
-
/** @description to get input value using one way binding like: [ngModel] or by two way binding [(ngModel)] */
|
|
63
|
-
this.ngModel = '';
|
|
64
|
-
this.option = ["anksuh", "bhure"];
|
|
65
|
-
/** @description min value for number type control */
|
|
66
|
-
this.min = 0;
|
|
67
|
-
/** @description max value for number type control */
|
|
68
|
-
this.max = 0;
|
|
69
|
-
/**
|
|
70
|
-
* @description
|
|
71
|
-
* Holds the size of the component like Small, Extra small, Large
|
|
72
|
-
* by Default it takes small size
|
|
73
|
-
* or the size set by the project setup service
|
|
74
|
-
* or it will beset for individual component
|
|
75
|
-
*
|
|
76
|
-
* Size Appled
|
|
77
|
-
* Component level then setup service then finally default md
|
|
78
|
-
* Options: "2xs" | ""xs" | "sm" | "md" | "lg" | "xl" | "xxl"
|
|
79
|
-
*/
|
|
80
|
-
this.size = "sm";
|
|
81
|
-
/** @description to set return value using one way binding like: (ngModelChanges) or by two way binding [(ngModel)] */
|
|
82
|
-
this.ngModelChange = new EventEmitter();
|
|
83
|
-
/*
|
|
84
|
-
internal Properties for input
|
|
85
|
-
*/
|
|
86
|
-
/** @description is vale need to read from ngModel or from value(need to implement), it is detected and maild fals on value chnages */
|
|
87
|
-
this.isNgModel = this.ngModel ? true : false;
|
|
88
|
-
/** @description this is to set control value is valid or not, set by us inside validate callbck method called by angular */
|
|
89
|
-
this.isValid = true;
|
|
90
|
-
/** @description when control is touched then the will maid true by the us to check it is touched or not, when we will set this true we will call the onTouched callback method of angualr to inform angular that somthis is changed and control is touched */
|
|
91
|
-
this.isTouched = false;
|
|
92
|
-
/** @description we will take type of control in type but is may be not exactly which input's type so we need to get type and set actule type to our input, also when type is set password but in calse view in textt then inuut type need to change to text */
|
|
93
|
-
this.typeInternal = "text";
|
|
94
|
-
/** @description if traling is set the it is assigned by it, but some case tarling icon not as it is set need tro be changed at runtime, like password visibility hide and show */
|
|
95
|
-
this.trailingIconInternal = "";
|
|
96
|
-
/*
|
|
97
|
-
Properties connected with trailingIconInternal
|
|
98
|
-
*/
|
|
99
|
-
this.isTrailingIconAllwedClick = false;
|
|
100
|
-
// Properties connected with id
|
|
101
|
-
this.idRandom = this.randomString();
|
|
102
|
-
// ==================================METHODS FOR CUSTOM FORM COMPONENT=============================
|
|
103
|
-
// FOR ANGULAR CALLED BY UI
|
|
104
|
-
/**
|
|
105
|
-
* @description Function to call when the HTML Chnage to tell Angular somthing is changed.
|
|
106
|
-
* @field value : inputType
|
|
107
|
-
*/
|
|
108
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
109
|
-
this.onChange = (value) => { };
|
|
110
|
-
/** @description Function to call when the input is touched (clciked) to tell Angular somthing is changed. */
|
|
111
|
-
this.onTouched = () => { };
|
|
112
|
-
/** @description Function to call when the input is need to Validate to tell Angular somthing is changed (in case of some input dipendent validation). */
|
|
113
|
-
this.onValidate = () => { };
|
|
114
|
-
// Modern Angular v20 pattern: Use constructor for initialization only
|
|
115
|
-
// Validate control
|
|
116
|
-
this.onValidate();
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* @description
|
|
120
|
-
* Method that performs synchronous validation against the provided control.
|
|
121
|
-
* Exicuted by Angular
|
|
122
|
-
*
|
|
123
|
-
* @param control The control to validate against.
|
|
124
|
-
*
|
|
125
|
-
* @returns A map of validation errors if validation fails,
|
|
126
|
-
* otherwise null.
|
|
127
|
-
*/
|
|
128
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
129
|
-
validate(control) {
|
|
130
|
-
const validation_error = this.isControlValid(this.ngModel);
|
|
131
|
-
if (validation_error?.status) {
|
|
132
|
-
return validation_error;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
return null;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* @description
|
|
140
|
-
* Registers a callback function to call when the validator inputs change.
|
|
141
|
-
* Exicuted by Angular
|
|
142
|
-
*
|
|
143
|
-
* @param fn The callback function
|
|
144
|
-
*/
|
|
145
|
-
registerOnValidatorChange(fn) {
|
|
146
|
-
this.onValidate = fn;
|
|
147
|
-
}
|
|
148
|
-
/** @description when form control change from model side this method is implemented */
|
|
149
|
-
writeValue(value) {
|
|
150
|
-
if (!this.isNgModel) {
|
|
151
|
-
const ngModel = this.autoCapitalizeByOption(value, this.type);
|
|
152
|
-
console.log('writeValue', this.ngModel, ngModel);
|
|
153
|
-
this.ngModel = ngModel;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
/** @description Allows Angular to register a function to call when the model changes. */
|
|
157
|
-
// Save the function as a property to call later here.
|
|
158
|
-
registerOnChange(fn) {
|
|
159
|
-
this.onChange = fn;
|
|
160
|
-
}
|
|
161
|
-
/** @description Allows Angular to register a function to call when the input has been touched. */
|
|
162
|
-
// Save the function as a property to call later here.
|
|
163
|
-
registerOnTouched(fn) {
|
|
164
|
-
this.onTouched = fn;
|
|
165
|
-
}
|
|
166
|
-
//==========================================================================
|
|
167
|
-
/*
|
|
168
|
-
Methods for input
|
|
169
|
-
*/
|
|
170
|
-
/** @description Detect wether input propertires canged or not */
|
|
171
|
-
ngOnChanges(changes) {
|
|
172
|
-
if (changes?.['value']) {
|
|
173
|
-
this.isNgModel = true;
|
|
174
|
-
this.ngModel = this.processValue(this.ngModel, this.type);
|
|
175
|
-
}
|
|
176
|
-
if (this.isValidValueAndType(this.ngModel, this.type) || this.isTouched) {
|
|
177
|
-
this.isControlValid(this.ngModel);
|
|
178
|
-
}
|
|
179
|
-
// Ditect type change
|
|
180
|
-
if (changes?.['type']) {
|
|
181
|
-
this.detectTypeChange();
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
ngOnInit() {
|
|
185
|
-
if (this.id) {
|
|
186
|
-
this.getControlData();
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
/** @description custom method run when HTML changes, we call method registerd by angular to detect change */
|
|
190
|
-
upDateValue(value) {
|
|
191
|
-
const target = value.target;
|
|
192
|
-
this.isControlValid(target?.value);
|
|
193
|
-
const updatedValue = this.processValue(target?.value, this.type);
|
|
194
|
-
this.ngModel = updatedValue;
|
|
195
|
-
this.ngModelChange?.emit(updatedValue);
|
|
196
|
-
// console.log(target)
|
|
197
|
-
this.onChange(updatedValue);
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* @description method applicable in case of control type checkbox
|
|
201
|
-
*
|
|
202
|
-
* @param value boolean | string
|
|
203
|
-
*/
|
|
204
|
-
updateValueCheckBox(value) {
|
|
205
|
-
// Convert string to boolean
|
|
206
|
-
this.ngModel = !this.ngModel;
|
|
207
|
-
value = (typeof value === 'boolean') ? value : (value === 'true' ? true : false);
|
|
208
|
-
this.ngModelChange?.emit(value);
|
|
209
|
-
this.onChange(value);
|
|
210
|
-
}
|
|
211
|
-
/** @description clear the value */
|
|
212
|
-
ClearInputValue() {
|
|
213
|
-
if (this.type == "text") {
|
|
214
|
-
this.upDateValue({ target: { value: "" } });
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
/** @description when HTML is focuesd */
|
|
218
|
-
focusControl() {
|
|
219
|
-
this.isTouched = true;
|
|
220
|
-
this.onTouched();
|
|
221
|
-
this.onValidate();
|
|
222
|
-
}
|
|
223
|
-
/** @description If control value need to be processed, like UPPERCASE */
|
|
224
|
-
processValue(value, type) {
|
|
225
|
-
value = this.autoCapitalizeByOption(value, type);
|
|
226
|
-
return value;
|
|
227
|
-
}
|
|
228
|
-
/** @description for capitalization */
|
|
229
|
-
autoCapitalizeByOption(value, type) {
|
|
230
|
-
if (type == 'text') {
|
|
231
|
-
if (this.autocapitalize == "on") {
|
|
232
|
-
return this.capitalizePipe?.transform(value, 'allUpperCase');
|
|
233
|
-
}
|
|
234
|
-
if (this.autocapitalize == "words") {
|
|
235
|
-
return this.capitalizePipe?.transform(value, 'titleCase');
|
|
236
|
-
}
|
|
237
|
-
if (this.autocapitalize == "sentences") {
|
|
238
|
-
return this.capitalizePipe?.transform(value, "sentenceCase");
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
return value;
|
|
242
|
-
}
|
|
243
|
-
/** @description It is used to return the value is valid or not */
|
|
244
|
-
isValidValueAndType(value, type) {
|
|
245
|
-
if (type == 'text') {
|
|
246
|
-
if (typeof (value) == 'string') {
|
|
247
|
-
if (value?.length > 0) {
|
|
248
|
-
return true;
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
return false;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
return false;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
/** @description to check control is valid or not */
|
|
263
|
-
isControlValid(value) {
|
|
264
|
-
const validation_status = {
|
|
265
|
-
validation: {},
|
|
266
|
-
status: false
|
|
267
|
-
};
|
|
268
|
-
if (this.required) {
|
|
269
|
-
if (!value) {
|
|
270
|
-
validation_status.status = true;
|
|
271
|
-
validation_status.validation.required = `required!`;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
if (this.type == 'text') {
|
|
275
|
-
if (typeof (value) == 'string') {
|
|
276
|
-
if (this.maxlength > 0) {
|
|
277
|
-
if (value?.length > this.maxlength) {
|
|
278
|
-
validation_status.status = true;
|
|
279
|
-
validation_status.validation.maxlength = `maximum length is ${this.maxlength}!`;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
if (this.minlength > 0) {
|
|
283
|
-
if (value?.length < this.minlength) {
|
|
284
|
-
validation_status.status = true;
|
|
285
|
-
validation_status.validation.minlength = `minimum length is ${this.minlength}!`;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
validation_status.status = true;
|
|
291
|
-
validation_status.validation.required = `required!`;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
this.isValid = !validation_status.status;
|
|
295
|
-
this.errorText = Object.values(validation_status.validation).at(0) || '';
|
|
296
|
-
return validation_status;
|
|
297
|
-
}
|
|
298
|
-
/** @description Allows Angular to disable the input. */
|
|
299
|
-
setDisabledState(isDisabled) {
|
|
300
|
-
this.disabled = isDisabled;
|
|
301
|
-
}
|
|
302
|
-
/** @description Method for trailing Icon Click */
|
|
303
|
-
trailingIconClick() {
|
|
304
|
-
if (this.type === 'password') {
|
|
305
|
-
if (this.typeInternal === 'password') {
|
|
306
|
-
this.typeInternal = 'text';
|
|
307
|
-
this.trailingIconInternal = 'visibility';
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
this.typeInternal = 'password';
|
|
311
|
-
this.trailingIconInternal = 'visibility_off';
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
this.typeInternal = this.type;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Method to generate Random String
|
|
320
|
-
* @param setupPrarameter { lenght: number, prefix: string }
|
|
321
|
-
* default lenght is 10, prefox is ""
|
|
322
|
-
* @returns string
|
|
323
|
-
*/
|
|
324
|
-
randomString(setupPrarameter = { lenght: 10, prefix: "" }) {
|
|
325
|
-
//variable consisting alphabets in small and capital letter
|
|
326
|
-
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
|
|
327
|
-
//loop to select a new character in each iteration
|
|
328
|
-
let random_string = setupPrarameter?.prefix || "";
|
|
329
|
-
for (let i = 0; i < setupPrarameter?.lenght; i++) {
|
|
330
|
-
const rnum = Math.floor(Math.random() * characters.length);
|
|
331
|
-
random_string += characters.substring(rnum, rnum + 1);
|
|
332
|
-
}
|
|
333
|
-
//return the generated string
|
|
334
|
-
return random_string;
|
|
335
|
-
}
|
|
336
|
-
async getControlData() {
|
|
337
|
-
const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });
|
|
338
|
-
if (cide_element_data) {
|
|
339
|
-
this.label = cide_element_data?.sype_label;
|
|
340
|
-
this.labelPlacement = (cide_element_data?.sype_label_placement || 'floating');
|
|
341
|
-
this.type = (cide_element_data?.sype_type || 'text');
|
|
342
|
-
this.required = (cide_element_data?.sype_required || false);
|
|
343
|
-
this.size = (cide_element_data?.sype_size || 'md');
|
|
344
|
-
this.helperTextCollapse = (cide_element_data?.sype_helper_text_collapse || false);
|
|
345
|
-
this.maxlength = (cide_element_data?.sype_max_length);
|
|
346
|
-
this.minlength = (cide_element_data?.sype_min_length);
|
|
347
|
-
this.leadingIcon = (cide_element_data?.sype_leading_icon);
|
|
348
|
-
this.labelHide = (cide_element_data?.sype_label_hide);
|
|
349
|
-
this.hideHelperAndErrorText = (cide_element_data?.sype_hide_helper_and_error_text);
|
|
350
|
-
this.detectTypeChange();
|
|
351
|
-
// Validate control
|
|
352
|
-
this.onValidate();
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* @description use to detact the change in type if changes done this method is ued to run
|
|
357
|
-
*/
|
|
358
|
-
detectTypeChange() {
|
|
359
|
-
if (this.type === 'password') {
|
|
360
|
-
this.typeInternal = "password";
|
|
361
|
-
this.trailingIconInternal = "visibility_off";
|
|
362
|
-
this.isTrailingIconAllwedClick = true;
|
|
363
|
-
}
|
|
364
|
-
else {
|
|
365
|
-
this.typeInternal = this.type;
|
|
366
|
-
this.trailingIconInternal = this.trailingIcon;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
370
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: CideInputComponent, isStandalone: true, selector: "cide-ele-input", inputs: { fill: "fill", label: "label", labelHide: "labelHide", disabled: "disabled", clearInput: "clearInput", labelPlacement: "labelPlacement", labelDir: "labelDir", placeholder: "placeholder", leadingIcon: "leadingIcon", trailingIcon: "trailingIcon", helperText: "helperText", helperTextCollapse: "helperTextCollapse", hideHelperAndErrorText: "hideHelperAndErrorText", errorText: "errorText", maxlength: "maxlength", minlength: "minlength", required: "required", autocapitalize: "autocapitalize", autocomplete: "autocomplete", type: "type", width: "width", id: "id", ngModel: "ngModel", option: "option", min: "min", max: "max", size: "size" }, outputs: { ngModelChange: "ngModelChange" }, providers: [
|
|
371
|
-
{
|
|
372
|
-
provide: NG_VALUE_ACCESSOR,
|
|
373
|
-
useExisting: forwardRef(() => CideInputComponent),
|
|
374
|
-
multi: true
|
|
375
|
-
},
|
|
376
|
-
/** @description to apply validations */
|
|
377
|
-
{
|
|
378
|
-
provide: NG_VALIDATORS,
|
|
379
|
-
multi: true,
|
|
380
|
-
useExisting: forwardRef(() => CideInputComponent),
|
|
381
|
-
},
|
|
382
|
-
CapitalizePipe
|
|
383
|
-
], usesOnChanges: true, ngImport: i0, template: "<div class=\"cide-input\">\r\n <!------------------------------------------TEXT | PASSWORD------------------------------------------>\r\n <div *ngIf=\"type === 'text' || type === 'number' || type === 'password'\">\r\n <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-leading-icon': leadingIcon,\r\n 'cide-element-trailing-icon': trailingIconInternal,\r\n 'cide-element-clear-input': clearInput,\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n 'cide-element-input-number': (type === 'number')\r\n }\">\r\n <!-- label -->\r\n <label [for]=\"id\" class=\"cide-input-label\" *ngIf=\"label && !labelHide\">{{label}}</label>\r\n\r\n <!-- all one line elemets which dose not affect with label and error text -->\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span\r\n class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n\r\n <!-- Traling icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\"\r\n *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n\r\n <!-- Input -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\r\n [autocomplete]=\"autocomplete\" [min]=\"min\" [max]=\"max\"\r\n class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\r\n </div>\r\n <!-- error text / helper text -->\r\n <span *ngIf=\"(errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText\"\r\n class=\"cide-input-help-error-text\">{{\r\n isValid\r\n ? helperText : (errorText ?\r\n (isTouched ? errorText : helperText)\r\n : helperText)}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Input with tralling icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-1 tw-pr-8 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!-- Input with leading icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-8 tw-pr-1 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!------------------------------------------CHECKBOX------------------------------------------>\r\n <div *ngIf=\"type === 'checkbox'\" class=\"tw-flex\">\r\n <div class=\"cide-checkbox tw-relative\">\r\n <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\"\r\n class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\r\n [autocomplete]=\"autocomplete\" />\r\n <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\r\n <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\r\n <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\r\n <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\r\n </svg>\r\n </span>\r\n <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\"\r\n *ngIf=\"!labelHide\">{{label}}</span>\r\n </label>\r\n <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\r\n <!-- Element hidden and its xpath is used to display inside SVG -->\r\n <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\r\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\r\n </symbol>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-------------------------------------------SELECT------------------------------------------->\r\n <div *ngIf=\"type === 'select'\">sas\r\n <div class=\"tw-relative\">\r\n <div class=\"tw-absolute\">\r\n @for (item of option; track $index) {\r\n <div class=\"tw-w-full\">\r\n {{item}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type:
|
|
384
|
-
// directives
|
|
385
|
-
CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type:
|
|
386
|
-
// for ngModel
|
|
387
|
-
FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
|
|
388
|
-
}
|
|
389
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideInputComponent, decorators: [{
|
|
390
|
-
type: Component,
|
|
391
|
-
args: [{ selector: 'cide-ele-input', standalone: true, imports: [
|
|
392
|
-
// directives
|
|
393
|
-
CommonModule,
|
|
394
|
-
// for ngModel
|
|
395
|
-
FormsModule
|
|
396
|
-
], providers: [
|
|
397
|
-
{
|
|
398
|
-
provide: NG_VALUE_ACCESSOR,
|
|
399
|
-
useExisting: forwardRef(() => CideInputComponent),
|
|
400
|
-
multi: true
|
|
401
|
-
},
|
|
402
|
-
/** @description to apply validations */
|
|
403
|
-
{
|
|
404
|
-
provide: NG_VALIDATORS,
|
|
405
|
-
multi: true,
|
|
406
|
-
useExisting: forwardRef(() => CideInputComponent),
|
|
407
|
-
},
|
|
408
|
-
CapitalizePipe
|
|
409
|
-
], template: "<div class=\"cide-input\">\r\n <!------------------------------------------TEXT | PASSWORD------------------------------------------>\r\n <div *ngIf=\"type === 'text' || type === 'number' || type === 'password'\">\r\n <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-leading-icon': leadingIcon,\r\n 'cide-element-trailing-icon': trailingIconInternal,\r\n 'cide-element-clear-input': clearInput,\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n 'cide-element-input-number': (type === 'number')\r\n }\">\r\n <!-- label -->\r\n <label [for]=\"id\" class=\"cide-input-label\" *ngIf=\"label && !labelHide\">{{label}}</label>\r\n\r\n <!-- all one line elemets which dose not affect with label and error text -->\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span\r\n class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n\r\n <!-- Traling icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\"\r\n *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n\r\n <!-- Input -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\r\n [autocomplete]=\"autocomplete\" [min]=\"min\" [max]=\"max\"\r\n class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\r\n </div>\r\n <!-- error text / helper text -->\r\n <span *ngIf=\"(errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText\"\r\n class=\"cide-input-help-error-text\">{{\r\n isValid\r\n ? helperText : (errorText ?\r\n (isTouched ? errorText : helperText)\r\n : helperText)}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Input with tralling icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-1 tw-pr-8 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!-- Input with leading icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-8 tw-pr-1 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!------------------------------------------CHECKBOX------------------------------------------>\r\n <div *ngIf=\"type === 'checkbox'\" class=\"tw-flex\">\r\n <div class=\"cide-checkbox tw-relative\">\r\n <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\"\r\n class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\r\n [autocomplete]=\"autocomplete\" />\r\n <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\r\n <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\r\n <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\r\n <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\r\n </svg>\r\n </span>\r\n <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\"\r\n *ngIf=\"!labelHide\">{{label}}</span>\r\n </label>\r\n <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\r\n <!-- Element hidden and its xpath is used to display inside SVG -->\r\n <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\r\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\r\n </symbol>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-------------------------------------------SELECT------------------------------------------->\r\n <div *ngIf=\"type === 'select'\">sas\r\n <div class=\"tw-relative\">\r\n <div class=\"tw-absolute\">\r\n @for (item of option; track $index) {\r\n <div class=\"tw-w-full\">\r\n {{item}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
|
|
410
|
-
}], ctorParameters: () => [], propDecorators: { fill: [{
|
|
411
|
-
type: Input
|
|
412
|
-
}], label: [{
|
|
413
|
-
type: Input
|
|
414
|
-
}], labelHide: [{
|
|
415
|
-
type: Input
|
|
416
|
-
}], disabled: [{
|
|
417
|
-
type: Input
|
|
418
|
-
}], clearInput: [{
|
|
419
|
-
type: Input
|
|
420
|
-
}], labelPlacement: [{
|
|
421
|
-
type: Input
|
|
422
|
-
}], labelDir: [{
|
|
423
|
-
type: Input
|
|
424
|
-
}], placeholder: [{
|
|
425
|
-
type: Input
|
|
426
|
-
}], leadingIcon: [{
|
|
427
|
-
type: Input
|
|
428
|
-
}], trailingIcon: [{
|
|
429
|
-
type: Input
|
|
430
|
-
}], helperText: [{
|
|
431
|
-
type: Input
|
|
432
|
-
}], helperTextCollapse: [{
|
|
433
|
-
type: Input
|
|
434
|
-
}], hideHelperAndErrorText: [{
|
|
435
|
-
type: Input
|
|
436
|
-
}], errorText: [{
|
|
437
|
-
type: Input
|
|
438
|
-
}], maxlength: [{
|
|
439
|
-
type: Input
|
|
440
|
-
}], minlength: [{
|
|
441
|
-
type: Input
|
|
442
|
-
}], required: [{
|
|
443
|
-
type: Input
|
|
444
|
-
}], autocapitalize: [{
|
|
445
|
-
type: Input
|
|
446
|
-
}], autocomplete: [{
|
|
447
|
-
type: Input
|
|
448
|
-
}], type: [{
|
|
449
|
-
type: Input
|
|
450
|
-
}], width: [{
|
|
451
|
-
type: Input
|
|
452
|
-
}], id: [{
|
|
453
|
-
type: Input
|
|
454
|
-
}], ngModel: [{
|
|
455
|
-
type: Input
|
|
456
|
-
}], option: [{
|
|
457
|
-
type: Input
|
|
458
|
-
}], min: [{
|
|
459
|
-
type: Input
|
|
460
|
-
}], max: [{
|
|
461
|
-
type: Input
|
|
462
|
-
}], size: [{
|
|
463
|
-
type: Input
|
|
464
|
-
}], ngModelChange: [{
|
|
465
|
-
type: Output
|
|
466
|
-
}] } });
|
|
467
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWVsZW1lbnQvc3JjL2xpYi9lbGVtZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL2VsZW1lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SCxPQUFPLEVBQXlDLFdBQVcsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQStCLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkosT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7O0FBeUNyRixNQUFNLE9BQU8sa0JBQWtCO0lBTTdCO1FBSkEsa0RBQWtEO1FBQzNDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFPckQsZ0VBQWdFO1FBRWhFOzs7V0FHRztRQUNNLFNBQUksR0FBcUIsU0FBUyxDQUFDO1FBQzVDLDhEQUE4RDtRQUNyRCxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQzVCLDBDQUEwQztRQUNqQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQ3BDLG1EQUFtRDtRQUMxQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQ25DLGlFQUFpRTtRQUN4RCxlQUFVLEdBQVksS0FBSyxDQUFD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QWE7NEJBQ3RCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDO3lCQUNsRDt3QkFDRCxjQUFjO3FCQUNmO3dEQW9CUSxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxFQUFFO3NCQUFWLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsR0FBRztzQkFBWCxLQUFLO2dCQVlHLElBQUk7c0JBQVosS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBmb3J3YXJkUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENhcGl0YWxpemVQaXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGlwZXMvY2FwaXRhbGl6ZS9jYXBpdGFsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBDaWRlRWxlbWVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2VydmljZXMvZWxlbWVudHMvZWxlbWVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IGF1dG9jYXBpdGFsaXplVHlwZSwgYXV0b2NvbXBsZXRlVHlwZSwgY29udHJvbFR5cGUsIGVsZW1lbnRTdHlsZVR5cGUsIGlucHV0VHlwZSwgbGFiZWxEaXJUeXBlLCBsYWJlbFBsYWNlbWVudFR5cGUsIHRoZW1lU2l6ZSB9IGZyb20gJ2Nsb3VkLWlkZS1sbXMtbW9kZWwnO1xyXG5cclxuLyoqIEBkZXNjcmlwdGlvbiB0eXBlIHRvIHJlZ2lzdGVyIGVycm9yIHJlbGF0ZWQgdG8gY29udHJvbCAqL1xyXG5leHBvcnQgdHlwZSBFcnJvclZhbGlkYXRpb25TdGF0dXMgPSB7XHJcbiAgbWF4bGVuZ3RoPzogc3RyaW5nLFxyXG4gIG1pbmxlbmd0aD86IHN0cmluZyxcclxuICByZXF1aXJlZD86IHN0cmluZyxcclxufVxyXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uU3RhdHVzID0ge1xyXG4gIHZhbGlkYXRpb246IEVycm9yVmFsaWRhdGlvblN0YXR1cyxcclxuICBzdGF0dXM6IGJvb2xlYW5cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjaWRlLWVsZS1pbnB1dCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuc2NzcycsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgLy8gZGlyZWN0aXZlc1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgLy8gZm9yIG5nTW9kZWxcclxuICAgIEZvcm1zTW9kdWxlXHJcbiAgXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENpZGVJbnB1dENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiB0byBhcHBseSB2YWxpZGF0aW9ucyAgKi9cclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENpZGVJbnB1dENvbXBvbmVudCksXHJcbiAgICB9LFxyXG4gICAgQ2FwaXRhbGl6ZVBpcGVcclxuICBdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQ2lkZUlucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25DaGFuZ2VzLCBPbkluaXQge1xyXG5cclxuICAvLyBNb2Rlcm4gQW5ndWxhciB2MjAgZGVwZW5kZW5jeSBpbmplY3Rpb24gcGF0dGVyblxyXG4gIHB1YmxpYyBjYXBpdGFsaXplUGlwZSA9IGluamVjdChDYXBpdGFsaXplUGlwZSk7XHJcbiAgcHJpdmF0ZSBlbGVtZW50U2VydmljZSA9IGluamVjdChDaWRlRWxlbWVudHNTZXJ2aWNlKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAvLyBNb2Rlcm4gQW5ndWxhciB2MjAgcGF0dGVybjogVXNlIGNvbnN0cnVjdG9yIGZvciBpbml0aWFsaXphdGlvbiBvbmx5XHJcbiAgICAvLyBWYWxpZGF0ZSBjb250cm9sXHJcbiAgICB0aGlzLm9uVmFsaWRhdGUoKTtcclxuICB9XHJcbiAgLyo9PT09PT09U2V0IGN1c3RvbSBjb250cm9scyBpbnB1dHMgdG8gc2V0IGNvbXBvbmVudHM9PT09PT09PT0qL1xyXG5cclxuICAvKiogXHJcbiAgICogQGRlc2NyaXB0aW9uIHRvIHNlIHRoZSB2aXN1YWwgb2YgY29udHJvbCBsaWtlIHNvbGlkIGNvbnRyb2wgb2ZmZXJkIGJ5IG1hdGVyaWFsIGRlc2lnbiBvciBvdXRsaW5lIHdpdGggYSBib3JkZXJcclxuICAgKiBAb3B0aW9ucyBzb2xpZCB8IG91dGxpbmUgfCBzdGFuZGFyZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGZpbGw6IGVsZW1lbnRTdHlsZVR5cGUgPSAnb3V0bGluZSc7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBMYWJsZSBvZiBjb250cm9sIChUaXRsZSksIExpa2UgTmFtZSwgRW1haWwgKi9cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gXCJcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIHRvIGhpZGUgYW5kIHNob3cgbGFiZWwgKi9cclxuICBASW5wdXQoKSBsYWJlbEhpZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogQGRlc2NyaXB0aW9uIGlzIGNvbnRyb2wgRWRpdGFibGUgb3IgRGlzYWJsZWQgKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gSXMgQ2xlYXIgSW5wdXQgQ3Jvc3MgYnV0dG9uIGlzIHZpc2libGUgb3Igbm90ICovXHJcbiAgQElucHV0KCkgY2xlYXJJbnB1dDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gUG9zaXRpb24gb2YgTGFiZWwgJ2Zsb2F0aW5nJyB8ICdmaXhlZCcgKi9cclxuICBASW5wdXQoKSBsYWJlbFBsYWNlbWVudDogbGFiZWxQbGFjZW1lbnRUeXBlID0gXCJmaXhlZFwiO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gTGFibGUgZGlyZWN0aW9uIGZyb20gc3RhcnQgb2YgY29udHJsIG9yIGVuZCBvZiBjb250cm9sICovXHJcbiAgQElucHV0KCkgbGFiZWxEaXI6IGxhYmVsRGlyVHlwZSA9IFwic3RhcnRcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIFBsYWNlIGhvbGRlciBmb3IgY29udHJvbCB0byBkaXNwbGF5IGlmIHRoZXJlIGlzIG5vIHZhbHVlICovXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpdCBpcyB0byBzZXQgbGVhZGluZyBpY29uLCBhdCB0aGUgc3RhcnQgb2YgY29udHJvbCAgKi9cclxuICBASW5wdXQoKSBsZWFkaW5nSWNvbjogc3RyaW5nID0gXCJcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIGl0IGlzIHRvIHNldCB0cmFpbGluZyBpY29uLCBhdCB0aGUgZW5kIG9mIGNvbnRyb2wsIGZvciBwYXNzd29yZCB0eXBlIGNvbnRyb2wgZXllIGlzIHRoZSB0cmFpbGluZyBpY29uICAqL1xyXG4gIEBJbnB1dCgpIHRyYWlsaW5nSWNvbjogc3RyaW5nID0gXCJcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkgYmVsb3cgdGhlIGNvbnRyb2wgZm9yIHN1Z2dlc3Rpb24sIGlmIHRoZXJlIGlzIGFueSBlcnJvciB0aGVuIGVycm9yIHdpbGwgYncgdGhlIGZpcnN0IHRvIHNob2UgaW4gcGxhY2Ugb2YgaGVscCB0ZXh0ICovXHJcbiAgQElucHV0KCkgaGVscGVyVGV4dDogc3RyaW5nID0gXCJcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIGRlZmF1bHQgdHJ1ZSB0byBjb2xsYXBzZSB3aGVuIHRoZXJlIGlzIG5vIGhlbHAgdGV4dCBvciBlcnJvciB0ZXh0LCBpZiBmYWxzZSB0aGVuIGVsZW1lbnQgYXJlYSBpbiBET00gd2lsbCBiZSByZXNlcnZlZCBuZXZlciBkZXRyb3kgICovXHJcbiAgQElucHV0KCkgaGVscGVyVGV4dENvbGxhcHNlOiBib29sZWFuID0gdHJ1ZTtcclxuICAvKiogQGRlc2NyaXB0aW9uIHNob3cgYW5kIGhpZGUgaGVscGVyIHRleHQgaXRzIGZvcmVjZnVsbCAqL1xyXG4gIEBJbnB1dCgpIGhpZGVIZWxwZXJBbmRFcnJvclRleHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogQGRlc2NyaXB0aW9uIGlmIGZvdW5kIGFueSBlcnJvciBpbiBjb250cm9sIHRoZSBlcnJvciB0aGV4dCB3aWxsIGJlIHVzZWQgdG8gZGlzcGxheSBlcnJvciBtZXNzYWdlLCBpZiB0aGVyZSBpcyBoZWxwIHRleHQgc3RpbGwgZXJyb3IgdGV4dCBpcyBoYXZpbmcgaGlnaGVyIHByaW9yaXR5IHRoZW4gaGVscHRleHQgKi9cclxuICBASW5wdXQoKSBlcnJvclRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBtYXhsZW5ndGggZm9yIGNvbnRyb2wgKi9cclxuICBASW5wdXQoKSBtYXhsZW5ndGg6IG51bWJlciA9IDA7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBtaW5sZW5ndGggZm9yIGNvbnRyb2wgKi9cclxuICBASW5wdXQoKSBtaW5sZW5ndGg6IG51bWJlciA9IDA7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpcyBjb250cm9sIGlzIHJlcXVpcmVkIG9yIG5vdCBpbnB1dCB0eXBlIGlzIHRydWUgfCBmYWxzZSAqL1xyXG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBBdXRvIGNhcGF0YWxpemF0aW9uIGZvciB0aGUgdmFsdWUgYW5kIGFwcGxpY2FibGUgdG8gd29yZCBvciB0byBjb21wbGV0ZSBzZW50YW5jZSAqL1xyXG4gIEBJbnB1dCgpIGF1dG9jYXBpdGFsaXplOiBhdXRvY2FwaXRhbGl6ZVR5cGUgPSBcIm9mZlwiO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gYXV0byBjb21wbGV0ZSB0eXBlIHRvIGhlbHAgcmVhZGVyIHdoYXQgaXMgdGhlIHR5cGUgb2YgdmFsdWUgKi9cclxuICBASW5wdXQoKSBhdXRvY29tcGxldGU6IGF1dG9jb21wbGV0ZVR5cGUgPSBcIm9mZlwiO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdHlwZSBvZiBjb250cm9sICovXHJcbiAgQElucHV0KCkgdHlwZTogY29udHJvbFR5cGUgPSAndGV4dCc7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB3aWR0aCBvZiBjb250cm9sLCBkZWZhdWx0IHdpZHRoIGlzIDEwMCUgKi9cclxuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nID0gJzEwMCUnO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdW5pcSBpZCBvZiBjb250cm9sLCB1c2VkIHRvIGRpZmZlcmVuY2lhdCB0aGUgdmFsdWUgYWxzbyBwcmV2ZW50IHZhbHVlIHNob3VsZCBub3QgZWZmZWN0IGFub3RoZXIgdmFsdWVzICovXHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICcnO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdG8gZ2V0IGlucHV0IHZhbHVlIHVzaW5nIG9uZSB3YXkgYmluZGluZyBsaWtlOiBbbmdNb2RlbF0gb3IgYnkgdHdvIHdheSBiaW5kaW5nIFsobmdNb2RlbCldICovXHJcbiAgQElucHV0KCkgbmdNb2RlbDogaW5wdXRUeXBlID0gJyc7XHJcbiAgQElucHV0KCkgb3B0aW9uOiBzdHJpbmdbXSA9IFtcImFua3N1aFwiLCBcImJodXJlXCJdO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gbWluIHZhbHVlIGZvciBudW1iZXIgdHlwZSBjb250cm9sICovXHJcbiAgQElucHV0KCkgbWluOiBudW1iZXIgPSAwO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gbWF4IHZhbHVlIGZvciBudW1iZXIgdHlwZSBjb250cm9sICovXHJcbiAgQElucHV0KCkgbWF4OiBudW1iZXIgPSAwO1xyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIEhvbGRzIHRoZSBzaXplIG9mIHRoZSBjb21wb25lbnQgbGlrZSBTbWFsbCwgRXh0cmEgc21hbGwsIExhcmdlXHJcbiAgICogYnkgRGVmYXVsdCBpdCB0YWtlcyBzbWFsbCBzaXplXHJcbiAgICogb3IgdGhlIHNpemUgc2V0IGJ5IHRoZSBwcm9qZWN0IHNldHVwIHNlcnZpY2VcclxuICAgKiBvciBpdCB3aWxsIGJlc2V0IGZvciBpbmRpdmlkdWFsIGNvbXBvbmVudFxyXG4gICAqIFxyXG4gICAqIFNpemUgQXBwbGVkIFxyXG4gICAqIENvbXBvbmVudCBsZXZlbCB0aGVuIHNldHVwIHNlcnZpY2UgdGhlbiBmaW5hbGx5IGRlZmF1bHQgbWRcclxuICAgKiAgT3B0aW9uczogXCIyeHNcIiB8IFwiXCJ4c1wiIHwgXCJzbVwiIHwgXCJtZFwiIHwgXCJsZ1wiIHwgXCJ4bFwiIHwgXCJ4eGxcIiBcclxuICAgKi9cclxuICBASW5wdXQoKSBzaXplOiB0aGVtZVNpemUgPSBcInNtXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB0byBzZXQgcmV0dXJuIHZhbHVlIHVzaW5nIG9uZSB3YXkgYmluZGluZyBsaWtlOiAobmdNb2RlbENoYW5nZXMpIG9yIGJ5IHR3byB3YXkgYmluZGluZyBbKG5nTW9kZWwpXSAqL1xyXG4gIEBPdXRwdXQoKSBuZ01vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8aW5wdXRUeXBlPiA9IG5ldyBFdmVudEVtaXR0ZXI8aW5wdXRUeXBlPigpO1xyXG5cclxuICAvKlxyXG4gICAgICBpbnRlcm5hbCBQcm9wZXJ0aWVzIGZvciBpbnB1dFxyXG4gICovXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpcyB2YWxlIG5lZWQgdG8gcmVhZCBmcm9tIG5nTW9kZWwgb3IgZnJvbSB2YWx1ZShuZWVkIHRvIGltcGxlbWVudCksIGl0IGlzIGRldGVjdGVkIGFuZCBtYWlsZCBmYWxzIG9uIHZhbHVlIGNobmFnZXMgKi9cclxuICBwdWJsaWMgaXNOZ01vZGVsOiBib29sZWFuID0gdGhpcy5uZ01vZGVsID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdGhpcyBpcyB0byBzZXQgY29udHJvbCB2YWx1ZSBpcyB2YWxpZCBvciBub3QsIHNldCBieSB1cyBpbnNpZGUgdmFsaWRhdGUgY2FsbGJjayBtZXRob2QgY2FsbGVkIGJ5IGFuZ3VsYXIgICovXHJcbiAgcHVibGljIGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gd2hlbiBjb250cm9sIGlzIHRvdWNoZWQgdGhlbiB0aGUgd2lsbCBtYWlkIHRydWUgYnkgdGhlIHVzIHRvIGNoZWNrIGl0IGlzIHRvdWNoZWQgb3Igbm90LCB3aGVuIHdlIHdpbGwgc2V0IHRoaXMgdHJ1ZSB3ZSB3aWxsIGNhbGwgdGhlIG9uVG91Y2hlZCBjYWxsYmFjayBtZXRob2Qgb2YgYW5ndWFsciB0byBpbmZvcm0gYW5ndWxhciB0aGF0IHNvbXRoaXMgaXMgY2hhbmdlZCBhbmQgY29udHJvbCBpcyB0b3VjaGVkICovXHJcbiAgcHVibGljIGlzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gd2Ugd2lsbCB0YWtlIHR5cGUgb2YgY29udHJvbCBpbiB0eXBlIGJ1dCBpcyBtYXkgYmUgbm90IGV4YWN0bHkgd2hpY2ggaW5wdXQncyB0eXBlIHNvIHdlIG5lZWQgdG8gZ2V0IHR5cGUgYW5kIHNldCBhY3R1bGUgdHlwZSB0byBvdXIgaW5wdXQsIGFsc28gd2hlbiB0eXBlIGlzIHNldCBwYXNzd29yZCBidXQgaW4gY2Fsc2UgdmlldyBpbiB0ZXh0dCB0aGVuIGludXV0IHR5cGUgbmVlZCB0byBjaGFuZ2UgdG8gdGV4dCAqL1xyXG4gIHB1YmxpYyB0eXBlSW50ZXJuYWw6IGNvbnRyb2xUeXBlID0gXCJ0ZXh0XCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpZiB0cmFsaW5nIGlzIHNldCB0aGUgaXQgaXMgYXNzaWduZWQgYnkgaXQsIGJ1dCBzb21lIGNhc2UgdGFybGluZyBpY29uIG5vdCBhcyBpdCBpcyBzZXQgbmVlZCB0cm8gYmUgY2hhbmdlZCBhdCBydW50aW1lLCBsaWtlIHBhc3N3b3JkIHZpc2liaWxpdHkgaGlkZSBhbmQgc2hvdyAqL1xyXG4gIHB1YmxpYyB0cmFpbGluZ0ljb25JbnRlcm5hbDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgLyogXHJcbiAgICAgIFByb3BlcnRpZXMgY29ubmVjdGVkIHdpdGggdHJhaWxpbmdJY29uSW50ZXJuYWwgXHJcbiAgKi9cclxuICBwdWJsaWMgaXNUcmFpbGluZ0ljb25BbGx3ZWRDbGljazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBQcm9wZXJ0aWVzIGNvbm5lY3RlZCB3aXRoIGlkXHJcbiAgcHVibGljIGlkUmFuZG9tOiBzdHJpbmcgPSB0aGlzLnJhbmRvbVN0cmluZygpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09TUVUSE9EUyBGT1IgQ1VTVE9NIEZPUk0gQ09NUE9ORU5UPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBGT1IgQU5HVUxBUiBDQUxMRUQgQlkgVUlcclxuXHJcbiAgLyoqIFxyXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIEhUTUwgQ2huYWdlIHRvIHRlbGwgQW5ndWxhciBzb210aGluZyBpcyBjaGFuZ2VkLlxyXG4gICAqIEBmaWVsZCB2YWx1ZSA6IGlucHV0VHlwZVxyXG4gICAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKHZhbHVlOiBpbnB1dFR5cGUpID0+IHsgfTtcclxuXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGlucHV0IGlzIHRvdWNoZWQgKGNsY2lrZWQpIHRvIHRlbGwgQW5ndWxhciBzb210aGluZyBpcyBjaGFuZ2VkLiAqL1xyXG4gIG9uVG91Y2hlZCA9ICgpID0+IHsgfTtcclxuXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGlucHV0IGlzIG5lZWQgdG8gVmFsaWRhdGUgdG8gdGVsbCBBbmd1bGFyIHNvbXRoaW5nIGlzIGNoYW5nZWQgKGluIGNhc2Ugb2Ygc29tZSBpbnB1dCBkaXBlbmRlbnQgdmFsaWRhdGlvbikuICovXHJcbiAgb25WYWxpZGF0ZSA9ICgpID0+IHsgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogTWV0aG9kIHRoYXQgcGVyZm9ybXMgc3luY2hyb25vdXMgdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBwcm92aWRlZCBjb250cm9sLlxyXG4gICAqIEV4aWN1dGVkIGJ5IEFuZ3VsYXJcclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHRvIHZhbGlkYXRlIGFnYWluc3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBBIG1hcCBvZiB2YWxpZGF0aW9uIGVycm9ycyBpZiB2YWxpZGF0aW9uIGZhaWxzLFxyXG4gICAqIG90aGVyd2lzZSBudWxsLlxyXG4gICAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uX2Vycm9yID0gdGhpcy5pc0NvbnRyb2xWYWxpZCh0aGlzLm5nTW9kZWwpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25fZXJyb3I/LnN0YXR1cykge1xyXG4gICAgICByZXR1cm4gdmFsaWRhdGlvbl9lcnJvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHZhbGlkYXRvciBpbnB1dHMgY2hhbmdlLlxyXG4gICAqIEV4aWN1dGVkIGJ5IEFuZ3VsYXJcclxuICAgKlxyXG4gICAqIEBwYXJhbSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cclxuICAgKi9cclxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlPyhmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblZhbGlkYXRlID0gZm47XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIHdoZW4gZm9ybSBjb250cm9sIGNoYW5nZSBmcm9tIG1vZGVsIHNpZGUgdGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgICovXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogaW5wdXRUeXBlKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNOZ01vZGVsKSB7XHJcbiAgICAgIGNvbnN0IG5nTW9kZWwgPSB0aGlzLmF1dG9DYXBpdGFsaXplQnlPcHRpb24odmFsdWUsIHRoaXMudHlwZSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd3cml0ZVZhbHVlJywgdGhpcy5uZ01vZGVsLCBuZ01vZGVsKTtcclxuICAgICAgdGhpcy5uZ01vZGVsID0gbmdNb2RlbDtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBBbGxvd3MgQW5ndWxhciB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbW9kZWwgY2hhbmdlcy4gKi9cclxuICAvLyBTYXZlIHRoZSBmdW5jdGlvbiBhcyBhIHByb3BlcnR5IHRvIGNhbGwgbGF0ZXIgaGVyZS5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGlucHV0VHlwZSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICAvKiogQGRlc2NyaXB0aW9uIEFsbG93cyBBbmd1bGFyIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBpbnB1dCBoYXMgYmVlbiB0b3VjaGVkLiAqL1xyXG4gIC8vIFNhdmUgdGhlIGZ1bmN0aW9uIGFzIGEgcHJvcGVydHkgdG8gY2FsbCBsYXRlciBoZXJlLlxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKlxyXG4gICAgTWV0aG9kcyBmb3IgaW5wdXRcclxuKi9cclxuXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBEZXRlY3Qgd2V0aGVyIGlucHV0IHByb3BlcnRpcmVzIGNhbmdlZCBvciBub3QgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcz8uWyd2YWx1ZSddKSB7XHJcbiAgICAgIHRoaXMuaXNOZ01vZGVsID0gdHJ1ZTtcclxuICAgICAgdGhpcy5uZ01vZGVsID0gdGhpcy5wcm9jZXNzVmFsdWUodGhpcy5uZ01vZGVsLCB0aGlzLnR5cGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNWYWxpZFZhbHVlQW5kVHlwZSh0aGlzLm5nTW9kZWwsIHRoaXMudHlwZSkgfHwgdGhpcy5pc1RvdWNoZWQpIHtcclxuICAgICAgdGhpcy5pc0NvbnRyb2xWYWxpZCh0aGlzLm5nTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERpdGVjdCB0eXBlIGNoYW5nZVxyXG4gICAgaWYgKGNoYW5nZXM/LlsndHlwZSddKSB7XHJcbiAgICAgIHRoaXMuZGV0ZWN0VHlwZUNoYW5nZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pZCkge1xyXG4gICAgICB0aGlzLmdldENvbnRyb2xEYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIGN1c3RvbSBtZXRob2QgcnVuIHdoZW4gSFRNTCBjaGFuZ2VzLCB3ZSBjYWxsIG1ldGhvZCByZWdpc3RlcmQgYnkgYW5ndWxhciB0byBkZXRlY3QgY2hhbmdlICovXHJcbiAgdXBEYXRlVmFsdWUodmFsdWU6IHsgdGFyZ2V0OiB7IHZhbHVlOiBpbnB1dFR5cGUgfSB9IHwgRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IHZhbHVlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgeyB2YWx1ZTogaW5wdXRUeXBlIH07XHJcbiAgICB0aGlzLmlzQ29udHJvbFZhbGlkKHRhcmdldD8udmFsdWUpO1xyXG4gICAgY29uc3QgdXBkYXRlZFZhbHVlID0gdGhpcy5wcm9jZXNzVmFsdWUodGFyZ2V0Py52YWx1ZSwgdGhpcy50eXBlKTtcclxuICAgIHRoaXMubmdNb2RlbCA9IHVwZGF0ZWRWYWx1ZTtcclxuICAgIHRoaXMubmdNb2RlbENoYW5nZT8uZW1pdCh1cGRhdGVkVmFsdWUpO1xyXG4gICAgLy8gY29uc29sZS5sb2codGFyZ2V0KVxyXG4gICAgdGhpcy5vbkNoYW5nZSh1cGRhdGVkVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIG1ldGhvZCBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgY29udHJvbCB0eXBlIGNoZWNrYm94XHJcbiAgICogXHJcbiAgICogQHBhcmFtIHZhbHVlIGJvb2xlYW4gfCBzdHJpbmdcclxuICAgKi9cclxuICB1cGRhdGVWYWx1ZUNoZWNrQm94KHZhbHVlOiBzdHJpbmcgfCBib29sZWFuKSB7XHJcbiAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBib29sZWFuXHJcbiAgICB0aGlzLm5nTW9kZWwgPSAhdGhpcy5uZ01vZGVsO1xyXG4gICAgdmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpID8gdmFsdWUgOiAodmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZSk7XHJcbiAgICB0aGlzLm5nTW9kZWxDaGFuZ2U/LmVtaXQodmFsdWUpO1xyXG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIGNsZWFyIHRoZSB2YWx1ZSAqL1xyXG4gIENsZWFySW5wdXRWYWx1ZSgpIHtcclxuICAgIGlmICh0aGlzLnR5cGUgPT0gXCJ0ZXh0XCIpIHtcclxuICAgICAgdGhpcy51cERhdGVWYWx1ZSh7IHRhcmdldDogeyB2YWx1ZTogXCJcIiB9IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB3aGVuIEhUTUwgaXMgZm9jdWVzZCAqL1xyXG4gIGZvY3VzQ29udHJvbCgpIHtcclxuICAgIHRoaXMuaXNUb3VjaGVkID0gdHJ1ZTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLm9uVmFsaWRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gSWYgY29udHJvbCB2YWx1ZSBuZWVkIHRvIGJlIHByb2Nlc3NlZCwgbGlrZSBVUFBFUkNBU0UgKi9cclxuICBwcm9jZXNzVmFsdWUodmFsdWU6IGlucHV0VHlwZSwgdHlwZTogY29udHJvbFR5cGUpIHtcclxuICAgIHZhbHVlID0gdGhpcy5hdXRvQ2FwaXRhbGl6ZUJ5T3B0aW9uKHZhbHVlLCB0eXBlKTtcclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gZm9yIGNhcGl0YWxpemF0aW9uICovXHJcbiAgYXV0b0NhcGl0YWxpemVCeU9wdGlvbih2YWx1ZTogaW5wdXRUeXBlLCB0eXBlOiBjb250cm9sVHlwZSkge1xyXG4gICAgaWYgKHR5cGUgPT0gJ3RleHQnKSB7XHJcbiAgICAgIGlmICh0aGlzLmF1dG9jYXBpdGFsaXplID09IFwib25cIikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhcGl0YWxpemVQaXBlPy50cmFuc2Zvcm0odmFsdWUgYXMgc3RyaW5nLCAnYWxsVXBwZXJDYXNlJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuYXV0b2NhcGl0YWxpemUgPT0gXCJ3b3Jkc1wiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwaXRhbGl6ZVBpcGU/LnRyYW5zZm9ybSh2YWx1ZSBhcyBzdHJpbmcsICd0aXRsZUNhc2UnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5hdXRvY2FwaXRhbGl6ZSA9PSBcInNlbnRlbmNlc1wiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwaXRhbGl6ZVBpcGU/LnRyYW5zZm9ybSh2YWx1ZSBhcyBzdHJpbmcsIFwic2VudGVuY2VDYXNlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIEl0IGlzIHVzZWQgdG8gcmV0dXJuIHRoZSB2YWx1ZSBpcyB2YWxpZCBvciBub3QgKi9cclxuICBpc1ZhbGlkVmFsdWVBbmRUeXBlKHZhbHVlOiBpbnB1dFR5cGUsIHR5cGU6IGNvbnRyb2xUeXBlKSB7XHJcbiAgICBpZiAodHlwZSA9PSAndGV4dCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gdG8gY2hlY2sgY29udHJvbCBpcyB2YWxpZCBvciBub3QgKi9cclxuICBpc0NvbnRyb2xWYWxpZCh2YWx1ZTogaW5wdXRUeXBlKTogVmFsaWRhdGlvblN0YXR1cyB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uX3N0YXR1czogVmFsaWRhdGlvblN0YXR1cyA9IHtcclxuICAgICAgdmFsaWRhdGlvbjoge30sXHJcbiAgICAgIHN0YXR1czogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgdmFsaWRhdGlvbl9zdGF0dXMudmFsaWRhdGlvbi5yZXF1aXJlZCA9IGByZXF1aXJlZCFgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudHlwZSA9PSAndGV4dCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWF4bGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgaWYgKHZhbHVlPy5sZW5ndGggPiB0aGlzLm1heGxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uX3N0YXR1cy5zdGF0dXMgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uX3N0YXR1cy52YWxpZGF0aW9uLm1heGxlbmd0aCA9IGBtYXhpbXVtIGxlbmd0aCBpcyAke3RoaXMubWF4bGVuZ3RofSFgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5taW5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAodmFsdWU/Lmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnZhbGlkYXRpb24ubWlubGVuZ3RoID0gYG1pbmltdW0gbGVuZ3RoIGlzICR7dGhpcy5taW5sZW5ndGh9IWA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgdmFsaWRhdGlvbl9zdGF0dXMudmFsaWRhdGlvbi5yZXF1aXJlZCA9IGByZXF1aXJlZCFgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVmFsaWQgPSAhdmFsaWRhdGlvbl9zdGF0dXMuc3RhdHVzO1xyXG4gICAgdGhpcy5lcnJvclRleHQgPSBPYmplY3QudmFsdWVzKHZhbGlkYXRpb25fc3RhdHVzLnZhbGlkYXRpb24pLmF0KDApIHx8ICcnXHJcbiAgICByZXR1cm4gdmFsaWRhdGlvbl9zdGF0dXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIEFsbG93cyBBbmd1bGFyIHRvIGRpc2FibGUgdGhlIGlucHV0LiAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIE1ldGhvZCBmb3IgdHJhaWxpbmcgSWNvbiBDbGljayAqL1xyXG4gIHRyYWlsaW5nSWNvbkNsaWNrKCkge1xyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xyXG4gICAgICBpZiAodGhpcy50eXBlSW50ZXJuYWwgPT09ICdwYXNzd29yZCcpIHtcclxuICAgICAgICB0aGlzLnR5cGVJbnRlcm5hbCA9ICd0ZXh0JztcclxuICAgICAgICB0aGlzLnRyYWlsaW5nSWNvbkludGVybmFsID0gJ3Zpc2liaWxpdHknO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHlwZUludGVybmFsID0gJ3Bhc3N3b3JkJztcclxuICAgICAgICB0aGlzLnRyYWlsaW5nSWNvbkludGVybmFsID0gJ3Zpc2liaWxpdHlfb2ZmJztcclxuICAgICAgfVxyXG4gICAgfWVsc2Uge1xyXG4gICAgICB0aGlzLnR5cGVJbnRlcm5hbCA9IHRoaXMudHlwZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRob2QgdG8gZ2VuZXJhdGUgUmFuZG9tIFN0cmluZ1xyXG4gICAqIEBwYXJhbSBzZXR1cFByYXJhbWV0ZXIgeyBsZW5naHQ6IG51bWJlciwgcHJlZml4OiBzdHJpbmcgfVxyXG4gICAqIGRlZmF1bHQgbGVuZ2h0IGlzIDEwLCBwcmVmb3ggaXMgXCJcIlxyXG4gICAqIEByZXR1cm5zIHN0cmluZ1xyXG4gICAqL1xyXG4gIHJhbmRvbVN0cmluZyhzZXR1cFByYXJhbWV0ZXI6IHsgbGVuZ2h0OiBudW1iZXIsIHByZWZpeDogc3RyaW5nIH0gPSB7IGxlbmdodDogMTAsIHByZWZpeDogXCJcIiB9KTogc3RyaW5nIHtcclxuICAgIC8vdmFyaWFibGUgY29uc2lzdGluZyBhbHBoYWJldHMgaW4gc21hbGwgYW5kIGNhcGl0YWwgbGV0dGVyICBcclxuICAgIGNvbnN0IGNoYXJhY3RlcnMgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFRaYWJjZGVmZ2hpa2xtbm9wcXJzdHV2d3h5elwiO1xyXG4gICAgLy9sb29wIHRvIHNlbGVjdCBhIG5ldyBjaGFyYWN0ZXIgaW4gZWFjaCBpdGVyYXRpb24gIFxyXG4gICAgbGV0IHJhbmRvbV9zdHJpbmcgPSBzZXR1cFByYXJhbWV0ZXI/LnByZWZpeCB8fCBcIlwiO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXR1cFByYXJhbWV0ZXI/LmxlbmdodDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHJudW0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzLmxlbmd0aCk7XHJcbiAgICAgIHJhbmRvbV9zdHJpbmcgKz0gY2hhcmFjdGVycy5zdWJzdHJpbmcocm51bSwgcm51bSArIDEpO1xyXG4gICAgfVxyXG4gICAgLy9yZXR1cm4gdGhlIGdlbmVyYXRlZCBzdHJpbmcgIFxyXG4gICAgcmV0dXJuIHJhbmRvbV9zdHJpbmc7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRDb250cm9sRGF0YSgpIHtcclxuICAgIGNvbnN0IGNpZGVfZWxlbWVudF9kYXRhID0gYXdhaXQgdGhpcy5lbGVtZW50U2VydmljZT8uZ2V0RWxlbWVudERhdGEoeyBzeXBlX2tleTogdGhpcy5pZCB9KTtcclxuICAgIGlmIChjaWRlX2VsZW1lbnRfZGF0YSkge1xyXG4gICAgICB0aGlzLmxhYmVsID0gY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfbGFiZWwgYXMgc3RyaW5nO1xyXG4gICAgICB0aGlzLmxhYmVsUGxhY2VtZW50ID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX2xhYmVsX3BsYWNlbWVudCB8fCAnZmxvYXRpbmcnKSBhcyBsYWJlbFBsYWNlbWVudFR5cGU7XHJcbiAgICAgIHRoaXMudHlwZSA9IChjaWRlX2VsZW1lbnRfZGF0YT8uc3lwZV90eXBlIHx8ICd0ZXh0JykgYXMgY29udHJvbFR5cGU7XHJcbiAgICAgIHRoaXMucmVxdWlyZWQgPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfcmVxdWlyZWQgfHwgZmFsc2UpIGFzIGJvb2xlYW47XHJcbiAgICAgIHRoaXMuc2l6ZSA9IChjaWRlX2VsZW1lbnRfZGF0YT8uc3lwZV9zaXplIHx8ICdtZCcpIGFzIHRoZW1lU2l6ZTtcclxuICAgICAgdGhpcy5oZWxwZXJUZXh0Q29sbGFwc2UgPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfaGVscGVyX3RleHRfY29sbGFwc2UgfHwgZmFsc2UpIGFzIGJvb2xlYW47XHJcbiAgICAgIHRoaXMubWF4bGVuZ3RoID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX21heF9sZW5ndGgpIGFzIG51bWJlcjtcclxuICAgICAgdGhpcy5taW5sZW5ndGggPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfbWluX2xlbmd0aCkgYXMgbnVtYmVyO1xyXG4gICAgICB0aGlzLmxlYWRpbmdJY29uID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX2xlYWRpbmdfaWNvbikgYXMgc3RyaW5nO1xyXG4gICAgICB0aGlzLmxhYmVsSGlkZSA9IChjaWRlX2VsZW1lbnRfZGF0YT8uc3lwZV9sYWJlbF9oaWRlKSBhcyBib29sZWFuO1xyXG4gICAgICB0aGlzLmhpZGVIZWxwZXJBbmRFcnJvclRleHQgPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfaGlkZV9oZWxwZXJfYW5kX2Vycm9yX3RleHQpIGFzIGJvb2xlYW47XHJcbiAgICAgIHRoaXMuZGV0ZWN0VHlwZUNoYW5nZSgpO1xyXG4gICAgICAvLyBWYWxpZGF0ZSBjb250cm9sXHJcbiAgICAgIHRoaXMub25WYWxpZGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIHVzZSB0byBkZXRhY3QgdGhlIGNoYW5nZSBpbiB0eXBlIGlmIGNoYW5nZXMgZG9uZSB0aGlzIG1ldGhvZCBpcyB1ZWQgdG8gcnVuXHJcbiAgICovXHJcbiAgZGV0ZWN0VHlwZUNoYW5nZSgpIHtcclxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdwYXNzd29yZCcpIHtcclxuICAgICAgdGhpcy50eXBlSW50ZXJuYWwgPSBcInBhc3N3b3JkXCI7XHJcbiAgICAgIHRoaXMudHJhaWxpbmdJY29uSW50ZXJuYWwgPSBcInZpc2liaWxpdHlfb2ZmXCI7XHJcbiAgICAgIHRoaXMuaXNUcmFpbGluZ0ljb25BbGx3ZWRDbGljayA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnR5cGVJbnRlcm5hbCA9IHRoaXMudHlwZTtcclxuICAgICAgdGhpcy50cmFpbGluZ0ljb25JbnRlcm5hbCA9IHRoaXMudHJhaWxpbmdJY29uO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2lkZS1pbnB1dFwiPlxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1URVhUIHwgUEFTU1dPUkQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0gJ3RleHQnIHx8IHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdwYXNzd29yZCdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctdy1mdWxsIHR3LXJlbGF0aXZlXCIgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkdGggfVwiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtc2l6ZS14eHMnOiAoc2l6ZSA9PT0gJzJ4cycpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLXhzJzogKHNpemUgPT09ICd4cycpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLXNtJzogKHNpemUgPT09ICdzbScpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLW1kJzogKHNpemUgPT09ICdtZCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLWxnJzogKHNpemUgPT09ICdsZycpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1sZWFkaW5nLWljb24nOiBsZWFkaW5nSWNvbixcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtdHJhaWxpbmctaWNvbic6IHRyYWlsaW5nSWNvbkludGVybmFsLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1jbGVhci1pbnB1dCc6IGNsZWFySW5wdXQsXHJcbiAgICAgICAgICAgICAgICAnY2lkZS1lbGVtZW50LWlucHV0LWxhYmVsLWZsb2F0aW5nJzogKGxhYmVsUGxhY2VtZW50ID09PSAnZmxvYXRpbmcnKSxcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtaW5wdXQtbGFiZWwtc3RhcnQnOiAobGFiZWxEaXIgPT09ICdzdGFydCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1pbnB1dC1sYWJlbC1lbmQnOiAobGFiZWxEaXIgPT09ICdlbmQnKSxcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtaW5wdXQtbGFiZWwtZml4ZWQnOiAobGFiZWxQbGFjZW1lbnQgPT09ICdmaXhlZCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1pbnB1dC1sYWJlbC1sZXNzJzogKCFsYWJlbCB8fCBsYWJlbEhpZGUpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zdHlsZS1vdXRsaW5lJzogKGZpbGwgPT09ICdvdXRsaW5lJyksXHJcbiAgICAgICAgICAgICAgICAnY2lkZS1lbGVtZW50LXN0eWxlLXNvbGlkJzogKGZpbGwgPT09ICdzb2xpZCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zdHlsZS1zdGFuZGFyZCc6IChmaWxsID09PSAnc3RhbmRhcmQnKSxcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtaW5wdXQtbnVtYmVyJzogKHR5cGUgPT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgIDwhLS0gbGFiZWwgLS0+XHJcbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cImlkXCIgY2xhc3M9XCJjaWRlLWlucHV0LWxhYmVsXCIgKm5nSWY9XCJsYWJlbCAmJiAhbGFiZWxIaWRlXCI+e3tsYWJlbH19PC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gYWxsIG9uZSBsaW5lIGVsZW1ldHMgd2hpY2ggZG9zZSBub3QgYWZmZWN0IHdpdGggbGFiZWwgYW5kIGVycm9yIHRleHQgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaWRlLWVsZW1lbnQtaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBMZWFkaW5nIEljb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNpZGUtaW5wdXQtbGVhZGluZy1pY29uLXdyYXBwZXJcIiAqbmdJZj1cImxlYWRpbmdJY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaWRlLWlucHV0LWxlYWRpbmctaWNvbiBtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHR3LXRleHQtY2VudGVyXCI+e3tsZWFkaW5nSWNvbn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHJhbGluZyBpY29uIC0tPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy1hYnNvbHV0ZSBjaWRlLWlucHV0LXRyYWlsaW5nLWljb24gLXR3LWJvdHRvbS0xIHR3LXNlbGVjdC1ub25lIHR3LXJpZ2h0LTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidHJhaWxpbmdJY29uSW50ZXJuYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgdHctdy04IHR3LXRleHQtY2VudGVyICF0dy10ZXh0LTJ4bFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndHctY3Vyc29yLXBvaW50ZXInOiBpc1RyYWlsaW5nSWNvbkFsbHdlZENsaWNrfVwiIFthdHRyLnRhYmluZGV4XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRyYWlsaW5nSWNvbkNsaWNrKClcIiAoa2V5dXApPVwidHJhaWxpbmdJY29uQ2xpY2soKVwiPnt7dHJhaWxpbmdJY29uSW50ZXJuYWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIENsZWFyIC0tPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpZGUtaW5wdXQtY2xlYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2xlYXJJbnB1dCAmJiBuZ01vZGVsXCIgKGNsaWNrKT1cIkNsZWFySW5wdXRWYWx1ZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaWRlLWlucHV0LWNsZWFyLWljb24gbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbaWRdPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsoKGxhYmVsICYmIGxhYmVsUGxhY2VtZW50ID09PSAnZml4ZWQnKSA/ICd0dy1yb3VuZGVkLWUtbWQgdHctcm91bmRlZC1lcy1tZCcgOiAndHctcm91bmRlZC1tZCAnKSwgKCFsZWFkaW5nSWNvbiA/ICd0dy1wbC0xJyA6ICcnKSwgKHRyYWlsaW5nSWNvbkludGVybmFsID8gJ3R3LXByLTgnOiAnJyksICghdHJhaWxpbmdJY29uSW50ZXJuYWwgPyAndHctcHItMScgOiAnJyksICgoc2l6ZSA9PT0gJ21kJykgPyAndHctaC04IHR3LXB0LTAuNSB0dy1wYi0wJyA6IChzaXplID09PSAnc20nID8gJ3R3LWgtNycgOiAnJykpLCAobGFiZWxIaWRlID8gJyF0dy1tdC0wJyA6ICcnKV1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibmdNb2RlbFwiIFt0eXBlXT1cInR5cGVJbnRlcm5hbFwiIChpbnB1dCk9XCJ1cERhdGVWYWx1ZSgkZXZlbnQpXCIgKGZvY3VzKT1cImZvY3VzQ29udHJvbCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiIFttaW5dPVwibWluXCIgW21heF09XCJtYXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctbS0wIHR3LXctZnVsbCB0dy1iZy10cmFuc3BhcmVudCB0dy1vdmVyZmxvdy1oaWRkZW4gdHctYm9yZGVyLXNvbGlkIHR3LXAtMCBjaWRlLWlucHV0LWlucHV0IHR3LW91dGxpbmUtbm9uZVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIGVycm9yIHRleHQgLyBoZWxwZXIgdGV4dCAtLT5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIoZXJyb3JUZXh0IHx8IGhlbHBlclRleHQgfHwgIWhlbHBlclRleHRDb2xsYXBzZSkgJiYgIWhpZGVIZWxwZXJBbmRFcnJvclRleHRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjaWRlLWlucHV0LWhlbHAtZXJyb3ItdGV4dFwiPnt7XHJcbiAgICAgICAgICAgICAgICBpc1ZhbGlkXHJcbiAgICAgICAgICAgICAgICA/IGhlbHBlclRleHQgOiAoZXJyb3JUZXh0ID9cclxuICAgICAgICAgICAgICAgIChpc1RvdWNoZWQgPyBlcnJvclRleHQgOiBoZWxwZXJUZXh0KVxyXG4gICAgICAgICAgICAgICAgOiBoZWxwZXJUZXh0KX19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBJbnB1dCB3aXRoIHRyYWxsaW5nIGljb24gLS0+XHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJ0dy1pbmxpbmUtYmxvY2sgdHctaC0xMiB0dy13LTY0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXctZnVsbGgtZnVsbCB0dy1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LXRvcC0xLzMgdHctbXgtMiB0dy1iZy13aGl0ZSB0dy1weC0wLjUgdHctcHktMCB0dy10ZXh0LXNtIHR3LWxlYWRpbmctNCB0dy10ZXh0LWdyYXktNzAwXCI+TmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LWJvdHRvbS1weCB0dy1yaWdodC0wIC10dy16LTEwIHR3LXRleHQtZ3JheS00MDBcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0dy13LTggdHctdGV4dC1jZW50ZXIgIXR3LXRleHQtMnhsXCI+IHBlcnNvbiA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInR3LW0tMCB0dy1oLTggdHctdy1mdWxsIHR3LW92ZXJmbG93LWhpZGRlbiB0dy1yb3VuZGVkLW1kIHR3LWJvcmRlci0yIHR3LWJvcmRlci1zb2xpZCB0dy1ib3JkZXItZ3JheS0zMDAgdHctYmctdHJhbnNwYXJlbnQgdHctcC0wIHR3LXBiLTAuNSB0dy1wbC0xIHR3LXByLTggdHctdGV4dC1zbSB0dy10ZXh0LWdyYXktNjAwIHR3LW91dGxpbmUtbm9uZSBob3Zlcjp0dy1ib3JkZXItYmx1ZS00MDAgZm9jdXM6dHctYm9yZGVyLWJsdWUtNDAwIGZvY3VzOnR3LXRleHQtZ3JheS05NTBcIlxyXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJBbmt1c2ggQmh1cmVcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+IC0tPlxyXG5cclxuICAgIDwhLS0gSW5wdXQgd2l0aCBsZWFkaW5nIGljb24gLS0+XHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJ0dy1pbmxpbmUtYmxvY2sgdHctaC0xMiB0dy13LTY0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXctZnVsbGgtZnVsbCB0dy1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LXRvcC0xLzMgdHctbXgtMiB0dy1iZy13aGl0ZSB0dy1weC0wLjUgdHctcHktMCB0dy10ZXh0LXNtIHR3LWxlYWRpbmctNCB0dy10ZXh0LWdyYXktNzAwXCI+TmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LWJvdHRvbS1weCB0dy1sZWZ0LTAgLXR3LXotMTAgdHctdGV4dC1ncmF5LTQwMFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHR3LXctOCB0dy10ZXh0LWNlbnRlciAhdHctdGV4dC0yeGxcIj4gcGVyc29uIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctbS0wIHR3LWgtOCB0dy13LWZ1bGwgdHctb3ZlcmZsb3ctaGlkZGVuIHR3LXJvdW5kZWQtbWQgdHctYm9yZGVyLTIgdHctYm9yZGVyLXNvbGlkIHR3LWJvcmRlci1ncmF5LTMwMCB0dy1iZy10cmFuc3BhcmVudCB0dy1wLTAgdHctcGItMC41IHR3LXBsLTggdHctcHItMSB0dy10ZXh0LXNtIHR3LXRleHQtZ3JheS02MDAgdHctb3V0bGluZS1ub25lIGhvdmVyOnR3LWJvcmRlci1ibHVlLTQwMCBmb2N1czp0dy1ib3JkZXItYmx1ZS00MDAgZm9jdXM6dHctdGV4dC1ncmF5LTk1MFwiXHJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cIkFua3VzaCBCaHVyZVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1DSEVDS0JPWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSAnY2hlY2tib3gnXCIgY2xhc3M9XCJ0dy1mbGV4XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNpZGUtY2hlY2tib3ggdHctcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cIm5nTW9kZWxcIiBbdmFsdWVdPVwibmdNb2RlbFwiIFtpZF09XCJpZFJhbmRvbVwiIFt0eXBlXT1cInR5cGVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1hYnNvbHV0ZSB0dy1sZWZ0LTAgdHctaW52aXNpYmxlXCIgKGNsaWNrKT1cInVwZGF0ZVZhbHVlQ2hlY2tCb3goIW5nTW9kZWwpOyBmb2N1c0NvbnRyb2woKVwiXHJcbiAgICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNpZGUtY2hlY2tib3gtbGFiZWwgdHctY3Vyc29yLXBvaW50ZXJcIiBbZm9yXT1cImlkUmFuZG9tXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInR3LWJvcmRlci0yIHR3LWJvcmRlci1zb2xpZCB0dy1yZWxhdGl2ZSB0dy1yb3VuZGVkLW1kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEycHhcIiBoZWlnaHQ9XCIxMHB4XCIgY2xhc3M9XCJ0dy1hYnNvbHV0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjc2Rmd2lvcmZrbGFzZmpqYWxmandlcndyXCI+PC91c2U+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInR3LXRleHQtc20gdHctcGwtMiB0dy1sZWFkaW5nLVsxOHB4XSB0dy1zZWxlY3Qtbm9uZSB0dy1jdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhbGFiZWxIaWRlXCI+e3tsYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwidHctYWJzb2x1dGUgdHctaC0wIHR3LXctMCB0dy1zZWxlY3Qtbm9uZSB0dy1wb2ludGVyLWV2ZW50cy1ub25lXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEVsZW1lbnQgaGlkZGVuIGFuZCBpdHMgeHBhdGggaXMgdXNlZCB0byBkaXNwbGF5IGluc2lkZSBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICA8c3ltYm9sIGlkPVwic2Rmd2lvcmZrbGFzZmpqYWxmandlcndyXCIgdmlld2JveD1cIjAgMCAxMiAxMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIxLjUgNiA0LjUgOSAxMC41IDFcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgICAgPC9zeW1ib2w+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU0VMRUNULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSAnc2VsZWN0J1wiPnNhc1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctYWJzb2x1dGVcIj5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygb3B0aW9uOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy13LWZ1bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|