tnx-shared 5.1.207 → 5.1.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/tnx-shared.umd.js +210 -103
- package/bundles/tnx-shared.umd.js.map +1 -1
- package/bundles/tnx-shared.umd.min.js +1 -1
- package/bundles/tnx-shared.umd.min.js.map +1 -1
- package/classes/environment-schema.d.ts.map +1 -1
- package/classes/form-schema.d.ts +6 -0
- package/classes/form-schema.d.ts.map +1 -1
- package/components/crud/crud-form/crud-form.component.d.ts +8 -5
- package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
- package/components/crud/crud-list/crud-list.component.d.ts +2 -2
- package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
- package/components/dropdown/dropdown.component.d.ts +0 -1
- package/components/dropdown/dropdown.component.d.ts.map +1 -1
- package/components/statemachines/statemachines-connection-metadata/statemachines-connection-metadata.component.d.ts.map +1 -1
- package/components/statemachines/utils/utils.d.ts.map +1 -1
- package/components/tn-tabview/tn-tabview.component.d.ts +2 -0
- package/components/tn-tabview/tn-tabview.component.d.ts.map +1 -1
- package/components/workflow/models/models.d.ts +1 -0
- package/components/workflow/models/models.d.ts.map +1 -1
- package/components/workflow/services/workflow-permission-detail.service.d.ts.map +1 -1
- package/esm2015/classes/environment-schema.js +1 -1
- package/esm2015/classes/form-schema.js +7 -1
- package/esm2015/components/crud/crud-form/crud-form.component.js +73 -27
- package/esm2015/components/crud/crud-list/crud-list.component.js +12 -3
- package/esm2015/components/dropdown/dropdown.component.js +5 -6
- package/esm2015/components/statemachines/statemachines-connection-metadata/statemachines-connection-metadata.component.js +16 -3
- package/esm2015/components/statemachines/utils/utils.js +2 -1
- package/esm2015/components/tn-tabview/tn-tabview.component.js +8 -3
- package/esm2015/components/workflow/models/models.js +1 -1
- package/esm2015/components/workflow/services/workflow-permission-detail.service.js +2 -1
- package/esm2015/public-api.js +2 -1
- package/esm2015/services/base.service.js +10 -1
- package/esm2015/services/notifier.service.js +23 -5
- package/esm2015/tnx-shared.js +70 -71
- package/esm2015/tnx-shared.module.js +2 -2
- package/fesm2015/tnx-shared.js +148 -41
- package/fesm2015/tnx-shared.js.map +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
- package/public-api.d.ts.map +1 -1
- package/services/base.service.d.ts +3 -0
- package/services/base.service.d.ts.map +1 -1
- package/services/notifier.service.d.ts +6 -1
- package/services/notifier.service.d.ts.map +1 -1
- package/tnx-shared.d.ts +69 -70
- package/tnx-shared.d.ts.map +1 -1
- package/tnx-shared.metadata.json +1 -1
- package/tnx-shared.module.d.ts +2 -2
- package/tnx-shared.module.d.ts.map +1 -1
|
@@ -9,8 +9,8 @@ import { Subject } from 'rxjs';
|
|
|
9
9
|
import { ContextMenu } from 'tn-custom-primeng/contextmenu';
|
|
10
10
|
import { ComponentContextService } from '../../../app-context/component-context.service';
|
|
11
11
|
import { ComponentBase } from '../../../classes/base/component-base';
|
|
12
|
-
import { KeyFlashShow } from '../../../classes/constants';
|
|
13
|
-
import { AddressControlSchema, AutoCompleteControlSchema, AutoCompletePickerControlSchema, ButtonControlSchema, CheckboxControlSchema, CheckBoxListControlSchema, CoCauToChucControlSchema, CoCauToChucPickerControlSchema, ColorControlSchema, ColorPickerControlSchema, CongViecPickerControlSchema, ContainerSchema, CrudFormSetting, CrudListSetting, CustomControlSchema, DateTimeControlSchema, DateTimeRangeControlSchema, DropdownControlSchema, EditorControlSchema, EntityPickerControlSchema, EventData, FileManagerControlSchema, FileUploadControlSchema, FileUploadMode, KeyValueControlSchema, LabelSchema, MaskControlSchema, NumberRangeControlSchema, Operator, OrganizationPickerControlSchema, PercentControlSchema, PopupSize, RadioButtonListControlSchema, SpanControlSchema, SwitchControlSchema, TableSchema, TemplateControlSchema, TextAreaControlSchema, TextControlSchema, TitleSchema, UserPickerControlSchema, VanBanPickerControlSchema, WrapPickerControlSchema, } from '../../../classes/form-schema';
|
|
12
|
+
import { FormState, KeyFlashShow } from '../../../classes/constants';
|
|
13
|
+
import { AddressControlSchema, AutoCompleteControlSchema, AutoCompletePickerControlSchema, ButtonControlSchema, CheckboxControlSchema, CheckBoxListControlSchema, CoCauToChucControlSchema, CoCauToChucPickerControlSchema, ColorControlSchema, ColorPickerControlSchema, ColumnSchemaBase, CongViecPickerControlSchema, ContainerSchema, CrudFormSetting, CrudListSetting, CustomControlSchema, DateTimeControlSchema, DateTimeRangeControlSchema, DropdownControlSchema, EditorControlSchema, EntityPickerControlSchema, EventData, FileManagerControlSchema, FileUploadControlSchema, FileUploadMode, KeyValueControlSchema, LabelSchema, MaskControlSchema, NumberRangeControlSchema, Operator, OrganizationPickerControlSchema, PercentControlSchema, PopupSize, RadioButtonListControlSchema, SpanControlSchema, SwitchControlSchema, TableSchema, TemplateControlSchema, TextAlign, TextAreaControlSchema, TextControlSchema, TitleSchema, UserPickerControlSchema, VanBanPickerControlSchema, WrapPickerControlSchema, } from '../../../classes/form-schema';
|
|
14
14
|
import { FieldDefineIsTaskFormControl, RegexSplitFieldByItem } from '../../../const/common';
|
|
15
15
|
import { CommonService } from '../../../services/common.service';
|
|
16
16
|
import { CrudService } from '../../../services/crud.service';
|
|
@@ -56,6 +56,7 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
56
56
|
this.formClass = '';
|
|
57
57
|
this.autoFocus = true;
|
|
58
58
|
this.trapFocus = true;
|
|
59
|
+
this.formState = FormState.EDIT;
|
|
59
60
|
this.onFormReady = new EventEmitter();
|
|
60
61
|
this.onControlReady = new EventEmitter();
|
|
61
62
|
this.onAllControlReady = new EventEmitter();
|
|
@@ -123,7 +124,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
123
124
|
try {
|
|
124
125
|
yield control.onChanged(eventData);
|
|
125
126
|
}
|
|
126
|
-
catch (_a) {
|
|
127
|
+
catch (_a) {
|
|
128
|
+
}
|
|
127
129
|
}
|
|
128
130
|
if (!bubble) {
|
|
129
131
|
this.fireModelChanged();
|
|
@@ -1082,6 +1084,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1082
1084
|
return 'congviec';
|
|
1083
1085
|
if (control instanceof PercentControlSchema)
|
|
1084
1086
|
return 'percent';
|
|
1087
|
+
if (control instanceof ColumnSchemaBase)
|
|
1088
|
+
return 'column';
|
|
1085
1089
|
return 'custom';
|
|
1086
1090
|
}
|
|
1087
1091
|
getViewModeDataType(control) {
|
|
@@ -1198,10 +1202,10 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1198
1202
|
});
|
|
1199
1203
|
}
|
|
1200
1204
|
/**
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
+
* Event khi dropdown điều chỉnh value từ raw value dạng guid | int | ... => object kiểu {value: guid | int | ..., ... [1 số trường khác]}
|
|
1206
|
+
* @param control
|
|
1207
|
+
* @param parentPath
|
|
1208
|
+
*/
|
|
1205
1209
|
handleAdjustValueDropdownEvent(control, parentPath) {
|
|
1206
1210
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1207
1211
|
const parentNode = this._rootNode.getNodeByPath(parentPath);
|
|
@@ -1215,7 +1219,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1215
1219
|
try {
|
|
1216
1220
|
yield control.onAdjustedValue(eventData);
|
|
1217
1221
|
}
|
|
1218
|
-
catch (_a) {
|
|
1222
|
+
catch (_a) {
|
|
1223
|
+
}
|
|
1219
1224
|
}
|
|
1220
1225
|
});
|
|
1221
1226
|
}
|
|
@@ -1231,15 +1236,31 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1231
1236
|
currentNode,
|
|
1232
1237
|
eventType: 'dataSourceLoaded',
|
|
1233
1238
|
crudForm: this,
|
|
1234
|
-
data: dataFromDropdown.dataSource
|
|
1239
|
+
data: dataFromDropdown.rawDataSource ? dataFromDropdown.rawDataSource : dataFromDropdown.dataSource
|
|
1235
1240
|
});
|
|
1236
1241
|
eventData['elm'] = dataFromDropdown.elm;
|
|
1242
|
+
if (this.formState == FormState.ADD
|
|
1243
|
+
&& control.autoDisplayFirst
|
|
1244
|
+
&& eventData.data.length > 0) {
|
|
1245
|
+
if (control.multiple) {
|
|
1246
|
+
if (!this._modelData[control.field] || !this._modelData[control.field].length) {
|
|
1247
|
+
this._modelData[control.field] = [eventData.data[0][control.valueField]];
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
else {
|
|
1251
|
+
if (!this._modelData[control.field]) {
|
|
1252
|
+
this._modelData[control.field] = eventData.data[0][control.valueField];
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1237
1256
|
if (control.callbackDataFinish) {
|
|
1238
1257
|
try {
|
|
1239
1258
|
yield control.callbackDataFinish(eventData);
|
|
1240
1259
|
}
|
|
1241
|
-
catch (_a) {
|
|
1260
|
+
catch (_a) {
|
|
1261
|
+
}
|
|
1242
1262
|
}
|
|
1263
|
+
this.fireModelChanged();
|
|
1243
1264
|
});
|
|
1244
1265
|
}
|
|
1245
1266
|
handleReadyControlPicker(control, parentPath) {
|
|
@@ -1256,7 +1277,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1256
1277
|
try {
|
|
1257
1278
|
yield control.onReady(eventData);
|
|
1258
1279
|
}
|
|
1259
|
-
catch (_a) {
|
|
1280
|
+
catch (_a) {
|
|
1281
|
+
}
|
|
1260
1282
|
}
|
|
1261
1283
|
});
|
|
1262
1284
|
}
|
|
@@ -1346,7 +1368,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1346
1368
|
crudForm: this
|
|
1347
1369
|
}));
|
|
1348
1370
|
}
|
|
1349
|
-
catch (_a) {
|
|
1371
|
+
catch (_a) {
|
|
1372
|
+
}
|
|
1350
1373
|
}
|
|
1351
1374
|
}
|
|
1352
1375
|
correctValue(currentNode) {
|
|
@@ -1363,7 +1386,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1363
1386
|
try {
|
|
1364
1387
|
re = corrector.correct(eventData);
|
|
1365
1388
|
}
|
|
1366
|
-
catch (_a) {
|
|
1389
|
+
catch (_a) {
|
|
1390
|
+
}
|
|
1367
1391
|
}
|
|
1368
1392
|
}
|
|
1369
1393
|
return re;
|
|
@@ -1402,7 +1426,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1402
1426
|
}
|
|
1403
1427
|
}
|
|
1404
1428
|
}
|
|
1405
|
-
catch (_a) {
|
|
1429
|
+
catch (_a) {
|
|
1430
|
+
}
|
|
1406
1431
|
}
|
|
1407
1432
|
if (errors.length > 0) {
|
|
1408
1433
|
return false;
|
|
@@ -1478,7 +1503,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1478
1503
|
}
|
|
1479
1504
|
return '';
|
|
1480
1505
|
}
|
|
1481
|
-
getAddressDisplayText(selectedValue) {
|
|
1506
|
+
getAddressDisplayText(selectedValue) {
|
|
1507
|
+
}
|
|
1482
1508
|
getLabelClass(control) {
|
|
1483
1509
|
let result = `label-control`;
|
|
1484
1510
|
if (control.indexLabel) {
|
|
@@ -1641,7 +1667,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1641
1667
|
crudForm: this
|
|
1642
1668
|
}));
|
|
1643
1669
|
}
|
|
1644
|
-
catch (_a) {
|
|
1670
|
+
catch (_a) {
|
|
1671
|
+
}
|
|
1645
1672
|
}
|
|
1646
1673
|
if (control.onDeleted) {
|
|
1647
1674
|
try {
|
|
@@ -1652,7 +1679,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1652
1679
|
crudForm: this
|
|
1653
1680
|
}));
|
|
1654
1681
|
}
|
|
1655
|
-
catch (_b) {
|
|
1682
|
+
catch (_b) {
|
|
1683
|
+
}
|
|
1656
1684
|
}
|
|
1657
1685
|
}
|
|
1658
1686
|
}));
|
|
@@ -1708,7 +1736,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1708
1736
|
crudForm: this
|
|
1709
1737
|
}));
|
|
1710
1738
|
}
|
|
1711
|
-
catch (_b) {
|
|
1739
|
+
catch (_b) {
|
|
1740
|
+
}
|
|
1712
1741
|
}
|
|
1713
1742
|
if (control.onAdded) {
|
|
1714
1743
|
try {
|
|
@@ -1719,7 +1748,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1719
1748
|
crudForm: this
|
|
1720
1749
|
}));
|
|
1721
1750
|
}
|
|
1722
|
-
catch (_c) {
|
|
1751
|
+
catch (_c) {
|
|
1752
|
+
}
|
|
1723
1753
|
}
|
|
1724
1754
|
}
|
|
1725
1755
|
});
|
|
@@ -1776,7 +1806,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1776
1806
|
crudForm: this
|
|
1777
1807
|
}));
|
|
1778
1808
|
}
|
|
1779
|
-
catch (_b) {
|
|
1809
|
+
catch (_b) {
|
|
1810
|
+
}
|
|
1780
1811
|
}
|
|
1781
1812
|
if (control.onAdded) {
|
|
1782
1813
|
try {
|
|
@@ -1787,7 +1818,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1787
1818
|
crudForm: this
|
|
1788
1819
|
}));
|
|
1789
1820
|
}
|
|
1790
|
-
catch (_c) {
|
|
1821
|
+
catch (_c) {
|
|
1822
|
+
}
|
|
1791
1823
|
}
|
|
1792
1824
|
}
|
|
1793
1825
|
}
|
|
@@ -1805,7 +1837,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1805
1837
|
crudForm: this
|
|
1806
1838
|
}));
|
|
1807
1839
|
}
|
|
1808
|
-
catch (_a) {
|
|
1840
|
+
catch (_a) {
|
|
1841
|
+
}
|
|
1809
1842
|
}
|
|
1810
1843
|
}
|
|
1811
1844
|
editRow(index, control, tablePath) {
|
|
@@ -1883,11 +1916,12 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1883
1916
|
crudForm: this
|
|
1884
1917
|
}));
|
|
1885
1918
|
}
|
|
1886
|
-
catch (_a) {
|
|
1919
|
+
catch (_a) {
|
|
1920
|
+
}
|
|
1887
1921
|
}
|
|
1888
1922
|
}
|
|
1889
1923
|
getTableFunctionColumnWidth(control) {
|
|
1890
|
-
let ne =
|
|
1924
|
+
let ne = 50;
|
|
1891
1925
|
if (control.showDelete)
|
|
1892
1926
|
ne += 30;
|
|
1893
1927
|
if (control.showEdit)
|
|
@@ -1903,6 +1937,16 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1903
1937
|
return 'dot_separator.5';
|
|
1904
1938
|
}
|
|
1905
1939
|
}
|
|
1940
|
+
getTextAlign(textAlign) {
|
|
1941
|
+
switch (textAlign) {
|
|
1942
|
+
case TextAlign.Center:
|
|
1943
|
+
return 'center';
|
|
1944
|
+
case TextAlign.Left:
|
|
1945
|
+
return 'left';
|
|
1946
|
+
case TextAlign.Right:
|
|
1947
|
+
return 'right';
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1906
1950
|
checkDisabled(data, control) {
|
|
1907
1951
|
return data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled);
|
|
1908
1952
|
}
|
|
@@ -1945,7 +1989,8 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1945
1989
|
});
|
|
1946
1990
|
}
|
|
1947
1991
|
}
|
|
1948
|
-
onFocusTextControl(evt) {
|
|
1992
|
+
onFocusTextControl(evt) {
|
|
1993
|
+
}
|
|
1949
1994
|
onSettings(event) {
|
|
1950
1995
|
}
|
|
1951
1996
|
onTableSchemaOldest(evt) {
|
|
@@ -1974,7 +2019,7 @@ export class CrudFormComponent extends ComponentBase {
|
|
|
1974
2019
|
CrudFormComponent.decorators = [
|
|
1975
2020
|
{ type: Component, args: [{
|
|
1976
2021
|
selector: 'crud-form',
|
|
1977
|
-
template: "<div [class]=\"_styleClass\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText\r\n [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText [type]=\"control.dataFormat\"\r\n [(ngModel)]=\"data[control.field]\" [max]=\"control.max\" [min]=\"control.min\"\r\n [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\"\r\n [(ngModel)]=\"data[control.field]\" (onFocus)=\"onFocusTextControl($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\r\n [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (focus)=\"onFocusTextControl($event)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\r\n [(ngModel)]=\"data[control.field]\" (focus)=\"onFocusTextControl($event)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea (focus)=\"onFocusTextControl($event)\" [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce *ngIf=\"!checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\" [languageCode]=\"control.languageCode\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\r\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\r\n [readonly]=\"control.disabled\" [layout]=\"control.layout\" [maxFileSize]=\"control.maxFileSize\"\r\n [inTaiLieu]=\"control.inTaiLieu\" [inTaiLieuChung]=\"control.inTaiLieuChung\"\r\n [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\" (onSelected)=\"control.onSelected($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\" [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" binary=\"true\">\r\n </p-checkbox>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\" [readOnly]=\"control.readOnly\"\r\n [loaiVanBan]=\"control.loaiVanBan\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percent'\">\r\n <div>\r\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\" [min]=\"0\" [max]=\"100\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onSlideEnd)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-slider>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\" [responsive]=\"true\"\r\n class=\"new-table scr-table table-control\" [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n [style.width]=\"subControl.width\" style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\"\r\n [style.width]=\"getTableFunctionColumnWidth(control)\"\r\n class=\"table-function column-function\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td style=\"text-align:center\" *ngIf=\"control.showFunction\" class=\"column-function\">\r\n <div class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-save\"\r\n [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-pencil\"\r\n [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton class=\"p-button-text p-button-danger\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n <!-- <button *ngFor=\"let bt of control.rowButtons\" type=\"button\" pButton\r\n [class]=\"bt.class\" [icon]=\"bt.icon\" [pTooltip]=\"bt.label | translate\"\r\n tooltipPosition=\"top\" style=\"width: 2.143em;\"\r\n (click)=\"messageRow(ri, control, path)\"></button> -->\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\" [ngTemplateOutletContext]=\"{\r\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #templateCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>",
|
|
2022
|
+
template: "<div [class]=\"_styleClass\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText\r\n [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\"/>\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText\r\n [type]=\"control.dataFormat\"\r\n [(ngModel)]=\"data[control.field]\" [max]=\"control.max\" [min]=\"control.min\"\r\n [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\"/>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\"\r\n [(ngModel)]=\"data[control.field]\" (onFocus)=\"onFocusTextControl($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\r\n [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (focus)=\"onFocusTextControl($event)\"/>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\r\n [(ngModel)]=\"data[control.field]\" (focus)=\"onFocusTextControl($event)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"/>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea (focus)=\"onFocusTextControl($event)\" [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce *ngIf=\"!checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\" [languageCode]=\"control.languageCode\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\r\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\r\n [readonly]=\"control.disabled\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [inTaiLieu]=\"control.inTaiLieu\" [inTaiLieuChung]=\"control.inTaiLieuChung\"\r\n [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\" (onSelected)=\"control.onSelected($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\" [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n binary=\"true\">\r\n </p-checkbox>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\"\r\n [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n [readOnly]=\"control.readOnly\"\r\n [loaiVanBan]=\"control.loaiVanBan\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percent'\">\r\n <div>\r\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\" [min]=\"0\" [max]=\"100\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onSlideEnd)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-slider>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table class=\"new-table scr-table table-control\"\r\n [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\" [responsive]=\"true\"\r\n [scrollable]=\"false\"\r\n [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 5%\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n style=\"text-align: center;\">\r\n <!-- [style.width]=\"subControl.width\" -->\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\" style=\"width: 30px\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\"\r\n [style.width]=\"'15%'\"\r\n class=\"table-function column-function\">\r\n <span style=\"text-align: center\">Ch\u1EE9c n\u0103ng</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td class=\"stt\" style=\"text-align: center; vertical-align: inherit\">\r\n <span>\r\n {{ri + 1}}\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\"\r\n [ngStyle]=\"{'text-align': getTextAlign(subControl.textAlign), 'vertical-align': 'inherit'}\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-template [ngIf]=\"getControlType(subControl) != 'column'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template [ngIf]=\"getControlType(subControl) == 'column'\">\r\n <span>{{_modelData[control.field][ri][subControl.field]}}</span>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td style=\"text-align: center\"\r\n *ngIf=\"control.showFunction\"\r\n class=\"column-function text-center\">\r\n <div\r\n *ngIf=\"!control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <button\r\n *ngIf=\"control.showSave\"\r\n [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-save\"\r\n [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\"\r\n (click)=\"saveRow(ri, control, path)\"></button>\r\n <button\r\n *ngIf=\"control.showEdit\"\r\n [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-pencil\"\r\n [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\"\r\n (click)=\"editRow(ri, control, path)\"></button>\r\n <button\r\n *ngIf=\"control.showDelete\"\r\n [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton class=\"p-button-text p-button-danger\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\"\r\n tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\"\r\n (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button\r\n *ngIf=\"control.rowButtons\"\r\n type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n <!-- <button *ngFor=\"let bt of control.rowButtons\" type=\"button\" pButton\r\n [class]=\"bt.class\" [icon]=\"bt.icon\" [pTooltip]=\"bt.label | translate\"\r\n tooltipPosition=\"top\" style=\"width: 2.143em;\"\r\n (click)=\"messageRow(ri, control, path)\"></button> -->\r\n </div>\r\n <div\r\n *ngIf=\"control.rowButtonTemplate != null\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"control.rowButtonTemplate\"\r\n [ngTemplateOutletContext]=\"{rowData: _modelData[control.field][ri], rowIndex: ri, path: path}\"></ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.summaryTemplate\" pTemplate=\"summary\" let-rowData>\r\n <ng-container\r\n *ngTemplateOutlet=\"control.summaryTemplate; context: {rowData: rowData}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span *ngIf=\"control.showDialog\" style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\" [ngTemplateOutletContext]=\"{\r\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #templateCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>\r\n",
|
|
1978
2023
|
providers: [ComponentContextService],
|
|
1979
2024
|
styles: [".label-only{font-weight:700;margin-bottom:1em}div.label{position:relative}div.label .star-required{color:red;padding-left:.2em;padding-top:.3em;position:absolute}div.type-container.not-show-in-box-holder{padding:0}.--table-schema-footer{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;color:#495057;display:flex;font-weight:600;padding:.5em}.show-in-box{border:1px solid #ced4da;border-radius:5px}.not-show-in-box{padding:0}.view-mode div.label{padding-bottom:3px}.view-mode div.label label{font-size:.85em;font-weight:700}.view-mode>span:not(:empty){display:inline-block;padding:5px 0;width:100%}.view-mode.type-table div.label+div{padding:5px 0}td>.view-mode{display:inline-block;padding:.25rem .5rem}td>.view-mode .view-mode{padding:0}.crud-form-control div[role=checkbox-alone]{margin-top:24px}.crud-form-control div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control .label+div[role=checkbox-alone]{margin-top:11px}.crud-form-control.type-table div[role=checkbox-alone]{margin-top:6px;text-align:center}.crud-form-control.type-table div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control.type-table div[role=checkbox-alone].align-left{text-align:left}.crud-form-control.type-title{border-bottom:1px solid #cfcfcf;color:#025ba7;font-size:1.2rem;font-weight:700;padding:10px 0 10px 5px;text-transform:uppercase}.crud-form-control.type-title>.label{margin-bottom:0}.control-description{color:#6c757d;font-size:.8rem;margin-bottom:5px;margin-left:10px}::ng-deep .crud-form-control .tn-check-box-list{margin-top:5px}::ng-deep .crud-form-control>div.label{font-size:.9em;height:1.15em;margin-bottom:5px}::ng-deep .crud-form-control>div.label+*{width:100%}::ng-deep .crud-form-control>.error-container .error-item{-webkit-animation:shrink .1s;animation:shrink .1s;min-height:20px;overflow:visible;padding-top:5px}::ng-deep .crud-form-control>.error-container .error-item .error-content{-webkit-animation:fadeIn .1s;animation:fadeIn .1s;color:red;display:flex;font-size:.9em;position:relative}::ng-deep .crud-form-control>.error-container .error-item .error-content i{display:flex;font-size:.9em;padding-top:1px}::ng-deep .crud-form-control>.error-container .error-item .error-content span{display:flex;padding-left:5px}::ng-deep .crud-form-control.no-label>div.label{display:none}::ng-deep .crud-form-control.error .p-dropdown,::ng-deep .crud-form-control.error .p-inputtext,::ng-deep .crud-form-control.error .p-multiselect,::ng-deep .crud-form-control.error .tn-dropdown,::ng-deep .crud-form-control.error input,::ng-deep .crud-form-control.error select,::ng-deep .crud-form-control.error textarea{border-color:#ff5722!important}::ng-deep .crud-form-control.error .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error .p-inputtext:enabled:focus,::ng-deep .crud-form-control.error .tn-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 0 .2rem #ffc4b3}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-multiselect,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .tn-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) input,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) select,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) textarea{border-color:#ced4da!important}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown.tn-dropdown.p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa}@-webkit-keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@-webkit-keyframes shrink{0%{height:0}to{height:20px}}@keyframes shrink{0%{height:0}to{height:20px}}@media screen and (min-width:40.063em){.label-right{padding-left:2em}}::ng-deep crud-form .crud-form-container{padding:.5rem .5rem 0}::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside,::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside .show-in-box:not(.crud-form-control),::ng-deep crud-form base-congviec-form crud-form>.crud-form-container{padding:0}:host ::ng-deep .tox-tinymce{border:none;border-top:1px solid #ccc;overflow:unset}:host ::ng-deep .tox-tinymce .tox-editor-container{overflow:unset}:host ::ng-deep .tox-tinymce .tox-toolbar{border:1px solid #ccc;border-bottom:none}:host ::ng-deep .tox-tinymce .tox-edit-area{border:1px solid #ccc}:host ::ng-deep .tox-tinymce .tox-edit-area iframe{box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}:host ::ng-deep .tox-tinymce .tox-menubar{border:1px solid #ccc}:host ::ng-deep .tox .tox-edit-area.tinymce-focus{border:1px solid #66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 3px 0 #66afe9;transition:box-shadow .3s,border-color .3s;transition-delay:0s,0s;transition-duration:.3s,.3s;transition-property:box-shadow,border-color;transition-timing-function:ease,ease}:host ::ng-deep .rq .tox .tox-edit-area{border-left-color:#ff4c46}.no-value{font-size:.8em}:host ::ng-deep .table-schema-paging{display:block;margin-bottom:40px}"]
|
|
1980
2025
|
},] }
|
|
@@ -2007,6 +2052,7 @@ CrudFormComponent.propDecorators = {
|
|
|
2007
2052
|
autoFocus: [{ type: Input }],
|
|
2008
2053
|
trapFocus: [{ type: Input }],
|
|
2009
2054
|
data: [{ type: Input }],
|
|
2055
|
+
formState: [{ type: Input }],
|
|
2010
2056
|
onFormReady: [{ type: Output }],
|
|
2011
2057
|
onControlReady: [{ type: Output }],
|
|
2012
2058
|
onAllControlReady: [{ type: Output }],
|
|
@@ -2221,4 +2267,4 @@ export class ControlTreeNode {
|
|
|
2221
2267
|
}
|
|
2222
2268
|
}
|
|
2223
2269
|
}
|
|
2224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDWSxTQUFTLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFDNUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUNwRCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQ0gsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLDhCQUE4QixFQUM5QixrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLDJCQUEyQixFQUMzQixl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QyxDQUFDO1NBQ25EO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQWMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4RSxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0ICogYXMgalF1ZXJ5XyBmcm9tICdqcXVlcnknO1xyXG5pbXBvcnQgKiBhcyBuYW5vaWRfIGZyb20gJ25hbm9pZCc7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBwLWNvbnRleHQvY29tcG9uZW50LWNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Jhc2UvY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBLZXlGbGFzaFNob3cgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7XHJcbiAgICBBZGRyZXNzQ29udHJvbFNjaGVtYSxcclxuICAgIEF1dG9Db21wbGV0ZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgQnV0dG9uQ29udHJvbFNjaGVtYSxcclxuICAgIENoZWNrYm94Q29udHJvbFNjaGVtYSxcclxuICAgIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEsXHJcbiAgICBDb0NhdVRvQ2h1Y0NvbnRyb2xTY2hlbWEsXHJcbiAgICBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb2xvckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb2xvclBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb250YWluZXJTY2hlbWEsXHJcbiAgICBDcnVkRm9ybVNldHRpbmcsXHJcbiAgICBDcnVkTGlzdFNldHRpbmcsXHJcbiAgICBDdXN0b21Db250cm9sU2NoZW1hLFxyXG4gICAgRGF0ZVRpbWVDb250cm9sU2NoZW1hLFxyXG4gICAgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBEcm9wZG93bkNvbnRyb2xTY2hlbWEsXHJcbiAgICBFZGl0b3JDb250cm9sU2NoZW1hLFxyXG4gICAgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEV2ZW50RGF0YSxcclxuICAgIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hLFxyXG4gICAgRmlsZVVwbG9hZE1vZGUsXHJcbiAgICBGb3JtQ29udHJvbEJhc2UsXHJcbiAgICBGb3JtQ29udHJvbEJhc2VXaXRoU2VydmljZSxcclxuICAgIEZvcm1TY2hlbWFCYXNlLFxyXG4gICAgS2V5VmFsdWVDb250cm9sU2NoZW1hLFxyXG4gICAgTGFiZWxTY2hlbWEsXHJcbiAgICBNYXNrQ29udHJvbFNjaGVtYSxcclxuICAgIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSxcclxuICAgIE9wZXJhdG9yLFxyXG4gICAgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIFBlcmNlbnRDb250cm9sU2NoZW1hLFxyXG4gICAgUG9wdXBTaXplLFxyXG4gICAgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSxcclxuICAgIFNwYW5Db250cm9sU2NoZW1hLFxyXG4gICAgU3dpdGNoQ29udHJvbFNjaGVtYSxcclxuICAgIFRhYmxlU2NoZW1hLFxyXG4gICAgVGVtcGxhdGVDb250cm9sU2NoZW1hLFxyXG4gICAgVGV4dEFyZWFDb250cm9sU2NoZW1hLFxyXG4gICAgVGV4dENvbnRyb2xTY2hlbWEsXHJcbiAgICBUaXRsZVNjaGVtYSxcclxuICAgIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIFdyYXBQaWNrZXJDb250cm9sU2NoZW1hLFxyXG59IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9jb25zdC9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NydWQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktcGlja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXN0ZXJEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21hc3Rlci1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERyb3Bkb3duU2VydmljZSB9IGZyb20gJy4uLy4uL2Ryb3Bkb3duL3NlcnZpY2VzL2Ryb3Bkb3duLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBiYXNlVHJpbmhLeSwgZ2V0UmVnZXhSZXN1bHQsIGdldFN0cmluZ0Rpc3BsYXlWYWx1ZSwgbG9vcEN1cnNvckZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBHbWFpbENvcnJlY3RvciwgTG93ZXJDb3JyZWN0b3IgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb3JyZWN0b3JzJztcclxuaW1wb3J0IHsgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IsIENoZWNrRHVwbGljYXRlVmFsaWRhdG9yLCBDb21wYXJlVmFsaWRhdG9yLCBEYXRlQ29tcGFyZVZhbGlkYXRvciwgRW1haWxWYWxpZGF0b3IsIE51bWJlckNvbXBhcmVWYWxpZGF0b3IsIE51bWJlck9ubHlWYWxpZGF0b3IsIFBob25lTnVtYmVyVmFsaWRhdG9yLCBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvciwgUmVxdWlyZWRWYWxpZGF0b3IsIFNhbWVWYWx1ZVZhbGlkYXRvciB9IGZyb20gJy4vLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL3ZhbGlkYXRvcnMnO1xyXG5pbXBvcnQgeyBpc0FycmF5LCBpc0xpdGVyYWxPYmplY3QsIG1lcmdlSlNPTiwgbWVyZ2VKU09OT2xkIH0gZnJvbSAnLi8uLi8uLi8uLi9jbGFzc2VzL2Vudmlyb25tZW50LXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4vLi4vLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5cclxuLy8gZml4IGZvciBidWlsZCBwcm9kXHJcbmNvbnN0IG5hbm9pZCA9IG5hbm9pZF87XHJcbmNvbnN0IGpRdWVyeSA9IGpRdWVyeV87XHJcblxyXG5kZWNsYXJlIHZhciB0aW55bWNlOiBhbnk7XHJcblxyXG5jb25zdCBvcGVyYXRvckNvbnRyYXN0ID0ge1xyXG4gICAgW09wZXJhdG9yLmdyZWF0ZXJdOiBPcGVyYXRvci5sb3dlcixcclxuICAgIFtPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXTogT3BlcmF0b3IubG93ZXJUaGFuRXF1YWwsXHJcbiAgICBbT3BlcmF0b3IubG93ZXJdOiBPcGVyYXRvci5ncmVhdGVyLFxyXG4gICAgW09wZXJhdG9yLmxvd2VyVGhhbkVxdWFsXTogT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbFxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NydWQtZm9ybScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NydWQtZm9ybS5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbQ29tcG9uZW50Q29udGV4dFNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcnVkRm9ybUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgICBAVmlld0NoaWxkKCdmb3JtRWxlbWVudCcpIGZvcm1FbGVtZW50OiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnUnLCB7IHN0YXRpYzogZmFsc2UgfSkgY29udGV4dE1lbnU6IENvbnRleHRNZW51O1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZVJlZikgY2hpbGRyZW46IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlQ29uZ1ZpZWNGb3JtJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCB0ZW1wbGF0ZUNvbmdWaWVjRm9ybSh2YWx1ZTogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVzW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dCgpIHNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcclxuICAgIEBJbnB1dCgpIGNvbnRleHQ6IENvbXBvbmVudENvbnRleHRTZXJ2aWNlO1xyXG5cclxuICAgIEBJbnB1dCgpIGZpbGVzVXBsb2FkZWQgPSBbXTtcclxuICAgIEBJbnB1dCgpIGlzVmlld01vZGUgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVLZXlwcmVzc0NvbnRyb2wgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVDYWNoaW5nID0gZmFsc2U7XHJcbiAgICBfc3R5bGVDbGFzcyA9ICdwLWZsdWlkIGNydWQtZm9ybS1jb250YWluZXInO1xyXG4gICAgQElucHV0KCkgc2V0IHN0eWxlQ2xhc3ModmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCBjcnVkLWZvcm0tY29udGFpbmVyJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZUNsYXNzICs9IGAgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEBJbnB1dCgpIGZvcm1JZCA9ICcnO1xyXG4gICAgQElucHV0KCkgZm9ybUNsYXNzID0gJyc7XHJcbiAgICBASW5wdXQoKSBhdXRvRm9jdXMgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgdHJhcEZvY3VzID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHNldCBkYXRhKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmNhblByaW50ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX21pbmltaXplZERhdGEgIT0gdmFsdWUgJiYgaXNMaXRlcmFsT2JqZWN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tb2RlbERhdGEgPSBtZXJnZUpTT04odGhpcy5fbW9kZWxEYXRhLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYW4oKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnbW9kZWxDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2VkLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEodGhpcy5fbW9kZWxEYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWREYXRhRWRpdE9sZCAmJiB0aGlzLmxvYWRlZERhdGFFZGl0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhblByaW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDYW5QcmludCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlLnNldENydWRGb3JtKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ21vZGVsQ2hhbmdlZCcsXHJcbiAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlZC5lbWl0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIEBPdXRwdXQoKSBvbkZvcm1SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ29udHJvbFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BbGxDb250cm9sUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbk1vZGVsQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPEV2ZW50RGF0YT4gPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50RGF0YT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkFmdGVyVHJpbmhLeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIF9yb290Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xyXG4gICAgX21pbmltaXplZERhdGE6IGFueTtcclxuICAgIF9tb2RlbERhdGE6IGFueSA9IHt9O1xyXG4gICAgX3Vuc3Vic2NyaWJlQWxsID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgX2luVmFsaWRGb3JtID0gZmFsc2U7XHJcblxyXG4gICAgLy8gRG9jIHR1IGNhdSBoaW5oIHRoYW0gc28gaGUgdGhvbmdcclxuICAgIGxpbWl0U2l6ZSA9IDA7XHJcbiAgICBmb3JtQ29udHJvbHM6IGFueSA9IFtdO1xyXG4gICAgZnVuY0NoZWNrVW5pcXVlRmllbGQ6IGFueSA9IHt9O1xyXG4gICAgYmVmb3JlRGF0YTogYW55ID0ge307XHJcbiAgICBmaXJzdERpdkhvbGRlcjogYW55O1xyXG4gICAgY2FjaGVkVmFsdWVzID0ge307XHJcbiAgICB0ZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogVGVtcGxhdGVSZWY8YW55PiB9ID0ge307XHJcbiAgICBfcHJlZml4Q3VzdG9tSGVhZGVyID0gJ2N1c3RvbUhlYWRlcl8nO1xyXG4gICAgY29uZ1ZpZWNTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmc7XHJcblxyXG4gICAgbG9hZGVkRGF0YUVkaXRPbGQgPSBmYWxzZTtcclxuICAgIGxvYWRlZERhdGFFZGl0ID0gZmFsc2U7XHJcbiAgICBjYW5QcmludCA9IGZhbHNlO1xyXG5cclxuICAgIHRhYmxlRm9ybVNob3cgPSBmYWxzZTtcclxuICAgIHRhYmxlRm9ybVRpdGxlOiBzdHJpbmc7XHJcbiAgICB0YWJsZUZvcm1Qb3B1cFNpemUgPSBuZXcgUG9wdXBTaXplKHsgd2lkdGg6IDExMDAsIGhlaWdodDogNjUwIH0pO1xyXG4gICAgdGFibGVGb3JtRGF0YTogYW55ID0ge307XHJcbiAgICB0YWJsZUZvcm1DdXJyZW50Um93OiBudW1iZXI7XHJcbiAgICB0YWJsZUZvcm1TY2hlbWE6IEZvcm1TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgIHRhYmxlRm9ybUN1cnJlbnRJbmZvOiBhbnkgPSB7fTtcclxuXHJcbiAgICBidXR0b25Db250ZXh0czogTWVudUl0ZW1bXSA9IFtdO1xyXG4gICAgcm93RGF0YUN1cnJlbnQ6IGFueSA9IHt9O1xyXG4gICAgY29udHJvbE5lZWRDaGVja1JlYWR5OiBGb3JtU2NoZW1hQmFzZVtdID0gW107XHJcbiAgICByZWFkeVN0YXR1czogYW55ID0ge307XHJcbiAgICBmaWVsZFBhcmVudEZpZWxkID0gJ3BhcmVudEZpZWxkJztcclxuICAgIHdhaXRSZWFkeUFuZFByaW50VGltZW91dDogYW55O1xyXG4gICAgcHVibGljIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcclxuICAgIHB1YmxpYyBfbWFzdGVyRGF0YVNlcnZpY2U6IE1hc3RlckRhdGFTZXJ2aWNlO1xyXG4gICAgcHVibGljIF91c2VyU2VydmljZTogVXNlclNlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHVibGljIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9kZXZpY2VEZXRlY3RvclNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9kcm9wZG93blNlcnZpY2U6IERyb3Bkb3duU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgIHB1YmxpYyBfZW50aXR5UGlja2VyU2VydmljZTogRW50aXR5UGlja2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9tb2R1bGVDb25maWc6IE1vZHVsZUNvbmZpZ1NlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChOb3RpZmllclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX21hc3RlckRhdGFTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KE1hc3RlckRhdGFTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl91c2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChVc2VyU2VydmljZSk7XHJcblxyXG4gICAgICAgIC8vIEdldCBDb25maWd1cmF0aW9uU3lzdGVtXHJcbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UuZ2V0Q29uZmlnQnlDb2RlKCdTaXplT2ZGaWxlJykudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saW1pdFNpemUgPSBOdW1iZXIocmVzcG9uc2UpICogMTAwMCAqIDEwMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5oaWRkZW5UcmluaEt5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgIG5ldyBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdwcmludEZpbGVJZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdGaWxlJyxcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBGaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAobW9kZWwsIGN1cnJlbnROb2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbW9kZWwucHJpbnRGaWxlSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdExvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2hWaWV3TW9kZShyZWFkb25seVZpZXcgPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZpZXdNb2RlID0gcmVhZG9ubHlWaWV3O1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoY29udHJvbCwgdGhpcy5pc1ZpZXdNb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKCkge1xyXG4gICAgICAgIHRoaXMuaW5pdExvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhbigpIHtcclxuICAgICAgICB0aGlzLmNsZWFuTW9kZWwodGhpcy5fbW9kZWxEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsZWFuTW9kZWwobW9kZWwpIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnX3N0YXR1cycpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgaW4gbW9kZWxba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFtrZXldW3NdID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gJ19lcnJvcnMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxba2V5XVtzXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5Nb2RlbChtb2RlbFtrZXldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5Nb2RlbChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1pbmltaXplRGF0YShtb2RlbCkge1xyXG4gICAgICAgIGlmIChpc0xpdGVyYWxPYmplY3QobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGlmIChtb2RlbC5fZHJvcGRvd252YWx1ZSAhPSBudWxsICYmIG1vZGVsLl9kcm9wZG93bnZhbHVlICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW21vZGVsLl9kcm9wZG93bnZhbHVlXSB8fCBtb2RlbFsndmFsdWUnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSAnX3N0YXR1cycgJiYga2V5ICE9ICdfZXJyb3JzJyAmJiBrZXkgIT0gJ19zb3VyY2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE1pbmltaXplRGF0YShtb2RlbFtrZXldKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuZ2V0TWluaW1pemVEYXRhKGl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TG9hZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5zY2hlbWEpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnZm9ybVJlYWR5JyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybVJlYWR5LmVtaXQoZm9ybUV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNjaGVtYSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSB0aGlzLmFwcGx5Q2FjaGVkVmFsdWVzKCk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdmb3JtUmVhZHknLFxyXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdChmb3JtRXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNjaGVtYSgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3Rvcihjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XHJcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBjb250cm9sLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcclxuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWRkTW9yZSA9IGNvbnRyb2wuaW5pdFJvd0NvdW50IC0gcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdGjhu7FjIGhp4buHbiBzYXUgY8O5bmcga2hpIHThuqV0IGPhuqMgbW9kZWwgxJHDoyBpbml0IHhvbmdcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTXVsdGlSb3coY29udHJvbCwgYWRkTW9yZSwgX3BhcmVudFBhdGgsICdpbml0Jyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIC8vIGlmICghcGFyZW50TW9kZWwuaGFzT3duUHJvcGVydHkoY29udHJvbC5maWVsZCkgJiYgY29udHJvbC5maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgIC8vICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIC8vICAgICAvLyB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb250cm9sRGVmYXVsdFZhbHVlRnJvbUV4dGVybmFsKCkge1xyXG4gICAgICAgIC8vIGNvbnN0IHNjaGVtYUR5bmFtaWNzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZSh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICAvLyBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEN1c3RvbUNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgLy8gICAgICYmIHRoaXMuY2hlY2tJc0R5bmFtaWNDb250cm9sKGNvbnRyb2wpXHJcbiAgICAgICAgICAgIC8vICkge1xyXG4gICAgICAgICAgICAvLyAgICAgc2NoZW1hRHluYW1pY3MucHVzaChjb250cm9sKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBU4bqhbSB0aOG7nWkgayByZW5kZXIgbHXDtG4gdMOqbiBjw7RuZyB2aeG7h2MgdHJvbmcgZm9ybSBpbml0LCB2w6wgxJFhbmcgayBraeG7g20gc2/DoXQgZGMga2hpIG7DoG8gdOG6pXQgY+G6oyBjb250cm9sIHJlYWR5XHJcbiAgICAgICAgLy8gc2NoZW1hRHluYW1pY3MuZm9yRWFjaChzY2hlbWEgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnJlbmRlclRlbkNvbmdWaWVjKHRoaXMuX21vZGVsRGF0YSwgc2NoZW1hKTtcclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDb250cm9sRGVmYXVsdFZhbHVlKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBjb250cm9sLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcclxuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWRkTW9yZSA9IGNvbnRyb2wuaW5pdFJvd0NvdW50IC0gcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZShwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsLmhhc093blByb3BlcnR5KGNvbnRyb2wuZmllbGQpICYmIGNvbnRyb2wuZmllbGQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBjb250cm9sLmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbC5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbFswXS52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgZmllbGQpIHtcclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zb3VyY2UpIHBhcmVudE1vZGVsLl9zb3VyY2UgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fc3RhdHVzKSBwYXJlbnRNb2RlbC5fc3RhdHVzID0ge307XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fZXJyb3JzKSBwYXJlbnRNb2RlbC5fZXJyb3JzID0ge307XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3N0YXR1c1tmaWVsZF0pIHBhcmVudE1vZGVsLl9zdGF0dXNbZmllbGRdID0ge307XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fZXJyb3JzW2ZpZWxkXSkgcGFyZW50TW9kZWwuX2Vycm9yc1tmaWVsZF0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDb250cm9sU2NoZW1hKHNjaGVtYTogRm9ybVNjaGVtYUJhc2UsIHBhcmVudElkPykge1xyXG4gICAgICAgIGlmIChzY2hlbWEuZGlzYWJsZWQgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc1ZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY2hlbWEubGFiZWwgJiYgIXNjaGVtYS5mdWxsTGFiZWwpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmZ1bGxMYWJlbCA9IHNjaGVtYS5sYWJlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYVxyXG4gICAgICAgICAgICB8fCBzY2hlbWEgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzY2hlbWEuc2hvd0xhYmVsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghc2NoZW1hLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWEuZmllbGQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYS5maWVsZCkge1xyXG4gICAgICAgICAgICBsZXQga2V5ID0gc2NoZW1hLmZpZWxkO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50SWQgIT0gbnVsbCkga2V5ID0gcGFyZW50SWQgKyAnLicgKyBrZXk7XHJcbiAgICAgICAgICAgIHNjaGVtYS51bmlxdWVGaWVsZCA9IGtleTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbHNba2V5XSA9IHNjaGVtYTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjaGVtYVsnY29udHJvbFR5cGUnXSA9IHRoaXMuZ2V0Q29udHJvbFR5cGUoc2NoZW1hKTtcclxuICAgICAgICBzY2hlbWFbJ2RhdGFUeXBlJ10gPSB0aGlzLmdldFZpZXdNb2RlRGF0YVR5cGUoc2NoZW1hKTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgc3ViQ29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdID0gY29udHJvbC51bmlxdWVGaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgc2NoZW1hLnVuaXF1ZUZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZHJvcGRvd25Db250cm9sU2NoZW1hID0gPERyb3Bkb3duQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5yZXR1cm5UeXBlID0gJ29iamVjdCc7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCFkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5sb2FkT25Jbml0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5maWx0ZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyUGlja2VyQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICB1c2VyUGlja2VyQ29udHJvbFNjaGVtYS5yZXR1cm5UeXBlID0gJ29iamVjdCc7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHN1YkNvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXSA9IGNvbnRyb2wudW5pcXVlRmllbGQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGNvbnRyb2wudW5pcXVlRmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlQ29udHJvbFNjaGVtYSA9IDxBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlQ29udHJvbFNjaGVtYS5yZXR1cm5UeXBlID0gJ29iamVjdCc7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQWRkcmVzc0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ3VzdG9tQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja0lzVGFza0NvbnRyb2woc2NoZW1hKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25nVmllY1NldHRpbmcgPSBuZXcgQ3J1ZExpc3RTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmdWaWVjU2V0dGluZy5pc1dvcmtmbG93VHJlZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWEuZGF0YS5maWVsZFBhcmVudEZvclRhc2tzID0gW107XHJcbiAgICAgICAgICAgICAgICBsb29wQ3Vyc29yRnVuY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UmVnZXhSZXN1bHQoc2NoZW1hLmRhdGEuX190ZW1wbGF0ZVRhc2tOYW1lLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0sIGV4ZWNSZXN1bHQgPT4gZXhlY1Jlc3VsdFsxXSksXHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEuZGF0YS5maWVsZFBhcmVudEZvclRhc2tzLnB1c2goZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFDaGlsZCA9IHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hQ2hpbGQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNb3JlT25DaGFuZ2VFdmVudChzY2hlbWFDaGlsZCwgKGV2dDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUZW5Db25nVmllYyhldnQucm9vdE1vZGVsLCBzY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGlzYWJsZUNvbnRyb2xTY2hlbWEoc2NoZW1hOiBGb3JtU2NoZW1hQmFzZSwgZGlzYWJsZWQgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmRpc2FibGVkID0gZGlzYWJsZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgZGlzYWJsZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGRpc2FibGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrSXNUYXNrQ29udHJvbChzY2hlbWEpIHtcclxuICAgICAgICByZXR1cm4gc2NoZW1hLmZpZWxkID09IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xcclxuICAgICAgICAgICAgJiYgc2NoZW1hLmRhdGFcclxuICAgICAgICAgICAgJiYgc2NoZW1hLmRhdGEuX190ZW1wbGF0ZVRhc2tOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclRlbkNvbmdWaWVjKG1vZGVsOiBhbnksIHNjaGVtYTogQ3VzdG9tQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgIGxldCB0ZW1wbGF0ZVRleHQgPSBzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWU7XHJcbiAgICAgICAgc2NoZW1hLmRhdGEuZmllbGRQYXJlbnRGb3JUYXNrcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgdGVtcGxhdGVUZXh0ID0gdGVtcGxhdGVUZXh0LnJlcGxhY2UoYHt7aXRlbS4ke2ZpZWxkfX19YCwgZ2V0U3RyaW5nRGlzcGxheVZhbHVlKG1vZGVsW2ZpZWxkXSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNjaGVtYS5kYXRhLnRlbkNvbmdWaWVjID0gdGVtcGxhdGVUZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHNjaGVtYTogYW55KSB7XHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duKGRyb3Bkb3duQ29udHJvbFNjaGVtYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWE6IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICBsZXQgdG1wRmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgIHRtcEZpbHRlcnMgPSBkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiAoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRtcEZpbHRlcnMgPSBkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRtcEZpbHRlcnMgPSBhd2FpdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRtcEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zZXR0aW5nLnNjaGVtYS5maW5kKHEgPT4gcS5maWVsZCA9PSBzb3VyY2VGaWVsZCk7XHJcbiAgICAgICAgICAgIGlmICghZmlsdGVyLnN1YkZpZWxkXHJcbiAgICAgICAgICAgICAgICAmJiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hIHx8IHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIuc3ViRmllbGQgPSBzY2hlbWEudmFsdWVGaWVsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IG1hcmtlZENvbnRyb2wgPSB7fTtcclxuICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoZHJvcGRvd25Db250cm9sU2NoZW1hLCB0bXBGaWx0ZXJzLCBtYXJrZWRDb250cm9sKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93bjogRHJvcGRvd25Db250cm9sU2NoZW1hIHwgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSwgdG1wRmlsdGVyczogRmlsdGVyW10sIG1hcmtlZENvbnRyb2wpIHtcclxuICAgICAgICBpZiAodG1wRmlsdGVycyBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRtcEZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpZWxkID0gZmlsdGVyLnNvdXJjZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RHJvcGRvd24gPSB0aGlzLmZvcm1Db250cm9sc1tzb3VyY2VGaWVsZF07XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50RHJvcGRvd24gJiYgIW1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFya2VkQ29udHJvbFtzb3VyY2VGaWVsZF0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZU9uQ2hhbmdlRXZlbnQocGFyZW50RHJvcGRvd24sIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmVlZEdldERhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLmFsbG93TG9hZERhdGFXaGVuUGFyZW50TnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LmV2ZW50VHlwZSA9PSAnYWRqdXN0VmFsdWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEdldERhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQudmFsdWUgPT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LnZhbHVlID09ICcnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGV2ZW50LnZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgZXZlbnQudmFsdWUubGVuZ3RoID09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQucmVzZXRDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEdldERhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRHZXREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2NydWRTZXJ2aWNlLmdldEZpbHRlckZyb21UZW1wbGF0ZSh0bXBGaWx0ZXJzLCBldmVudC5wYXJlbnRNb2RlbCwgZXZlbnQucm9vdE1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghKHBhcmVudERyb3Bkb3duIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyZW50RHJvcGRvd24uX2NvbXBvbmVudCAmJiBwYXJlbnREcm9wZG93bi5fY29tcG9uZW50Ll9oYXNMb2FkZWREYXRhc291cmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LmdldERhdGEoZmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudCAmJiBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93blJlY3Vyc2l2ZShjaGlsZERyb3Bkb3duLCBmaWx0ZXIuZmlsdGVycywgbWFya2VkQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRNb3JlT25DaGFuZ2VFdmVudChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIG5ld09uQ2hhbmdlKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZCkge1xyXG4gICAgICAgICAgICBjb25zdCBvbGRUcmlnZ2VyTG9hZENoaWxkID0gY29udHJvbC50cmlnZ2VyTG9hZENoaWxkO1xyXG4gICAgICAgICAgICBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb2xkVHJpZ2dlckxvYWRDaGlsZChldmVudCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0bXBGaWVsZE9sZE9uQ2hhbmdlID0gJ29sZE9uQ2hhbmdlJztcclxuICAgICAgICBpZiAoY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkT25DaGFuZ2UgPSBjb250cm9sLm9uQ2hhbmdlZDtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0gPSBvbGRPbkNoYW5nZTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbGRPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0gPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkT25DaGFuZ2UgPSBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNoYW5nZWQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9sZE9uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gY29udHJvbC50cmlnZ2VyTG9hZENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkanVzdGVkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEV2ZW50ID0gY29udHJvbC5vbkFkanVzdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZSA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZSA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UpIHtcclxuICAgICAgICBpZiAoIXNjaGVtYS5jb3JyZWN0b3JzKSBzY2hlbWEuY29ycmVjdG9ycyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoIXNjaGVtYS52YWxpZGF0b3JzKSBzY2hlbWEudmFsaWRhdG9ycyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IFJlcXVpcmVkVmFsaWRhdG9yKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgc2NoZW1hLnZhbGlkYXRvcnMuZm9yRWFjaCh2YWxpZGF0b3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydCh2YWxpZGF0b3IsIHNjaGVtYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dFNjaGVtYSA9ICg8VGV4dENvbnRyb2xTY2hlbWE+c2NoZW1hKTtcclxuICAgICAgICAgICAgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnbnVtYmVyJyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2Ftb3VudCcpIHtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBOdW1iZXJPbmx5VmFsaWRhdG9yKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnbW9uZXknIHx8IHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnbW9uZXlpbnQnKSB7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnZW1haWwnKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgRW1haWxWYWxpZGF0b3IoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0U2NoZW1hLmNvcnJlY3RvcnMpIHRleHRTY2hlbWEuY29ycmVjdG9ycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS5jb3JyZWN0b3JzLnB1c2gobmV3IEdtYWlsQ29ycmVjdG9yKCkpO1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS5jb3JyZWN0b3JzLnB1c2gobmV3IExvd2VyQ29ycmVjdG9yKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAncGhvbmUnIHx8IHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnZmF4Jykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IFBob25lTnVtYmVyVmFsaWRhdG9yKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGV4dFNjaGVtYS52YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMuZm9yRWFjaCh2YWxpZGF0b3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydCh2YWxpZGF0b3IsIHRleHRTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZVNjaGVtYSA9ICg8RGF0ZVRpbWVDb250cm9sU2NoZW1hPnNjaGVtYSk7XHJcbiAgICAgICAgICAgIGlmIChkYXRlVGltZVNjaGVtYS52YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlVGltZVNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgRGF0ZUNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KHZhbGlkYXRvciwgZGF0ZVRpbWVTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYSwgdmFsaWRhdG9yLmdldER1cGxpY2F0ZUZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JSZXF1aXJlZHMoc2NoZW1hLCB2YWxpZGF0b3IuZ2V0UmVxdWlyZWRGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgU2FtZVZhbHVlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNhbWVWYWx1ZVZhbGlkYXRvcnMoc2NoZW1hLCB2YWxpZGF0b3IuZ2V0U2FtZUZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQoXHJcbiAgICAgICAgdmFsaWRhdG9yOiBEYXRlQ29tcGFyZVZhbGlkYXRvciB8IE51bWJlckNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICAgICAgc2NoZW1hOiBEYXRlVGltZUNvbnRyb2xTY2hlbWEgfCBUZXh0Q29udHJvbFNjaGVtYSB8IE1hc2tDb250cm9sU2NoZW1hXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCBjb21wYXJlVW5pcXVlRmllbGQgPSB2YWxpZGF0b3IuY29tcGFyZVVuaXF1ZUZpZWxkO1xyXG4gICAgICAgIGlmIChzY2hlbWEudW5pcXVlRmllbGQgPT0gY29tcGFyZVVuaXF1ZUZpZWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wZXJhdG9yQ29tcGFyZSA9IHZhbGlkYXRvci5nZXRPcGVyYXRvckNvbXBhcmUoKTtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hQ29tcGFyZSA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2NvbXBhcmVVbmlxdWVGaWVsZF0pO1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hQ29tcGFyZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIENvbXBhcmVWYWxpZGF0b3JcclxuICAgICAgICAgICAgICAgICAgICAmJiBwLmNvbXBhcmVVbmlxdWVGaWVsZCA9PSBzY2hlbWEudW5pcXVlRmllbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBEYXRlQ29tcGFyZVZhbGlkYXRvcihvcGVyYXRvckNvbnRyYXN0W29wZXJhdG9yQ29tcGFyZV0sIHNjaGVtYS51bmlxdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IE51bWJlckNvbXBhcmVWYWxpZGF0b3Iob3BlcmF0b3JDb250cmFzdFtvcGVyYXRvckNvbXBhcmVdLCBzY2hlbWEudW5pcXVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVmFsaWRhdG9yQ2hlY2tEdXBsaWNhdGUoc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UsIGZpZWxkT3RoZXI6IHN0cmluZ1tdLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0RHVwbGljYXRlRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIF92YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFPdGhlci52YWxpZGF0b3JzLnB1c2goX3ZhbGlkYXRvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVWYWxpZGF0b3JSZXF1aXJlZHMoc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UsIGZpZWxkT3RoZXI6IHN0cmluZ1tdLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIFJlcXVpcmVkRmllbGRzVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0UmVxdWlyZWRGaWVsZHMoKSkpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdmFsaWRhdG9yID0gbmV3IFJlcXVpcmVkRmllbGRzVmFsaWRhdG9yKHRtcEZpZWxkcywgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlU2FtZVZhbHVlVmFsaWRhdG9ycyhzY2hlbWE6IEZvcm1Db250cm9sQmFzZSwgZmllbGRPdGhlcjogc3RyaW5nW10sIG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChmaWVsZE90aGVyLmluZGV4T2Yoc2NoZW1hLnVuaXF1ZUZpZWxkKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5maWVsZE90aGVyLCBzY2hlbWEuZmllbGRdO1xyXG4gICAgICAgICAgICBmaWVsZE90aGVyLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hT3RoZXIgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tmaWVsZF0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdG1wRmllbGRzID0gZmllbGRzLmZpbHRlcihwID0+IHAgIT0gc2NoZW1hT3RoZXIuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFPdGhlci52YWxpZGF0b3JzLnNvbWUocCA9PiBwIGluc3RhbmNlb2YgU2FtZVZhbHVlVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0U2FtZUZpZWxkcygpKSlcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF92YWxpZGF0b3IgPSBuZXcgU2FtZVZhbHVlVmFsaWRhdG9yKHRtcEZpZWxkcywgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXREYXRhRGVmYXVsdCgpIHtcclxuICAgICAgICBjb25zdCBzdHJpbmdEYXRhRGVmYXVsdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkRFRkFVTFRfREFUQSk7XHJcbiAgICAgICAgY29uc3QgZ2V0U2V0dGluZ0RhdGFEZWZhdWx0ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmdldENvbmZpZygpLmVudmlyb25tZW50LnNldHRpbmdEYXRhRGVmYXVsdDtcclxuICAgICAgICBpZiAoc3RyaW5nRGF0YURlZmF1bHQgJiYgKHRoaXMuX21vZGVsRGF0YSAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhQ2FjaGUgPSBKU09OLnBhcnNlKHN0cmluZ0RhdGFEZWZhdWx0KTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9ICg8RHJvcGRvd25Db250cm9sU2NoZW1hPml0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IChjb250cm9sLmZpZWxkICsgKGNvbnRyb2wudmFsdWVGaWVsZCA9PSAnaWQnID8gJycgOiBjb250cm9sLnZhbHVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdldFNldHRpbmdEYXRhRGVmYXVsdCkgeyAvLyBs4bqleSBj4bqldSBow6xuaCBmaWVsZCBtYXBQaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkTWFwR2V0Q2FjaGUgPSBnZXRTZXR0aW5nRGF0YURlZmF1bHRbY29udHJvbC5maWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZE1hcEdldENhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSAoZmllbGRNYXBHZXRDYWNoZSArIChjb250cm9sLnZhbHVlRmllbGQgPT0gJ2lkJyA/ICcnIDogY29udHJvbC52YWx1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFDYWNoZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFDYWNoZVsoPEZvcm1TY2hlbWFCYXNlPml0ZW0pLmZpZWxkXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhWyg8Rm9ybVNjaGVtYUJhc2U+aXRlbSkuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuZnVuY3Rpb24ubW9kaWZ5RGF0YUFmdGVyR2V0Q2FjaGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmZ1bmN0aW9uLm1vZGlmeURhdGFBZnRlckdldENhY2hlKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXBwbHlDYWNoZWRWYWx1ZXMoKSB7XHJcbiAgICAgICAgdGhpcy5nZXRDYWNoZWRWYWx1ZXNGcm9tU3RvcmFnZSgpO1xyXG4gICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRDYWNoZWRWYWx1ZVRvTW9kZWwobW9kZWwsIHVuaXF1ZUtleUNvbnRyb2w/LCBwYXRoPykge1xyXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgaWYgKGZpZWxkICE9ICdfZXJyb3JzJyAmJiBmaWVsZCAhPSAnX3N0YXR1cycgJiYgZmllbGQgIT0gJ19zb3VyY2UnKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3ViVW5pcXVlS2V5Q29udHJvbDtcclxuICAgICAgICAgICAgICAgIGlmICh1bmlxdWVLZXlDb250cm9sICE9IG51bGwgJiYgdW5pcXVlS2V5Q29udHJvbCAhPT0gJycpIHN1YlVuaXF1ZUtleUNvbnRyb2wgPSB1bmlxdWVLZXlDb250cm9sICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHN1YlVuaXF1ZUtleUNvbnRyb2wgPSBmaWVsZDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sc1tzdWJVbmlxdWVLZXlDb250cm9sXTtcclxuICAgICAgICAgICAgICAgIGlmICghY29udHJvbCkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3ViUGF0aDtcclxuICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aCAhPT0gJycpIHN1YlBhdGggPSBwYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHN1YlBhdGggPSBmaWVsZDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJNb2RlbCA9IG1vZGVsW2ZpZWxkXTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3ViTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYWNoZWRWYWx1ZVRvTW9kZWwoaXRlbSwgc3ViVW5pcXVlS2V5Q29udHJvbCwgc3ViUGF0aCArICdbJyArIGluZGV4ICsgJ10nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0xpdGVyYWxPYmplY3Qoc3ViTW9kZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYWNoZWRWYWx1ZVRvTW9kZWwoc3ViTW9kZWwsIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbC5lbmFibGVDYWNoaW5nICYmIHRoaXMuY2FjaGVkVmFsdWVzLmhhc093blByb3BlcnR5KHN1YlBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxbZmllbGRdID0gdGhpcy5jYWNoZWRWYWx1ZXNbc3ViUGF0aF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDYWNoZWRWYWx1ZXNGcm9tU3RvcmFnZSgpIHtcclxuICAgICAgICBjb25zdCBjYWNoZWRWYWx1ZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYWNoZWRWYWx1ZXMnKSk7XHJcbiAgICAgICAgaWYgKGNhY2hlZFZhbHVlcykge1xyXG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUlkKSBwYXRoTmFtZSArPSAnLycgKyB0aGlzLmZvcm1JZDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjYWNoZWRWYWx1ZXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlZFZhbHVlcyA9IGVsZW1lbnQudmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2F2ZUNhY2hlVmFsdWVzVG9TdG9yYWdlKCkge1xyXG4gICAgICAgIGxldCBjYWNoZWRWYWx1ZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYWNoZWRWYWx1ZXMnKSk7XHJcbiAgICAgICAgaWYgKCFjYWNoZWRWYWx1ZXMpIGNhY2hlZFZhbHVlcyA9IFtdO1xyXG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybUlkKSBwYXRoTmFtZSArPSAnLycgKyB0aGlzLmZvcm1JZDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY2FjaGVkVmFsdWVzW2ldO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWVzID0gdGhpcy5jYWNoZWRWYWx1ZXM7XHJcbiAgICAgICAgICAgICAgICBjaGVja0V4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNoZWNrRXhpc3QpIHtcclxuICAgICAgICAgICAgY2FjaGVkVmFsdWVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgcGF0aG5hbWU6IHBhdGhOYW1lLFxyXG4gICAgICAgICAgICAgICAgdmFsdWVzOiB0aGlzLmNhY2hlZFZhbHVlc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWNoZWRWYWx1ZXMnLCBKU09OLnN0cmluZ2lmeShjYWNoZWRWYWx1ZXMpKTtcclxuICAgIH1cclxuXHJcbiAgICB0cmlnZ2VyQ2hhbmdlKGZpZWxkUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChmaWVsZFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgIGlmIChjb250cm9sICYmIGN1cnJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCBudWxsLCAndHJpZ2dlcicsIGN1cnJlbnROb2RlLnBhcmVudE1vZGVsLCBjdXJyZW50Tm9kZS5wYXJlbnRNb2RlbFBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9Gb2N1cyAmJiAhdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzRmlyc3RDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmRhdGEuZmxhZ3MuaGFzRm9jdXNpbmdDb250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LCA4MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SXNMb2FkZWREYXRhRWRpdCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMubG9hZGVkRGF0YUVkaXRPbGQgPSB0aGlzLmxvYWRlZERhdGFFZGl0O1xyXG4gICAgICAgIHRoaXMubG9hZGVkRGF0YUVkaXQgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29udHJvbFR5cGUoY29udHJvbDogYW55KSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYSkgcmV0dXJuICd0aXRsZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYSkgcmV0dXJuICdsYWJlbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTcGFuQ29udHJvbFNjaGVtYSkgcmV0dXJuICdzcGFuQ29udHJvbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkgcmV0dXJuICdtYXNrJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdudW1iZXJyYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0Q29udHJvbCA9IDxUZXh0Q29udHJvbFNjaGVtYT5jb250cm9sO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB0ZXh0Q29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXknXHJcbiAgICAgICAgICAgICAgICB8fCB0ZXh0Q29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXlpbnQnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdtb25leSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ3Bob25lJ1xyXG4gICAgICAgICAgICAgICAgfHwgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ2ZheCdcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3Bob25lT3JmYXgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAndGV4dCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGVtcGxhdGVDb250cm9sU2NoZW1hKSByZXR1cm4gJ3RlbXBsYXRlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkYXRldGltZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZVJhbmdlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkYXRldGltZXJhbmdlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FkZHJlc3MnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSByZXR1cm4gJ2Ryb3Bkb3duJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVkaXRvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZWRpdG9yJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHRBcmVhQ29udHJvbFNjaGVtYSkgcmV0dXJuICd0ZXh0YXJlYSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBXcmFwUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvbW1vbi1waWNrZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQaOG6o2kgxJHhu4MgZMOybmcgZMaw4bubaSDhu58gYsOqbiB0csOqbiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSB2w6wgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSA6IFVzZXJQaWNrZXJDb250cm9sU2NoZW1hXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2F1dG9jb21wbGV0ZS1waWNrZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAndXNlci1waWNrZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdlbnRpdHktcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE9yZ2FuaXphdGlvblBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdvcmdhbml6YXRpb24tcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yy1waWNrZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvQ2F1VG9DaHVjQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvY2F1dG9jaHVjJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVDb250cm9sU2NoZW1hKSByZXR1cm4gJ2F1dG9jb21wbGV0ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTd2l0Y2hDb250cm9sU2NoZW1hKSByZXR1cm4gJ3N3aXRjaCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja2JveENvbnRyb2xTY2hlbWEpIHJldHVybiAnY2hlY2tib3gnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSkgcmV0dXJuICdjaGVja2JveGxpc3QnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3JhZGlvYnV0dG9ubGlzdCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wubW9kZSA9PSBGaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdzZXJ2aWNlRmlsZVVwbG9hZCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZmlsZU1hbmFnZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yUGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvckNvbnRyb2wnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHJldHVybiAndGFibGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSByZXR1cm4gJ2NvbnRhaW5lcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBCdXR0b25Db250cm9sU2NoZW1hKSByZXR1cm4gJ2J1dHRvbic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBWYW5CYW5QaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3ZhbmJhbic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29uZ3ZpZWMnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgUGVyY2VudENvbnRyb2xTY2hlbWEpIHJldHVybiAncGVyY2VudCc7XHJcbiAgICAgICAgcmV0dXJuICdjdXN0b20nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRWaWV3TW9kZURhdGFUeXBlKGNvbnRyb2wpIHtcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRpdGxlU2NoZW1hKSByZXR1cm4gJ3RpdGxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIExhYmVsU2NoZW1hKSByZXR1cm4gJ2xhYmVsJztcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ21hc2snO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUNvbnRyb2wgPSA8RGF0ZVRpbWVDb250cm9sU2NoZW1hPmNvbnRyb2w7XHJcbiAgICAgICAgICAgIGlmIChkYXRlQ29udHJvbC5zaG93VGltZSkgcmV0dXJuICdkYXRldGltZSc7XHJcbiAgICAgICAgICAgIHJldHVybiAnZGF0ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRWRpdG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdodG1sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXInO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIFN3aXRjaENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrYm94Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIE9yZ2FuaXphdGlvblBpY2tlckNvbnRyb2xTY2hlbWFcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuICdoYXNEYXRhU291cmNlJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5tb2RlID09IEZpbGVVcGxvYWRNb2RlLnVzaW5nRmlsZUluc3RhbmNlSWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVVwbG9hZCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZpbGVTZXJ2aWNlVXBsb2FkJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdmaWxlTWFuYWdlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICAmJiAoY29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXknXHJcbiAgICAgICAgICAgICAgICB8fCBjb250cm9sLmRhdGFGb3JtYXQgPT09ICdtb25leWludCcpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvclBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSByZXR1cm4gJ3RhYmxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEtleVZhbHVlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhcHAta2V5LXZhbHVlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvbnRhaW5lcic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtKHNldFZhbGlkYXRlRm9ybSA9IHRydWUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBpZiAoc2V0VmFsaWRhdGVGb3JtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luVmFsaWRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVNb2RlbCh0aGlzLl9yb290Tm9kZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pblZhbGlkRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c1RvRmlyc3RFcnJvckNvbnRyb2woKTtcclxuICAgICAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1vZGVsKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghY2hpbGROb2RlLmNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuY2hpbGROb2RlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGROb2RlLmNvbnRyb2xbJ19oaWRkZW4nXSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMudmFsaWRhdGUoY2hpbGROb2RlLCB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5WYWxpZEZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwoY2hpbGROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtQ29udHJvbChmaWVsZFBhdGgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBpZiAoY29udHJvbE5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNvbnRyb2xOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZUNoYW5nZURyb3Bkb3duKGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykge1xyXG4gICAgICAgIGlmIChjb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gJ2hpZGUnKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgZXZlbnQsICdjaGFuZ2UnLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIGV2ZW50LCBldmVudFR5cGUsIHBhcmVudE1vZGVsLCBwYXJlbnRQYXRoLCBzb3VyY2VOb2RlLCBidWJibGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIMSQ4buDIG5ndXnDqm4gaMOgbSBk4bqhbmcgYXJyb3cgZnVuY3Rpb24gdsOsIGPDsyAxIHPhu5EgZm9ybSBraMOhYyBn4buNaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlRmllbGRWYWx1ZUNoYW5nZSA9IGFzeW5jIChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIGV2ZW50PywgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pID0+IHtcclxuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlO1xyXG5cclxuICAgICAgICAvLyByb3cgaW4gdGFibGVcclxuICAgICAgICBpZiAoY29udHJvbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIHBhcmVudE1vZGVsID0gcGFyZW50Tm9kZS5tb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB2YWx1ZSA9IGN1cnJlbnROb2RlLnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBhdXRvIGNvcnJlY3QgdmFsdWVcclxuICAgICAgICB2YWx1ZSA9IHRoaXMuY29ycmVjdFZhbHVlKGN1cnJlbnROb2RlKTtcclxuICAgICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAvLyB2YWxpZGF0ZSB2YWx1ZVxyXG4gICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGUoY3VycmVudE5vZGUpO1xyXG5cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICBzb3VyY2VOb2RlOiBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYnViYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmVudE5vZGUucGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUucGFyZW50Tm9kZSAhPSBwYXJlbnROb2RlLnJvb3ROb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShwYXJlbnROb2RlLmNvbnRyb2wsIGV2ZW50LCBldmVudFR5cGUsIHBhcmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbCwgcGFyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsUGF0aCwgc291cmNlTm9kZSB8fCBjdXJyZW50Tm9kZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZUNhY2hpbmcgJiYgY29udHJvbC5lbmFibGVDYWNoaW5nKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZUNvbnRyb2xWYWx1ZShjb250cm9sLCB2YWx1ZSwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEV2ZW50IGtoaSBkcm9wZG93biDEkWnhu4F1IGNo4buJbmggdmFsdWUgdOG7qyByYXcgdmFsdWUgZOG6oW5nIGd1aWQgfCBpbnQgfCAuLi4gPT4gb2JqZWN0IGtp4buDdSB7dmFsdWU6IGd1aWQgfCBpbnQgfCAuLi4sIC4uLiBbMSBz4buRIHRyxrDhu51uZyBraMOhY119XHJcbiAgICAqIEBwYXJhbSBjb250cm9sXHJcbiAgICAqIEBwYXJhbSBwYXJlbnRQYXRoXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUFkanVzdFZhbHVlRHJvcGRvd25FdmVudChjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdhZGp1c3RWYWx1ZScsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkanVzdGVkVmFsdWUoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkQ29tcGxldGUoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlV2l0aFNlcnZpY2UsIHBhcmVudFBhdGgsIGRhdGFTb3VyY2UpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkZWQoY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hLCBwYXJlbnRQYXRoLCBkYXRhRnJvbURyb3Bkb3duOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlOiAnZGF0YVNvdXJjZUxvYWRlZCcsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhRnJvbURyb3Bkb3duLmRhdGFTb3VyY2VcclxuICAgICAgICB9KTtcclxuICAgICAgICBldmVudERhdGFbJ2VsbSddID0gZGF0YUZyb21Ecm9wZG93bi5lbG07XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5jYWxsYmFja0RhdGFGaW5pc2goZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlUmVhZHlDb250cm9sUGlja2VyKGNvbnRyb2w6IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgfCBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSB8IENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2wsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdyZWFkeScsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25SZWFkeSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vblJlYWR5KGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVDb250cm9sUmVhZHlFdmVudChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgcGFyZW50Tm9kZS5tb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm9uQ29udHJvbFJlYWR5LmVtaXQoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsRGF0YVtLZXlGbGFzaFNob3ddKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRQYXRoKSB7IC8vIMSQb+G6oW4gY29kZSB0cm9uZyBibG9jayBpZiBuw6B5IGNoxrBhIGNodeG6qW4sIHThuqFtIHRo4budaSBjb2RlIHRo4bq/IMSR4bq/biBraGkgZ+G6t3AgY2FzZSBuw6B5IHRow6wgeGVtIGzhuqFpIHNhdVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXR1c1tgJHtwYXJlbnRQYXRofS4ke2NvbnRyb2wuZmllbGR9YF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXR1c1tgJHtjb250cm9sLmZpZWxkfWBdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2FuUHJpbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tDYW5QcmludCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd10gJiYgdGhpcy5jYW5QcmludCkge1xyXG4gICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHdhaXRSZWFkeUFuZFByaW50KCkge1xyXG4gICAgICAgIGNvbnN0IHJlYWR5QWxsID0gdGhpcy5jaGVja1JlYWR5QWxsKCk7XHJcbiAgICAgICAgaWYgKHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWFkeUFsbCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd107XHJcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLl9wcmludFBkZkJ5U2NoZW1hKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSwgdGhpcy5fbWluaW1pemVkRGF0YSwgdGhpcy5zZXR0aW5nLnNjaGVtYSlcclxuICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlcywgJycsIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnVOG6oW8gZmlsZSB0aMOgbmggY8O0bmcnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhLnByaW50RmlsZUlkID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuY2xvbmVPYmplY3QodGhpcy5fbWluaW1pemVkRGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlV2FpdEJveCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmdldENvbmZpZygpLmVudmlyb25tZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VUcmluaEt5KGVudmlyb25tZW50LCB0aGlzLnNldHRpbmcsIHRoaXMuX21vZGVsRGF0YSwgcmVzLmRhdGEsIHRoaXMuX25vdGlmaWVyU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQWZ0ZXJUcmluaEt5LmVtaXQoKTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53YWl0UmVhZHlBbmRQcmludCgpO1xyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1vZGVsVGFibGVTY2hlbWFCeUNoaWxkU2NoZW1hKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xUYWJsZSA9IHRoaXMuZm9ybUNvbnRyb2xzW2NvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXV07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsRGF0YVtjb250cm9sVGFibGUuZmllbGRdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tSZWFkeUFsbCgpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wuaGlkZGVuIHx8ICF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEZpZWxkID0gY29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdO1xyXG4gICAgICAgICAgICAvLyBO4bq/dSBsw6AgZmllbGQgdHJvbmcgdGFibGUgc2NoZW1hXHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXJyTW9kZWxDdW5nTGV2ZWwgPSB0aGlzLmdldE1vZGVsVGFibGVTY2hlbWFCeUNoaWxkU2NoZW1hKGNvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFyck1vZGVsQ3VuZ0xldmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJNb2RlbEN1bmdMZXZlbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVhZHlTdGF0dXNbYCR7cGFyZW50RmllbGR9WyR7aX1dLiR7Y29udHJvbC5maWVsZH1gXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnJlYWR5U3RhdHVzW2Ake2NvbnRyb2wuZmllbGR9YF0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVNb2RlbEZyb21FeHRlcm5hbCA9ICgpID0+IHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGjhuqNpIMSR4buDIGFycm93IGZ1bmN0aW9uIHbDrCBjw7MgZXhwb3J0IHJhIGNobyBt4buZdCBz4buRIHRlbXBsYXRlIHPhu60gZOG7pW5nXHJcbiAgICBmaXJlTW9kZWxDaGFuZ2VkID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZS5lbWl0KHRoaXMuX21pbmltaXplZERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVCdXR0b25DbGljayhjb250cm9sOiBCdXR0b25Db250cm9sU2NoZW1hLCBldmVudCwgcGFyZW50UGF0aCkge1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DbGljayhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnY2xpY2snLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29ycmVjdFZhbHVlKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcclxuICAgICAgICBsZXQgcmUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmNvcnJlY3RvcnMgJiYgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sLmNvcnJlY3RvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvcnJlY3RvciA9IGNvbnRyb2wuY29ycmVjdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F1dG9Db3JyZWN0JyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlID0gY29ycmVjdG9yLmNvcnJlY3QoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0cnVlIGzDoCB0aOG7j2EgbcOjbiwgZmFsc2UgbMOgIGtow7RuZyB0aOG7j2EgbcOjbiAo4bueIGPhuqVwIGhp4buHbiB04bqhaSBjaOG7qSBjaMawYSBraeG7g20gdHJhIGPhuqVwIGNvbilcclxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGUoY3VycmVudE5vZGU6IENvbnRyb2xUcmVlTm9kZSwgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmICghZm9yY2UgJiYgIXBhcmVudE5vZGUubW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGUubW9kZWwuX2Vycm9yc1tjdXJyZW50Tm9kZS5maWVsZF07XHJcbiAgICAgICAgICAgIGlmICghZXJyb3JzKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgZXJyb3JzLnNwbGljZSgwLCBlcnJvcnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsaWRhdG9ycyAmJiBjb250cm9sLnZhbGlkYXRvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sLnZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBjb250cm9sLnZhbGlkYXRvcnNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd2YWxpZGF0ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IHZhbGlkYXRvci52YWxpZGF0ZShldmVudERhdGEpID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gdmFsaWRhdG9yLmdldEVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmluZGV4T2YoZXJyKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgX3NldEVycm9yKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpIHtcclxuICAgIC8vICAgICBjb25zdCBub2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChmaWVsZCk7XHJcbiAgICAvLyAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RyxrDhu51uZyBk4buvIGxp4buHdSBraMO0bmcgdOG7k24gdOG6oWknKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBjb25zdCBlcnJvcnMgPSBub2RlLnBhcmVudE5vZGUubW9kZWwuX2Vycm9yc1tub2RlLmZpZWxkXTtcclxuICAgIC8vICAgICBlcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gc2V0RXJyb3IoZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBlcnJvcjogc3RyaW5nKSB7XHJcbiAgICAvLyAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKVxyXG4gICAgLy8gICAgICAgICBmaWVsZC5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5fc2V0RXJyb3IoaXRlbSwgZXJyb3IpKTtcclxuICAgIC8vICAgICBlbHNlXHJcbiAgICAvLyAgICAgICAgIHRoaXMuX3NldEVycm9yKGZpZWxkLCBlcnJvcik7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWNoZUNvbnRyb2xWYWx1ZShjb250cm9sLCB2YWx1ZSwgcGFyZW50UGF0aCkge1xyXG4gICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuZW5hYmxlQ2FjaGluZykge1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZFZhbHVlc1twYXJlbnRQYXRoICsgJy4nICsgY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29tcG9uZW50QnlUeXBlKHRlbXBsYXRlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMuY2hpbGRyZW4sIHRlbXBsYXRlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJdGVtSW5BcnJheUJ5VmFsdWUoYXJyYXksIHYsIGNvbnRyb2wpIHtcclxuICAgICAgICBpZiAodiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGZ1bmNHZXRMYWJlbCA9IGNvbnRyb2wuZnVuY0dldExhYmVsO1xyXG4gICAgICAgIGlmIChmdW5jR2V0TGFiZWwgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmdW5jR2V0TGFiZWwgPSBpdGVtID0+IGl0ZW1bY29udHJvbC5kaXNwbGF5RmllbGRdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBBcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCB2QXJyID0gdjtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHYpKSB7XHJcbiAgICAgICAgICAgICAgICB2QXJyID0gdi50b1N0cmluZygpLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2QXJyLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGFycmF5LmZpbmQoeCA9PiB4W2NvbnRyb2wudmFsdWVGaWVsZF0gPT0gdik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jR2V0TGFiZWwoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodkFyci5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuZmlsdGVyKHAgPT4gdkFyci5zb21lKHEgPT4gcSA9PSBwW2NvbnRyb2wudmFsdWVGaWVsZF0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBmdW5jR2V0TGFiZWwoaXRlbSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEl0ZW1JbkFycmF5QnlUZXh0VmFsdWUoYXJyYXksIHYpIHtcclxuICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHYgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgYXJyYXkgaW5zdGFuY2VvZiBBcnJheVxyXG4gICAgICAgICAgICAmJiBhcnJheS5sZW5ndGggPiAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2LmpvaW4oJzsgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWRkcmVzc0Rpc3BsYXlUZXh0KHNlbGVjdGVkVmFsdWUpIHsgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRMYWJlbENsYXNzKGNvbnRyb2wpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gYGxhYmVsLWNvbnRyb2xgO1xyXG4gICAgICAgIGlmIChjb250cm9sLmluZGV4TGFiZWwpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgaGF2ZUluZGV4JztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNjcm9sbFRvVmlldyhlbGUpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGVsZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGgxOiBhbnkgPSBlbGUuY2xvc2VzdCgnZGl2W2lkJD1cXCctaG9sZGVyXFwnXScpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGgxICYmIGgxLnByZXZpb3VzU2libGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGgxID0gaDEucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoMS50YWdOYW1lID09PSAnRElWJykgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGgxICYmIGgxLnNjcm9sbEludG9WaWV3KSBoMS5zY3JvbGxJbnRvVmlldygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogLSBTZXQgRm9jdXMgY29udHJvbFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnNcclxuICAgICAqL1xyXG5cclxuICAgIHByaXZhdGUgZm9jdXNGaXJzdENvbnRyb2woKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSB0aGlzLmZvcm1FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgZGl2cyA9IGZvcm1FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Rpdi5jcnVkLWZvcm0tY29udHJvbCcpO1xyXG4gICAgICAgIGlmIChkaXZzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZGl2IG9mIGRpdnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3REaXZIb2xkZXIgPSBkaXY7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3RDb250cm9sID0gdGhpcy5maXJzdERpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCdpbnB1dDpub3QoW3R5cGU9ZmlsZV0pOm5vdChbdHlwZT1oaWRkZW5dKScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9WaWV3KGZpcnN0Q29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCAmJiBmaXJzdENvbnRyb2wuaWQuaW5kZXhPZigndGlueS1hbmd1bGFyJykgIT0gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgPSB0aGlzLmZpcnN0RGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZmlyc3RDb250cm9sKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250ZW50cygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2JvZHknKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZGVwcmVjYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbnltY2UtZm9jdXMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvY3VzVG9GaXJzdEVycm9yQ29udHJvbCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBzZWxlY3RvciA9IGBkaXYuZXJyb3JgO1xyXG4gICAgICAgIGNvbnN0IGRpdkhvbGRlciA9IGZvcm1FbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xyXG4gICAgICAgIGlmIChkaXZIb2xkZXIpIHtcclxuICAgICAgICAgICAgbGV0IGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG4gICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9WaWV3KGZpcnN0Q29udHJvbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgJiYgZmlyc3RDb250cm9sLmlkLmluZGV4T2YoJ3RpbnktYW5ndWxhcicpICE9IDBcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZmlyc3RDb250cm9sKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCdib2R5JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZGVwcmVjYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbnltY2UtZm9jdXMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcmV2ZW50Qmx1cihldmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyYXBGb2N1cykge1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgfHwgdGFyZ2V0LnRhZ05hbWUgPT0gJ0ZPUk0nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlkLmVuZHNXaXRoKCctaG9sZGVyJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHRoaXMuZmlyc3REaXZIb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q29udHJvbCA9IHRhcmdldC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCA9PSBldmVudC50YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1Zpc2libGUoZWxlbSkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcclxuICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKHN0eWxlLnZpc2liaWxpdHkgIT09ICd2aXNpYmxlJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICgrc3R5bGUub3BhY2l0eSA8IDAuMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbS5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgICArIGVsZW0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgICsgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgKyBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXHJcbiAgICAgICAgICAgID09PSAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxlbUNlbnRlciA9IHtcclxuICAgICAgICAgICAgeDogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgZWxlbS5vZmZzZXRXaWR0aCAvIDIsXHJcbiAgICAgICAgICAgIHk6IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgZWxlbS5vZmZzZXRIZWlnaHQgLyAyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHBvaW50Q29udGFpbmVyID0gPGFueT4oXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZWxlbUNlbnRlci54LCBlbGVtQ2VudGVyLnkpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAocG9pbnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvaW50Q29udGFpbmVyID09PSBlbGVtKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxyXG4gICAgICAgICAgICB9IHdoaWxlICgocG9pbnRDb250YWluZXIgPSBwb2ludENvbnRhaW5lci5wYXJlbnROb2RlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlUm93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dEZWxldGVDb25maXJtKCkudGhlbihhc3luYyBycyA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcnMpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgICAgICBjb25zdCB0b0RlbGV0ZVJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XHJcblxyXG4gICAgICAgICAgICBsZXQgdG9EZWxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0b0RlbGV0ZSA9IGNvbnRyb2wub25EZWxldGluZyhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdkZWxldGluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodG9EZWxldGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5yZWluaXRDaGlsZE5vZGVzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAndGFibGVDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25EZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkRlbGV0ZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnZGVsZXRlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGFkZE5ld1Jvdyhjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoLCBldmVudFR5cGU/KSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0VkaXQpIHtcclxuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1UaXRsZSA9IGBUaMOqbSBt4bubaSAke2NvbnRyb2wubGFiZWx9YDtcclxuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1TY2hlbWEgPSBjb250cm9sLnJvd1RlbXBsYXRlO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSAtMTtcclxuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mbyA9IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wsXHJcbiAgICAgICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0YWJsZU5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHRhYmxlUGF0aCArICdbJyArIGluZGV4ICsgJ10nO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKGRhdGEsIHN1YkNvbnRyb2wsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvQWRkID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY29udHJvbC5vbkFkZGluZykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSBjb250cm9sLm9uQWRkaW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCAnYWRkaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIHRvQWRkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0b0FkZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgIHRhYmxlTm9kZS5yZWluaXRDaGlsZE5vZGVzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlICE9ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1Jvd05vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IG5ld1Jvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICd0YWJsZUNoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ2FkZGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkTXVsdGlSb3coY29udHJvbCwgbGVuZ3RoLCB0YWJsZVBhdGgsIGV2ZW50VHlwZT8pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkTmV3Um93KGNvbnRyb2wsIHRhYmxlUGF0aCwgZXZlbnRUeXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlU2F2ZWRUYWJsZVJvdyhkYXRhKSB7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1TaG93ID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8uY29udHJvbDtcclxuICAgICAgICBjb25zdCB0YWJsZVBhdGggPSB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvLnRhYmxlUGF0aDtcclxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvLmV2ZW50VHlwZTtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGVGb3JtQ3VycmVudFJvdyA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbFt0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3ddID0geyAuLi50YWJsZU5vZGUubW9kZWxbdGhpcy50YWJsZUZvcm1DdXJyZW50Um93XSwgLi4uZGF0YSB9O1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHRhYmxlUGF0aCArICdbJyArIGluZGV4ICsgJ10nO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKGRhdGEsIHN1YkNvbnRyb2wsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgdG9BZGQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGluZykge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICB0b0FkZCA9IGNvbnRyb2wub25BZGRpbmcobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICdhZGRpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICB0b0FkZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodG9BZGQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5yZWluaXRDaGlsZE5vZGVzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSAhPSAnaW5pdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3dOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25DaGFuZ2VkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IG5ld1Jvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCAndGFibGVDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ2FkZGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhdmVSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VyZW50Um93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblNhdmUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25TYXZlKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogY3VyZW50Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzYXZlJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlZGl0Um93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1UaXRsZSA9IGBT4butYSAke2NvbnRyb2wubGFiZWx9YDtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID0gaW5kZXg7XHJcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgIGNvbnN0IHRvRGVsZXRlUm93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybURhdGEgPSB0b0RlbGV0ZVJvd05vZGUudmFsdWU7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mbyA9IHtcclxuICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgdGFibGVQYXRoLFxyXG4gICAgICAgICAgICBpbmRleFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1TaG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlUm93T3JkZXJlZChjb250cm9sOiBUYWJsZVNjaGVtYSwgZXZ0LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykge1xyXG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGU7XHJcblxyXG4gICAgICAgIC8vIHJvdyBpbiB0YWJsZVxyXG4gICAgICAgIGlmIChjb250cm9sID09IG51bGwpIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgcGFyZW50TW9kZWwgPSBwYXJlbnROb2RlLm1vZGVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHZhbHVlID0gY3VycmVudE5vZGUudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIGF1dG8gY29ycmVjdCB2YWx1ZVxyXG4gICAgICAgIHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUoY3VycmVudE5vZGUpO1xyXG4gICAgICAgIGN1cnJlbnROb2RlLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICBzb3VyY2VOb2RlOiBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25SZW9yZGVyZWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vblJlb3JkZXJlZChldmVudERhdGEpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChldmVudERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dDb250ZXh0TWVudShldnQsIHJvd0RhdGEsIGNvbnRyb2w6IFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5yb3dEYXRhQ3VycmVudCA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cyA9IGF3YWl0IGNvbnRyb2wucm93QnV0dG9ucyhyb3dEYXRhKTtcclxuICAgICAgICBpZiAoIXRoaXMuYnV0dG9uQ29udGV4dHMgfHwgdGhpcy5idXR0b25Db250ZXh0cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudShldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Nob3dDb250ZXh0TWVudShldnQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZ0KTtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1lc3NhZ2VSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VyZW50Um93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuICAgICAgICBpZiAoY29udHJvbC5vbk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25NZXNzYWdlKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogY3VyZW50Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdtZXNzYWdlJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGFibGVGdW5jdGlvbkNvbHVtbldpZHRoKGNvbnRyb2w6IFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgbGV0IG5lID0gMjA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0RlbGV0ZSkgbmUgKz0gMzA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0VkaXQpIG5lICs9IDMwO1xyXG4gICAgICAgIGlmIChjb250cm9sLnNob3dTYXZlKSBuZSArPSAzMDtcclxuICAgICAgICBpZiAoY29udHJvbC5yb3dCdXR0b25zKSBuZSArPSAzMDtcclxuICAgICAgICByZXR1cm4gbmUgKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNYXNrQnlUeXBlKG1hc2tUeXBlKSB7XHJcbiAgICAgICAgaWYgKG1hc2tUeXBlID09ICdkZWNpbWFsJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RvdF9zZXBhcmF0b3IuNSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrRGlzYWJsZWQoZGF0YTogYW55LCBjb250cm9sOiBGb3JtQ29udHJvbEJhc2UpIHtcclxuICAgICAgICByZXR1cm4gZGF0YS5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmRpc2FibGVkID09PSB0cnVlIHx8IChkYXRhLl9zdGF0dXNbY29udHJvbC5maWVsZF0uZGlzYWJsZWQgPT09IHVuZGVmaW5lZCAmJiBjb250cm9sLmRpc2FibGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0hpZGRlbihjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIHBhcmVudE1vZGVsOiBhbnksIHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHBhdGggJiYgY29udHJvbFsnbm9kZXMnXSkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGNvbnRyb2xbJ25vZGVzJ11bcGF0aF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2xbJ19oaWRkZW4nXSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmhpZGRlbiA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB8fCAocGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5oaWRkZW4gPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgJiYgKGNvbnRyb2wuaGlkZGVuXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgKGNvbnRyb2wuaGlkZGVuQ2hlY2sgJiYgY29udHJvbC5oaWRkZW5DaGVjayh0aGlzLl9taW5pbWl6ZWREYXRhLCBjdXJyZW50Tm9kZSkpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgY29udHJvbFsnX2hpZGRlbiddID0gISFyZXN1bHQ7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZXh0VGQoY29udHJvbCwgZGF0YSwgaW5kZXgsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wsXHJcbiAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IGAke3RhYmxlUGF0aH1bJHtpbmRleH1dYCxcclxuICAgICAgICAgICAgcGF0aDogYCR7dGFibGVQYXRofVske2luZGV4fV0uJHtjb250cm9sLmZpZWxkfWAsXHJcbiAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXHJcbiAgICAgICAgICAgIG1kV2lkdGg6IDEyXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNNb2JpbGVPclRhYmxldCgpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNNb2JpbGUoKVxyXG4gICAgICAgICAgICB8fCB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNUYWJsZXQoKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDYWNoaW5nKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQ2FjaGVWYWx1ZXNUb1N0b3JhZ2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkZvY3VzVGV4dENvbnRyb2woZXZ0KSB7IH1cclxuXHJcbiAgICBwdWJsaWMgb25TZXR0aW5ncyhldmVudCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJsZVNjaGVtYU9sZGVzdChldnQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19PTERFU1QsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hTmV3ZXN0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX05FV0VTVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFOZXh0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX05FWFQsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hUHJldihldnQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19QUkVWLCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaChldnQpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udHJvbERhdGFTb3VyY2UoY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hLCBkYXRhOiBhbnkpIHtcclxuICAgICAgICBpZiAoZGF0YS5fc291cmNlW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF07XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlO1xyXG4gICAgICAgIGlmIChjb250cm9sLmRhdGFTb3VyY2UgaW5zdGFuY2VvZiBGdW5jdGlvbikgcmV0dXJuIGNvbnRyb2wuZGF0YVNvdXJjZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbFRyZWVOb2RlIHtcclxuICAgIG1vZGVsUGF0aDogc3RyaW5nO1xyXG4gICAgc2NoZW1hUGF0aDogc3RyaW5nO1xyXG4gICAgZmllbGQ6IHN0cmluZztcclxuICAgIHBhcmVudE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIHJvb3ROb2RlOiBDb250cm9sVHJlZU5vZGU7XHJcbiAgICBjaGlsZE5vZGVzOiBDb250cm9sVHJlZU5vZGVbXSA9IFtdO1xyXG4gICAgY29udHJvbDogRm9ybUNvbnRyb2xCYXNlO1xyXG4gICAgZm9ybUNvbnRyb2xzO1xyXG4gICAga2V5c1BsdXM6IHN0cmluZ1tdO1xyXG4gICAgcHJpdmF0ZSBfY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBjaGlsZE5vZGVEaWMgPSB7fTtcclxuICAgIHByaXZhdGUgZGF0YTogYW55O1xyXG4gICAgcHJpdmF0ZSBoYXNTY2hlbWEgPSB0cnVlO1xyXG4gICAgY29uc3RydWN0b3IobW9kZWw6IGFueSwgc2NoZW1hczogW10sIGZpZWxkPywgcGFyZW50Tm9kZT86IENvbnRyb2xUcmVlTm9kZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG1vZGVsO1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xzID0gc2NoZW1hcztcclxuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5tb2RlbFBhdGggIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZmllbGQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFBhdGggPSBwYXJlbnROb2RlLm1vZGVsUGF0aCArICdbJyArIGZpZWxkICsgJ10nO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IHBhcmVudE5vZGUuc2NoZW1hUGF0aDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1NjaGVtYSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbFBhdGggPSBmaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IGZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlID0gcGFyZW50Tm9kZS5yb290Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkO1xyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbCA9IHNjaGVtYXNbdGhpcy5zY2hlbWFQYXRoXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2xbJ25vZGVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xbJ25vZGVzJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXVt0aGlzLm1vZGVsUGF0aF0gPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYXNbdGhpcy5zY2hlbWFQYXRoXTtcclxuICAgICAgICBsZXQga2V5c1BsdXMgPSBbXTtcclxuICAgICAgICBpZiAoc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLmNvbnRyb2xzLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzUGx1cyA9IHNjaGVtYS5yb3dUZW1wbGF0ZS5maWx0ZXIocSA9PiBxLmZpZWxkKS5tYXAocSA9PiBxLmZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYVBhdGgpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gT2JqZWN0LmtleXMoc2NoZW1hcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5rZXlzUGx1cyA9IGtleXNQbHVzO1xyXG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXMobW9kZWwsIHNjaGVtYXMsIGtleXNQbHVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVpbml0Q2hpbGROb2RlcygpIHtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXModGhpcy5kYXRhLCB0aGlzLmZvcm1Db250cm9scywgdGhpcy5rZXlzUGx1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q2hpbGROb2Rlcyhtb2RlbDogYW55LCBzY2hlbWFzOiBbXSwga2V5c1BsdXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgY29uc3QgYWxsS2V5ID0gbmV3IFNldChbLi4ua2V5c1BsdXMsIC4uLk9iamVjdC5rZXlzKG1vZGVsKV0pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBhbGxLZXkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJyAmJiBrZXkgIT0gS2V5Rmxhc2hTaG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZShtb2RlbFtrZXldLCBzY2hlbWFzLCBrZXksIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVEaWNbY2hpbGROb2RlLmZpZWxkXSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtb2RlbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKGl0ZW0sIHNjaGVtYXMsIGksIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnROb2RlID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2RlRGljW2NoaWxkTm9kZS5maWVsZF0gPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGlsZE5vZGUoZmllbGQpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZURpY1tmaWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q3J1ZEZvcm0oY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5fY3J1ZEZvcm0gPSBjcnVkRm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFyZW50TW9kZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5tb2RlbDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFyZW50TW9kZWxQYXRoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUubW9kZWxQYXRoO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRDb250cm9sKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9kZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdO1xyXG4gICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbW9kZWwodmFsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF0gPSB2YWw7XHJcbiAgICAgICAgZWxzZSB0aGlzLmRhdGEgPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXTtcclxuICAgICAgICBlbHNlIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHZhbHVlKHZhbCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdID0gdmFsO1xyXG4gICAgICAgIGVsc2UgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRIaWRkZW4oZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XHJcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGYsIGhpZGRlbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRIaWRkZW5GaWVsZChmaWVsZCwgaGlkZGVuKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRIaWRkZW5GaWVsZChmaWVsZDogc3RyaW5nLCBoaWRkZW46IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoZmllbGQuaW5kZXhPZignLicpID4gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5nZXROb2RlQnlQYXRoKGAke3RoaXMubW9kZWxQYXRofS4ke2ZpZWxkfWApO1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZC5zcGxpdCgnLicpLnBvcCgpO1xyXG4gICAgICAgICAgICBjaGlsZE5vZGUucGFyZW50Tm9kZS5kYXRhLl9zdGF0dXNbbGFzdEZpZWxkXS5oaWRkZW4gPSBoaWRkZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuX3N0YXR1c1tmaWVsZF0uaGlkZGVuID0gaGlkZGVuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5UGF0aChtb2RlbFBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChtb2RlbFBhdGggPT0gbnVsbCB8fCBtb2RlbFBhdGggPT09ICcnKSByZXR1cm4gdGhpcy5yb290Tm9kZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5UcmVlKHRoaXMucm9vdE5vZGUsIG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5U2NoZW1hUGF0aChzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAoc2NoZW1hUGF0aCA9PSBudWxsIHx8IHNjaGVtYVBhdGggPT09ICcnKSByZXR1cm4gdGhpcy5yb290Tm9kZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kU2NoZW1hSW5UcmVlKHRoaXMucm9vdE5vZGUsIHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaW5kSW5UcmVlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgbW9kZWxQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAobm9kZS5tb2RlbFBhdGggIT0gbnVsbCAmJiBub2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpID09IG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSByZXR1cm4gbm9kZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLm1vZGVsUGF0aCAhPSBudWxsICYmIG1vZGVsUGF0aC5zdGFydHNXaXRoKGNoaWxkTm9kZS5tb2RlbFBhdGgudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuZmluZEluVHJlZShjaGlsZE5vZGUsIG1vZGVsUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlKSByZXR1cm4gcmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaW5kU2NoZW1hSW5UcmVlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgc2NoZW1hUGF0aCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgaWYgKG5vZGUuc2NoZW1hUGF0aCAhPSBudWxsICYmIG5vZGUuc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpID09IHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5zY2hlbWFQYXRoICE9IG51bGwgJiYgc2NoZW1hUGF0aC5zdGFydHNXaXRoKGNoaWxkTm9kZS5zY2hlbWFQYXRoLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSB0aGlzLmZpbmRTY2hlbWFJblRyZWUoY2hpbGROb2RlLCBzY2hlbWFQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUpIHJldHVybiByZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0RGF0YVNvdXJjZVRhYmxlU2NoZW1hKHBhdGg6IHN0cmluZywgZGF0YVNvdXJjZTogYW55W10pIHtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgocGF0aCk7XHJcbiAgICAgICAgaWYgKCF0YWJsZU5vZGUubW9kZWwpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0YWJsZU5vZGUubW9kZWwubGVuZ3RoID4gZGF0YVNvdXJjZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsID0gdGFibGVOb2RlLm1vZGVsLnNwbGljZShkYXRhU291cmNlLmxlbmd0aCwgZGF0YVNvdXJjZS5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlTm9kZS5tb2RlbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBtZXJnZUpTT05PbGQodGFibGVOb2RlLm1vZGVsW2ldLCBkYXRhU291cmNlW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSB0YWJsZU5vZGUubW9kZWwubGVuZ3RoOyBpIDwgZGF0YVNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlLl9jcnVkRm9ybS5hZGROZXdSb3coPFRhYmxlU2NoZW1hPnRhYmxlTm9kZS5jb250cm9sLCBwYXRoKTtcclxuICAgICAgICAgICAgbWVyZ2VKU09OT2xkKHRhYmxlTm9kZS5tb2RlbFtpXSwgZGF0YVNvdXJjZVtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
2270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuTCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUNILG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIsK0JBQStCLEVBQy9CLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4Qiw4QkFBOEIsRUFDOUIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixnQkFB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Q0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBYyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hFLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25EO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0ICogYXMgalF1ZXJ5XyBmcm9tICdqcXVlcnknO1xyXG5pbXBvcnQgKiBhcyBuYW5vaWRfIGZyb20gJ25hbm9pZCc7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBwLWNvbnRleHQvY29tcG9uZW50LWNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Jhc2UvY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBGb3JtU3RhdGUsIEtleUZsYXNoU2hvdyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcclxuaW1wb3J0IHtcclxuICAgIEFkZHJlc3NDb250cm9sU2NoZW1hLFxyXG4gICAgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSxcclxuICAgIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBCdXR0b25Db250cm9sU2NoZW1hLFxyXG4gICAgQ2hlY2tib3hDb250cm9sU2NoZW1hLFxyXG4gICAgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSxcclxuICAgIENvQ2F1VG9DaHVjQ29udHJvbFNjaGVtYSxcclxuICAgIENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIENvbG9yQ29udHJvbFNjaGVtYSxcclxuICAgIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIENvbHVtblNjaGVtYUJhc2UsXHJcbiAgICBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb250YWluZXJTY2hlbWEsXHJcbiAgICBDcnVkRm9ybVNldHRpbmcsXHJcbiAgICBDcnVkTGlzdFNldHRpbmcsXHJcbiAgICBDdXN0b21Db250cm9sU2NoZW1hLFxyXG4gICAgRGF0ZVRpbWVDb250cm9sU2NoZW1hLFxyXG4gICAgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBEcm9wZG93bkNvbnRyb2xTY2hlbWEsXHJcbiAgICBFZGl0b3JDb250cm9sU2NoZW1hLFxyXG4gICAgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEV2ZW50RGF0YSxcclxuICAgIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hLFxyXG4gICAgRmlsZVVwbG9hZE1vZGUsXHJcbiAgICBGb3JtQ29udHJvbEJhc2UsXHJcbiAgICBGb3JtQ29udHJvbEJhc2VXaXRoU2VydmljZSxcclxuICAgIEZvcm1TY2hlbWFCYXNlLFxyXG4gICAgS2V5VmFsdWVDb250cm9sU2NoZW1hLFxyXG4gICAgTGFiZWxTY2hlbWEsXHJcbiAgICBNYXNrQ29udHJvbFNjaGVtYSxcclxuICAgIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSxcclxuICAgIE9wZXJhdG9yLFxyXG4gICAgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIFBlcmNlbnRDb250cm9sU2NoZW1hLFxyXG4gICAgUG9wdXBTaXplLFxyXG4gICAgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSxcclxuICAgIFNwYW5Db250cm9sU2NoZW1hLFxyXG4gICAgU3dpdGNoQ29udHJvbFNjaGVtYSxcclxuICAgIFRhYmxlU2NoZW1hLFxyXG4gICAgVGVtcGxhdGVDb250cm9sU2NoZW1hLFxyXG4gICAgVGV4dEFsaWduLFxyXG4gICAgVGV4dEFyZWFDb250cm9sU2NoZW1hLFxyXG4gICAgVGV4dENvbnRyb2xTY2hlbWEsXHJcbiAgICBUaXRsZVNjaGVtYSxcclxuICAgIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIFdyYXBQaWNrZXJDb250cm9sU2NoZW1hLFxyXG59IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9jb25zdC9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NydWQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktcGlja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXN0ZXJEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21hc3Rlci1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERyb3Bkb3duU2VydmljZSB9IGZyb20gJy4uLy4uL2Ryb3Bkb3duL3NlcnZpY2VzL2Ryb3Bkb3duLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBiYXNlVHJpbmhLeSwgZ2V0UmVnZXhSZXN1bHQsIGdldFN0cmluZ0Rpc3BsYXlWYWx1ZSwgbG9vcEN1cnNvckZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBHbWFpbENvcnJlY3RvciwgTG93ZXJDb3JyZWN0b3IgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb3JyZWN0b3JzJztcclxuaW1wb3J0IHtcclxuICAgIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yLFxyXG4gICAgQ2hlY2tEdXBsaWNhdGVWYWxpZGF0b3IsXHJcbiAgICBDb21wYXJlVmFsaWRhdG9yLFxyXG4gICAgRGF0ZUNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICBFbWFpbFZhbGlkYXRvcixcclxuICAgIE51bWJlckNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICBOdW1iZXJPbmx5VmFsaWRhdG9yLFxyXG4gICAgUGhvbmVOdW1iZXJWYWxpZGF0b3IsXHJcbiAgICBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcixcclxuICAgIFJlcXVpcmVkVmFsaWRhdG9yLFxyXG4gICAgU2FtZVZhbHVlVmFsaWRhdG9yXHJcbn0gZnJvbSAnLi8uLi8uLi8uLi9jbGFzc2VzL2Jhc2UvdmFsaWRhdG9ycyc7XHJcbmltcG9ydCB7IGlzQXJyYXksIGlzTGl0ZXJhbE9iamVjdCwgbWVyZ2VKU09OLCBtZXJnZUpTT05PbGQgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvZW52aXJvbm1lbnQtc2NoZW1hJztcclxuaW1wb3J0IHsgQ29tQ3R4Q29uc3RhbnRzIH0gZnJvbSAnLi8uLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi8uLi8uLi8uLi9tb2RlbHMvZ3JpZC1pbmZvJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcblxyXG4vLyBmaXggZm9yIGJ1aWxkIHByb2RcclxuY29uc3QgbmFub2lkID0gbmFub2lkXztcclxuY29uc3QgalF1ZXJ5ID0galF1ZXJ5XztcclxuXHJcbmRlY2xhcmUgdmFyIHRpbnltY2U6IGFueTtcclxuXHJcbmNvbnN0IG9wZXJhdG9yQ29udHJhc3QgPSB7XHJcbiAgICBbT3BlcmF0b3IuZ3JlYXRlcl06IE9wZXJhdG9yLmxvd2VyLFxyXG4gICAgW09wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5sb3dlclRoYW5FcXVhbCxcclxuICAgIFtPcGVyYXRvci5sb3dlcl06IE9wZXJhdG9yLmdyZWF0ZXIsXHJcbiAgICBbT3BlcmF0b3IubG93ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY3J1ZC1mb3JtJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jcnVkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtDb21wb25lbnRDb250ZXh0U2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENydWRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICAgIEBWaWV3Q2hpbGQoJ2Zvcm1FbGVtZW50JykgZm9ybUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdjb250ZXh0TWVudScsIHsgc3RhdGljOiBmYWxzZSB9KSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XHJcbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBjaGlsZHJlbjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlQ29uZ1ZpZWNGb3JtJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCB0ZW1wbGF0ZUNvbmdWaWVjRm9ybSh2YWx1ZTogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVzW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dCgpIHNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcclxuICAgIEBJbnB1dCgpIGNvbnRleHQ6IENvbXBvbmVudENvbnRleHRTZXJ2aWNlO1xyXG5cclxuICAgIEBJbnB1dCgpIGZpbGVzVXBsb2FkZWQgPSBbXTtcclxuICAgIEBJbnB1dCgpIGlzVmlld01vZGUgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVLZXlwcmVzc0NvbnRyb2wgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVDYWNoaW5nID0gZmFsc2U7XHJcbiAgICBfc3R5bGVDbGFzcyA9ICdwLWZsdWlkIGNydWQtZm9ybS1jb250YWluZXInO1xyXG4gICAgQElucHV0KCkgc2V0IHN0eWxlQ2xhc3ModmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCBjcnVkLWZvcm0tY29udGFpbmVyJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZUNsYXNzICs9IGAgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBmb3JtSWQgPSAnJztcclxuICAgIEBJbnB1dCgpIGZvcm1DbGFzcyA9ICcnO1xyXG4gICAgQElucHV0KCkgYXV0b0ZvY3VzID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHRyYXBGb2N1cyA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgc2V0IGRhdGEodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY2FuUHJpbnQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5fbWluaW1pemVkRGF0YSAhPSB2YWx1ZSAmJiBpc0xpdGVyYWxPYmplY3QodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YSA9IG1lcmdlSlNPTih0aGlzLl9tb2RlbERhdGEsIHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5jbGVhbigpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKHRoaXMuX21vZGVsRGF0YSwgdGhpcy5mb3JtQ29udHJvbHMpO1xyXG4gICAgICAgICAgICB0aGlzLl9yb290Tm9kZS5zZXRDcnVkRm9ybSh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdtb2RlbENoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZWQuZW1pdChldmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvYWRlZERhdGFFZGl0T2xkICYmIHRoaXMubG9hZGVkRGF0YUVkaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FuUHJpbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0NhblByaW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tb2RlbERhdGEgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnbW9kZWxDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2VkLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBASW5wdXQoKSBmb3JtU3RhdGU6IEZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5FRElUO1xyXG5cclxuICAgIEBPdXRwdXQoKSBvbkZvcm1SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ29udHJvbFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BbGxDb250cm9sUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbk1vZGVsQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPEV2ZW50RGF0YT4gPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50RGF0YT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkFmdGVyVHJpbmhLeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIF9yb290Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xyXG4gICAgX21pbmltaXplZERhdGE6IGFueTtcclxuICAgIF9tb2RlbERhdGE6IGFueSA9IHt9O1xyXG4gICAgX3Vuc3Vic2NyaWJlQWxsID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgX2luVmFsaWRGb3JtID0gZmFsc2U7XHJcblxyXG4gICAgLy8gRG9jIHR1IGNhdSBoaW5oIHRoYW0gc28gaGUgdGhvbmdcclxuICAgIGxpbWl0U2l6ZSA9IDA7XHJcbiAgICBmb3JtQ29udHJvbHM6IGFueSA9IFtdO1xyXG4gICAgZnVuY0NoZWNrVW5pcXVlRmllbGQ6IGFueSA9IHt9O1xyXG4gICAgYmVmb3JlRGF0YTogYW55ID0ge307XHJcbiAgICBmaXJzdERpdkhvbGRlcjogYW55O1xyXG4gICAgY2FjaGVkVmFsdWVzID0ge307XHJcbiAgICB0ZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogVGVtcGxhdGVSZWY8YW55PiB9ID0ge307XHJcbiAgICBfcHJlZml4Q3VzdG9tSGVhZGVyID0gJ2N1c3RvbUhlYWRlcl8nO1xyXG4gICAgY29uZ1ZpZWNTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmc7XHJcblxyXG4gICAgbG9hZGVkRGF0YUVkaXRPbGQgPSBmYWxzZTtcclxuICAgIGxvYWRlZERhdGFFZGl0ID0gZmFsc2U7XHJcbiAgICBjYW5QcmludCA9IGZhbHNlO1xyXG5cclxuICAgIHRhYmxlRm9ybVNob3cgPSBmYWxzZTtcclxuICAgIHRhYmxlRm9ybVRpdGxlOiBzdHJpbmc7XHJcbiAgICB0YWJsZUZvcm1Qb3B1cFNpemUgPSBuZXcgUG9wdXBTaXplKHsgd2lkdGg6IDExMDAsIGhlaWdodDogNjUwIH0pO1xyXG4gICAgdGFibGVGb3JtRGF0YTogYW55ID0ge307XHJcbiAgICB0YWJsZUZvcm1DdXJyZW50Um93OiBudW1iZXI7XHJcbiAgICB0YWJsZUZvcm1TY2hlbWE6IEZvcm1TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgIHRhYmxlRm9ybUN1cnJlbnRJbmZvOiBhbnkgPSB7fTtcclxuXHJcbiAgICBidXR0b25Db250ZXh0czogTWVudUl0ZW1bXSA9IFtdO1xyXG4gICAgcm93RGF0YUN1cnJlbnQ6IGFueSA9IHt9O1xyXG4gICAgY29udHJvbE5lZWRDaGVja1JlYWR5OiBGb3JtU2NoZW1hQmFzZVtdID0gW107XHJcbiAgICByZWFkeVN0YXR1czogYW55ID0ge307XHJcbiAgICBmaWVsZFBhcmVudEZpZWxkID0gJ3BhcmVudEZpZWxkJztcclxuICAgIHdhaXRSZWFkeUFuZFByaW50VGltZW91dDogYW55O1xyXG4gICAgcHVibGljIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcclxuICAgIHB1YmxpYyBfbWFzdGVyRGF0YVNlcnZpY2U6IE1hc3RlckRhdGFTZXJ2aWNlO1xyXG4gICAgcHVibGljIF91c2VyU2VydmljZTogVXNlclNlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHVibGljIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9kZXZpY2VEZXRlY3RvclNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9kcm9wZG93blNlcnZpY2U6IERyb3Bkb3duU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgIHB1YmxpYyBfZW50aXR5UGlja2VyU2VydmljZTogRW50aXR5UGlja2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9tb2R1bGVDb25maWc6IE1vZHVsZUNvbmZpZ1NlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChOb3RpZmllclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX21hc3RlckRhdGFTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KE1hc3RlckRhdGFTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl91c2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChVc2VyU2VydmljZSk7XHJcblxyXG4gICAgICAgIC8vIEdldCBDb25maWd1cmF0aW9uU3lzdGVtXHJcbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UuZ2V0Q29uZmlnQnlDb2RlKCdTaXplT2ZGaWxlJykudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saW1pdFNpemUgPSBOdW1iZXIocmVzcG9uc2UpICogMTAwMCAqIDEwMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5oaWRkZW5UcmluaEt5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgIG5ldyBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdwcmludEZpbGVJZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdGaWxlJyxcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBGaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAobW9kZWwsIGN1cnJlbnROb2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbW9kZWwucHJpbnRGaWxlSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdExvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2hWaWV3TW9kZShyZWFkb25seVZpZXcgPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZpZXdNb2RlID0gcmVhZG9ubHlWaWV3O1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoY29udHJvbCwgdGhpcy5pc1ZpZXdNb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKCkge1xyXG4gICAgICAgIHRoaXMuaW5pdExvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhbigpIHtcclxuICAgICAgICB0aGlzLmNsZWFuTW9kZWwodGhpcy5fbW9kZWxEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsZWFuTW9kZWwobW9kZWwpIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnX3N0YXR1cycpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgaW4gbW9kZWxba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFtrZXldW3NdID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gJ19lcnJvcnMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxba2V5XVtzXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5Nb2RlbChtb2RlbFtrZXldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5Nb2RlbChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1pbmltaXplRGF0YShtb2RlbCkge1xyXG4gICAgICAgIGlmIChpc0xpdGVyYWxPYmplY3QobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGlmIChtb2RlbC5fZHJvcGRvd252YWx1ZSAhPSBudWxsICYmIG1vZGVsLl9kcm9wZG93bnZhbHVlICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW21vZGVsLl9kcm9wZG93bnZhbHVlXSB8fCBtb2RlbFsndmFsdWUnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSAnX3N0YXR1cycgJiYga2V5ICE9ICdfZXJyb3JzJyAmJiBrZXkgIT0gJ19zb3VyY2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE1pbmltaXplRGF0YShtb2RlbFtrZXldKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuZ2V0TWluaW1pemVEYXRhKGl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TG9hZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5zY2hlbWEpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnZm9ybVJlYWR5JyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybVJlYWR5LmVtaXQoZm9ybUV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNjaGVtYSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSB0aGlzLmFwcGx5Q2FjaGVkVmFsdWVzKCk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdmb3JtUmVhZHknLFxyXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdChmb3JtRXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNjaGVtYSgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3Rvcihjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XHJcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBjb250cm9sLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcclxuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWRkTW9yZSA9IGNvbnRyb2wuaW5pdFJvd0NvdW50IC0gcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdGjhu7FjIGhp4buHbiBzYXUgY8O5bmcga2hpIHThuqV0IGPhuqMgbW9kZWwgxJHDoyBpbml0IHhvbmdcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTXVsdGlSb3coY29udHJvbCwgYWRkTW9yZSwgX3BhcmVudFBhdGgsICdpbml0Jyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIC8vIGlmICghcGFyZW50TW9kZWwuaGFzT3duUHJvcGVydHkoY29udHJvbC5maWVsZCkgJiYgY29udHJvbC5maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgIC8vICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIC8vICAgICAvLyB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb250cm9sRGVmYXVsdFZhbHVlRnJvbUV4dGVybmFsKCkge1xyXG4gICAgICAgIC8vIGNvbnN0IHNjaGVtYUR5bmFtaWNzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZSh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICAvLyBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEN1c3RvbUNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgLy8gICAgICYmIHRoaXMuY2hlY2tJc0R5bmFtaWNDb250cm9sKGNvbnRyb2wpXHJcbiAgICAgICAgICAgIC8vICkge1xyXG4gICAgICAgICAgICAvLyAgICAgc2NoZW1hRHluYW1pY3MucHVzaChjb250cm9sKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBU4bqhbSB0aOG7nWkgayByZW5kZXIgbHXDtG4gdMOqbiBjw7RuZyB2aeG7h2MgdHJvbmcgZm9ybSBpbml0LCB2w6wgxJFhbmcgayBraeG7g20gc2/DoXQgZGMga2hpIG7DoG8gdOG6pXQgY+G6oyBjb250cm9sIHJlYWR5XHJcbiAgICAgICAgLy8gc2NoZW1hRHluYW1pY3MuZm9yRWFjaChzY2hlbWEgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnJlbmRlclRlbkNvbmdWaWVjKHRoaXMuX21vZGVsRGF0YSwgc2NoZW1hKTtcclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDb250cm9sRGVmYXVsdFZhbHVlKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBjb250cm9sLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcclxuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWRkTW9yZSA9IGNvbnRyb2wuaW5pdFJvd0NvdW50IC0gcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZShwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsLmhhc093blByb3BlcnR5KGNvbnRyb2wuZmllbGQpICYmIGNvbnRyb2wuZmllbGQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBjb250cm9sLmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbC5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbFswXS52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgZmllbGQpIHtcclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zb3VyY2UpIHBhcmVudE1vZGVsLl9zb3VyY2UgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fc3RhdHVzKSBwYXJlbnRNb2RlbC5fc3RhdHVzID0ge307XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fZXJyb3JzKSBwYXJlbnRNb2RlbC5fZXJyb3JzID0ge307XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3N0YXR1c1tmaWVsZF0pIHBhcmVudE1vZGVsLl9zdGF0dXNbZmllbGRdID0ge307XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fZXJyb3JzW2ZpZWxkXSkgcGFyZW50TW9kZWwuX2Vycm9yc1tmaWVsZF0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDb250cm9sU2NoZW1hKHNjaGVtYTogRm9ybVNjaGVtYUJhc2UsIHBhcmVudElkPykge1xyXG4gICAgICAgIGlmIChzY2hlbWEuZGlzYWJsZWQgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc1ZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY2hlbWEubGFiZWwgJiYgIXNjaGVtYS5mdWxsTGFiZWwpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmZ1bGxMYWJlbCA9IHNjaGVtYS5sYWJlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYVxyXG4gICAgICAgICAgICB8fCBzY2hlbWEgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzY2hlbWEuc2hvd0xhYmVsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghc2NoZW1hLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWEuZmllbGQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYS5maWVsZCkge1xyXG4gICAgICAgICAgICBsZXQga2V5ID0gc2NoZW1hLmZpZWxkO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50SWQgIT0gbnVsbCkga2V5ID0gcGFyZW50SWQgKyAnLicgKyBrZXk7XHJcbiAgICAgICAgICAgIHNjaGVtYS51bmlxdWVGaWVsZCA9IGtleTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbHNba2V5XSA9IHNjaGVtYTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjaGVtYVsnY29udHJvbFR5cGUnXSA9IHRoaXMuZ2V0Q29udHJvbFR5cGUoc2NoZW1hKTtcclxuICAgICAgICBzY2hlbWFbJ2RhdGFUeXBlJ10gPSB0aGlzLmdldFZpZXdNb2RlRGF0YVR5cGUoc2NoZW1hKTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgc3ViQ29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdID0gY29udHJvbC51bmlxdWVGaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgc2NoZW1hLnVuaXF1ZUZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZHJvcGRvd25Db250cm9sU2NoZW1hID0gPERyb3Bkb3duQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5yZXR1cm5UeXBlID0gJ29iamVjdCc7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCFkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5sb2FkT25Jbml0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5maWx0ZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyUGlja2VyQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICB1c2VyUGlja2VyQ29udHJvbFNjaGVtYS5yZXR1cm5UeXBlID0gJ29iamVjdCc7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHN1YkNvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXSA9IGNvbnRyb2wudW5pcXVlRmllbGQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGNvbnRyb2wudW5pcXVlRmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlQ29udHJvbFNjaGVtYSA9IDxBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlQ29udHJvbFNjaGVtYS5yZXR1cm5UeXBlID0gJ29iamVjdCc7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQWRkcmVzc0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ3VzdG9tQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja0lzVGFza0NvbnRyb2woc2NoZW1hKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25nVmllY1NldHRpbmcgPSBuZXcgQ3J1ZExpc3RTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmdWaWVjU2V0dGluZy5pc1dvcmtmbG93VHJlZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWEuZGF0YS5maWVsZFBhcmVudEZvclRhc2tzID0gW107XHJcbiAgICAgICAgICAgICAgICBsb29wQ3Vyc29yRnVuY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UmVnZXhSZXN1bHQoc2NoZW1hLmRhdGEuX190ZW1wbGF0ZVRhc2tOYW1lLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0sIGV4ZWNSZXN1bHQgPT4gZXhlY1Jlc3VsdFsxXSksXHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEuZGF0YS5maWVsZFBhcmVudEZvclRhc2tzLnB1c2goZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFDaGlsZCA9IHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hQ2hpbGQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNb3JlT25DaGFuZ2VFdmVudChzY2hlbWFDaGlsZCwgKGV2dDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUZW5Db25nVmllYyhldnQucm9vdE1vZGVsLCBzY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGlzYWJsZUNvbnRyb2xTY2hlbWEoc2NoZW1hOiBGb3JtU2NoZW1hQmFzZSwgZGlzYWJsZWQgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmRpc2FibGVkID0gZGlzYWJsZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgZGlzYWJsZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGRpc2FibGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrSXNUYXNrQ29udHJvbChzY2hlbWEpIHtcclxuICAgICAgICByZXR1cm4gc2NoZW1hLmZpZWxkID09IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xcclxuICAgICAgICAgICAgJiYgc2NoZW1hLmRhdGFcclxuICAgICAgICAgICAgJiYgc2NoZW1hLmRhdGEuX190ZW1wbGF0ZVRhc2tOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclRlbkNvbmdWaWVjKG1vZGVsOiBhbnksIHNjaGVtYTogQ3VzdG9tQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgIGxldCB0ZW1wbGF0ZVRleHQgPSBzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWU7XHJcbiAgICAgICAgc2NoZW1hLmRhdGEuZmllbGRQYXJlbnRGb3JUYXNrcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgdGVtcGxhdGVUZXh0ID0gdGVtcGxhdGVUZXh0LnJlcGxhY2UoYHt7aXRlbS4ke2ZpZWxkfX19YCwgZ2V0U3RyaW5nRGlzcGxheVZhbHVlKG1vZGVsW2ZpZWxkXSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNjaGVtYS5kYXRhLnRlbkNvbmdWaWVjID0gdGVtcGxhdGVUZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHNjaGVtYTogYW55KSB7XHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duKGRyb3Bkb3duQ29udHJvbFNjaGVtYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWE6IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICBsZXQgdG1wRmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgIHRtcEZpbHRlcnMgPSBkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiAoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRtcEZpbHRlcnMgPSBkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRtcEZpbHRlcnMgPSBhd2FpdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRtcEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zZXR0aW5nLnNjaGVtYS5maW5kKHEgPT4gcS5maWVsZCA9PSBzb3VyY2VGaWVsZCk7XHJcbiAgICAgICAgICAgIGlmICghZmlsdGVyLnN1YkZpZWxkXHJcbiAgICAgICAgICAgICAgICAmJiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hIHx8IHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIuc3ViRmllbGQgPSBzY2hlbWEudmFsdWVGaWVsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IG1hcmtlZENvbnRyb2wgPSB7fTtcclxuICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoZHJvcGRvd25Db250cm9sU2NoZW1hLCB0bXBGaWx0ZXJzLCBtYXJrZWRDb250cm9sKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93bjogRHJvcGRvd25Db250cm9sU2NoZW1hIHwgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSwgdG1wRmlsdGVyczogRmlsdGVyW10sIG1hcmtlZENvbnRyb2wpIHtcclxuICAgICAgICBpZiAodG1wRmlsdGVycyBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRtcEZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpZWxkID0gZmlsdGVyLnNvdXJjZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RHJvcGRvd24gPSB0aGlzLmZvcm1Db250cm9sc1tzb3VyY2VGaWVsZF07XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50RHJvcGRvd24gJiYgIW1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFya2VkQ29udHJvbFtzb3VyY2VGaWVsZF0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZU9uQ2hhbmdlRXZlbnQocGFyZW50RHJvcGRvd24sIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmVlZEdldERhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLmFsbG93TG9hZERhdGFXaGVuUGFyZW50TnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LmV2ZW50VHlwZSA9PSAnYWRqdXN0VmFsdWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEdldERhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQudmFsdWUgPT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LnZhbHVlID09ICcnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGV2ZW50LnZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgZXZlbnQudmFsdWUubGVuZ3RoID09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQucmVzZXRDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEdldERhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRHZXREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2NydWRTZXJ2aWNlLmdldEZpbHRlckZyb21UZW1wbGF0ZSh0bXBGaWx0ZXJzLCBldmVudC5wYXJlbnRNb2RlbCwgZXZlbnQucm9vdE1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghKHBhcmVudERyb3Bkb3duIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyZW50RHJvcGRvd24uX2NvbXBvbmVudCAmJiBwYXJlbnREcm9wZG93bi5fY29tcG9uZW50Ll9oYXNMb2FkZWREYXRhc291cmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LmdldERhdGEoZmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudCAmJiBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93blJlY3Vyc2l2ZShjaGlsZERyb3Bkb3duLCBmaWx0ZXIuZmlsdGVycywgbWFya2VkQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRNb3JlT25DaGFuZ2VFdmVudChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIG5ld09uQ2hhbmdlKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZCkge1xyXG4gICAgICAgICAgICBjb25zdCBvbGRUcmlnZ2VyTG9hZENoaWxkID0gY29udHJvbC50cmlnZ2VyTG9hZENoaWxkO1xyXG4gICAgICAgICAgICBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb2xkVHJpZ2dlckxvYWRDaGlsZChldmVudCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0bXBGaWVsZE9sZE9uQ2hhbmdlID0gJ29sZE9uQ2hhbmdlJztcclxuICAgICAgICBpZiAoY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkT25DaGFuZ2UgPSBjb250cm9sLm9uQ2hhbmdlZDtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0gPSBvbGRPbkNoYW5nZTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbGRPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0gPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkT25DaGFuZ2UgPSBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNoYW5nZWQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9sZE9uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gY29udHJvbC50cmlnZ2VyTG9hZENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkanVzdGVkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEV2ZW50ID0gY29udHJvbC5vbkFkanVzdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZSA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZSA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UpIHtcclxuICAgICAgICBpZiAoIXNjaGVtYS5jb3JyZWN0b3JzKSBzY2hlbWEuY29ycmVjdG9ycyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoIXNjaGVtYS52YWxpZGF0b3JzKSBzY2hlbWEudmFsaWRhdG9ycyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IFJlcXVpcmVkVmFsaWRhdG9yKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgc2NoZW1hLnZhbGlkYXRvcnMuZm9yRWFjaCh2YWxpZGF0b3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydCh2YWxpZGF0b3IsIHNjaGVtYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dFNjaGVtYSA9ICg8VGV4dENvbnRyb2xTY2hlbWE+c2NoZW1hKTtcclxuICAgICAgICAgICAgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnbnVtYmVyJyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2Ftb3VudCcpIHtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBOdW1iZXJPbmx5VmFsaWRhdG9yKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnbW9uZXknIHx8IHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnbW9uZXlpbnQnKSB7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnZW1haWwnKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgRW1haWxWYWxpZGF0b3IoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0U2NoZW1hLmNvcnJlY3RvcnMpIHRleHRTY2hlbWEuY29ycmVjdG9ycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS5jb3JyZWN0b3JzLnB1c2gobmV3IEdtYWlsQ29ycmVjdG9yKCkpO1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS5jb3JyZWN0b3JzLnB1c2gobmV3IExvd2VyQ29ycmVjdG9yKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAncGhvbmUnIHx8IHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnZmF4Jykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IFBob25lTnVtYmVyVmFsaWRhdG9yKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGV4dFNjaGVtYS52YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMuZm9yRWFjaCh2YWxpZGF0b3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydCh2YWxpZGF0b3IsIHRleHRTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZVNjaGVtYSA9ICg8RGF0ZVRpbWVDb250cm9sU2NoZW1hPnNjaGVtYSk7XHJcbiAgICAgICAgICAgIGlmIChkYXRlVGltZVNjaGVtYS52YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlVGltZVNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgRGF0ZUNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KHZhbGlkYXRvciwgZGF0ZVRpbWVTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYSwgdmFsaWRhdG9yLmdldER1cGxpY2F0ZUZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JSZXF1aXJlZHMoc2NoZW1hLCB2YWxpZGF0b3IuZ2V0UmVxdWlyZWRGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgU2FtZVZhbHVlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNhbWVWYWx1ZVZhbGlkYXRvcnMoc2NoZW1hLCB2YWxpZGF0b3IuZ2V0U2FtZUZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQoXHJcbiAgICAgICAgdmFsaWRhdG9yOiBEYXRlQ29tcGFyZVZhbGlkYXRvciB8IE51bWJlckNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICAgICAgc2NoZW1hOiBEYXRlVGltZUNvbnRyb2xTY2hlbWEgfCBUZXh0Q29udHJvbFNjaGVtYSB8IE1hc2tDb250cm9sU2NoZW1hXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCBjb21wYXJlVW5pcXVlRmllbGQgPSB2YWxpZGF0b3IuY29tcGFyZVVuaXF1ZUZpZWxkO1xyXG4gICAgICAgIGlmIChzY2hlbWEudW5pcXVlRmllbGQgPT0gY29tcGFyZVVuaXF1ZUZpZWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wZXJhdG9yQ29tcGFyZSA9IHZhbGlkYXRvci5nZXRPcGVyYXRvckNvbXBhcmUoKTtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hQ29tcGFyZSA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2NvbXBhcmVVbmlxdWVGaWVsZF0pO1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hQ29tcGFyZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIENvbXBhcmVWYWxpZGF0b3JcclxuICAgICAgICAgICAgICAgICAgICAmJiBwLmNvbXBhcmVVbmlxdWVGaWVsZCA9PSBzY2hlbWEudW5pcXVlRmllbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBEYXRlQ29tcGFyZVZhbGlkYXRvcihvcGVyYXRvckNvbnRyYXN0W29wZXJhdG9yQ29tcGFyZV0sIHNjaGVtYS51bmlxdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IE51bWJlckNvbXBhcmVWYWxpZGF0b3Iob3BlcmF0b3JDb250cmFzdFtvcGVyYXRvckNvbXBhcmVdLCBzY2hlbWEudW5pcXVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVmFsaWRhdG9yQ2hlY2tEdXBsaWNhdGUoc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UsIGZpZWxkT3RoZXI6IHN0cmluZ1tdLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0RHVwbGljYXRlRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIF92YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFPdGhlci52YWxpZGF0b3JzLnB1c2goX3ZhbGlkYXRvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVWYWxpZGF0b3JSZXF1aXJlZHMoc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UsIGZpZWxkT3RoZXI6IHN0cmluZ1tdLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIFJlcXVpcmVkRmllbGRzVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0UmVxdWlyZWRGaWVsZHMoKSkpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdmFsaWRhdG9yID0gbmV3IFJlcXVpcmVkRmllbGRzVmFsaWRhdG9yKHRtcEZpZWxkcywgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlU2FtZVZhbHVlVmFsaWRhdG9ycyhzY2hlbWE6IEZvcm1Db250cm9sQmFzZSwgZmllbGRPdGhlcjogc3RyaW5nW10sIG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChmaWVsZE90aGVyLmluZGV4T2Yoc2NoZW1hLnVuaXF1ZUZpZWxkKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5maWVsZE90aGVyLCBzY2hlbWEuZmllbGRdO1xyXG4gICAgICAgICAgICBmaWVsZE90aGVyLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hT3RoZXIgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tmaWVsZF0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdG1wRmllbGRzID0gZmllbGRzLmZpbHRlcihwID0+IHAgIT0gc2NoZW1hT3RoZXIuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFPdGhlci52YWxpZGF0b3JzLnNvbWUocCA9PiBwIGluc3RhbmNlb2YgU2FtZVZhbHVlVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0U2FtZUZpZWxkcygpKSlcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF92YWxpZGF0b3IgPSBuZXcgU2FtZVZhbHVlVmFsaWRhdG9yKHRtcEZpZWxkcywgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXREYXRhRGVmYXVsdCgpIHtcclxuICAgICAgICBjb25zdCBzdHJpbmdEYXRhRGVmYXVsdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkRFRkFVTFRfREFUQSk7XHJcbiAgICAgICAgY29uc3QgZ2V0U2V0dGluZ0RhdGFEZWZhdWx0ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmdldENvbmZpZygpLmVudmlyb25tZW50LnNldHRpbmdEYXRhRGVmYXVsdDtcclxuICAgICAgICBpZiAoc3RyaW5nRGF0YURlZmF1bHQgJiYgKHRoaXMuX21vZGVsRGF0YSAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhQ2FjaGUgPSBKU09OLnBhcnNlKHN0cmluZ0RhdGFEZWZhdWx0KTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9ICg8RHJvcGRvd25Db250cm9sU2NoZW1hPml0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IChjb250cm9sLmZpZWxkICsgKGNvbnRyb2wudmFsdWVGaWVsZCA9PSAnaWQnID8gJycgOiBjb250cm9sLnZhbHVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdldFNldHRpbmdEYXRhRGVmYXVsdCkgeyAvLyBs4bqleSBj4bqldSBow6xuaCBmaWVsZCBtYXBQaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkTWFwR2V0Q2FjaGUgPSBnZXRTZXR0aW5nRGF0YURlZmF1bHRbY29udHJvbC5maWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZE1hcEdldENhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSAoZmllbGRNYXBHZXRDYWNoZSArIChjb250cm9sLnZhbHVlRmllbGQgPT0gJ2lkJyA/ICcnIDogY29udHJvbC52YWx1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFDYWNoZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFDYWNoZVsoPEZvcm1TY2hlbWFCYXNlPml0ZW0pLmZpZWxkXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhWyg8Rm9ybVNjaGVtYUJhc2U+aXRlbSkuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuZnVuY3Rpb24ubW9kaWZ5RGF0YUFmdGVyR2V0Q2FjaGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmZ1bmN0aW9uLm1vZGlmeURhdGFBZnRlckdldENhY2hlKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXBwbHlDYWNoZWRWYWx1ZXMoKSB7XHJcbiAgICAgICAgdGhpcy5nZXRDYWNoZWRWYWx1ZXNGcm9tU3RvcmFnZSgpO1xyXG4gICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRDYWNoZWRWYWx1ZVRvTW9kZWwobW9kZWwsIHVuaXF1ZUtleUNvbnRyb2w/LCBwYXRoPykge1xyXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgaWYgKGZpZWxkICE9ICdfZXJyb3JzJyAmJiBmaWVsZCAhPSAnX3N0YXR1cycgJiYgZmllbGQgIT0gJ19zb3VyY2UnKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3ViVW5pcXVlS2V5Q29udHJvbDtcclxuICAgICAgICAgICAgICAgIGlmICh1bmlxdWVLZXlDb250cm9sICE9IG51bGwgJiYgdW5pcXVlS2V5Q29udHJvbCAhPT0gJycpIHN1YlVuaXF1ZUtleUNvbnRyb2wgPSB1bmlxdWVLZXlDb250cm9sICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHN1YlVuaXF1ZUtleUNvbnRyb2wgPSBmaWVsZDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sc1tzdWJVbmlxdWVLZXlDb250cm9sXTtcclxuICAgICAgICAgICAgICAgIGlmICghY29udHJvbCkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3ViUGF0aDtcclxuICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aCAhPT0gJycpIHN1YlBhdGggPSBwYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHN1YlBhdGggPSBmaWVsZDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJNb2RlbCA9IG1vZGVsW2ZpZWxkXTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3ViTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYWNoZWRWYWx1ZVRvTW9kZWwoaXRlbSwgc3ViVW5pcXVlS2V5Q29udHJvbCwgc3ViUGF0aCArICdbJyArIGluZGV4ICsgJ10nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0xpdGVyYWxPYmplY3Qoc3ViTW9kZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYWNoZWRWYWx1ZVRvTW9kZWwoc3ViTW9kZWwsIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbC5lbmFibGVDYWNoaW5nICYmIHRoaXMuY2FjaGVkVmFsdWVzLmhhc093blByb3BlcnR5KHN1YlBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxbZmllbGRdID0gdGhpcy5jYWNoZWRWYWx1ZXNbc3ViUGF0aF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDYWNoZWRWYWx1ZXNGcm9tU3RvcmFnZSgpIHtcclxuICAgICAgICBjb25zdCBjYWNoZWRWYWx1ZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYWNoZWRWYWx1ZXMnKSk7XHJcbiAgICAgICAgaWYgKGNhY2hlZFZhbHVlcykge1xyXG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUlkKSBwYXRoTmFtZSArPSAnLycgKyB0aGlzLmZvcm1JZDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjYWNoZWRWYWx1ZXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlZFZhbHVlcyA9IGVsZW1lbnQudmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2F2ZUNhY2hlVmFsdWVzVG9TdG9yYWdlKCkge1xyXG4gICAgICAgIGxldCBjYWNoZWRWYWx1ZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYWNoZWRWYWx1ZXMnKSk7XHJcbiAgICAgICAgaWYgKCFjYWNoZWRWYWx1ZXMpIGNhY2hlZFZhbHVlcyA9IFtdO1xyXG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybUlkKSBwYXRoTmFtZSArPSAnLycgKyB0aGlzLmZvcm1JZDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY2FjaGVkVmFsdWVzW2ldO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWVzID0gdGhpcy5jYWNoZWRWYWx1ZXM7XHJcbiAgICAgICAgICAgICAgICBjaGVja0V4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNoZWNrRXhpc3QpIHtcclxuICAgICAgICAgICAgY2FjaGVkVmFsdWVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgcGF0aG5hbWU6IHBhdGhOYW1lLFxyXG4gICAgICAgICAgICAgICAgdmFsdWVzOiB0aGlzLmNhY2hlZFZhbHVlc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWNoZWRWYWx1ZXMnLCBKU09OLnN0cmluZ2lmeShjYWNoZWRWYWx1ZXMpKTtcclxuICAgIH1cclxuXHJcbiAgICB0cmlnZ2VyQ2hhbmdlKGZpZWxkUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChmaWVsZFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgIGlmIChjb250cm9sICYmIGN1cnJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCBudWxsLCAndHJpZ2dlcicsIGN1cnJlbnROb2RlLnBhcmVudE1vZGVsLCBjdXJyZW50Tm9kZS5wYXJlbnRNb2RlbFBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9Gb2N1cyAmJiAhdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzRmlyc3RDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmRhdGEuZmxhZ3MuaGFzRm9jdXNpbmdDb250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LCA4MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SXNMb2FkZWREYXRhRWRpdCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMubG9hZGVkRGF0YUVkaXRPbGQgPSB0aGlzLmxvYWRlZERhdGFFZGl0O1xyXG4gICAgICAgIHRoaXMubG9hZGVkRGF0YUVkaXQgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29udHJvbFR5cGUoY29udHJvbDogYW55KSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYSkgcmV0dXJuICd0aXRsZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYSkgcmV0dXJuICdsYWJlbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTcGFuQ29udHJvbFNjaGVtYSkgcmV0dXJuICdzcGFuQ29udHJvbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkgcmV0dXJuICdtYXNrJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdudW1iZXJyYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0Q29udHJvbCA9IDxUZXh0Q29udHJvbFNjaGVtYT5jb250cm9sO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB0ZXh0Q29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXknXHJcbiAgICAgICAgICAgICAgICB8fCB0ZXh0Q29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXlpbnQnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdtb25leSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ3Bob25lJ1xyXG4gICAgICAgICAgICAgICAgfHwgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ2ZheCdcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3Bob25lT3JmYXgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAndGV4dCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGVtcGxhdGVDb250cm9sU2NoZW1hKSByZXR1cm4gJ3RlbXBsYXRlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkYXRldGltZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZVJhbmdlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkYXRldGltZXJhbmdlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FkZHJlc3MnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSByZXR1cm4gJ2Ryb3Bkb3duJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVkaXRvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZWRpdG9yJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHRBcmVhQ29udHJvbFNjaGVtYSkgcmV0dXJuICd0ZXh0YXJlYSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBXcmFwUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvbW1vbi1waWNrZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQaOG6o2kgxJHhu4MgZMOybmcgZMaw4bubaSDhu58gYsOqbiB0csOqbiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSB2w6wgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSA6IFVzZXJQaWNrZXJDb250cm9sU2NoZW1hXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2F1dG9jb21wbGV0ZS1waWNrZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAndXNlci1waWNrZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdlbnRpdHktcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE9yZ2FuaXphdGlvblBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdvcmdhbml6YXRpb24tcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yy1waWNrZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvQ2F1VG9DaHVjQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvY2F1dG9jaHVjJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVDb250cm9sU2NoZW1hKSByZXR1cm4gJ2F1dG9jb21wbGV0ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTd2l0Y2hDb250cm9sU2NoZW1hKSByZXR1cm4gJ3N3aXRjaCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja2JveENvbnRyb2xTY2hlbWEpIHJldHVybiAnY2hlY2tib3gnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSkgcmV0dXJuICdjaGVja2JveGxpc3QnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3JhZGlvYnV0dG9ubGlzdCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wubW9kZSA9PSBGaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdzZXJ2aWNlRmlsZVVwbG9hZCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZmlsZU1hbmFnZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yUGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvckNvbnRyb2wnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHJldHVybiAndGFibGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSByZXR1cm4gJ2NvbnRhaW5lcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBCdXR0b25Db250cm9sU2NoZW1hKSByZXR1cm4gJ2J1dHRvbic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBWYW5CYW5QaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3ZhbmJhbic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29uZ3ZpZWMnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgUGVyY2VudENvbnRyb2xTY2hlbWEpIHJldHVybiAncGVyY2VudCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2x1bW5TY2hlbWFCYXNlKSByZXR1cm4gJ2NvbHVtbic7XHJcbiAgICAgICAgcmV0dXJuICdjdXN0b20nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRWaWV3TW9kZURhdGFUeXBlKGNvbnRyb2wpIHtcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRpdGxlU2NoZW1hKSByZXR1cm4gJ3RpdGxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIExhYmVsU2NoZW1hKSByZXR1cm4gJ2xhYmVsJztcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ21hc2snO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUNvbnRyb2wgPSA8RGF0ZVRpbWVDb250cm9sU2NoZW1hPmNvbnRyb2w7XHJcbiAgICAgICAgICAgIGlmIChkYXRlQ29udHJvbC5zaG93VGltZSkgcmV0dXJuICdkYXRldGltZSc7XHJcbiAgICAgICAgICAgIHJldHVybiAnZGF0ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRWRpdG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdodG1sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXInO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIFN3aXRjaENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrYm94Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIE9yZ2FuaXphdGlvblBpY2tlckNvbnRyb2xTY2hlbWFcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuICdoYXNEYXRhU291cmNlJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5tb2RlID09IEZpbGVVcGxvYWRNb2RlLnVzaW5nRmlsZUluc3RhbmNlSWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVVwbG9hZCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZpbGVTZXJ2aWNlVXBsb2FkJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdmaWxlTWFuYWdlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICAmJiAoY29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXknXHJcbiAgICAgICAgICAgICAgICB8fCBjb250cm9sLmRhdGFGb3JtYXQgPT09ICdtb25leWludCcpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvclBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSByZXR1cm4gJ3RhYmxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEtleVZhbHVlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhcHAta2V5LXZhbHVlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvbnRhaW5lcic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtKHNldFZhbGlkYXRlRm9ybSA9IHRydWUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBpZiAoc2V0VmFsaWRhdGVGb3JtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luVmFsaWRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVNb2RlbCh0aGlzLl9yb290Tm9kZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pblZhbGlkRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c1RvRmlyc3RFcnJvckNvbnRyb2woKTtcclxuICAgICAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1vZGVsKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghY2hpbGROb2RlLmNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuY2hpbGROb2RlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGROb2RlLmNvbnRyb2xbJ19oaWRkZW4nXSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMudmFsaWRhdGUoY2hpbGROb2RlLCB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5WYWxpZEZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwoY2hpbGROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtQ29udHJvbChmaWVsZFBhdGgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBpZiAoY29udHJvbE5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNvbnRyb2xOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZUNoYW5nZURyb3Bkb3duKGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykge1xyXG4gICAgICAgIGlmIChjb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gJ2hpZGUnKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgZXZlbnQsICdjaGFuZ2UnLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIGV2ZW50LCBldmVudFR5cGUsIHBhcmVudE1vZGVsLCBwYXJlbnRQYXRoLCBzb3VyY2VOb2RlLCBidWJibGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIMSQ4buDIG5ndXnDqm4gaMOgbSBk4bqhbmcgYXJyb3cgZnVuY3Rpb24gdsOsIGPDsyAxIHPhu5EgZm9ybSBraMOhYyBn4buNaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlRmllbGRWYWx1ZUNoYW5nZSA9IGFzeW5jIChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIGV2ZW50PywgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pID0+IHtcclxuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlO1xyXG5cclxuICAgICAgICAvLyByb3cgaW4gdGFibGVcclxuICAgICAgICBpZiAoY29udHJvbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIHBhcmVudE1vZGVsID0gcGFyZW50Tm9kZS5tb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB2YWx1ZSA9IGN1cnJlbnROb2RlLnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBhdXRvIGNvcnJlY3QgdmFsdWVcclxuICAgICAgICB2YWx1ZSA9IHRoaXMuY29ycmVjdFZhbHVlKGN1cnJlbnROb2RlKTtcclxuICAgICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAvLyB2YWxpZGF0ZSB2YWx1ZVxyXG4gICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGUoY3VycmVudE5vZGUpO1xyXG5cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICBzb3VyY2VOb2RlOiBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYnViYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmVudE5vZGUucGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUucGFyZW50Tm9kZSAhPSBwYXJlbnROb2RlLnJvb3ROb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShwYXJlbnROb2RlLmNvbnRyb2wsIGV2ZW50LCBldmVudFR5cGUsIHBhcmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbCwgcGFyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsUGF0aCwgc291cmNlTm9kZSB8fCBjdXJyZW50Tm9kZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZUNhY2hpbmcgJiYgY29udHJvbC5lbmFibGVDYWNoaW5nKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZUNvbnRyb2xWYWx1ZShjb250cm9sLCB2YWx1ZSwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQga2hpIGRyb3Bkb3duIMSRaeG7gXUgY2jhu4luaCB2YWx1ZSB04burIHJhdyB2YWx1ZSBk4bqhbmcgZ3VpZCB8IGludCB8IC4uLiA9PiBvYmplY3Qga2nhu4N1IHt2YWx1ZTogZ3VpZCB8IGludCB8IC4uLiwgLi4uIFsxIHPhu5EgdHLGsOG7nW5nIGtow6FjXX1cclxuICAgICAqIEBwYXJhbSBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gcGFyZW50UGF0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlQWRqdXN0VmFsdWVEcm9wZG93bkV2ZW50KGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ2FkanVzdFZhbHVlJyxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZShldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlRGF0YVNvdXJjZUxvYWRDb21wbGV0ZShjb250cm9sOiBGb3JtQ29udHJvbEJhc2VXaXRoU2VydmljZSwgcGFyZW50UGF0aCwgZGF0YVNvdXJjZSkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlRGF0YVNvdXJjZUxvYWRlZChjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGgsIGRhdGFGcm9tRHJvcGRvd246IGFueSkge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdkYXRhU291cmNlTG9hZGVkJyxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXMsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGFGcm9tRHJvcGRvd24ucmF3RGF0YVNvdXJjZSA/IGRhdGFGcm9tRHJvcGRvd24ucmF3RGF0YVNvdXJjZSA6IGRhdGFGcm9tRHJvcGRvd24uZGF0YVNvdXJjZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGV2ZW50RGF0YVsnZWxtJ10gPSBkYXRhRnJvbURyb3Bkb3duLmVsbTtcclxuICAgICAgICBpZiAodGhpcy5mb3JtU3RhdGUgPT0gRm9ybVN0YXRlLkFERFxyXG4gICAgICAgICAgICAmJiBjb250cm9sLmF1dG9EaXNwbGF5Rmlyc3RcclxuICAgICAgICAgICAgJiYgZXZlbnREYXRhLmRhdGEubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gfHwgIXRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gPSBbZXZlbnREYXRhLmRhdGFbMF1bY29udHJvbC52YWx1ZUZpZWxkXV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IGV2ZW50RGF0YS5kYXRhWzBdW2NvbnRyb2wudmFsdWVGaWVsZF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuY2FsbGJhY2tEYXRhRmluaXNoKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaChldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVSZWFkeUNvbnRyb2xQaWNrZXIoY29udHJvbDogQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSB8IFVzZXJQaWNrZXJDb250cm9sU2NoZW1hIHwgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQoY29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3JlYWR5JyxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblJlYWR5KSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVhZHkoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBwYXJlbnROb2RlLm1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMub25Db250cm9sUmVhZHkuZW1pdChjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd10pIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudFBhdGgpIHsgLy8gxJBv4bqhbiBjb2RlIHRyb25nIGJsb2NrIGlmIG7DoHkgY2jGsGEgY2h14bqpbiwgdOG6oW0gdGjhu51pIGNvZGUgdGjhur8gxJHhur9uIGtoaSBn4bq3cCBjYXNlIG7DoHkgdGjDrCB4ZW0gbOG6oWkgc2F1XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudFBhdGh9LiR7Y29udHJvbC5maWVsZH1gXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake2NvbnRyb2wuZmllbGR9YF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDYW5QcmludCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja0NhblByaW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XSAmJiB0aGlzLmNhblByaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgd2FpdFJlYWR5QW5kUHJpbnQoKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZHlBbGwgPSB0aGlzLmNoZWNrUmVhZHlBbGwoKTtcclxuICAgICAgICBpZiAodGhpcy53YWl0UmVhZHlBbmRQcmludFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlYWR5QWxsKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XTtcclxuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByaW50UGRmQnlTY2hlbWEodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLCB0aGlzLl9taW5pbWl6ZWREYXRhLCB0aGlzLnNldHRpbmcuc2NoZW1hKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdU4bqhbyBmaWxlIHRow6BuaCBjw7RuZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEucHJpbnRGaWxlSWQgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5fY29tbW9uU2VydmljZS5jbG9uZU9iamVjdCh0aGlzLl9taW5pbWl6ZWREYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVXYWl0Qm94KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWcuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZVRyaW5oS3koZW52aXJvbm1lbnQsIHRoaXMuc2V0dGluZywgdGhpcy5fbW9kZWxEYXRhLCByZXMuZGF0YSwgdGhpcy5fbm90aWZpZXJTZXJ2aWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25BZnRlclRyaW5oS3kuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy53YWl0UmVhZHlBbmRQcmludFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnQoKTtcclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNb2RlbFRhYmxlU2NoZW1hQnlDaGlsZFNjaGVtYShjb250cm9sOiBGb3JtQ29udHJvbEJhc2UpIHtcclxuICAgICAgICBjb25zdCBjb250cm9sVGFibGUgPSB0aGlzLmZvcm1Db250cm9sc1tjb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF1dO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbERhdGFbY29udHJvbFRhYmxlLmZpZWxkXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrUmVhZHlBbGwoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5KSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLmhpZGRlbiB8fCAhdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRGaWVsZCA9IGNvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXTtcclxuICAgICAgICAgICAgLy8gTuG6v3UgbMOgIGZpZWxkIHRyb25nIHRhYmxlIHNjaGVtYVxyXG4gICAgICAgICAgICBpZiAocGFyZW50RmllbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFyck1vZGVsQ3VuZ0xldmVsID0gdGhpcy5nZXRNb2RlbFRhYmxlU2NoZW1hQnlDaGlsZFNjaGVtYShjb250cm9sKTtcclxuICAgICAgICAgICAgICAgIGlmIChhcnJNb2RlbEN1bmdMZXZlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyTW9kZWxDdW5nTGV2ZWwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudEZpZWxkfVske2l9XS4ke2NvbnRyb2wuZmllbGR9YF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5yZWFkeVN0YXR1c1tgJHtjb250cm9sLmZpZWxkfWBdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTW9kZWxGcm9tRXh0ZXJuYWwgPSAoKSA9PiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBQaOG6o2kgxJHhu4MgYXJyb3cgZnVuY3Rpb24gdsOsIGPDsyBleHBvcnQgcmEgY2hvIG3hu5l0IHPhu5EgdGVtcGxhdGUgc+G7rSBk4bulbmdcclxuICAgIGZpcmVNb2RlbENoYW5nZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlLmVtaXQodGhpcy5fbWluaW1pemVkRGF0YSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVCdXR0b25DbGljayhjb250cm9sOiBCdXR0b25Db250cm9sU2NoZW1hLCBldmVudCwgcGFyZW50UGF0aCkge1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DbGljayhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnY2xpY2snLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29ycmVjdFZhbHVlKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcclxuICAgICAgICBsZXQgcmUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmNvcnJlY3RvcnMgJiYgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sLmNvcnJlY3RvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvcnJlY3RvciA9IGNvbnRyb2wuY29ycmVjdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F1dG9Db3JyZWN0JyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlID0gY29ycmVjdG9yLmNvcnJlY3QoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdHJ1ZSBsw6AgdGjhu49hIG3Do24sIGZhbHNlIGzDoCBraMO0bmcgdGjhu49hIG3Do24gKOG7niBj4bqlcCBoaeG7h24gdOG6oWkgY2jhu6kgY2jGsGEga2nhu4NtIHRyYSBj4bqlcCBjb24pXHJcbiAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUsIGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgQWRkcmVzc0NvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmICFwYXJlbnROb2RlLm1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsLl9lcnJvcnNbY3VycmVudE5vZGUuZmllbGRdO1xyXG4gICAgICAgICAgICBpZiAoIWVycm9ycykgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGVycm9ycy5zcGxpY2UoMCwgZXJyb3JzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLnZhbGlkYXRvcnMgJiYgY29udHJvbC52YWxpZGF0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC52YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gY29udHJvbC52YWxpZGF0b3JzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAndmFsaWRhdGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCB2YWxpZGF0b3IudmFsaWRhdGUoZXZlbnREYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IHZhbGlkYXRvci5nZXRFcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5pbmRleE9mKGVycikgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgX3NldEVycm9yKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpIHtcclxuICAgIC8vICAgICBjb25zdCBub2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChmaWVsZCk7XHJcbiAgICAvLyAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RyxrDhu51uZyBk4buvIGxp4buHdSBraMO0bmcgdOG7k24gdOG6oWknKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBjb25zdCBlcnJvcnMgPSBub2RlLnBhcmVudE5vZGUubW9kZWwuX2Vycm9yc1tub2RlLmZpZWxkXTtcclxuICAgIC8vICAgICBlcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gc2V0RXJyb3IoZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBlcnJvcjogc3RyaW5nKSB7XHJcbiAgICAvLyAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKVxyXG4gICAgLy8gICAgICAgICBmaWVsZC5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5fc2V0RXJyb3IoaXRlbSwgZXJyb3IpKTtcclxuICAgIC8vICAgICBlbHNlXHJcbiAgICAvLyAgICAgICAgIHRoaXMuX3NldEVycm9yKGZpZWxkLCBlcnJvcik7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWNoZUNvbnRyb2xWYWx1ZShjb250cm9sLCB2YWx1ZSwgcGFyZW50UGF0aCkge1xyXG4gICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuZW5hYmxlQ2FjaGluZykge1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZFZhbHVlc1twYXJlbnRQYXRoICsgJy4nICsgY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29tcG9uZW50QnlUeXBlKHRlbXBsYXRlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMuY2hpbGRyZW4sIHRlbXBsYXRlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJdGVtSW5BcnJheUJ5VmFsdWUoYXJyYXksIHYsIGNvbnRyb2wpIHtcclxuICAgICAgICBpZiAodiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGZ1bmNHZXRMYWJlbCA9IGNvbnRyb2wuZnVuY0dldExhYmVsO1xyXG4gICAgICAgIGlmIChmdW5jR2V0TGFiZWwgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmdW5jR2V0TGFiZWwgPSBpdGVtID0+IGl0ZW1bY29udHJvbC5kaXNwbGF5RmllbGRdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBBcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCB2QXJyID0gdjtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHYpKSB7XHJcbiAgICAgICAgICAgICAgICB2QXJyID0gdi50b1N0cmluZygpLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2QXJyLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGFycmF5LmZpbmQoeCA9PiB4W2NvbnRyb2wudmFsdWVGaWVsZF0gPT0gdik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jR2V0TGFiZWwoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodkFyci5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuZmlsdGVyKHAgPT4gdkFyci5zb21lKHEgPT4gcSA9PSBwW2NvbnRyb2wudmFsdWVGaWVsZF0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBmdW5jR2V0TGFiZWwoaXRlbSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEl0ZW1JbkFycmF5QnlUZXh0VmFsdWUoYXJyYXksIHYpIHtcclxuICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHYgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgYXJyYXkgaW5zdGFuY2VvZiBBcnJheVxyXG4gICAgICAgICAgICAmJiBhcnJheS5sZW5ndGggPiAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2LmpvaW4oJzsgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWRkcmVzc0Rpc3BsYXlUZXh0KHNlbGVjdGVkVmFsdWUpIHtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TGFiZWxDbGFzcyhjb250cm9sKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGBsYWJlbC1jb250cm9sYDtcclxuICAgICAgICBpZiAoY29udHJvbC5pbmRleExhYmVsKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSAnIGhhdmVJbmRleCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzY3JvbGxUb1ZpZXcoZWxlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgIGlmIChlbGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBoMTogYW55ID0gZWxlLmNsb3Nlc3QoJ2RpdltpZCQ9XFwnLWhvbGRlclxcJ10nKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChoMSAmJiBoMS5wcmV2aW91c1NpYmxpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBoMSA9IGgxLnByZXZpb3VzU2libGluZztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaDEudGFnTmFtZSA9PT0gJ0RJVicpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChoMSAmJiBoMS5zY3JvbGxJbnRvVmlldykgaDEuc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIC0gU2V0IEZvY3VzIGNvbnRyb2xcclxuICAgICAqIEBwYXJhbSBvcHRpb25zXHJcbiAgICAgKi9cclxuXHJcbiAgICBwcml2YXRlIGZvY3VzRmlyc3RDb250cm9sKCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1FbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGRpdnMgPSBmb3JtRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkaXYuY3J1ZC1mb3JtLWNvbnRyb2wnKTtcclxuICAgICAgICBpZiAoZGl2cykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRpdiBvZiBkaXZzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0RGl2SG9sZGVyID0gZGl2O1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaW5wdXQ6bm90KFt0eXBlPWZpbGVdKTpub3QoW3R5cGU9aGlkZGVuXSknKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVmlldyhmaXJzdENvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gdGhpcy5maXJzdERpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sICYmIGZpcnN0Q29udHJvbC5pZC5pbmRleE9mKCd0aW55LWFuZ3VsYXInKSAhPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gdGhpcy5maXJzdERpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KGZpcnN0Q29udHJvbClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGVudHMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCdib2R5JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRlcHJlY2F0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aW55bWNlLWZvY3VzJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c1RvRmlyc3RFcnJvckNvbnRyb2woKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSB0aGlzLmZvcm1FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgZGl2LmVycm9yYDtcclxuICAgICAgICBjb25zdCBkaXZIb2xkZXIgPSBmb3JtRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcclxuICAgICAgICBpZiAoZGl2SG9sZGVyKSB7XHJcbiAgICAgICAgICAgIGxldCBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVmlldyhmaXJzdENvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gZGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sICYmIGZpcnN0Q29udHJvbC5pZC5pbmRleE9mKCd0aW55LWFuZ3VsYXInKSAhPSAwXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGVudHMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2JvZHknKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByZXZlbnRCbHVyKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhcEZvY3VzKSB7XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgd2hpbGUgKHRhcmdldCB8fCB0YXJnZXQudGFnTmFtZSA9PSAnRk9STScpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaWQuZW5kc1dpdGgoJy1ob2xkZXInKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT0gdGhpcy5maXJzdERpdkhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDb250cm9sID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sID09IGV2ZW50LnRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVmlzaWJsZShlbGVtKSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xyXG4gICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoc3R5bGUudmlzaWJpbGl0eSAhPT0gJ3Zpc2libGUnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCtzdHlsZS5vcGFjaXR5IDwgMC4xKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBlbGVtLm9mZnNldFdpZHRoXHJcbiAgICAgICAgICAgICsgZWxlbS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgKyBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxyXG4gICAgICAgICAgICArIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcclxuICAgICAgICAgICAgPT09IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbGVtQ2VudGVyID0ge1xyXG4gICAgICAgICAgICB4OiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyBlbGVtLm9mZnNldFdpZHRoIC8gMixcclxuICAgICAgICAgICAgeTogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBlbGVtLm9mZnNldEhlaWdodCAvIDJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcG9pbnRDb250YWluZXIgPSA8YW55PihcclxuICAgICAgICAgICAgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlbGVtQ2VudGVyLngsIGVsZW1DZW50ZXIueSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChwb2ludENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRDb250YWluZXIgPT09IGVsZW0pIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKChwb2ludENvbnRhaW5lciA9IHBvaW50Q29udGFpbmVyLnBhcmVudE5vZGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0RlbGV0ZUNvbmZpcm0oKS50aGVuKGFzeW5jIHJzID0+IHtcclxuICAgICAgICAgICAgaWYgKCFycykgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlUm93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0b0RlbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uRGVsZXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRvRGVsZXRlID0gY29udHJvbC5vbkRlbGV0aW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2RlbGV0aW5nJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0b0RlbGV0ZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiB0b0RlbGV0ZVJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd0YWJsZUNoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9uRGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25EZWxldGVkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2RlbGV0ZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGFkZE5ld1Jvdyhjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoLCBldmVudFR5cGU/KSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0VkaXQpIHtcclxuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1UaXRsZSA9IGBUaMOqbSBt4bubaSAke2NvbnRyb2wubGFiZWx9YDtcclxuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1TY2hlbWEgPSBjb250cm9sLnJvd1RlbXBsYXRlO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSAtMTtcclxuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mbyA9IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wsXHJcbiAgICAgICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0YWJsZU5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHRhYmxlUGF0aCArICdbJyArIGluZGV4ICsgJ10nO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKGRhdGEsIHN1YkNvbnRyb2wsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvQWRkID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY29udHJvbC5vbkFkZGluZykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSBjb250cm9sLm9uQWRkaW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCAnYWRkaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIHRvQWRkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0b0FkZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgIHRhYmxlTm9kZS5yZWluaXRDaGlsZE5vZGVzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlICE9ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1Jvd05vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IG5ld1Jvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICd0YWJsZUNoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWRkZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IG5ld1Jvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICdhZGRlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRNdWx0aVJvdyhjb250cm9sLCBsZW5ndGgsIHRhYmxlUGF0aCwgZXZlbnRUeXBlPykge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hZGROZXdSb3coY29udHJvbCwgdGFibGVQYXRoLCBldmVudFR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVTYXZlZFRhYmxlUm93KGRhdGEpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby5jb250cm9sO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGF0aCA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8udGFibGVQYXRoO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8uZXZlbnRUeXBlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBpZiAodGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID4gLTEpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsW3RoaXMudGFibGVGb3JtQ3VycmVudFJvd10gPSB7IC4uLnRhYmxlTm9kZS5tb2RlbFt0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3ddLCAuLi5kYXRhIH07XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVOb2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGFibGVQYXRoICsgJ1snICsgaW5kZXggKyAnXSc7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCB0b0FkZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gY29udHJvbC5vbkFkZGluZyhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ2FkZGluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0b0FkZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbC5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlICE9ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1Jvd05vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICd0YWJsZUNoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWRkZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICdhZGRlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhdmVSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VyZW50Um93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblNhdmUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25TYXZlKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogY3VyZW50Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzYXZlJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlZGl0Um93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1UaXRsZSA9IGBT4butYSAke2NvbnRyb2wubGFiZWx9YDtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID0gaW5kZXg7XHJcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgIGNvbnN0IHRvRGVsZXRlUm93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybURhdGEgPSB0b0RlbGV0ZVJvd05vZGUudmFsdWU7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mbyA9IHtcclxuICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgdGFibGVQYXRoLFxyXG4gICAgICAgICAgICBpbmRleFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1TaG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlUm93T3JkZXJlZChjb250cm9sOiBUYWJsZVNjaGVtYSwgZXZ0LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykge1xyXG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGU7XHJcblxyXG4gICAgICAgIC8vIHJvdyBpbiB0YWJsZVxyXG4gICAgICAgIGlmIChjb250cm9sID09IG51bGwpIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgcGFyZW50TW9kZWwgPSBwYXJlbnROb2RlLm1vZGVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHZhbHVlID0gY3VycmVudE5vZGUudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIGF1dG8gY29ycmVjdCB2YWx1ZVxyXG4gICAgICAgIHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUoY3VycmVudE5vZGUpO1xyXG4gICAgICAgIGN1cnJlbnROb2RlLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICBzb3VyY2VOb2RlOiBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25SZW9yZGVyZWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vblJlb3JkZXJlZChldmVudERhdGEpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChldmVudERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dDb250ZXh0TWVudShldnQsIHJvd0RhdGEsIGNvbnRyb2w6IFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5yb3dEYXRhQ3VycmVudCA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cyA9IGF3YWl0IGNvbnRyb2wucm93QnV0dG9ucyhyb3dEYXRhKTtcclxuICAgICAgICBpZiAoIXRoaXMuYnV0dG9uQ29udGV4dHMgfHwgdGhpcy5idXR0b25Db250ZXh0cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudShldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Nob3dDb250ZXh0TWVudShldnQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZ0KTtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1lc3NhZ2VSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VyZW50Um93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuICAgICAgICBpZiAoY29udHJvbC5vbk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25NZXNzYWdlKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogY3VyZW50Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdtZXNzYWdlJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGFibGVGdW5jdGlvbkNvbHVtbldpZHRoKGNvbnRyb2w6IFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgbGV0IG5lID0gNTA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0RlbGV0ZSkgbmUgKz0gMzA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0VkaXQpIG5lICs9IDMwO1xyXG4gICAgICAgIGlmIChjb250cm9sLnNob3dTYXZlKSBuZSArPSAzMDtcclxuICAgICAgICBpZiAoY29udHJvbC5yb3dCdXR0b25zKSBuZSArPSAzMDtcclxuICAgICAgICByZXR1cm4gbmUgKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNYXNrQnlUeXBlKG1hc2tUeXBlKSB7XHJcbiAgICAgICAgaWYgKG1hc2tUeXBlID09ICdkZWNpbWFsJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RvdF9zZXBhcmF0b3IuNSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUZXh0QWxpZ24odGV4dEFsaWduOiBudW1iZXIpIHtcclxuICAgICAgICBzd2l0Y2ggKHRleHRBbGlnbikge1xyXG4gICAgICAgICAgICBjYXNlIFRleHRBbGlnbi5DZW50ZXI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NlbnRlcic7XHJcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLkxlZnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2xlZnQnO1xyXG4gICAgICAgICAgICBjYXNlIFRleHRBbGlnbi5SaWdodDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja0Rpc2FibGVkKGRhdGE6IGFueSwgY29udHJvbDogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5kaXNhYmxlZCA9PT0gdHJ1ZSB8fCAoZGF0YS5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmRpc2FibGVkID09PSB1bmRlZmluZWQgJiYgY29udHJvbC5kaXNhYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tIaWRkZW4oY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBwYXJlbnRNb2RlbDogYW55LCBwYXRoOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBudWxsO1xyXG4gICAgICAgIGlmIChwYXRoICYmIGNvbnRyb2xbJ25vZGVzJ10pIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjb250cm9sWydub2RlcyddW3BhdGhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudE5vZGUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb250cm9sWydfaGlkZGVuJ10gPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5oaWRkZW4gPT09IHRydWVcclxuICAgICAgICAgICAgfHwgKHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0uaGlkZGVuID09PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICYmIChjb250cm9sLmhpZGRlblxyXG4gICAgICAgICAgICAgICAgICAgIHx8IChjb250cm9sLmhpZGRlbkNoZWNrICYmIGNvbnRyb2wuaGlkZGVuQ2hlY2sodGhpcy5fbWluaW1pemVkRGF0YSwgY3VycmVudE5vZGUpKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIGNvbnRyb2xbJ19oaWRkZW4nXSA9ICEhcmVzdWx0O1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGV4dFRkKGNvbnRyb2wsIGRhdGEsIGluZGV4LCB0YWJsZVBhdGgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgdGFibGVQYXRoLFxyXG4gICAgICAgICAgICBwYXJlbnRQYXRoOiBgJHt0YWJsZVBhdGh9WyR7aW5kZXh9XWAsXHJcbiAgICAgICAgICAgIHBhdGg6IGAke3RhYmxlUGF0aH1bJHtpbmRleH1dLiR7Y29udHJvbC5maWVsZH1gLFxyXG4gICAgICAgICAgICBzaG93TGFiZWw6IGZhbHNlLFxyXG4gICAgICAgICAgICBtZFdpZHRoOiAxMlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzTW9iaWxlT3JUYWJsZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzTW9iaWxlKClcclxuICAgICAgICAgICAgfHwgdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzVGFibGV0KClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZykge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUNhY2hlVmFsdWVzVG9TdG9yYWdlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Gb2N1c1RleHRDb250cm9sKGV2dCkge1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNldHRpbmdzKGV2ZW50KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hT2xkZXN0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX09MREVTVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFOZXdlc3QoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVXRVNULCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJsZVNjaGVtYU5leHQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVYVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFQcmV2KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX1BSRVYsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoKGV2dCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250cm9sRGF0YVNvdXJjZShjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIGlmIChkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGRhdGEuX3NvdXJjZVtjb250cm9sLmZpZWxkXTtcclxuICAgICAgICBpZiAoY29udHJvbC5kYXRhU291cmNlIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBjb250cm9sLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgbW9kZWxQYXRoOiBzdHJpbmc7XHJcbiAgICBzY2hlbWFQYXRoOiBzdHJpbmc7XHJcbiAgICBmaWVsZDogc3RyaW5nO1xyXG4gICAgcGFyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xyXG4gICAgcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIGNoaWxkTm9kZXM6IENvbnRyb2xUcmVlTm9kZVtdID0gW107XHJcbiAgICBjb250cm9sOiBGb3JtQ29udHJvbEJhc2U7XHJcbiAgICBmb3JtQ29udHJvbHM7XHJcbiAgICBrZXlzUGx1czogc3RyaW5nW107XHJcbiAgICBwcml2YXRlIF9jcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIGNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBhbnk7XHJcbiAgICBwcml2YXRlIGhhc1NjaGVtYSA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IobW9kZWw6IGFueSwgc2NoZW1hczogW10sIGZpZWxkPywgcGFyZW50Tm9kZT86IENvbnRyb2xUcmVlTm9kZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG1vZGVsO1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xzID0gc2NoZW1hcztcclxuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5tb2RlbFBhdGggIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZmllbGQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFBhdGggPSBwYXJlbnROb2RlLm1vZGVsUGF0aCArICdbJyArIGZpZWxkICsgJ10nO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IHBhcmVudE5vZGUuc2NoZW1hUGF0aDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1NjaGVtYSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbFBhdGggPSBmaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IGZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlID0gcGFyZW50Tm9kZS5yb290Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkO1xyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbCA9IHNjaGVtYXNbdGhpcy5zY2hlbWFQYXRoXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2xbJ25vZGVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xbJ25vZGVzJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXVt0aGlzLm1vZGVsUGF0aF0gPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYXNbdGhpcy5zY2hlbWFQYXRoXTtcclxuICAgICAgICBsZXQga2V5c1BsdXMgPSBbXTtcclxuICAgICAgICBpZiAoc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLmNvbnRyb2xzLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzUGx1cyA9IHNjaGVtYS5yb3dUZW1wbGF0ZS5maWx0ZXIocSA9PiBxLmZpZWxkKS5tYXAocSA9PiBxLmZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYVBhdGgpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gT2JqZWN0LmtleXMoc2NoZW1hcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5rZXlzUGx1cyA9IGtleXNQbHVzO1xyXG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXMobW9kZWwsIHNjaGVtYXMsIGtleXNQbHVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVpbml0Q2hpbGROb2RlcygpIHtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXModGhpcy5kYXRhLCB0aGlzLmZvcm1Db250cm9scywgdGhpcy5rZXlzUGx1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q2hpbGROb2Rlcyhtb2RlbDogYW55LCBzY2hlbWFzOiBbXSwga2V5c1BsdXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgY29uc3QgYWxsS2V5ID0gbmV3IFNldChbLi4ua2V5c1BsdXMsIC4uLk9iamVjdC5rZXlzKG1vZGVsKV0pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBhbGxLZXkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJyAmJiBrZXkgIT0gS2V5Rmxhc2hTaG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZShtb2RlbFtrZXldLCBzY2hlbWFzLCBrZXksIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVEaWNbY2hpbGROb2RlLmZpZWxkXSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtb2RlbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKGl0ZW0sIHNjaGVtYXMsIGksIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnROb2RlID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2RlRGljW2NoaWxkTm9kZS5maWVsZF0gPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGlsZE5vZGUoZmllbGQpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZURpY1tmaWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q3J1ZEZvcm0oY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5fY3J1ZEZvcm0gPSBjcnVkRm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFyZW50TW9kZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5tb2RlbDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFyZW50TW9kZWxQYXRoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUubW9kZWxQYXRoO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRDb250cm9sKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9kZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdO1xyXG4gICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbW9kZWwodmFsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF0gPSB2YWw7XHJcbiAgICAgICAgZWxzZSB0aGlzLmRhdGEgPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXTtcclxuICAgICAgICBlbHNlIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHZhbHVlKHZhbCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdID0gdmFsO1xyXG4gICAgICAgIGVsc2UgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRIaWRkZW4oZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XHJcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGYsIGhpZGRlbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRIaWRkZW5GaWVsZChmaWVsZCwgaGlkZGVuKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRIaWRkZW5GaWVsZChmaWVsZDogc3RyaW5nLCBoaWRkZW46IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoZmllbGQuaW5kZXhPZignLicpID4gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5nZXROb2RlQnlQYXRoKGAke3RoaXMubW9kZWxQYXRofS4ke2ZpZWxkfWApO1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZC5zcGxpdCgnLicpLnBvcCgpO1xyXG4gICAgICAgICAgICBjaGlsZE5vZGUucGFyZW50Tm9kZS5kYXRhLl9zdGF0dXNbbGFzdEZpZWxkXS5oaWRkZW4gPSBoaWRkZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuX3N0YXR1c1tmaWVsZF0uaGlkZGVuID0gaGlkZGVuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5UGF0aChtb2RlbFBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChtb2RlbFBhdGggPT0gbnVsbCB8fCBtb2RlbFBhdGggPT09ICcnKSByZXR1cm4gdGhpcy5yb290Tm9kZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5UcmVlKHRoaXMucm9vdE5vZGUsIG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5U2NoZW1hUGF0aChzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAoc2NoZW1hUGF0aCA9PSBudWxsIHx8IHNjaGVtYVBhdGggPT09ICcnKSByZXR1cm4gdGhpcy5yb290Tm9kZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kU2NoZW1hSW5UcmVlKHRoaXMucm9vdE5vZGUsIHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaW5kSW5UcmVlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgbW9kZWxQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAobm9kZS5tb2RlbFBhdGggIT0gbnVsbCAmJiBub2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpID09IG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSByZXR1cm4gbm9kZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLm1vZGVsUGF0aCAhPSBudWxsICYmIG1vZGVsUGF0aC5zdGFydHNXaXRoKGNoaWxkTm9kZS5tb2RlbFBhdGgudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuZmluZEluVHJlZShjaGlsZE5vZGUsIG1vZGVsUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlKSByZXR1cm4gcmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaW5kU2NoZW1hSW5UcmVlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgc2NoZW1hUGF0aCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgaWYgKG5vZGUuc2NoZW1hUGF0aCAhPSBudWxsICYmIG5vZGUuc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpID09IHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5zY2hlbWFQYXRoICE9IG51bGwgJiYgc2NoZW1hUGF0aC5zdGFydHNXaXRoKGNoaWxkTm9kZS5zY2hlbWFQYXRoLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSB0aGlzLmZpbmRTY2hlbWFJblRyZWUoY2hpbGROb2RlLCBzY2hlbWFQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUpIHJldHVybiByZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0RGF0YVNvdXJjZVRhYmxlU2NoZW1hKHBhdGg6IHN0cmluZywgZGF0YVNvdXJjZTogYW55W10pIHtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgocGF0aCk7XHJcbiAgICAgICAgaWYgKCF0YWJsZU5vZGUubW9kZWwpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0YWJsZU5vZGUubW9kZWwubGVuZ3RoID4gZGF0YVNvdXJjZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsID0gdGFibGVOb2RlLm1vZGVsLnNwbGljZShkYXRhU291cmNlLmxlbmd0aCwgZGF0YVNvdXJjZS5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlTm9kZS5tb2RlbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBtZXJnZUpTT05PbGQodGFibGVOb2RlLm1vZGVsW2ldLCBkYXRhU291cmNlW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSB0YWJsZU5vZGUubW9kZWwubGVuZ3RoOyBpIDwgZGF0YVNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlLl9jcnVkRm9ybS5hZGROZXdSb3coPFRhYmxlU2NoZW1hPnRhYmxlTm9kZS5jb250cm9sLCBwYXRoKTtcclxuICAgICAgICAgICAgbWVyZ2VKU09OT2xkKHRhYmxlTm9kZS5tb2RlbFtpXSwgZGF0YVNvdXJjZVtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|