@pepperi-addons/ngx-composite-lib 0.4.2-beta.99 → 0.5.0-ng15.1
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/color-settings/color-settings.component.d.ts +1 -1
- package/core/common/directives/reset-configuration-field.directive.d.ts +1 -1
- package/data-view-builder/data-view-builder.component.d.ts +1 -1
- package/data-view-builder/data-view-builder.model.d.ts +1 -1
- package/data-view-builder/menu-data-view/menu-data-view.component.d.ts +1 -1
- package/esm2020/color-settings/color-settings.component.mjs +13 -13
- package/esm2020/color-settings/color-settings.module.mjs +5 -5
- package/esm2020/core/common/directives/reset-configuration-field.directive.mjs +24 -24
- package/esm2020/core/common/services/dimx.service.mjs +4 -4
- package/esm2020/core/common/services/utilities.service.mjs +4 -4
- package/esm2020/data-view-builder/data-view-builder.component.mjs +19 -19
- package/esm2020/data-view-builder/data-view-builder.module.mjs +5 -5
- package/esm2020/data-view-builder/data-view-builder.service.mjs +7 -7
- package/esm2020/data-view-builder/menu-data-view/menu-data-view.component.mjs +4 -4
- package/esm2020/file-status-panel/file-status-panel.component.mjs +4 -4
- package/esm2020/file-status-panel/file-status-panel.module.mjs +5 -5
- package/esm2020/flow-picker-button/flow-picker-button.component.mjs +16 -16
- package/esm2020/flow-picker-button/flow-picker-button.module.mjs +5 -5
- package/esm2020/flow-picker-button/flow-picker-button.service.mjs +4 -4
- package/esm2020/generic-fields-builder/field-container/field-container.component.mjs +18 -0
- package/esm2020/generic-fields-builder/generic-fields-builder.component.mjs +119 -0
- package/esm2020/generic-fields-builder/generic-fields-builder.module.mjs +82 -0
- package/esm2020/generic-fields-builder/generic-fields-builder.service.mjs +39 -0
- package/esm2020/generic-fields-builder/pepperi-addons-ngx-composite-lib-generic-fields-builder.mjs +5 -0
- package/esm2020/generic-fields-builder/public-api.mjs +6 -0
- package/esm2020/generic-form/generic-form.component.mjs +13 -13
- package/esm2020/generic-form/generic-form.module.mjs +5 -5
- package/esm2020/generic-form/generic-form.service.mjs +4 -4
- package/esm2020/generic-list/generic-list.component.mjs +102 -49
- package/esm2020/generic-list/generic-list.module.mjs +18 -10
- package/esm2020/generic-list/generic-list.service.mjs +30 -5
- package/esm2020/group-buttons-settings/group-buttons-settings.component.mjs +15 -15
- package/esm2020/group-buttons-settings/group-buttons-settings.module.mjs +5 -5
- package/esm2020/icon-picker/icon-picker.component.mjs +4 -4
- package/esm2020/icon-picker/icon-picker.module.mjs +5 -5
- package/esm2020/icon-picker/icon-picker.service.mjs +4 -4
- package/esm2020/layout-builder/hide-in/hide-in.component.mjs +5 -5
- package/esm2020/layout-builder/hide-in/hide-in.module.mjs +5 -5
- package/esm2020/layout-builder/layout/layout.component.mjs +67 -42
- package/esm2020/layout-builder/layout/layout.module.mjs +7 -5
- package/esm2020/layout-builder/layout-builder-editor/layout-builder-editor.component.mjs +4 -4
- package/esm2020/layout-builder/layout-builder-editor/layout-builder-editor.module.mjs +5 -5
- package/esm2020/layout-builder/layout-builder-internal.service.mjs +77 -77
- package/esm2020/layout-builder/layout-builder.component.mjs +134 -103
- package/esm2020/layout-builder/layout-builder.model.mjs +1 -1
- package/esm2020/layout-builder/layout-builder.module.mjs +5 -5
- package/esm2020/layout-builder/layout-builder.service.mjs +31 -18
- package/esm2020/layout-builder/main-editor/main-editor.component.mjs +47 -36
- package/esm2020/layout-builder/main-editor/main-editor.module.mjs +5 -5
- package/esm2020/layout-builder/section/section.component.mjs +59 -34
- package/esm2020/layout-builder/section/section.module.mjs +5 -5
- package/esm2020/layout-builder/section-block/section-block.component.mjs +19 -19
- package/esm2020/layout-builder/section-block/section-block.module.mjs +5 -5
- package/esm2020/layout-builder/section-editor/section-editor.component.mjs +31 -22
- package/esm2020/layout-builder/section-editor/section-editor.module.mjs +10 -6
- package/esm2020/manage-parameters/manage-parameter/manage-parameter.component.mjs +10 -6
- package/esm2020/manage-parameters/manage-parameters.component.mjs +55 -19
- package/esm2020/manage-parameters/manage-parameters.model.mjs +1 -1
- package/esm2020/manage-parameters/manage-parameters.module.mjs +5 -5
- package/esm2020/manage-parameters/manage-parameters.service.mjs +14 -7
- package/esm2020/mapping-parameters/mapping-parameters.component.mjs +44 -0
- package/esm2020/mapping-parameters/mapping-parameters.model.mjs +6 -0
- package/esm2020/mapping-parameters/mapping-parameters.module.mjs +59 -0
- package/esm2020/mapping-parameters/mapping-parameters.service.mjs +37 -0
- package/esm2020/mapping-parameters/param-map/param-map.component.mjs +73 -0
- package/esm2020/mapping-parameters/pepperi-addons-ngx-composite-lib-mapping-parameters.mjs +5 -0
- package/esm2020/mapping-parameters/public-api.mjs +4 -0
- package/esm2020/ngx-composite-lib.module.mjs +5 -5
- package/esm2020/padding-settings/padding-settings.component.mjs +32 -22
- package/esm2020/padding-settings/padding-settings.model.mjs +3 -3
- package/esm2020/padding-settings/padding-settings.module.mjs +5 -5
- package/esm2020/rich-text/rich-text.component.mjs +12 -12
- package/esm2020/rich-text/rich-text.module.mjs +5 -5
- package/esm2020/rich-text/rich-text.service.mjs +4 -4
- package/esm2020/shadow-settings/shadow-settings.component.mjs +12 -12
- package/esm2020/shadow-settings/shadow-settings.module.mjs +5 -5
- package/esm2020/show-if-badge/show-if-badge.component.mjs +5 -5
- package/esm2020/show-if-badge/show-if-badge.module.mjs +5 -5
- package/fesm2015/pepperi-addons-ngx-composite-lib-color-settings.mjs +16 -16
- package/fesm2015/pepperi-addons-ngx-composite-lib-color-settings.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-data-view-builder.mjs +31 -31
- package/fesm2015/pepperi-addons-ngx-composite-lib-data-view-builder.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-file-status-panel.mjs +7 -7
- package/fesm2015/pepperi-addons-ngx-composite-lib-file-status-panel.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-flow-picker-button.mjs +22 -22
- package/fesm2015/pepperi-addons-ngx-composite-lib-flow-picker-button.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-generic-fields-builder.mjs +254 -0
- package/fesm2015/pepperi-addons-ngx-composite-lib-generic-fields-builder.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-composite-lib-generic-form.mjs +19 -19
- package/fesm2015/pepperi-addons-ngx-composite-lib-generic-form.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-generic-list.mjs +148 -60
- package/fesm2015/pepperi-addons-ngx-composite-lib-generic-list.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-group-buttons-settings.mjs +18 -18
- package/fesm2015/pepperi-addons-ngx-composite-lib-group-buttons-settings.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-icon-picker.mjs +10 -10
- package/fesm2015/pepperi-addons-ngx-composite-lib-icon-picker.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-layout-builder.mjs +853 -725
- package/fesm2015/pepperi-addons-ngx-composite-lib-layout-builder.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-manage-parameters.mjs +83 -35
- package/fesm2015/pepperi-addons-ngx-composite-lib-manage-parameters.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-mapping-parameters.mjs +207 -0
- package/fesm2015/pepperi-addons-ngx-composite-lib-mapping-parameters.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-composite-lib-padding-settings.mjs +37 -27
- package/fesm2015/pepperi-addons-ngx-composite-lib-padding-settings.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-rich-text.mjs +18 -18
- package/fesm2015/pepperi-addons-ngx-composite-lib-rich-text.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-shadow-settings.mjs +15 -15
- package/fesm2015/pepperi-addons-ngx-composite-lib-shadow-settings.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib-show-if-badge.mjs +8 -8
- package/fesm2015/pepperi-addons-ngx-composite-lib-show-if-badge.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-composite-lib.mjs +33 -33
- package/fesm2015/pepperi-addons-ngx-composite-lib.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-color-settings.mjs +16 -16
- package/fesm2020/pepperi-addons-ngx-composite-lib-color-settings.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-data-view-builder.mjs +31 -31
- package/fesm2020/pepperi-addons-ngx-composite-lib-data-view-builder.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-file-status-panel.mjs +7 -7
- package/fesm2020/pepperi-addons-ngx-composite-lib-file-status-panel.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-flow-picker-button.mjs +22 -22
- package/fesm2020/pepperi-addons-ngx-composite-lib-flow-picker-button.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-generic-fields-builder.mjs +254 -0
- package/fesm2020/pepperi-addons-ngx-composite-lib-generic-fields-builder.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-composite-lib-generic-form.mjs +19 -19
- package/fesm2020/pepperi-addons-ngx-composite-lib-generic-form.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-generic-list.mjs +146 -60
- package/fesm2020/pepperi-addons-ngx-composite-lib-generic-list.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-group-buttons-settings.mjs +18 -18
- package/fesm2020/pepperi-addons-ngx-composite-lib-group-buttons-settings.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-icon-picker.mjs +10 -10
- package/fesm2020/pepperi-addons-ngx-composite-lib-icon-picker.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-layout-builder.mjs +844 -727
- package/fesm2020/pepperi-addons-ngx-composite-lib-layout-builder.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-manage-parameters.mjs +81 -33
- package/fesm2020/pepperi-addons-ngx-composite-lib-manage-parameters.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-mapping-parameters.mjs +209 -0
- package/fesm2020/pepperi-addons-ngx-composite-lib-mapping-parameters.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-composite-lib-padding-settings.mjs +37 -27
- package/fesm2020/pepperi-addons-ngx-composite-lib-padding-settings.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-rich-text.mjs +18 -18
- package/fesm2020/pepperi-addons-ngx-composite-lib-rich-text.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-shadow-settings.mjs +15 -15
- package/fesm2020/pepperi-addons-ngx-composite-lib-shadow-settings.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-show-if-badge.mjs +8 -8
- package/fesm2020/pepperi-addons-ngx-composite-lib-show-if-badge.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib.mjs +33 -33
- package/fesm2020/pepperi-addons-ngx-composite-lib.mjs.map +1 -1
- package/file-status-panel/file-status-panel.component.d.ts +1 -1
- package/file-status-panel/file-status-panel.model.d.ts +1 -1
- package/flow-picker-button/flow-picker-button.component.d.ts +1 -1
- package/generic-fields-builder/field-container/field-container.component.d.ts +10 -0
- package/generic-fields-builder/generic-fields-builder.component.d.ts +46 -0
- package/generic-fields-builder/generic-fields-builder.module.d.ts +23 -0
- package/generic-fields-builder/generic-fields-builder.service.d.ts +14 -0
- package/generic-fields-builder/index.d.ts +5 -0
- package/generic-fields-builder/public-api.d.ts +2 -0
- package/generic-form/generic-form.component.d.ts +1 -1
- package/generic-list/generic-list.component.d.ts +25 -9
- package/generic-list/generic-list.module.d.ts +13 -11
- package/generic-list/generic-list.service.d.ts +3 -1
- package/group-buttons-settings/group-buttons-settings.component.d.ts +1 -1
- package/group-buttons-settings/group-buttons-settings.model.d.ts +1 -1
- package/icon-picker/icon-picker.component.d.ts +1 -1
- package/layout-builder/hide-in/hide-in.component.d.ts +1 -1
- package/layout-builder/hide-in/hide-in.component.theme.scss +1 -1
- package/layout-builder/layout/layout.component.d.ts +12 -8
- package/layout-builder/layout-builder-editor/layout-builder-editor.component.d.ts +1 -1
- package/layout-builder/layout-builder-internal.service.d.ts +5 -10
- package/layout-builder/layout-builder.component.d.ts +11 -4
- package/layout-builder/layout-builder.component.theme.scss +1 -1
- package/layout-builder/layout-builder.model.d.ts +3 -3
- package/layout-builder/layout-builder.service.d.ts +15 -6
- package/layout-builder/main-editor/main-editor.component.d.ts +7 -5
- package/layout-builder/section/section.component.d.ts +8 -1
- package/layout-builder/section-block/section-block.component.d.ts +1 -1
- package/layout-builder/section-editor/section-editor.component.d.ts +4 -1
- package/layout-builder/section-editor/section-editor.module.d.ts +3 -2
- package/manage-parameters/manage-parameter/manage-parameter.component.d.ts +3 -1
- package/manage-parameters/manage-parameters.component.d.ts +10 -3
- package/manage-parameters/manage-parameters.model.d.ts +4 -1
- package/manage-parameters/manage-parameters.service.d.ts +2 -2
- package/mapping-parameters/index.d.ts +5 -0
- package/mapping-parameters/mapping-parameters.component.d.ts +19 -0
- package/mapping-parameters/mapping-parameters.model.d.ts +8 -0
- package/mapping-parameters/mapping-parameters.module.d.ts +18 -0
- package/mapping-parameters/mapping-parameters.service.d.ts +12 -0
- package/mapping-parameters/param-map/param-map.component.d.ts +27 -0
- package/mapping-parameters/public-api.d.ts +3 -0
- package/package.json +19 -2
- package/padding-settings/padding-settings.component.d.ts +1 -1
- package/padding-settings/padding-settings.model.d.ts +2 -2
- package/rich-text/rich-text.component.d.ts +1 -1
- package/shadow-settings/shadow-settings.component.d.ts +1 -1
- package/shadow-settings/shadow-settings.model.d.ts +1 -1
- package/show-if-badge/show-if-badge.component.d.ts +1 -1
- package/src/assets/i18n/en.ngx-composite-lib.json +22 -2
|
@@ -13,19 +13,19 @@ export class PepLayoutBuilderEditorModule {
|
|
|
13
13
|
//
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
PepLayoutBuilderEditorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
17
|
-
PepLayoutBuilderEditorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
16
|
+
PepLayoutBuilderEditorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PepLayoutBuilderEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
17
|
+
PepLayoutBuilderEditorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: PepLayoutBuilderEditorModule, declarations: [PepLayoutBuilderEditorComponent], imports: [CommonModule,
|
|
18
18
|
HttpClientModule,
|
|
19
19
|
OverlayModule,
|
|
20
20
|
MatTabsModule,
|
|
21
21
|
PepNgxLibModule, i1.TranslateModule], exports: [PepLayoutBuilderEditorComponent] });
|
|
22
|
-
PepLayoutBuilderEditorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
22
|
+
PepLayoutBuilderEditorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PepLayoutBuilderEditorModule, imports: [CommonModule,
|
|
23
23
|
HttpClientModule,
|
|
24
24
|
OverlayModule,
|
|
25
25
|
MatTabsModule,
|
|
26
26
|
PepNgxLibModule,
|
|
27
27
|
TranslateModule.forChild()] });
|
|
28
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PepLayoutBuilderEditorModule, decorators: [{
|
|
29
29
|
type: NgModule,
|
|
30
30
|
args: [{
|
|
31
31
|
declarations: [
|
|
@@ -42,4 +42,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
|
|
|
42
42
|
exports: [PepLayoutBuilderEditorComponent]
|
|
43
43
|
}]
|
|
44
44
|
}], ctorParameters: function () { return []; } });
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJ1aWxkZXItZWRpdG9yLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb3NpdGUtbGliL2xheW91dC1idWlsZGVyL2xheW91dC1idWlsZGVyLWVkaXRvci9sYXlvdXQtYnVpbGRlci1lZGl0b3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXZELE9BQU8sRUFBRSxlQUFlLEVBQUcsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7O0FBZ0JwRixNQUFNLE9BQU8sNEJBQTRCO0lBQ3JDO1FBQ0ksRUFBRTtJQUNOLENBQUM7OzBIQUhRLDRCQUE0QjsySEFBNUIsNEJBQTRCLGlCQVpqQywrQkFBK0IsYUFHL0IsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixhQUFhO1FBQ2IsYUFBYTtRQUNiLGVBQWUsaUNBR1YsK0JBQStCOzJIQUUvQiw0QkFBNEIsWUFUakMsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixhQUFhO1FBQ2IsYUFBYTtRQUNiLGVBQWU7UUFDZixlQUFlLENBQUMsUUFBUSxFQUFFOzRGQUlyQiw0QkFBNEI7a0JBZHhDLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFO3dCQUNWLCtCQUErQjtxQkFDbEM7b0JBQ0QsT0FBTyxFQUFFO3dCQUNMLFlBQVk7d0JBQ1osZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixlQUFlLENBQUMsUUFBUSxFQUFFO3FCQUM3QjtvQkFDRCxPQUFPLEVBQUMsQ0FBQywrQkFBK0IsQ0FBQztpQkFDNUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPdmVybGF5TW9kdWxlfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5cbmltcG9ydCB7IFBlcE5neExpYk1vZHVsZSAgfSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYic7XG5cbmltcG9ydCB7IFBlcExheW91dEJ1aWxkZXJFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1idWlsZGVyLWVkaXRvci5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBQZXBMYXlvdXRCdWlsZGVyRWRpdG9yQ29tcG9uZW50XG4gICAgXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgSHR0cENsaWVudE1vZHVsZSxcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcbiAgICAgICAgTWF0VGFic01vZHVsZSxcbiAgICAgICAgUGVwTmd4TGliTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUuZm9yQ2hpbGQoKVxuICAgIF0sXG4gICAgZXhwb3J0czpbUGVwTGF5b3V0QnVpbGRlckVkaXRvckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgUGVwTGF5b3V0QnVpbGRlckVkaXRvck1vZHVsZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vXG4gICAgfVxufVxuIl19
|
|
@@ -5,68 +5,22 @@ import { PepGuid, PepScreenSizeType } from "@pepperi-addons/ngx-lib";
|
|
|
5
5
|
import { BehaviorSubject } from 'rxjs';
|
|
6
6
|
import { distinctUntilChanged, filter } from 'rxjs/operators';
|
|
7
7
|
import { PepDialogData } from "@pepperi-addons/ngx-lib/dialog";
|
|
8
|
+
import { PepPaddingSettings } from "@pepperi-addons/ngx-composite-lib/padding-settings";
|
|
8
9
|
import * as i0 from "@angular/core";
|
|
9
10
|
import * as i1 from "@ngx-translate/core";
|
|
10
11
|
import * as i2 from "@pepperi-addons/ngx-lib/dialog";
|
|
11
12
|
import * as i3 from "@pepperi-addons/ngx-lib";
|
|
12
13
|
export class LayoutBuilderInternalService {
|
|
13
|
-
constructor(translate, dialogService, layoutService) {
|
|
14
|
-
this.translate = translate;
|
|
15
|
-
this.dialogService = dialogService;
|
|
16
|
-
this.layoutService = layoutService;
|
|
17
|
-
this._defaultSectionTitle = '';
|
|
18
|
-
// This configuration is for blocks behavior.
|
|
19
|
-
this._blocksLimitNumber = 0;
|
|
20
|
-
this._navigateToEditorAfterBlockAdded = false;
|
|
21
|
-
this._getBlockTitle = (blockKey) => { return blockKey; };
|
|
22
|
-
this._editorsBreadCrumb = Array();
|
|
23
|
-
this._editMode = false;
|
|
24
|
-
this._editableState = false;
|
|
25
|
-
// This subject is for the screen size change events.
|
|
26
|
-
this._screenSizeSubject = new BehaviorSubject(undefined);
|
|
27
|
-
// This subject is for demostrate the container size (Usage only in edit mode).
|
|
28
|
-
this._screenWidthSubject = new BehaviorSubject('100%');
|
|
29
|
-
// This subject is for load the current editor (Usage only in edit mode).
|
|
30
|
-
this._editorSubject = new BehaviorSubject(null);
|
|
31
|
-
// This is the sections columns drop list subject.
|
|
32
|
-
this._sectionsColumnsDropListSubject = new BehaviorSubject([]);
|
|
33
|
-
// This is the sections subject (a pare from the layout view object)
|
|
34
|
-
this._sectionsViewSubject = new BehaviorSubject([]);
|
|
35
|
-
// This subject is for layout view change.
|
|
36
|
-
this._layoutViewSubject = new BehaviorSubject(null);
|
|
37
|
-
// This subject is for edit mode when block is dragging now or not.
|
|
38
|
-
this._draggingBlockKey = new BehaviorSubject('');
|
|
39
|
-
// This subject is for edit mode when section is dragging now or not.
|
|
40
|
-
this._draggingSectionKey = new BehaviorSubject('');
|
|
41
|
-
// This subject is for lock or unlock the screen (Usage only in edit mode).
|
|
42
|
-
this._lockScreenSubject = new BehaviorSubject(false);
|
|
43
|
-
// This is for control the preview mode (for load the blocks with the CPI events)
|
|
44
|
-
this._previewModeSubject = new BehaviorSubject(false);
|
|
45
|
-
// This is for editor mode for block added.
|
|
46
|
-
this._blockAddedEventSubject = new BehaviorSubject(null);
|
|
47
|
-
// This is for editor mode for blocks removed.
|
|
48
|
-
this._blocksRemovedEventSubject = new BehaviorSubject([]);
|
|
49
|
-
// This subject is for skeleton.
|
|
50
|
-
this._showSkeletonSubject = new BehaviorSubject(true);
|
|
51
|
-
//
|
|
52
|
-
this.translate.get('LAYOUT_BUILDER.SECTION').subscribe((res) => {
|
|
53
|
-
// Set the default section name.
|
|
54
|
-
this._defaultSectionTitle = res;
|
|
55
|
-
});
|
|
56
|
-
this.layoutService.onResize$.subscribe((size) => {
|
|
57
|
-
this.notifyScreenSizeChange(size);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
14
|
setBlocksConfig(value) {
|
|
61
15
|
this._blocksLimitNumber = value.blocksLimitNumber || 0;
|
|
62
16
|
this._navigateToEditorAfterBlockAdded = value.navigateToEditorAfterBlockAdded ?? false;
|
|
63
17
|
this._getBlockTitle = value.getBlockTitle ? value.getBlockTitle : (blockKey) => { return blockKey; };
|
|
64
18
|
}
|
|
65
|
-
get
|
|
66
|
-
return this.
|
|
19
|
+
get editorMode() {
|
|
20
|
+
return this._editorMode;
|
|
67
21
|
}
|
|
68
|
-
|
|
69
|
-
this.
|
|
22
|
+
setEditorMode(value) {
|
|
23
|
+
this._editorMode = value;
|
|
70
24
|
this.setEditableState();
|
|
71
25
|
}
|
|
72
26
|
get editableState() {
|
|
@@ -97,9 +51,6 @@ export class LayoutBuilderInternalService {
|
|
|
97
51
|
get draggingSectionKey() {
|
|
98
52
|
return this._draggingSectionKey.asObservable().pipe(distinctUntilChanged());
|
|
99
53
|
}
|
|
100
|
-
get lockScreenChange$() {
|
|
101
|
-
return this._lockScreenSubject.asObservable().pipe(distinctUntilChanged());
|
|
102
|
-
}
|
|
103
54
|
get previewModeChange$() {
|
|
104
55
|
return this._previewModeSubject.asObservable().pipe(distinctUntilChanged());
|
|
105
56
|
}
|
|
@@ -109,15 +60,65 @@ export class LayoutBuilderInternalService {
|
|
|
109
60
|
get blocksRemovedEventSubject$() {
|
|
110
61
|
return this._blocksRemovedEventSubject.asObservable();
|
|
111
62
|
}
|
|
112
|
-
|
|
113
|
-
|
|
63
|
+
// // This subject is for skeleton.
|
|
64
|
+
// private _showSkeletonSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);
|
|
65
|
+
// get showSkeletonChange$(): Observable<boolean> {
|
|
66
|
+
// return this._showSkeletonSubject.asObservable().pipe(distinctUntilChanged());
|
|
67
|
+
// }
|
|
68
|
+
constructor(translate, dialogService, layoutService) {
|
|
69
|
+
this.translate = translate;
|
|
70
|
+
this.dialogService = dialogService;
|
|
71
|
+
this.layoutService = layoutService;
|
|
72
|
+
this._defaultSectionTitle = '';
|
|
73
|
+
// This configuration is for blocks behavior.
|
|
74
|
+
this._blocksLimitNumber = 0;
|
|
75
|
+
this._navigateToEditorAfterBlockAdded = false;
|
|
76
|
+
this._getBlockTitle = (blockKey) => { return blockKey; };
|
|
77
|
+
this._editorsBreadCrumb = Array();
|
|
78
|
+
this._editorMode = false;
|
|
79
|
+
this._editableState = false;
|
|
80
|
+
// This subject is for the screen size change events.
|
|
81
|
+
this._screenSizeSubject = new BehaviorSubject(undefined);
|
|
82
|
+
// This subject is for demostrate the container size (Usage only in edit mode).
|
|
83
|
+
this._screenWidthSubject = new BehaviorSubject('100%');
|
|
84
|
+
// This subject is for load the current editor (Usage only in edit mode).
|
|
85
|
+
this._editorSubject = new BehaviorSubject(null);
|
|
86
|
+
// This is the sections columns drop list subject.
|
|
87
|
+
this._sectionsColumnsDropListSubject = new BehaviorSubject([]);
|
|
88
|
+
// This is the sections subject (a pare from the layout view object)
|
|
89
|
+
this._sectionsViewSubject = new BehaviorSubject([]);
|
|
90
|
+
// This subject is for layout view change.
|
|
91
|
+
this._layoutViewSubject = new BehaviorSubject(null);
|
|
92
|
+
// This subject is for edit mode when block is dragging now or not.
|
|
93
|
+
this._draggingBlockKey = new BehaviorSubject('');
|
|
94
|
+
// This subject is for edit mode when section is dragging now or not.
|
|
95
|
+
this._draggingSectionKey = new BehaviorSubject('');
|
|
96
|
+
// // This subject is for lock or unlock the screen (Usage only in edit mode).
|
|
97
|
+
// private _lockScreenSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
|
|
98
|
+
// get lockScreenChange$(): Observable<boolean> {
|
|
99
|
+
// return this._lockScreenSubject.asObservable().pipe(distinctUntilChanged());
|
|
100
|
+
// }
|
|
101
|
+
// This is for control the preview mode (for load the blocks with the CPI events)
|
|
102
|
+
this._previewModeSubject = new BehaviorSubject(false);
|
|
103
|
+
// This is for editor mode for block added.
|
|
104
|
+
this._blockAddedEventSubject = new BehaviorSubject(null);
|
|
105
|
+
// This is for editor mode for blocks removed.
|
|
106
|
+
this._blocksRemovedEventSubject = new BehaviorSubject([]);
|
|
107
|
+
//
|
|
108
|
+
this.translate.get('LAYOUT_BUILDER.SECTION').subscribe((res) => {
|
|
109
|
+
// Set the default section name.
|
|
110
|
+
this._defaultSectionTitle = res;
|
|
111
|
+
});
|
|
112
|
+
this.layoutService.onResize$.subscribe((size) => {
|
|
113
|
+
this.notifyScreenSizeChange(size);
|
|
114
|
+
});
|
|
114
115
|
}
|
|
115
116
|
setEditableState() {
|
|
116
|
-
this._editableState = this.
|
|
117
|
+
this._editableState = this.editorMode && !this._previewModeSubject.getValue();
|
|
117
118
|
}
|
|
118
119
|
notifyLayoutViewChange(layoutViewToUpdate) {
|
|
119
120
|
if (layoutViewToUpdate) {
|
|
120
|
-
if (this.
|
|
121
|
+
if (this.editorMode) {
|
|
121
122
|
this.updateLayoutEditorProperties(layoutViewToUpdate);
|
|
122
123
|
}
|
|
123
124
|
// Update the layout for the view.
|
|
@@ -143,9 +144,9 @@ export class LayoutBuilderInternalService {
|
|
|
143
144
|
this._previewModeSubject.next(value);
|
|
144
145
|
this.setEditableState();
|
|
145
146
|
}
|
|
146
|
-
notifyLockScreen(value) {
|
|
147
|
-
|
|
148
|
-
}
|
|
147
|
+
// private notifyLockScreen(value: boolean) {
|
|
148
|
+
// this._lockScreenSubject.next(value);
|
|
149
|
+
// }
|
|
149
150
|
notifySectionsColumnsDropListChange(sectionsColumnsDropList) {
|
|
150
151
|
this._sectionsColumnsDropListSubject.next(sectionsColumnsDropList);
|
|
151
152
|
}
|
|
@@ -223,7 +224,8 @@ export class LayoutBuilderInternalService {
|
|
|
223
224
|
split: section.Split || undefined,
|
|
224
225
|
height: section.Height || 0,
|
|
225
226
|
collapseOnTablet: section.CollapseOnTablet ?? false,
|
|
226
|
-
fillHeight: section.FillHeight ?? false
|
|
227
|
+
fillHeight: section.FillHeight ?? false,
|
|
228
|
+
padding: section.Padding || new PepPaddingSettings(true, '0')
|
|
227
229
|
};
|
|
228
230
|
return {
|
|
229
231
|
id: sectionId,
|
|
@@ -371,6 +373,7 @@ export class LayoutBuilderInternalService {
|
|
|
371
373
|
currentSection.Height = sectionData.height;
|
|
372
374
|
currentSection.CollapseOnTablet = sectionData.collapseOnTablet;
|
|
373
375
|
currentSection.FillHeight = sectionData.fillHeight;
|
|
376
|
+
currentSection.Padding = sectionData.padding;
|
|
374
377
|
// Get the new columns number from currentSection.Split, if its undefined put a default 1.
|
|
375
378
|
const newColumnsLength = currentSection.Split?.split(' ').length || 1;
|
|
376
379
|
if (newColumnsLength > currentSection.Columns.length) {
|
|
@@ -598,14 +601,14 @@ export class LayoutBuilderInternalService {
|
|
|
598
601
|
}
|
|
599
602
|
}
|
|
600
603
|
}
|
|
601
|
-
showSkeleton(show) {
|
|
602
|
-
|
|
603
|
-
}
|
|
604
|
-
lockScreen(value) {
|
|
605
|
-
|
|
606
|
-
}
|
|
604
|
+
// showSkeleton(show: boolean): void {
|
|
605
|
+
// this._showSkeletonSubject.next(show);
|
|
606
|
+
// }
|
|
607
|
+
// lockScreen(value: boolean): void {
|
|
608
|
+
// this.notifyLockScreen(value);
|
|
609
|
+
// }
|
|
607
610
|
loadLayoutBuilder(layoutView) {
|
|
608
|
-
if (this.
|
|
611
|
+
if (this.editorMode) {
|
|
609
612
|
if (this._editorsBreadCrumb.length === 0) {
|
|
610
613
|
// Load the layout editor.
|
|
611
614
|
this.loadDefaultEditor(layoutView);
|
|
@@ -617,12 +620,9 @@ export class LayoutBuilderInternalService {
|
|
|
617
620
|
}
|
|
618
621
|
LayoutBuilderInternalService.AVAILABLE_BLOCKS_CONTAINER_ID = 'availableBlocks';
|
|
619
622
|
LayoutBuilderInternalService.MAIN_EDITOR_ID = 'main';
|
|
620
|
-
LayoutBuilderInternalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
621
|
-
LayoutBuilderInternalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
622
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
623
|
-
type: Injectable
|
|
624
|
-
args: [{
|
|
625
|
-
providedIn: 'root',
|
|
626
|
-
}]
|
|
623
|
+
LayoutBuilderInternalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LayoutBuilderInternalService, deps: [{ token: i1.TranslateService }, { token: i2.PepDialogService }, { token: i3.PepLayoutService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
624
|
+
LayoutBuilderInternalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LayoutBuilderInternalService });
|
|
625
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LayoutBuilderInternalService, decorators: [{
|
|
626
|
+
type: Injectable
|
|
627
627
|
}], ctorParameters: function () { return [{ type: i1.TranslateService }, { type: i2.PepDialogService }, { type: i3.PepLayoutService }]; } });
|
|
628
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJ1aWxkZXItaW50ZXJuYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb3NpdGUtbGliL2xheW91dC1idWlsZGVyL2xheW91dC1idWlsZGVyLWludGVybmFsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQXdELGVBQWUsRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVsSSxPQUFPLEVBQW1CLE9BQU8sRUFBb0MsaUJBQWlCLEVBQTBDLE1BQU0seUJBQXlCLENBQUM7QUFHaEssT0FBTyxFQUFjLGVBQWUsRUFBVyxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQWdCLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVFLE9BQU8sRUFBRSxhQUFhLEVBQW9CLE1BQU0sZ0NBQWdDLENBQUM7Ozs7O0FBd0JqRixNQUFNLE9BQU8sNEJBQTRCO0lBOEdyQyxZQUNjLFNBQTJCLEVBQzNCLGFBQStCLEVBQ2pDLGFBQStCO1FBRjdCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUNqQyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUE3R25DLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUVsQyw2Q0FBNkM7UUFDckMsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLHFDQUFnQyxHQUFHLEtBQUssQ0FBQztRQUN6QyxtQkFBYyxHQUFpQyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsT0FBTyxRQUFRLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFPakYsdUJBQWtCLEdBQUcsS0FBSyxFQUFXLENBQUM7UUFFdEMsY0FBUyxHQUFH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QkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2VyY2lvblwiO1xuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIENka0RyYWdFbmQsIENka0RyYWdTdGFydCwgY29weUFycmF5SXRlbSwgbW92ZUl0ZW1JbkFycmF5LCB0cmFuc2ZlckFycmF5SXRlbSB9IGZyb20gXCJAYW5ndWxhci9jZGsvZHJhZy1kcm9wXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IFBlcEFkZG9uU2VydmljZSwgUGVwR3VpZCwgUGVwSHR0cFNlcnZpY2UsIFBlcExheW91dFNlcnZpY2UsIFBlcFNjcmVlblNpemVUeXBlLCBQZXBTZXNzaW9uU2VydmljZSwgUGVwVXRpbGl0aWVzU2VydmljZSB9IGZyb20gXCJAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYlwiO1xuaW1wb3J0IHsgSVBlcERyYWdnYWJsZUl0ZW0gfSBmcm9tIFwiQHBlcHBlcmktYWRkb25zL25neC1saWIvZHJhZ2dhYmxlLWl0ZW1zXCI7XG5pbXBvcnQgeyBEYXRhVmlld1NjcmVlblNpemUsIFNwbGl0VHlwZSB9IGZyb20gXCJAcGVwcGVyaS1hZGRvbnMvcGFwaS1zZGtcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUGVwTGF5b3V0RWRpdG9yVHlwZSwgSVBlcExheW91dEJsb2NrQWRkZWRFdmVudCwgSVBlcExheW91dFNlY3Rpb24sIElQZXBMYXlvdXRTZWN0aW9uQ29sdW1uLCBJUGVwTGF5b3V0VmlldywgSVBlcExheW91dEJsb2NrQ29uZmlnLCBQZXBMYXlvdXRTaXplVHlwZSwgSUVkaXRvciB9IGZyb20gXCIuL2xheW91dC1idWlsZGVyLm1vZGVsXCI7XG5pbXBvcnQgeyBQZXBEaWFsb2dEYXRhLCBQZXBEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIkBwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2RpYWxvZ1wiO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxheW91dEVkaXRvciB7XG4gICAgbWF4V2lkdGg6IG51bWJlcixcbiAgICBob3Jpem9udGFsU3BhY2luZz86IFBlcExheW91dFNpemVUeXBlLFxuICAgIHZlcnRpY2FsU3BhY2luZz86IFBlcExheW91dFNpemVUeXBlLFxuICAgIHNlY3Rpb25zR2FwPzogUGVwTGF5b3V0U2l6ZVR5cGUsXG4gICAgY29sdW1uc0dhcD86IFBlcExheW91dFNpemVUeXBlLFxuICAgIHJvdW5kZWRDb3JuZXJzPzogUGVwTGF5b3V0U2l6ZVR5cGUsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxheW91dFNlY3Rpb25FZGl0b3Ige1xuICAgIGlkOiBzdHJpbmcsXG4gICAgc2VjdGlvbk5hbWU6IHN0cmluZyxcbiAgICBzcGxpdDogU3BsaXRUeXBlIHwgdW5kZWZpbmVkLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGNvbGxhcHNlT25UYWJsZXQ6IGJvb2xlYW4sXG4gICAgZmlsbEhlaWdodDogYm9vbGVhblxufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMYXlvdXRCdWlsZGVySW50ZXJuYWxTZXJ2aWNlIHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgQVZBSUxBQkxFX0JMT0NLU19DT05UQUlORVJfSUQgPSAnYXZhaWxhYmxlQmxvY2tzJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgTUFJTl9FRElUT1JfSUQgPSAnbWFpbic7XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0U2VjdGlvblRpdGxlID0gJyc7XG4gICAgXG4gICAgLy8gVGhpcyBjb25maWd1cmF0aW9uIGlzIGZvciBibG9ja3MgYmVoYXZpb3IuXG4gICAgcHJpdmF0ZSBfYmxvY2tzTGltaXROdW1iZXIgPSAwO1xuICAgIHByaXZhdGUgX25hdmlnYXRlVG9FZGl0b3JBZnRlckJsb2NrQWRkZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9nZXRCbG9ja1RpdGxlOiAoYmxvY2tLZXk6IHN0cmluZykgPT4gc3RyaW5nID0gKGJsb2NrS2V5KSA9PiB7IHJldHVybiBibG9ja0tleSB9O1xuICAgIHNldEJsb2Nrc0NvbmZpZyh2YWx1ZTogSVBlcExheW91dEJsb2NrQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2Jsb2Nrc0xpbWl0TnVtYmVyID0gdmFsdWUuYmxvY2tzTGltaXROdW1iZXIgfHwgMDtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVUb0VkaXRvckFmdGVyQmxvY2tBZGRlZCA9IHZhbHVlLm5hdmlnYXRlVG9FZGl0b3JBZnRlckJsb2NrQWRkZWQgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuX2dldEJsb2NrVGl0bGUgPSB2YWx1ZS5nZXRCbG9ja1RpdGxlID8gdmFsdWUuZ2V0QmxvY2tUaXRsZSA6IChibG9ja0tleSkgPT4geyByZXR1cm4gYmxvY2tLZXkgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9lZGl0b3JzQnJlYWRDcnVtYiA9IEFycmF5PElFZGl0b3I+KCk7XG5cbiAgICBwcml2YXRlIF9lZGl0TW9kZSA9IGZhbHNlO1xuICAgIGdldCBlZGl0TW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRNb2RlO1xuICAgIH1cbiAgICBzZXRFZGl0TW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9lZGl0TW9kZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNldEVkaXRhYmxlU3RhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9lZGl0YWJsZVN0YXRlID0gZmFsc2U7XG4gICAgZ2V0IGVkaXRhYmxlU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0YWJsZVN0YXRlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgdGhlIHNjcmVlbiBzaXplIGNoYW5nZSBldmVudHMuXG4gICAgcHJpdmF0ZSBfc2NyZWVuU2l6ZVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQZXBTY3JlZW5TaXplVHlwZSB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBlcFNjcmVlblNpemVUeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIGdldCBzY3JlZW5TaXplQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPFBlcFNjcmVlblNpemVUeXBlIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JlZW5TaXplU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBUaGlzIHN1YmplY3QgaXMgZm9yIGRlbW9zdHJhdGUgdGhlIGNvbnRhaW5lciBzaXplIChVc2FnZSBvbmx5IGluIGVkaXQgbW9kZSkuXG4gICAgcHJpdmF0ZSBfc2NyZWVuV2lkdGhTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignMTAwJScpO1xuICAgIGdldCBzY3JlZW5XaWR0aENoYW5nZSQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjcmVlbldpZHRoU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgbG9hZCB0aGUgY3VycmVudCBlZGl0b3IgKFVzYWdlIG9ubHkgaW4gZWRpdCBtb2RlKS5cbiAgICBwcml2YXRlIF9lZGl0b3JTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8SUVkaXRvciB8IG51bGw+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRWRpdG9yIHwgbnVsbD4obnVsbCk7XG4gICAgZ2V0IGVkaXRvckNoYW5nZSQoKTogT2JzZXJ2YWJsZTxJRWRpdG9yIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgdGhlIHNlY3Rpb25zIGNvbHVtbnMgZHJvcCBsaXN0IHN1YmplY3QuXG4gICAgcHJpdmF0ZSBfc2VjdGlvbnNDb2x1bW5zRHJvcExpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIGdldCBzZWN0aW9uc0NvbHVtbnNEcm9wTGlzdENoYW5nZSQoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnNDb2x1bW5zRHJvcExpc3RTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgdGhlIHNlY3Rpb25zIHN1YmplY3QgKGEgcGFyZSBmcm9tIHRoZSBsYXlvdXQgdmlldyBvYmplY3QpXG4gICAgcHJpdmF0ZSBfc2VjdGlvbnNWaWV3U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PElQZXBMYXlvdXRTZWN0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJUGVwTGF5b3V0U2VjdGlvbltdPihbXSk7XG4gICAgZ2V0IHNlY3Rpb25zQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPElQZXBMYXlvdXRTZWN0aW9uW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlY3Rpb25zVmlld1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIC8vIChwcmV2U2VjdGlvbnMsIG5leHRTZWN0aW9ucykgPT4gSlNPTi5zdHJpbmdpZnkocHJldlNlY3Rpb25zKSA9PT0gSlNPTi5zdHJpbmdpZnkobmV4dFNlY3Rpb25zKSkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgbGF5b3V0IHZpZXcgY2hhbmdlLlxuICAgIHByaXZhdGUgX2xheW91dFZpZXdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8SVBlcExheW91dFZpZXcgfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVBlcExheW91dFZpZXcgfCBudWxsPihudWxsKTtcbiAgICBnZXQgbGF5b3V0Vmlld0NoYW5nZSQoKTogT2JzZXJ2YWJsZTxJUGVwTGF5b3V0VmlldyB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZmlsdGVyKGxheW91dCA9PiAhIWxheW91dCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgZWRpdCBtb2RlIHdoZW4gYmxvY2sgaXMgZHJhZ2dpbmcgbm93IG9yIG5vdC5cbiAgICBwcml2YXRlIF9kcmFnZ2luZ0Jsb2NrS2V5OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICAgIGdldCBkcmFnZ2luZ0Jsb2NrS2V5KCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnZ2luZ0Jsb2NrS2V5LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBzdWJqZWN0IGlzIGZvciBlZGl0IG1vZGUgd2hlbiBzZWN0aW9uIGlzIGRyYWdnaW5nIG5vdyBvciBub3QuXG4gICAgcHJpdmF0ZSBfZHJhZ2dpbmdTZWN0aW9uS2V5OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICAgIGdldCBkcmFnZ2luZ1NlY3Rpb25LZXkoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdnaW5nU2VjdGlvbktleS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgbG9jayBvciB1bmxvY2sgdGhlIHNjcmVlbiAoVXNhZ2Ugb25seSBpbiBlZGl0IG1vZGUpLlxuICAgIHByaXZhdGUgX2xvY2tTY3JlZW5TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBnZXQgbG9ja1NjcmVlbkNoYW5nZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NrU2NyZWVuU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZm9yIGNvbnRyb2wgdGhlIHByZXZpZXcgbW9kZSAoZm9yIGxvYWQgdGhlIGJsb2NrcyB3aXRoIHRoZSBDUEkgZXZlbnRzKSBcbiAgICBwcml2YXRlIF9wcmV2aWV3TW9kZVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIGdldCBwcmV2aWV3TW9kZUNoYW5nZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmV2aWV3TW9kZVN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGZvciBlZGl0b3IgbW9kZSBmb3IgYmxvY2sgYWRkZWQuXG4gICAgcHJpdmF0ZSBfYmxvY2tBZGRlZEV2ZW50U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVBlcExheW91dEJsb2NrQWRkZWRFdmVudCB8IG51bGw+KG51bGwpO1xuICAgIGdldCBibG9ja0FkZGVkRXZlbnRTdWJqZWN0JCgpOiBPYnNlcnZhYmxlPElQZXBMYXlvdXRCbG9ja0FkZGVkRXZlbnQgfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ibG9ja0FkZGVkRXZlbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICAvLyBUaGlzIGlzIGZvciBlZGl0b3IgbW9kZSBmb3IgYmxvY2tzIHJlbW92ZWQuXG4gICAgcHJpdmF0ZSBfYmxvY2tzUmVtb3ZlZEV2ZW50U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcbiAgICBnZXQgYmxvY2tzUmVtb3ZlZEV2ZW50U3ViamVjdCQoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2tzUmVtb3ZlZEV2ZW50U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIHN1YmplY3QgaXMgZm9yIHNrZWxldG9uLlxuICAgIHByaXZhdGUgX3Nob3dTa2VsZXRvblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gICAgZ2V0IHNob3dTa2VsZXRvbkNoYW5nZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93U2tlbGV0b25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgZGlhbG9nU2VydmljZTogUGVwRGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBQZXBMYXlvdXRTZXJ2aWNlLFxuICAgICkge1xuICAgICAgICAvL1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5nZXQoJ0xBWU9VVF9CVUlMREVSLlNFQ1RJT04nKS5zdWJzY3JpYmUoKHJlczogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgc2VjdGlvbiBuYW1lLlxuICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFNlY3Rpb25UaXRsZSA9IHJlcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLm9uUmVzaXplJC5zdWJzY3JpYmUoKHNpemU6IFBlcFNjcmVlblNpemVUeXBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeVNjcmVlblNpemVDaGFuZ2Uoc2l6ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIHNldEVkaXRhYmxlU3RhdGUoKSB7XG4gICAgICAgIHRoaXMuX2VkaXRhYmxlU3RhdGUgPSB0aGlzLmVkaXRNb2RlICYmICF0aGlzLl9wcmV2aWV3TW9kZVN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlld1RvVXBkYXRlOiBJUGVwTGF5b3V0VmlldyB8IG51bGwpIHtcbiAgICAgICAgaWYgKGxheW91dFZpZXdUb1VwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdE1vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxheW91dEVkaXRvclByb3BlcnRpZXMobGF5b3V0Vmlld1RvVXBkYXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBsYXlvdXQgZm9yIHRoZSB2aWV3LlxuICAgICAgICAgICAgdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QubmV4dChsYXlvdXRWaWV3VG9VcGRhdGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlY3Rpb25zIGZvciB0aGUgdmlldy5cbiAgICAgICAgICAgIHRoaXMuX3NlY3Rpb25zVmlld1N1YmplY3QubmV4dChsYXlvdXRWaWV3VG9VcGRhdGU/LkxheW91dC5TZWN0aW9ucyB8fCBbXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUJsb2NrQWRkZWQoYmxvY2tBZGRlZEV2ZW50RGF0YTogSVBlcExheW91dEJsb2NrQWRkZWRFdmVudCkge1xuICAgICAgICAvLyBOb3RpZnkgdGhhdCB0aGUgYmxvY2sgaXMgYWRkZWQgKHRvIHJhaXNlIHRoZSBldmVudCBmb3IgdGhlIGNsaWVudCkuXG4gICAgICAgIHRoaXMuX2Jsb2NrQWRkZWRFdmVudFN1YmplY3QubmV4dChibG9ja0FkZGVkRXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUJsb2Nrc1JlbW92ZWQoa2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGtleXMpIHtcbiAgICAgICAgICAgIC8vIE5vdGlmeSB0aGF0IHRoZSBibG9ja3MgYXJlIHJlbW92ZWQgKHRvIHJhaXNlIHRoZSBldmVudCBmb3IgdGhlIGNsaWVudCkuXG4gICAgICAgICAgICB0aGlzLl9ibG9ja3NSZW1vdmVkRXZlbnRTdWJqZWN0Lm5leHQoa2V5cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUVkaXRvckNoYW5nZShlZGl0b3I6IElFZGl0b3IgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX2VkaXRvclN1YmplY3QubmV4dChlZGl0b3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm90aWZ5UHJldmlld01vZGVDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcHJldmlld01vZGVTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgICAgICB0aGlzLnNldEVkaXRhYmxlU3RhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUxvY2tTY3JlZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fbG9ja1NjcmVlblN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlTZWN0aW9uc0NvbHVtbnNEcm9wTGlzdENoYW5nZShzZWN0aW9uc0NvbHVtbnNEcm9wTGlzdDogYW55W10pIHtcbiAgICAgICAgdGhpcy5fc2VjdGlvbnNDb2x1bW5zRHJvcExpc3RTdWJqZWN0Lm5leHQoc2VjdGlvbnNDb2x1bW5zRHJvcExpc3QpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm90aWZ5U2NyZWVuU2l6ZUNoYW5nZShzaXplOiBQZXBTY3JlZW5TaXplVHlwZSkge1xuICAgICAgICB0aGlzLl9zY3JlZW5TaXplU3ViamVjdC5uZXh0KHNpemUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTGF5b3V0RWRpdG9yUHJvcGVydGllcyhsYXlvdXRWaWV3OiBJUGVwTGF5b3V0Vmlldykge1xuICAgICAgICBpZiAodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWJbMF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxheW91dEVkaXRvcjogSUxheW91dEVkaXRvciA9IHtcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogbGF5b3V0Vmlldz8uTGF5b3V0Lk1heFdpZHRoIHx8IDAsXG4gICAgICAgICAgICAgICAgdmVydGljYWxTcGFjaW5nOiBsYXlvdXRWaWV3Py5MYXlvdXQuVmVydGljYWxTcGFjaW5nLFxuICAgICAgICAgICAgICAgIGhvcml6b250YWxTcGFjaW5nOiBsYXlvdXRWaWV3Py5MYXlvdXQuSG9yaXpvbnRhbFNwYWNpbmcsXG4gICAgICAgICAgICAgICAgc2VjdGlvbnNHYXA6IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9uc0dhcCxcbiAgICAgICAgICAgICAgICBjb2x1bW5zR2FwOiBsYXlvdXRWaWV3Py5MYXlvdXQuQ29sdW1uc0dhcCxcbiAgICAgICAgICAgICAgICAvLyByb3VuZGVkQ29ybmVyczogbGF5b3V0Vmlldz8uTGF5b3V0LlJvdW5kZWRDb3JuZXJzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYlswXS5ob3N0T2JqZWN0ID0gbGF5b3V0RWRpdG9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkRGVmYXVsdEVkaXRvcihsYXlvdXRWaWV3OiBJUGVwTGF5b3V0Vmlldykge1xuICAgICAgICB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYiA9IG5ldyBBcnJheTxJRWRpdG9yPigpO1xuXG4gICAgICAgIGlmIChsYXlvdXRWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5nZXQoJ0xBWU9VVF9CVUlMREVSLkRFRkFVTFRfVElUTEUnKS5zdWJzY3JpYmUoKHRpdGxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IExheW91dEJ1aWxkZXJJbnRlcm5hbFNlcnZpY2UuTUFJTl9FRElUT1JfSUQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgOiAnbGF5b3V0LWJ1aWxkZXInLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvc3RPYmplY3Q6IHt9IC8vIFVwZGF0ZXMgaW4gdXBkYXRlTGF5b3V0RWRpdG9yUHJvcGVydGllcyBmdW5jdGlvbiBhYm92ZS5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTGF5b3V0RWRpdG9yUHJvcGVydGllcyhsYXlvdXRWaWV3KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUVkaXRvckNoYW5nZSh0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYlswXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5RWRpdG9yQ2hhbmdlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VDdXJyZW50RWRpdG9yKCkge1xuICAgICAgICBpZiAodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlFZGl0b3JDaGFuZ2UodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWJbdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFZGl0b3JCeVR5cGUoZWRpdG9yVHlwZTogUGVwTGF5b3V0RWRpdG9yVHlwZSwgaWQ6IHN0cmluZywgdGl0bGUgPSAnJyk6IElFZGl0b3IgfCBudWxsIHtcbiAgICAgICAgLy8gQnVpbGQgZWRpdG9yIG9iamVjdC5cbiAgICAgICAgbGV0IGVkaXRvcjogSUVkaXRvciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChlZGl0b3JUeXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgICAgICAgIGVkaXRvciA9IHRoaXMuZ2V0U2VjdGlvbkVkaXRvcihpZCwgdGl0bGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGVkaXRvclR5cGUgPT09ICdibG9jaycpIHtcbiAgICAgICAgICAgIGVkaXRvciA9IHRoaXMuZ2V0QmxvY2tFZGl0b3IoaWQsIHRpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlZGl0b3I7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCbG9ja0VkaXRvcihibG9ja0tleTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogSUVkaXRvciB7XG4gICAgICAgIC8vIEdldCBibG9jayBlZGl0b3IgdGl0bGUuXG4gICAgICAgIGNvbnN0IGJsb2NrVGl0bGUgPSB0aXRsZSB8fCB0aGlzLmdldEJsb2NrVGl0bGUoYmxvY2tLZXkpOyBcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGJsb2NrS2V5LFxuICAgICAgICAgICAgdHlwZTogJ2Jsb2NrJyxcbiAgICAgICAgICAgIHRpdGxlOiBibG9ja1RpdGxlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlY3Rpb25FZGl0b3JUaXRsZShzZWN0aW9uOiBJUGVwTGF5b3V0U2VjdGlvbiwgc2VjdGlvbkluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc2VjdGlvbi5OYW1lIHx8IGAke3RoaXMuX2RlZmF1bHRTZWN0aW9uVGl0bGV9ICR7c2VjdGlvbkluZGV4ICsgMX1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VjdGlvbkVkaXRvcihzZWN0aW9uSWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IElFZGl0b3IgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBzZWN0aW9uSW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcblxuICAgICAgICBpZiAoc2VjdGlvbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkVkaXRvcjogSUxheW91dFNlY3Rpb25FZGl0b3IgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHNlY3Rpb24uS2V5LFxuICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lOiBzZWN0aW9uLk5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgc3BsaXQ6IHNlY3Rpb24uU3BsaXQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGhlaWdodDogc2VjdGlvbi5IZWlnaHQgfHwgMCxcbiAgICAgICAgICAgICAgICBjb2xsYXBzZU9uVGFibGV0OiBzZWN0aW9uLkNvbGxhcHNlT25UYWJsZXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsbEhlaWdodDogc2VjdGlvbi5GaWxsSGVpZ2h0ID8/IGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IHNlY3Rpb25JZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2VjdGlvbicsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlIHx8IHRoaXMuZ2V0U2VjdGlvbkVkaXRvclRpdGxlKHNlY3Rpb24sIHNlY3Rpb25JbmRleCksXG4gICAgICAgICAgICAgICAgaG9zdE9iamVjdDogc2VjdGlvbkVkaXRvclxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlY3Rpb25Db2x1bW5CeUlkRm9yRWRpdG9yKHNlY3Rpb25Db2x1bW5JZDogc3RyaW5nKTogSVBlcExheW91dFNlY3Rpb25Db2x1bW4gfCBudWxsIHtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW4gPSBudWxsO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2VjdGlvbiBhbmQgY29sdW1uIGFycmF5IGJ5IHRoZSBwYXR0ZXJuIG9mIHRoZSBzZWN0aW9uIGNvbHVtbiBrZXkuXG4gICAgICAgIGNvbnN0IHNlY3Rpb25Db2x1bW5QYXR0ZXJuU2VwYXJhdG9yID0gdGhpcy5nZXRTZWN0aW9uQ29sdW1uS2V5KCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25Db2x1bW5BcnIgPSBzZWN0aW9uQ29sdW1uSWQuc3BsaXQoc2VjdGlvbkNvbHVtblBhdHRlcm5TZXBhcmF0b3IpO1xuXG4gICAgICAgIGlmIChzZWN0aW9uQ29sdW1uQXJyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHRoZSBzZWN0aW9uIGlkIHRvIGdldCB0aGUgc2VjdGlvbiBpbmRleC5cbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25JZCA9IHNlY3Rpb25Db2x1bW5BcnJbMF07XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY29sdW1uIGluZGV4LlxuICAgICAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eShzZWN0aW9uQ29sdW1uQXJyWzFdLCAtMSk7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbkluZGV4ID49IDAgJiYgY29sdW1uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb2x1bW4gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdLkNvbHVtbnNbY29sdW1uSW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDb2x1bW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDc3NTY3JlZW5XaWRoKHNjcmVlblR5cGU6IERhdGFWaWV3U2NyZWVuU2l6ZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCB3aWR0aFRvU2V0ID0gJzEwMCUnO1xuXG4gICAgICAgIGlmIChzY3JlZW5UeXBlID09PSAnVGFibGV0Jykge1xuICAgICAgICAgICAgd2lkdGhUb1NldCA9ICc3MjAnO1xuICAgICAgICB9IGVsc2UgaWYgKHNjcmVlblR5cGUgPT09ICdQaGFibGV0Jykge1xuICAgICAgICAgICAgd2lkdGhUb1NldCA9ICczNjAnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdpZHRoVG9TZXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCbG9ja3NOdW1iZXIoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGJsb2Nrc051bWJlciA9IDA7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKT8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzZWN0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tpbmRleF07XG4gICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IHNlY3Rpb24uQ29sdW1ucy5sZW5ndGg7IGNvbHVtbkluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBzZWN0aW9uLkNvbHVtbnNbY29sdW1uSW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uQmxvY2tDb250YWluZXIgJiYgY29sdW1uLkJsb2NrQ29udGFpbmVyLkJsb2NrS2V5Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2Nrc051bWJlcisrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBibG9ja3NOdW1iZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VDdXJzb3JPbkRyYWdTdGFydCgpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpbmhlcml0Q3Vyc29ycycpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VDdXJzb3JPbkRyYWdFbmQoKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnaW5oZXJpdEN1cnNvcnMnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAndW5zZXQnO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdWJsaWMgZnVuY3Rpb25zXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgZ2V0QmxvY2tUaXRsZShibG9ja0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJsb2NrVGl0bGUoYmxvY2tLZXkpIHx8IGJsb2NrS2V5O1xuICAgIH1cblxuICAgIHNldFNlY3Rpb25zQ29sdW1uc0Ryb3BMaXN0Q2hhbmdlKHNlY3Rpb25zQ29sdW1uc0Ryb3BMaXN0OiBhbnlbXSkge1xuICAgICAgICB0aGlzLm5vdGlmeVNlY3Rpb25zQ29sdW1uc0Ryb3BMaXN0Q2hhbmdlKHNlY3Rpb25zQ29sdW1uc0Ryb3BMaXN0KTtcbiAgICB9XG5cbiAgICBjaGFuZ2VQcmV2aWV3TW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm5vdGlmeVByZXZpZXdNb2RlQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50U2NyZWVuVHlwZSgpOiBEYXRhVmlld1NjcmVlblNpemUge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JlZW5UeXBlKHRoaXMuX3NjcmVlblNpemVTdWJqZWN0Py5nZXRWYWx1ZSgpIHx8IFBlcFNjcmVlblNpemVUeXBlLkxHKTtcbiAgICB9XG5cbiAgICBnZXRTY3JlZW5UeXBlKHNpemU6IFBlcFNjcmVlblNpemVUeXBlKTogRGF0YVZpZXdTY3JlZW5TaXplIHtcbiAgICAgICAgY29uc3Qgc2NyZWVuVHlwZTogRGF0YVZpZXdTY3JlZW5TaXplID1cbiAgICAgICAgICAgIHNpemUgPCBQZXBTY3JlZW5TaXplVHlwZS5NRCA/ICdMYW5kc2NhcGUnIDpcbiAgICAgICAgICAgIChzaXplID09PSBQZXBTY3JlZW5TaXplVHlwZS5NRCB8fCBzaXplID09PSBQZXBTY3JlZW5TaXplVHlwZS5TTSA/ICdUYWJsZXQnIDogJ1BoYWJsZXQnKTtcblxuICAgICAgICByZXR1cm4gc2NyZWVuVHlwZTtcbiAgICB9XG5cbiAgICBnZXRTZWN0aW9uQ29sdW1uS2V5KHNlY3Rpb25LZXkgPSAnJywgaW5kZXggPSAnJykge1xuICAgICAgICByZXR1cm4gYCR7c2VjdGlvbktleX1fY29sdW1uXyR7aW5kZXh9YDtcbiAgICB9XG5cbiAgICBnZXRJc0hpZGRlbihoaWRlSW46IERhdGFWaWV3U2NyZWVuU2l6ZVtdIHwgdW5kZWZpbmVkLCBjdXJyZW50U2NyZWVuVHlwZTogRGF0YVZpZXdTY3JlZW5TaXplKSB7XG4gICAgICAgIHJldHVybiAoaGlkZUluICYmIGhpZGVJbj8ubGVuZ3RoID4gMCkgPyBoaWRlSW4uc29tZShoaSA9PiBoaSA9PT0gY3VycmVudFNjcmVlblR5cGUpIDogZmFsc2U7XG4gICAgfVxuXG4gICAgbmF2aWdhdGVUb0VkaXRvcihlZGl0b3JUeXBlOiBQZXBMYXlvdXRFZGl0b3JUeXBlLCBpZDogc3RyaW5nLCB0aXRsZSA9ICcnKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2Fubm90IG5hdmlnYXRlIGludG8gJ2xheW91dC1idWlsZGVyJyBiZWNhdXNlIHRoaXMgaXMgZmlyc3QgYW5kIGNvbnN0IGluIHRoZSBlZGl0b3JzQnJlYWRDcnVtYnMuXG4gICAgICAgIGlmIChlZGl0b3JUeXBlICE9PSAnbGF5b3V0LWJ1aWxkZXInICYmIGlkPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBDaGVjayB3aGljaCBlZGl0b3Igd2UgaGF2ZSBub3dcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFZGl0b3IgPSB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYlt0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgLy8gT25seSBpZiBpdCdzIGFub3RoZXIgZWRpdG9yLlxuICAgICAgICAgICAgaWYoY3VycmVudEVkaXRvci5pZCAhPT0gaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVkaXRvci50eXBlICE9PSAnbGF5b3V0LWJ1aWxkZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBwb3AgdGhlIGxhc3QgYW5kIGluc2VydCB0aGUgY3VycmVudC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5nZXRFZGl0b3JCeVR5cGUoZWRpdG9yVHlwZSwgaWQsIHRpdGxlKTtcblxuICAgICAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIucHVzaChlZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUN1cnJlbnRFZGl0b3IoKTtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIG5hdmlnYXRlQmFja0Zyb21FZGl0b3IoKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIGxheW91dCBidWlsZGVyIGVkaXRvci5cbiAgICAgICAgaWYgKHRoaXMuX2VkaXRvcnNCcmVhZENydW1iLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIE1heWJlIHdlIHdhbnQgdG8gY29tcGFyZSB0aGUgbGFzdCBlZGl0b3IgZm9yIHZhbGlkYXRpb24gP1xuICAgICAgICAgICAgY29uc3QgbGFzdEVkaXRvciA9IHRoaXMuX2VkaXRvcnNCcmVhZENydW1iLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VDdXJyZW50RWRpdG9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVMYXlvdXRGcm9tRWRpdG9yKGVkaXRvckRhdGE6IElMYXlvdXRFZGl0b3IpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgaWYgKGxheW91dFZpZXcpIHtcbiAgICAgICAgICAgIGxheW91dFZpZXcuTGF5b3V0Lk1heFdpZHRoID0gZWRpdG9yRGF0YS5tYXhXaWR0aDtcbiAgICAgICAgICAgIGxheW91dFZpZXcuTGF5b3V0Lkhvcml6b250YWxTcGFjaW5nID0gZWRpdG9yRGF0YS5ob3Jpem9udGFsU3BhY2luZztcbiAgICAgICAgICAgIGxheW91dFZpZXcuTGF5b3V0LlZlcnRpY2FsU3BhY2luZyA9IGVkaXRvckRhdGEudmVydGljYWxTcGFjaW5nO1xuICAgICAgICAgICAgbGF5b3V0Vmlldy5MYXlvdXQuU2VjdGlvbnNHYXAgPSBlZGl0b3JEYXRhLnNlY3Rpb25zR2FwO1xuICAgICAgICAgICAgbGF5b3V0Vmlldy5MYXlvdXQuQ29sdW1uc0dhcCA9IGVkaXRvckRhdGEuY29sdW1uc0dhcDtcbiAgICAgICAgICAgIC8vIGxheW91dFZpZXcuTGF5b3V0LlJvdW5kZWRDb3JuZXJzID0gZWRpdG9yRGF0YS5yb3VuZGVkQ29ybmVycztcblxuICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHVwZGF0ZVNlY3Rpb25Gcm9tRWRpdG9yKHNlY3Rpb25EYXRhOiBJTGF5b3V0U2VjdGlvbkVkaXRvcikge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIGNvbnN0IHNlY3Rpb25JbmRleCA9IHNlY3Rpb25zLmZpbmRJbmRleChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uRGF0YS5pZCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNlY3Rpb24gZGV0YWlscy5cbiAgICAgICAgaWYgKHNlY3Rpb25JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBibG9ja3NJZHNUb1JlbW92ZSA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U2VjdGlvbiA9IHNlY3Rpb25zW3NlY3Rpb25JbmRleF07XG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5OYW1lID0gc2VjdGlvbkRhdGEuc2VjdGlvbk5hbWU7XG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5TcGxpdCA9IHNlY3Rpb25EYXRhLnNwbGl0O1xuICAgICAgICAgICAgY3VycmVudFNlY3Rpb24uSGVpZ2h0ID0gc2VjdGlvbkRhdGEuaGVpZ2h0O1xuICAgICAgICAgICAgY3VycmVudFNlY3Rpb24uQ29sbGFwc2VPblRhYmxldCA9IHNlY3Rpb25EYXRhLmNvbGxhcHNlT25UYWJsZXQ7XG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5GaWxsSGVpZ2h0ID0gc2VjdGlvbkRhdGEuZmlsbEhlaWdodDtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXcgY29sdW1ucyBudW1iZXIgZnJvbSBjdXJyZW50U2VjdGlvbi5TcGxpdCwgaWYgaXRzIHVuZGVmaW5lZCBwdXQgYSBkZWZhdWx0IDEuXG4gICAgICAgICAgICBjb25zdCBuZXdDb2x1bW5zTGVuZ3RoID0gY3VycmVudFNlY3Rpb24uU3BsaXQ/LnNwbGl0KCcgJykubGVuZ3RoIHx8IDE7XG4gICAgICAgICAgICBpZiAobmV3Q29sdW1uc0xlbmd0aCA+IGN1cnJlbnRTZWN0aW9uLkNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld0NvbHVtbnNMZW5ndGggPiBjdXJyZW50U2VjdGlvbi5Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5Db2x1bW5zLnB1c2goe30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3Q29sdW1uc0xlbmd0aCA8IGN1cnJlbnRTZWN0aW9uLkNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld0NvbHVtbnNMZW5ndGggPCBjdXJyZW50U2VjdGlvbi5Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bm0gPSBjdXJyZW50U2VjdGlvbi5Db2x1bW5zLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBibG9jayBpbiB0aGlzIGNvbHVtbiBkZWxldGUgaXQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bm0gJiYgY29sdW5tLkJsb2NrQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NJZHNUb1JlbW92ZS5wdXNoKGNvbHVubS5CbG9ja0NvbnRhaW5lci5CbG9ja0tleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBlZGl0b3IgdGl0bGVcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFZGl0b3IgPSB0aGlzLl9lZGl0b3JTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudEVkaXRvciAmJiBjdXJyZW50RWRpdG9yLnR5cGUgPT09ICdzZWN0aW9uJyAmJiBjdXJyZW50RWRpdG9yLmlkID09PSBjdXJyZW50U2VjdGlvbi5LZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuZ2V0U2VjdGlvbkVkaXRvclRpdGxlKGN1cnJlbnRTZWN0aW9uLCBzZWN0aW9uSW5kZXgpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFZGl0b3IudGl0bGUgPSB0aXRsZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUVkaXRvckNoYW5nZShjdXJyZW50RWRpdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHNlY3Rpb25zIGNoYW5nZS5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGJsb2NrcyB0byByZW1vdmUsIG5vdGlmeSB0aGUgYmxvY2tzIHJlbW92ZWQuXG4gICAgICAgICAgICBpZiAoYmxvY2tzSWRzVG9SZW1vdmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5QmxvY2tzUmVtb3ZlZChibG9ja3NJZHNUb1JlbW92ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRTZWN0aW9uKHNlY3Rpb246IElQZXBMYXlvdXRTZWN0aW9uIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBzZWN0aW9uXG4gICAgICAgIGlmICghc2VjdGlvbikge1xuICAgICAgICAgICAgc2VjdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBLZXk6IFBlcEd1aWQubmV3R3VpZCgpLFxuICAgICAgICAgICAgICAgIENvbHVtbnM6IFt7fV0sIC8vIEFkZCBlbXB0eSBzZWN0aW9uIGNvbHVtblxuICAgICAgICAgICAgICAgIEhpZGU6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGhlIG5ldyBzZWN0aW9uIHRvIGxheW91dCB2aWV3LlxuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIHNlY3Rpb25zLnB1c2goc2VjdGlvbik7XG4gICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICB9XG5cbiAgICByZW1vdmVTZWN0aW9uKHNlY3Rpb25JZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgYmxvY2tzIGlkJ3MgdG8gcmVtb3ZlLlxuICAgICAgICAgICAgY29uc3QgYmxvY2tzSWRzVG9SZW1vdmU6IGFueSA9IHNlY3Rpb25zW2luZGV4XS5Db2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uPy5CbG9ja0NvbnRhaW5lcj8uQmxvY2tLZXkpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgc2VjdGlvbi5cbiAgICAgICAgICAgIHNlY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBibG9ja3MgdG8gcmVtb3ZlLCBub3RpZnkgdGhlIGJsb2NrcyByZW1vdmVkLlxuICAgICAgICAgICAgaWYgKGJsb2Nrc0lkc1RvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUJsb2Nrc1JlbW92ZWQoYmxvY2tzSWRzVG9SZW1vdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoaWRlU2VjdGlvbihzZWN0aW9uSWQ6IHN0cmluZywgaGlkZUluOiBEYXRhVmlld1NjcmVlblNpemVbXSkge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc2VjdGlvbnMuZmluZEluZGV4KHNlY3Rpb24gPT4gc2VjdGlvbi5LZXkgPT09IHNlY3Rpb25JZCk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBzZWN0aW9uc1tpbmRleF0uSGlkZSA9IGhpZGVJbjtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU2VjdGlvbkRyb3BwZWQoZXZlbnQ6IENka0RyYWdEcm9wPGFueVtdPikge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShzZWN0aW9ucywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuICAgIH1cblxuICAgIG9uU2VjdGlvbkRyYWdTdGFydChldmVudDogQ2RrRHJhZ1N0YXJ0KSB7XG4gICAgICAgIHRoaXMuY2hhbmdlQ3Vyc29yT25EcmFnU3RhcnQoKTtcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmdTZWN0aW9uS2V5Lm5leHQoZXZlbnQuc291cmNlLmRhdGEpO1xuICAgIH1cblxuICAgIG9uU2VjdGlvbkRyYWdFbmQoZXZlbnQ6IENka0RyYWdFbmQpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3JPbkRyYWdFbmQoKTtcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmdTZWN0aW9uS2V5Lm5leHQoJycpO1xuICAgIH1cblxuICAgIHJlbW92ZUJsb2NrRnJvbVNlY3Rpb24oYmxvY2tJZDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBibG9ja1JlbW92ZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIGJsb2NrIGZyb20gc2VjdGlvbiBjb2x1bW4uXG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IHNlY3Rpb25JbmRleCA9IDA7IHNlY3Rpb25JbmRleCA8IHNlY3Rpb25zLmxlbmd0aDsgc2VjdGlvbkluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJsb2NrIGNvbnRhaW5lci5cbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gc2VjdGlvbi5Db2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLkJsb2NrQ29udGFpbmVyPy5CbG9ja0tleSA9PT0gYmxvY2tJZCk7XG4gICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWN0aW9uLkNvbHVtbnNbY29sdW1uSW5kZXhdLkJsb2NrQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICAgICAgICAgICAgICBibG9ja1JlbW92ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgYmxvY2sgd2FzIHJlbW92ZWQsIG5vdGlmeSB0aGUgYmxvY2sgcmVtb3ZlZC5cbiAgICAgICAgaWYgKGJsb2NrUmVtb3ZlZCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlCbG9ja3NSZW1vdmVkKFtibG9ja0lkXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoaWRlQmxvY2soc2VjdGlvbklkOiBzdHJpbmcsIGJsb2NrSWQ6IHN0cmluZywgaGlkZUluOiBEYXRhVmlld1NjcmVlblNpemVbXSkge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIFxuICAgICAgICBjb25zdCBpbmRleCA9IHNlY3Rpb25zLmZpbmRJbmRleChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uSWQpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBzZWN0aW9uc1tpbmRleF0uQ29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5CbG9ja0NvbnRhaW5lcj8uQmxvY2tLZXkgPT09IGJsb2NrSWQpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja0NvbnRhaW5lciA9IHNlY3Rpb25zW2luZGV4XS5Db2x1bW5zW2NvbHVtbkluZGV4XS5CbG9ja0NvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2tDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tDb250YWluZXIuSGlkZSA9IGhpZGVJbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQmxvY2tEcm9wcGVkKGV2ZW50OiBDZGtEcmFnRHJvcDxJUGVwTGF5b3V0U2VjdGlvbkNvbHVtbiwgYW55LCBhbnk+LCBzZWN0aW9uSWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcblxuICAgICAgICBpZiAoZXZlbnQucHJldmlvdXNDb250YWluZXIuaWQgPT09IExheW91dEJ1aWxkZXJJbnRlcm5hbFNlcnZpY2UuQVZBSUxBQkxFX0JMT0NLU19DT05UQUlORVJfSUQpIHtcbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIGlmIGJsb2NrcyBudW1iZXIgYWxsb3cuXG4gICAgICAgICAgICBpZiAodGhpcy5fYmxvY2tzTGltaXROdW1iZXIgPiAwICYmIHRoaXMuZ2V0QmxvY2tzTnVtYmVyKCkgPj0gdGhpcy5fYmxvY2tzTGltaXROdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IFBlcERpYWxvZ0RhdGEoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTUVTU0FHRVMuRElBTE9HX05PVElDRV9USVRMRScpLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdMQVlPVVRfQlVJTERFUi5CTE9DS1NfQ09VTlRfTElNSVRfTUVTU0FHRScpLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5EZWZhdWx0RGlhbG9nKGRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGJsb2NrIHJlbGF0aW9uIChwcmV2aW91c0NvbnRhaW5lci5kYXRhIGlzIElQZXBEcmFnZ2FibGVJdGVtIGFuZCBpbnNpZGUgd2UgaGF2ZSBBdmFpbGFibGVCbG9jayBvYmplY3QpLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdnYWJsZUl0ZW06IElQZXBEcmFnZ2FibGVJdGVtID0gZXZlbnQucHJldmlvdXNDb250YWluZXIuZGF0YVtldmVudC5wcmV2aW91c0luZGV4XSBhcyBJUGVwRHJhZ2dhYmxlSXRlbTtcblxuICAgICAgICAgICAgICAgIGlmIChkcmFnZ2FibGVJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvY2sgdGhlIHNjcmVlbiB1bnRpbGwgdGhlIGVkaXRvciB3aWxsIGJlIGxvYWRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fbG9ja1NjcmVlblN1YmplY3QubmV4dCh0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGNvbHVtbi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuZ2V0U2VjdGlvbkNvbHVtbkJ5SWRGb3JFZGl0b3IoZXZlbnQuY29udGFpbmVyLmlkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGJsb2NrIGtleSBpbiB0aGUgc2VjdGlvbiBibG9jayBvbmx5IGlmIHRoZXJlIGlzIGEgYmxhbmsgY29sdW1uLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudENvbHVtbiAmJiAhY3VycmVudENvbHVtbi5CbG9ja0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgdGhlIGJsb2NrIHV1aWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0tleSA9IFBlcEd1aWQubmV3R3VpZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29sdW1uLkJsb2NrQ29udGFpbmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrS2V5OiBibG9ja0tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgdXBkYXRlIHRoZSBsYXlvdXQgdmlldyBjYXVzZSB0aGUgbGF5b3V0IGlzIHVwZGF0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhaXNlIGJsb2NrIGFkZGVkIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tBZGRlZEV2ZW50RGF0YTogSVBlcExheW91dEJsb2NrQWRkZWRFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0tleTogYmxvY2tLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ2dhYmxlSXRlbTogZHJhZ2dhYmxlSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlCbG9ja0FkZGVkKGJsb2NrQWRkZWRFdmVudERhdGEpOyAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9uYXZpZ2F0ZVRvRWRpdG9yQWZ0ZXJCbG9ja0FkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGJsb2NrIGVkaXRvci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9FZGl0b3IoJ2Jsb2NrJywgYmxvY2tLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJkcmFnZ2FibGVJdGVtIGlzIG5vdCBhIElQZXBEcmFnZ2FibGVJdGVtIHR5cGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIG1vdmVkIGJldHdlZW4gY29sdW1ucyBpbiB0aGUgc2FtZSBzZWN0aW9uIG9yIGJldHdlZW4gZGlmZmVyZW50IHNlY3Rpb25zIGJ1dCBub3QgaW4gdGhlIHNhbWUgY29sdW1uLlxuICAgICAgICAgICAgaWYgKGV2ZW50LmNvbnRhaW5lci5pZCAhPT0gZXZlbnQucHJldmlvdXNDb250YWluZXIuaWQpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gdGhpcy5nZXRTZWN0aW9uQ29sdW1uQnlJZEZvckVkaXRvcihldmVudC5jb250YWluZXIuaWQpO1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcHJldmlvdXMgY29sdW1uLlxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpdW9zQ29sdW1uID0gdGhpcy5nZXRTZWN0aW9uQ29sdW1uQnlJZEZvckVkaXRvcihldmVudC5wcmV2aW91c0NvbnRhaW5lci5pZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENvbHVtbiAmJiBwcmV2aXVvc0NvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29sdW1uLkJsb2NrQ29udGFpbmVyID0gcHJldml1b3NDb2x1bW4uQmxvY2tDb250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwcmV2aXVvc0NvbHVtbi5CbG9ja0NvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQmxvY2tEcmFnU3RhcnQoZXZlbnQ6IENka0RyYWdTdGFydCkge1xuICAgICAgICB0aGlzLmNoYW5nZUN1cnNvck9uRHJhZ1N0YXJ0KCk7XG4gICAgICAgIC8vIFRha2UgdGhlIGJsb2NrIGtleSBpZiBleGlzdCwgZWxzZSB0YWtlIHRoZSBhdmFpbGFibGUgYmxvY2sga2V5IChyZWxhdGlvbiBrZXkpLlxuICAgICAgICBjb25zdCBibG9ja0tleSA9IGV2ZW50LnNvdXJjZS5kYXRhPy5CbG9ja0tleSB8fCBldmVudC5zb3VyY2UuZGF0YT8uS2V5O1xuICAgICAgICB0aGlzLl9kcmFnZ2luZ0Jsb2NrS2V5Lm5leHQoYmxvY2tLZXkpO1xuICAgIH1cblxuICAgIG9uQmxvY2tEcmFnRW5kKGV2ZW50OiBDZGtEcmFnRW5kKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlQ3Vyc29yT25EcmFnRW5kKCk7XG4gICAgICAgIHRoaXMuX2RyYWdnaW5nQmxvY2tLZXkubmV4dCgnJyk7XG4gICAgfVxuICAgIFxuICAgIGRvZXNDb2x1bW5Db250YWluQmxvY2soc2VjdGlvbklkOiBzdHJpbmcsIGNvbHVtbkluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlcyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucy5maW5kKHNlY3Rpb24gPT4gc2VjdGlvbi5LZXkgPT09IHNlY3Rpb25JZCk7XG5cbiAgICAgICAgaWYgKHNlY3Rpb24gJiYgY29sdW1uSW5kZXggPj0gMCAmJiBzZWN0aW9uLkNvbHVtbnMubGVuZ3RoID4gY29sdW1uSW5kZXgpIHtcbiAgICAgICAgICAgIHJlcyA9ICEhc2VjdGlvbi5Db2x1bW5zW2NvbHVtbkluZGV4XS5CbG9ja0NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgc2V0U2NyZWVuV2lkdGgoc2NyZWVuVHlwZTogRGF0YVZpZXdTY3JlZW5TaXplKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDc3NTY3JlZW5XaWRoKHNjcmVlblR5cGUpXG5cbiAgICAgICAgY29uc3Qgd2lkdGggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSwgMCk7XG4gICAgICAgIGlmICh3aWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fc2NyZWVuV2lkdGhTdWJqZWN0Lm5leHQoJzEwMCUnKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5U2NyZWVuU2l6ZUNoYW5nZShQZXBTY3JlZW5TaXplVHlwZS5YTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zY3JlZW5XaWR0aFN1YmplY3QubmV4dChgJHt3aWR0aH1weGApO1xuXG4gICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIHNpemUgYWNjb3JkaW5nIHRoZSB3aWR0aC5cbiAgICAgICAgICAgIGlmICh3aWR0aCA+PSAxOTIwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlTY3JlZW5TaXplQ2hhbmdlKFBlcFNjcmVlblNpemVUeXBlLlhMKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPj0gMTI4MCAmJiB3aWR0aCA8IDE5MjApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeVNjcmVlblNpemVDaGFuZ2UoUGVwU2NyZWVuU2l6ZVR5cGUuTEcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aCA+PSA5NjAgJiYgd2lkdGggPCAxMjgwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlTY3JlZW5TaXplQ2hhbmdlKFBlcFNjcmVlblNpemVUeXBlLk1EKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPj0gNjAwICYmIHdpZHRoIDwgOTYwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlTY3JlZW5TaXplQ2hhbmdlKFBlcFNjcmVlblNpemVUeXBlLlNNKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPCA2MDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeVNjcmVlblNpemVDaGFuZ2UoUGVwU2NyZWVuU2l6ZVR5cGUuWFMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd1NrZWxldG9uKHNob3c6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2hvd1NrZWxldG9uU3ViamVjdC5uZXh0KHNob3cpO1xuICAgIH1cbiAgICBcbiAgICBsb2NrU2NyZWVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubm90aWZ5TG9ja1NjcmVlbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgbG9hZExheW91dEJ1aWxkZXIobGF5b3V0VmlldzogSVBlcExheW91dFZpZXcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZWRpdE1vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBMb2FkIHRoZSBsYXlvdXQgZWRpdG9yLlxuICAgICAgICAgICAgICAgIHRoaXMubG9hZERlZmF1bHRFZGl0b3IobGF5b3V0Vmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIG9ubHkgdGhlIGxheW91dCB2aWV3LlxuICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgfVxufVxuIl19
|
|
628
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJ1aWxkZXItaW50ZXJuYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb3NpdGUtbGliL2xheW91dC1idWlsZGVyL2xheW91dC1idWlsZGVyLWludGVybmFsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQXdELGVBQWUsRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVsSSxPQUFPLEVBQW1CLE9BQU8sRUFBb0MsaUJBQWlCLEVBQTBDLE1BQU0seUJBQXlCLENBQUM7QUFHaEssT0FBTyxFQUFjLGVBQWUsRUFBVyxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQWdCLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVFLE9BQU8sRUFBRSxhQUFhLEVBQW9CLE1BQU0sZ0NBQWdDLENBQUM7QUFDakYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7O0FBMEJ4RixNQUFNLE9BQU8sNEJBQTRCO0lBVXJDLGVBQWUsQ0FBQyxLQUE0QjtRQUN4QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsS0FBSyxDQUFDLCtCQUErQixJQUFJLEtBQUssQ0FBQztRQUN2RixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxPQUFPLFFBQVEsQ0FBQSxDQUFDLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBS0QsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFDRCxhQUFhLENBQUMsS0FBYztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBR0QsSUFBSSxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQy9CLENBQUM7SUFJRCxJQUFJLGlCQUFpQjtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFJRCxJQUFJLGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFJRCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBSUQsSUFBSSw4QkFBOEI7UUFDOUIsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUlELElBQUksZUFBZTtRQUNmLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2hELG1HQUFtRztJQUN2RyxDQUFDO0lBSUQsSUFBSSxpQkFBaUI7UUFDakIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFJRCxJQUFJLGdCQUFnQjtRQUNoQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFJRCxJQUFJLGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFVRCxJQUFJLGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFJRCxJQUFJLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2RCxDQUFDO0lBR0QsSUFBSSwwQkFBMEI7UUFDMUIsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVELG1DQUFtQztJQUNuQywrRkFBK0Y7SUFDL0YsbURBQW1EO0lBQ25ELG9GQUFvRjtJQUNwRixJQUFJO0lBRUosWUFDYyxTQUEyQixFQUMzQixhQUErQixFQUNqQyxhQUErQjtRQUY3QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDakMsa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBN0duQyx5QkFBb0IsR0FBRyxFQUFFLENBQUM7UUFFbEMsNkNBQTZDO1FBQ3JDLHVCQUFrQixHQUFHLENBQUMsQ0FBQztRQUN2QixxQ0FBZ0MsR0FBRyxLQUFLLENBQUM7UUFDekMsbUJBQWMsR0FBaUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLE9BQU8sUUFBUSxDQUFBLENBQUMsQ0FBQyxDQUFDO1FBT2pGLHVCQUFrQixHQUFHLEtBQUssRUFBVyxDQUFDO1FBRXRDLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBU3BCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBSy9CLHFEQUFxRDtRQUM3Qyx1QkFBa0IsR0FBbUQsSUFBSSxlQUFlLENBQWdDLFNBQVMsQ0FBQyxDQUFDO1FBSzNJLCtFQUErRTtRQUN2RSx3QkFBbUIsR0FBNEIsSUFBSSxlQUFlLENBQVMsTUFBTSxDQUFDLENBQUM7UUFLM0YseUVBQXlFO1FBQ2pFLG1CQUFjLEdBQW9DLElBQUksZUFBZSxDQUFpQixJQUFJLENBQUMsQ0FBQztRQUtwRyxrREFBa0Q7UUFDMUMsb0NBQStCLEdBQTJCLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBS2pHLG9FQUFvRTtRQUM1RCx5QkFBb0IsR0FBeUMsSUFBSSxlQUFlLENBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBTWxILDBDQUEwQztRQUNsQyx1QkFBa0IsR0FBMkMsSUFBSSxlQUFlLENBQXdCLElBQUksQ0FBQyxDQUFDO1FBS3RILG1FQUFtRTtRQUMzRCxzQkFBaUIsR0FBNEIsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFLN0UscUVBQXFFO1FBQzdELHdCQUFtQixHQUE0QixJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUsvRSw4RUFBOEU7UUFDOUUsOEZBQThGO1FBQzlGLGlEQUFpRDtRQUNqRCxrRkFBa0Y7UUFDbEYsSUFBSTtRQUVKLGtGQUFrRjtRQUMxRSx3QkFBbUIsR0FBNkIsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFLNUYsMkNBQTJDO1FBQ25DLDRCQUF1QixHQUFHLElBQUksZUFBZSxDQUFtQyxJQUFJLENBQUMsQ0FBQztRQUk5Riw4Q0FBOEM7UUFDdEMsK0JBQTBCLEdBQUcsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDLENBQUM7UUFnQm5FLEVBQUU7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQ25FLGdDQUFnQztZQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBdUIsRUFBRSxFQUFFO1lBQy9ELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xGLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxrQkFBeUM7UUFDcEUsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ3pEO1lBRUQsa0NBQWtDO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUVqRCxvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQzdFO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLG1CQUE4QztRQUNuRSxzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxJQUEwQjtRQUNsRCxJQUFJLElBQUksRUFBRTtZQUNOLDBFQUEwRTtZQUMxRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE1BQXNCO1FBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxLQUFjO1FBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELDZDQUE2QztJQUM3QywyQ0FBMkM7SUFDM0MsSUFBSTtJQUVJLG1DQUFtQyxDQUFDLHVCQUE4QjtRQUN0RSxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLHNCQUFzQixDQUFDLElBQXVCO1FBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLDRCQUE0QixDQUFDLFVBQTBCO1FBQzNELElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzVCLE1BQU0sWUFBWSxHQUFrQjtnQkFDaEMsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUM7Z0JBQzFDLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLGVBQWU7Z0JBQ25ELGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsaUJBQWlCO2dCQUN2RCxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMzQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUN6QyxvREFBb0Q7YUFDdkQsQ0FBQztZQUVGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO1NBQ3hEO0lBQ0wsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFVBQTBCO1FBQ2hELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLEtBQUssRUFBVyxDQUFDO1FBRS9DLElBQUksVUFBVSxFQUFFO1lBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRTtnQkFDM0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztvQkFDekIsRUFBRSxFQUFFLDRCQUE0QixDQUFDLGNBQWM7b0JBQy9DLElBQUksRUFBRyxnQkFBZ0I7b0JBQ3ZCLEtBQUssRUFBRSxLQUFLO29CQUNaLDRFQUE0RTtpQkFDL0UsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUMsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNMLENBQUM7SUFFTyxtQkFBbUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4RjtJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsVUFBK0IsRUFBRSxFQUFVLEVBQUUsS0FBSyxHQUFHLEVBQUU7UUFDM0UsdUJBQXVCO1FBQ3ZCLElBQUksTUFBTSxHQUFtQixJQUFJLENBQUM7UUFFbEMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQzFCLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO2FBQU0sSUFBSSxVQUFVLEtBQUssT0FBTyxFQUFFO1lBQy9CLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBZ0IsRUFBRSxLQUFhO1FBQ2xELDBCQUEwQjtRQUMxQixNQUFNLFVBQVUsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6RCxPQUFPO1lBQ0gsRUFBRSxFQUFFLFFBQVE7WUFDWixJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxVQUFVO1NBQ3BCLENBQUE7SUFDTCxDQUFDO0lBRU8scUJBQXFCLENBQUMsT0FBMEIsRUFBRSxZQUFvQjtRQUMxRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQzlFLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLEtBQWE7UUFDckQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUU5RSxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUU7WUFDbkIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sYUFBYSxHQUF5QjtnQkFDeEMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNmLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQy9CLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLFNBQVM7Z0JBQ2pDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUM7Z0JBQzNCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLO2dCQUNuRCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxLQUFLO2dCQUN2QyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7YUFDaEUsQ0FBQTtZQUVELE9BQU87Z0JBQ0gsRUFBRSxFQUFFLFNBQVM7Z0JBQ2IsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsS0FBSyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQztnQkFDakUsVUFBVSxFQUFFLGFBQWE7YUFDNUIsQ0FBQTtTQUNKO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVPLDZCQUE2QixDQUFDLGVBQXVCO1FBQ3pELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztRQUV6Qiw2RUFBNkU7UUFDN0UsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUU5RSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RELE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUVuRCwrQ0FBK0M7WUFDL0MsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUM7WUFDOUUsd0JBQXdCO1lBQ3hCLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEUsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7Z0JBQ3ZDLGFBQWEsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQy9EO1NBQ0o7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsVUFBOEI7UUFDbkQsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBRXhCLElBQUksVUFBVSxLQUFLLFFBQVEsRUFBRTtZQUN6QixVQUFVLEdBQUcsS0FBSyxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQ2pDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDdEI7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBRTNFLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2xELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVoQyxLQUFLLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUU7Z0JBQzNFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzVDLElBQUksTUFBTSxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNyRSxZQUFZLEVBQUUsQ0FBQztpQkFDbEI7YUFDSjtTQUNKO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVPLHVCQUF1QjtRQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM5QyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO0lBQzVDLENBQUM7SUFFTyxxQkFBcUI7UUFDekIsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakQsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUN6QyxDQUFDO0lBRUQsaUdBQWlHO0lBQ2pHO3FHQUNpRztJQUVqRyxhQUFhLENBQUMsUUFBZ0I7UUFDMUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUNyRCxDQUFDO0lBRUQsZ0NBQWdDLENBQUMsdUJBQThCO1FBQzNELElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFjO1FBQzVCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLElBQUksaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUF1QjtRQUNqQyxNQUFNLFVBQVUsR0FDWixJQUFJLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMzQyxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU1RixPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQsbUJBQW1CLENBQUMsVUFBVSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRTtRQUMzQyxPQUFPLEdBQUcsVUFBVSxXQUFXLEtBQUssRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBd0MsRUFBRSxpQkFBcUM7UUFDdkYsT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNoRyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBK0IsRUFBRSxFQUFVLEVBQUUsS0FBSyxHQUFHLEVBQUU7UUFDcEUsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXBCLG1HQUFtRztRQUNuRyxJQUFJLFVBQVUsS0FBSyxnQkFBZ0IsSUFBSSxFQUFFLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuRCxpQ0FBaUM7WUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFbEYsK0JBQStCO1lBQy9CLElBQUcsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3hCLElBQUksYUFBYSxDQUFDLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtvQkFDekMsOENBQThDO29CQUM5QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ2pDO2dCQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFM0QsSUFBSSxNQUFNLEVBQUU7b0JBQ1IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDckMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQzNCLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ2xCO3FCQUFNO29CQUNILE9BQU8sR0FBRyxLQUFLLENBQUM7aUJBQ25CO2FBQ0o7U0FDSjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRCxzQkFBc0I7UUFDbEIsa0NBQWtDO1FBQ2xDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEMsNERBQTREO1lBQzVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxVQUF5QjtRQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFdEQsSUFBSSxVQUFVLEVBQUU7WUFDWixVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2pELFVBQVUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDO1lBQ25FLFVBQVUsQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUM7WUFDL0QsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUN2RCxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBQ3JELGdFQUFnRTtZQUVoRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDM0M7SUFDTCxDQUFDO0lBRUQsdUJBQXVCLENBQUMsV0FBaUM7UUFDckQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkYsMEJBQTBCO1FBQzFCLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRTtZQUNuQixNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztZQUU3QixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUMsY0FBYyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO1lBQzlDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN6QyxjQUFjLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDM0MsY0FBYyxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvRCxjQUFjLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFDbkQsY0FBYyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1lBRTdDLDBGQUEwRjtZQUMxRixNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFDdEUsSUFBSSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDbEQsT0FBTyxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDckQsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ25DO2FBQ0o7aUJBQU0sSUFBSSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDekQsT0FBTyxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDckQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDNUMsOENBQThDO29CQUM5QyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFO3dCQUNqQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDMUQ7aUJBQ0o7YUFDSjtZQUVELHNCQUFzQjtZQUN0QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxFQUFFLEtBQUssY0FBYyxDQUFDLEdBQUcsRUFBRTtnQkFDOUYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDdkUsYUFBYSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUMxQztZQUVELDBCQUEwQjtZQUMxQixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFeEMsNERBQTREO1lBQzVELElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDL0M7U0FDSjtJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsVUFBb0MsSUFBSTtRQUMvQyxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU8sR0FBRztnQkFDTixHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRTtnQkFDdEIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNiLElBQUksRUFBRSxFQUFFO2FBQ1gsQ0FBQTtTQUNKO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDbkQsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGFBQWEsQ0FBQyxTQUFpQjtRQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQUcsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ25ELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ1osaUNBQWlDO1lBQ2pDLE1BQU0saUJBQWlCLEdBQVEsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXZHLGtCQUFrQjtZQUNsQixRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFeEMsNERBQTREO1lBQzVELElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLENBQUE7YUFDOUM7U0FDSjtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsU0FBaUIsRUFBRSxNQUE0QjtRQUN2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQUcsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ25ELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ1osUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7WUFDOUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzNDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQXlCO1FBQ3RDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDbkQsZUFBZSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQW1CO1FBQ2xDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBaUI7UUFDOUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsc0JBQXNCLENBQUMsT0FBZTtRQUNsQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFFekIsd0NBQXdDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFFbkQsS0FBSyxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUUsWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUU7WUFDdkUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRXZDLDhCQUE4QjtZQUM5QixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBQ3JHLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNsQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsY0FBYyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3hDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBRXBCLE1BQU07YUFDVDtTQUNKO1FBRUQsc0RBQXNEO1FBQ3RELElBQUksWUFBWSxFQUFFO1lBQ2QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUN2QztJQUNMLENBQUM7SUFFRCxTQUFTLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsTUFBNEI7UUFDdEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUVuRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUN2RSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNaLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUM7WUFDN0csSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xCLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsY0FBYyxDQUFDO2dCQUMzRSxJQUFJLGNBQWMsRUFBRTtvQkFDaEIsY0FBYyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7b0JBQzdCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDM0M7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFxRCxFQUFFLFNBQWlCO1FBQ25GLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV0RCxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssNEJBQTRCLENBQUMsNkJBQTZCLEVBQUU7WUFDM0YsbUNBQW1DO1lBQ25DLElBQUksSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUNsRixNQUFNLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDO29CQUM3RCxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsMkNBQTJDLENBQUM7aUJBQy9FLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzlDO2lCQUFNO2dCQUNILGlIQUFpSDtnQkFDakgsTUFBTSxhQUFhLEdBQXNCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBc0IsQ0FBQztnQkFFaEgsSUFBSSxhQUFhLEVBQUU7b0JBQ2Ysb0RBQW9EO29CQUNwRCxzQ0FBc0M7b0JBRXRDLGtCQUFrQjtvQkFDbEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRTdFLDBFQUEwRTtvQkFDMUUsSUFBSSxhQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFO3dCQUNoRCwyQkFBMkI7d0JBQzNCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFFbkMsYUFBYSxDQUFDLGNBQWMsR0FBRzs0QkFDM0IsUUFBUSxFQUFFLFFBQVE7eUJBQ3JCLENBQUM7d0JBRUYsOERBQThEO3dCQUM5RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBRXhDLDJCQUEyQjt3QkFDM0IsTUFBTSxtQkFBbUIsR0FBOEI7NEJBQ25ELFFBQVEsRUFBRSxRQUFROzRCQUNsQixhQUFhLEVBQUUsYUFBYTt5QkFDL0IsQ0FBQTt3QkFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQzt3QkFFM0MsSUFBSSxJQUFJLENBQUMsZ0NBQWdDLEVBQUU7NEJBQ3ZDLGdDQUFnQzs0QkFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQzt5QkFDNUM7cUJBQ0o7aUJBQ0o7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO2lCQUNoRTthQUNKO1NBQ0o7YUFBTTtZQUNILG1IQUFtSDtZQUNuSCxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25ELGtCQUFrQjtnQkFDbEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdFLDJCQUEyQjtnQkFDM0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFdEYsSUFBSSxhQUFhLElBQUksY0FBYyxFQUFFO29CQUNqQyxhQUFhLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUM7b0JBQzdELE9BQU8sY0FBYyxDQUFDLGNBQWMsQ0FBQztvQkFDckMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUMzQzthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBbUI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsaUZBQWlGO1FBQ2pGLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7UUFDdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWlCO1FBQzVCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELHNCQUFzQixDQUFDLFNBQWlCLEVBQUUsV0FBbUI7UUFDekQsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0RCxNQUFNLE9BQU8sR0FBRyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBRXZGLElBQUksT0FBTyxJQUFJLFdBQVcsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFO1lBQ3JFLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjLENBQUM7U0FDdkQ7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxjQUFjLENBQUMsVUFBOEI7UUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRS9DLE1BQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDYixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7WUFFNUMsdUNBQXVDO1lBQ3ZDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtnQkFDZixJQUFJLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDckQ7aUJBQU0sSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNyRDtpQkFBTSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksRUFBRTtnQkFDckMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3JEO2lCQUFNLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDckQ7aUJBQU0sSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO2dCQUNwQixJQUFJLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDckQ7U0FDSjtJQUNMLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsNENBQTRDO0lBQzVDLElBQUk7SUFFSixxQ0FBcUM7SUFDckMsb0NBQW9DO0lBQ3BDLElBQUk7SUFFSixpQkFBaUIsQ0FBQyxVQUEwQjtRQUN4QyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdEMsMEJBQTBCO2dCQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDdEM7U0FDSjtRQUVELDZCQUE2QjtRQUM3QixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7QUFqdEJlLDBEQUE2QixHQUFHLGlCQUFpQixDQUFDO0FBQ2xELDJDQUFjLEdBQUcsTUFBTSxDQUFDOzBIQUYvQiw0QkFBNEI7OEhBQTVCLDRCQUE0Qjs0RkFBNUIsNEJBQTRCO2tCQUx4QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29lcmNpb25cIjtcbmltcG9ydCB7IENka0RyYWdEcm9wLCBDZGtEcmFnRW5kLCBDZGtEcmFnU3RhcnQsIGNvcHlBcnJheUl0ZW0sIG1vdmVJdGVtSW5BcnJheSwgdHJhbnNmZXJBcnJheUl0ZW0gfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2RyYWctZHJvcFwiO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQgeyBQZXBBZGRvblNlcnZpY2UsIFBlcEd1aWQsIFBlcEh0dHBTZXJ2aWNlLCBQZXBMYXlvdXRTZXJ2aWNlLCBQZXBTY3JlZW5TaXplVHlwZSwgUGVwU2Vzc2lvblNlcnZpY2UsIFBlcFV0aWxpdGllc1NlcnZpY2UgfSBmcm9tIFwiQHBlcHBlcmktYWRkb25zL25neC1saWJcIjtcbmltcG9ydCB7IElQZXBEcmFnZ2FibGVJdGVtIH0gZnJvbSBcIkBwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2RyYWdnYWJsZS1pdGVtc1wiO1xuaW1wb3J0IHsgRGF0YVZpZXdTY3JlZW5TaXplLCBTcGxpdFR5cGUgfSBmcm9tIFwiQHBlcHBlcmktYWRkb25zL3BhcGktc2RrXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFBlcExheW91dEVkaXRvclR5cGUsIElQZXBMYXlvdXRCbG9ja0FkZGVkRXZlbnQsIElQZXBMYXlvdXRTZWN0aW9uLCBJUGVwTGF5b3V0U2VjdGlvbkNvbHVtbiwgSVBlcExheW91dFZpZXcsIElQZXBMYXlvdXRCbG9ja0NvbmZpZywgUGVwTGF5b3V0U2l6ZVR5cGUsIElFZGl0b3IgfSBmcm9tIFwiLi9sYXlvdXQtYnVpbGRlci5tb2RlbFwiO1xuaW1wb3J0IHsgUGVwRGlhbG9nRGF0YSwgUGVwRGlhbG9nU2VydmljZSB9IGZyb20gXCJAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9kaWFsb2dcIjtcbmltcG9ydCB7IFBlcFBhZGRpbmdTZXR0aW5ncyB9IGZyb20gXCJAcGVwcGVyaS1hZGRvbnMvbmd4LWNvbXBvc2l0ZS1saWIvcGFkZGluZy1zZXR0aW5nc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRFZGl0b3Ige1xuICAgIG1heFdpZHRoOiBudW1iZXIsXG4gICAgaG9yaXpvbnRhbFNwYWNpbmc/OiBQZXBMYXlvdXRTaXplVHlwZSxcbiAgICB2ZXJ0aWNhbFNwYWNpbmc/OiBQZXBMYXlvdXRTaXplVHlwZSxcbiAgICBzZWN0aW9uc0dhcD86IFBlcExheW91dFNpemVUeXBlLFxuICAgIGNvbHVtbnNHYXA/OiBQZXBMYXlvdXRTaXplVHlwZSxcbiAgICByb3VuZGVkQ29ybmVycz86IFBlcExheW91dFNpemVUeXBlLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRTZWN0aW9uRWRpdG9yIHtcbiAgICBpZDogc3RyaW5nLFxuICAgIHNlY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgc3BsaXQ6IFNwbGl0VHlwZSB8IHVuZGVmaW5lZCxcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBjb2xsYXBzZU9uVGFibGV0OiBib29sZWFuLFxuICAgIGZpbGxIZWlnaHQ6IGJvb2xlYW5cbiAgICBwYWRkaW5nOiBQZXBQYWRkaW5nU2V0dGluZ3M7XG59XG5cbkBJbmplY3RhYmxlKFxuLy8gICAgIHtcbi8vICAgICBwcm92aWRlZEluOiAncm9vdCcsXG4vLyB9XG4pXG5leHBvcnQgY2xhc3MgTGF5b3V0QnVpbGRlckludGVybmFsU2VydmljZSB7XG4gICAgc3RhdGljIHJlYWRvbmx5IEFWQUlMQUJMRV9CTE9DS1NfQ09OVEFJTkVSX0lEID0gJ2F2YWlsYWJsZUJsb2Nrcyc7XG4gICAgc3RhdGljIHJlYWRvbmx5IE1BSU5fRURJVE9SX0lEID0gJ21haW4nO1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdFNlY3Rpb25UaXRsZSA9ICcnO1xuICAgIFxuICAgIC8vIFRoaXMgY29uZmlndXJhdGlvbiBpcyBmb3IgYmxvY2tzIGJlaGF2aW9yLlxuICAgIHByaXZhdGUgX2Jsb2Nrc0xpbWl0TnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9uYXZpZ2F0ZVRvRWRpdG9yQWZ0ZXJCbG9ja0FkZGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZ2V0QmxvY2tUaXRsZTogKGJsb2NrS2V5OiBzdHJpbmcpID0+IHN0cmluZyA9IChibG9ja0tleSkgPT4geyByZXR1cm4gYmxvY2tLZXkgfTtcbiAgICBzZXRCbG9ja3NDb25maWcodmFsdWU6IElQZXBMYXlvdXRCbG9ja0NvbmZpZykge1xuICAgICAgICB0aGlzLl9ibG9ja3NMaW1pdE51bWJlciA9IHZhbHVlLmJsb2Nrc0xpbWl0TnVtYmVyIHx8IDA7XG4gICAgICAgIHRoaXMuX25hdmlnYXRlVG9FZGl0b3JBZnRlckJsb2NrQWRkZWQgPSB2YWx1ZS5uYXZpZ2F0ZVRvRWRpdG9yQWZ0ZXJCbG9ja0FkZGVkID8/IGZhbHNlO1xuICAgICAgICB0aGlzLl9nZXRCbG9ja1RpdGxlID0gdmFsdWUuZ2V0QmxvY2tUaXRsZSA/IHZhbHVlLmdldEJsb2NrVGl0bGUgOiAoYmxvY2tLZXkpID0+IHsgcmV0dXJuIGJsb2NrS2V5IH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZWRpdG9yc0JyZWFkQ3J1bWIgPSBBcnJheTxJRWRpdG9yPigpO1xuXG4gICAgcHJpdmF0ZSBfZWRpdG9yTW9kZSA9IGZhbHNlO1xuICAgIGdldCBlZGl0b3JNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yTW9kZTtcbiAgICB9XG4gICAgc2V0RWRpdG9yTW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9lZGl0b3JNb2RlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2V0RWRpdGFibGVTdGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2VkaXRhYmxlU3RhdGUgPSBmYWxzZTtcbiAgICBnZXQgZWRpdGFibGVTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRhYmxlU3RhdGU7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBzdWJqZWN0IGlzIGZvciB0aGUgc2NyZWVuIHNpemUgY2hhbmdlIGV2ZW50cy5cbiAgICBwcml2YXRlIF9zY3JlZW5TaXplU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFBlcFNjcmVlblNpemVUeXBlIHwgdW5kZWZpbmVkPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGVwU2NyZWVuU2l6ZVR5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgZ2V0IHNjcmVlblNpemVDaGFuZ2UkKCk6IE9ic2VydmFibGU8UGVwU2NyZWVuU2l6ZVR5cGUgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjcmVlblNpemVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgZGVtb3N0cmF0ZSB0aGUgY29udGFpbmVyIHNpemUgKFVzYWdlIG9ubHkgaW4gZWRpdCBtb2RlKS5cbiAgICBwcml2YXRlIF9zY3JlZW5XaWR0aFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcxMDAlJyk7XG4gICAgZ2V0IHNjcmVlbldpZHRoQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2NyZWVuV2lkdGhTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBzdWJqZWN0IGlzIGZvciBsb2FkIHRoZSBjdXJyZW50IGVkaXRvciAoVXNhZ2Ugb25seSBpbiBlZGl0IG1vZGUpLlxuICAgIHByaXZhdGUgX2VkaXRvclN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxJRWRpdG9yIHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElFZGl0b3IgfCBudWxsPihudWxsKTtcbiAgICBnZXQgZWRpdG9yQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPElFZGl0b3IgfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgc2VjdGlvbnMgY29sdW1ucyBkcm9wIGxpc3Qgc3ViamVjdC5cbiAgICBwcml2YXRlIF9zZWN0aW9uc0NvbHVtbnNEcm9wTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgZ2V0IHNlY3Rpb25zQ29sdW1uc0Ryb3BMaXN0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPGFueVtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWN0aW9uc0NvbHVtbnNEcm9wTGlzdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgc2VjdGlvbnMgc3ViamVjdCAoYSBwYXJlIGZyb20gdGhlIGxheW91dCB2aWV3IG9iamVjdClcbiAgICBwcml2YXRlIF9zZWN0aW9uc1ZpZXdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8SVBlcExheW91dFNlY3Rpb25bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElQZXBMYXlvdXRTZWN0aW9uW10+KFtdKTtcbiAgICBnZXQgc2VjdGlvbnNDaGFuZ2UkKCk6IE9ic2VydmFibGU8SVBlcExheW91dFNlY3Rpb25bXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnNWaWV3U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgLy8gKHByZXZTZWN0aW9ucywgbmV4dFNlY3Rpb25zKSA9PiBKU09OLnN0cmluZ2lmeShwcmV2U2VjdGlvbnMpID09PSBKU09OLnN0cmluZ2lmeShuZXh0U2VjdGlvbnMpKSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBzdWJqZWN0IGlzIGZvciBsYXlvdXQgdmlldyBjaGFuZ2UuXG4gICAgcHJpdmF0ZSBfbGF5b3V0Vmlld1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxJUGVwTGF5b3V0VmlldyB8IG51bGw+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJUGVwTGF5b3V0VmlldyB8IG51bGw+KG51bGwpO1xuICAgIGdldCBsYXlvdXRWaWV3Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPElQZXBMYXlvdXRWaWV3IHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShmaWx0ZXIobGF5b3V0ID0+ICEhbGF5b3V0KSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBzdWJqZWN0IGlzIGZvciBlZGl0IG1vZGUgd2hlbiBibG9jayBpcyBkcmFnZ2luZyBub3cgb3Igbm90LlxuICAgIHByaXZhdGUgX2RyYWdnaW5nQmxvY2tLZXk6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gICAgZ2V0IGRyYWdnaW5nQmxvY2tLZXkoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdnaW5nQmxvY2tLZXkuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIHN1YmplY3QgaXMgZm9yIGVkaXQgbW9kZSB3aGVuIHNlY3Rpb24gaXMgZHJhZ2dpbmcgbm93IG9yIG5vdC5cbiAgICBwcml2YXRlIF9kcmFnZ2luZ1NlY3Rpb25LZXk6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gICAgZ2V0IGRyYWdnaW5nU2VjdGlvbktleSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ2dpbmdTZWN0aW9uS2V5LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gLy8gVGhpcyBzdWJqZWN0IGlzIGZvciBsb2NrIG9yIHVubG9jayB0aGUgc2NyZWVuIChVc2FnZSBvbmx5IGluIGVkaXQgbW9kZSkuXG4gICAgLy8gcHJpdmF0ZSBfbG9ja1NjcmVlblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIC8vIGdldCBsb2NrU2NyZWVuQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuX2xvY2tTY3JlZW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgLy8gfVxuXG4gICAgLy8gVGhpcyBpcyBmb3IgY29udHJvbCB0aGUgcHJldmlldyBtb2RlIChmb3IgbG9hZCB0aGUgYmxvY2tzIHdpdGggdGhlIENQSSBldmVudHMpIFxuICAgIHByaXZhdGUgX3ByZXZpZXdNb2RlU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgZ2V0IHByZXZpZXdNb2RlQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXZpZXdNb2RlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZm9yIGVkaXRvciBtb2RlIGZvciBibG9jayBhZGRlZC5cbiAgICBwcml2YXRlIF9ibG9ja0FkZGVkRXZlbnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJUGVwTGF5b3V0QmxvY2tBZGRlZEV2ZW50IHwgbnVsbD4obnVsbCk7XG4gICAgZ2V0IGJsb2NrQWRkZWRFdmVudFN1YmplY3QkKCk6IE9ic2VydmFibGU8SVBlcExheW91dEJsb2NrQWRkZWRFdmVudCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jsb2NrQWRkZWRFdmVudFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgZm9yIGVkaXRvciBtb2RlIGZvciBibG9ja3MgcmVtb3ZlZC5cbiAgICBwcml2YXRlIF9ibG9ja3NSZW1vdmVkRXZlbnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuICAgIGdldCBibG9ja3NSZW1vdmVkRXZlbnRTdWJqZWN0JCgpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ibG9ja3NSZW1vdmVkRXZlbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIC8vIFRoaXMgc3ViamVjdCBpcyBmb3Igc2tlbGV0b24uXG4gICAgLy8gcHJpdmF0ZSBfc2hvd1NrZWxldG9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICAvLyBnZXQgc2hvd1NrZWxldG9uQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuX3Nob3dTa2VsZXRvblN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICAvLyB9XG4gICAgXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBkaWFsb2dTZXJ2aWNlOiBQZXBEaWFsb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxheW91dFNlcnZpY2U6IFBlcExheW91dFNlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLmdldCgnTEFZT1VUX0JVSUxERVIuU0VDVElPTicpLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBzZWN0aW9uIG5hbWUuXG4gICAgICAgICAgICB0aGlzLl9kZWZhdWx0U2VjdGlvblRpdGxlID0gcmVzO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxheW91dFNlcnZpY2Uub25SZXNpemUkLnN1YnNjcmliZSgoc2l6ZTogUGVwU2NyZWVuU2l6ZVR5cGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5U2NyZWVuU2l6ZUNoYW5nZShzaXplKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHByaXZhdGUgc2V0RWRpdGFibGVTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5fZWRpdGFibGVTdGF0ZSA9IHRoaXMuZWRpdG9yTW9kZSAmJiAhdGhpcy5fcHJldmlld01vZGVTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXdUb1VwZGF0ZTogSVBlcExheW91dFZpZXcgfCBudWxsKSB7XG4gICAgICAgIGlmIChsYXlvdXRWaWV3VG9VcGRhdGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvck1vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxheW91dEVkaXRvclByb3BlcnRpZXMobGF5b3V0Vmlld1RvVXBkYXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBsYXlvdXQgZm9yIHRoZSB2aWV3LlxuICAgICAgICAgICAgdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QubmV4dChsYXlvdXRWaWV3VG9VcGRhdGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlY3Rpb25zIGZvciB0aGUgdmlldy5cbiAgICAgICAgICAgIHRoaXMuX3NlY3Rpb25zVmlld1N1YmplY3QubmV4dChsYXlvdXRWaWV3VG9VcGRhdGU/LkxheW91dC5TZWN0aW9ucyB8fCBbXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUJsb2NrQWRkZWQoYmxvY2tBZGRlZEV2ZW50RGF0YTogSVBlcExheW91dEJsb2NrQWRkZWRFdmVudCkge1xuICAgICAgICAvLyBOb3RpZnkgdGhhdCB0aGUgYmxvY2sgaXMgYWRkZWQgKHRvIHJhaXNlIHRoZSBldmVudCBmb3IgdGhlIGNsaWVudCkuXG4gICAgICAgIHRoaXMuX2Jsb2NrQWRkZWRFdmVudFN1YmplY3QubmV4dChibG9ja0FkZGVkRXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUJsb2Nrc1JlbW92ZWQoa2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGtleXMpIHtcbiAgICAgICAgICAgIC8vIE5vdGlmeSB0aGF0IHRoZSBibG9ja3MgYXJlIHJlbW92ZWQgKHRvIHJhaXNlIHRoZSBldmVudCBmb3IgdGhlIGNsaWVudCkuXG4gICAgICAgICAgICB0aGlzLl9ibG9ja3NSZW1vdmVkRXZlbnRTdWJqZWN0Lm5leHQoa2V5cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUVkaXRvckNoYW5nZShlZGl0b3I6IElFZGl0b3IgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX2VkaXRvclN1YmplY3QubmV4dChlZGl0b3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm90aWZ5UHJldmlld01vZGVDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcHJldmlld01vZGVTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgICAgICB0aGlzLnNldEVkaXRhYmxlU3RhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIG5vdGlmeUxvY2tTY3JlZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICAvLyAgICAgdGhpcy5fbG9ja1NjcmVlblN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlTZWN0aW9uc0NvbHVtbnNEcm9wTGlzdENoYW5nZShzZWN0aW9uc0NvbHVtbnNEcm9wTGlzdDogYW55W10pIHtcbiAgICAgICAgdGhpcy5fc2VjdGlvbnNDb2x1bW5zRHJvcExpc3RTdWJqZWN0Lm5leHQoc2VjdGlvbnNDb2x1bW5zRHJvcExpc3QpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm90aWZ5U2NyZWVuU2l6ZUNoYW5nZShzaXplOiBQZXBTY3JlZW5TaXplVHlwZSkge1xuICAgICAgICB0aGlzLl9zY3JlZW5TaXplU3ViamVjdC5uZXh0KHNpemUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTGF5b3V0RWRpdG9yUHJvcGVydGllcyhsYXlvdXRWaWV3OiBJUGVwTGF5b3V0Vmlldykge1xuICAgICAgICBpZiAodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWJbMF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxheW91dEVkaXRvcjogSUxheW91dEVkaXRvciA9IHtcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogbGF5b3V0Vmlldz8uTGF5b3V0Lk1heFdpZHRoIHx8IDAsXG4gICAgICAgICAgICAgICAgdmVydGljYWxTcGFjaW5nOiBsYXlvdXRWaWV3Py5MYXlvdXQuVmVydGljYWxTcGFjaW5nLFxuICAgICAgICAgICAgICAgIGhvcml6b250YWxTcGFjaW5nOiBsYXlvdXRWaWV3Py5MYXlvdXQuSG9yaXpvbnRhbFNwYWNpbmcsXG4gICAgICAgICAgICAgICAgc2VjdGlvbnNHYXA6IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9uc0dhcCxcbiAgICAgICAgICAgICAgICBjb2x1bW5zR2FwOiBsYXlvdXRWaWV3Py5MYXlvdXQuQ29sdW1uc0dhcCxcbiAgICAgICAgICAgICAgICAvLyByb3VuZGVkQ29ybmVyczogbGF5b3V0Vmlldz8uTGF5b3V0LlJvdW5kZWRDb3JuZXJzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYlswXS5ob3N0T2JqZWN0ID0gbGF5b3V0RWRpdG9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkRGVmYXVsdEVkaXRvcihsYXlvdXRWaWV3OiBJUGVwTGF5b3V0Vmlldykge1xuICAgICAgICB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYiA9IG5ldyBBcnJheTxJRWRpdG9yPigpO1xuXG4gICAgICAgIGlmIChsYXlvdXRWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5nZXQoJ0xBWU9VVF9CVUlMREVSLkRFRkFVTFRfVElUTEUnKS5zdWJzY3JpYmUoKHRpdGxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IExheW91dEJ1aWxkZXJJbnRlcm5hbFNlcnZpY2UuTUFJTl9FRElUT1JfSUQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgOiAnbGF5b3V0LWJ1aWxkZXInLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvc3RPYmplY3Q6IHt9IC8vIFVwZGF0ZXMgaW4gdXBkYXRlTGF5b3V0RWRpdG9yUHJvcGVydGllcyBmdW5jdGlvbiBhYm92ZS5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTGF5b3V0RWRpdG9yUHJvcGVydGllcyhsYXlvdXRWaWV3KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUVkaXRvckNoYW5nZSh0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYlswXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5RWRpdG9yQ2hhbmdlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VDdXJyZW50RWRpdG9yKCkge1xuICAgICAgICBpZiAodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlFZGl0b3JDaGFuZ2UodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWJbdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFZGl0b3JCeVR5cGUoZWRpdG9yVHlwZTogUGVwTGF5b3V0RWRpdG9yVHlwZSwgaWQ6IHN0cmluZywgdGl0bGUgPSAnJyk6IElFZGl0b3IgfCBudWxsIHtcbiAgICAgICAgLy8gQnVpbGQgZWRpdG9yIG9iamVjdC5cbiAgICAgICAgbGV0IGVkaXRvcjogSUVkaXRvciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChlZGl0b3JUeXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgICAgICAgIGVkaXRvciA9IHRoaXMuZ2V0U2VjdGlvbkVkaXRvcihpZCwgdGl0bGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGVkaXRvclR5cGUgPT09ICdibG9jaycpIHtcbiAgICAgICAgICAgIGVkaXRvciA9IHRoaXMuZ2V0QmxvY2tFZGl0b3IoaWQsIHRpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlZGl0b3I7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCbG9ja0VkaXRvcihibG9ja0tleTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogSUVkaXRvciB7XG4gICAgICAgIC8vIEdldCBibG9jayBlZGl0b3IgdGl0bGUuXG4gICAgICAgIGNvbnN0IGJsb2NrVGl0bGUgPSB0aXRsZSB8fCB0aGlzLmdldEJsb2NrVGl0bGUoYmxvY2tLZXkpOyBcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGJsb2NrS2V5LFxuICAgICAgICAgICAgdHlwZTogJ2Jsb2NrJyxcbiAgICAgICAgICAgIHRpdGxlOiBibG9ja1RpdGxlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlY3Rpb25FZGl0b3JUaXRsZShzZWN0aW9uOiBJUGVwTGF5b3V0U2VjdGlvbiwgc2VjdGlvbkluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc2VjdGlvbi5OYW1lIHx8IGAke3RoaXMuX2RlZmF1bHRTZWN0aW9uVGl0bGV9ICR7c2VjdGlvbkluZGV4ICsgMX1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VjdGlvbkVkaXRvcihzZWN0aW9uSWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IElFZGl0b3IgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBzZWN0aW9uSW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcblxuICAgICAgICBpZiAoc2VjdGlvbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkVkaXRvcjogSUxheW91dFNlY3Rpb25FZGl0b3IgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHNlY3Rpb24uS2V5LFxuICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lOiBzZWN0aW9uLk5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgc3BsaXQ6IHNlY3Rpb24uU3BsaXQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGhlaWdodDogc2VjdGlvbi5IZWlnaHQgfHwgMCxcbiAgICAgICAgICAgICAgICBjb2xsYXBzZU9uVGFibGV0OiBzZWN0aW9uLkNvbGxhcHNlT25UYWJsZXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsbEhlaWdodDogc2VjdGlvbi5GaWxsSGVpZ2h0ID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IHNlY3Rpb24uUGFkZGluZyB8fCBuZXcgUGVwUGFkZGluZ1NldHRpbmdzKHRydWUsICcwJylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZDogc2VjdGlvbklkLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdzZWN0aW9uJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUgfHwgdGhpcy5nZXRTZWN0aW9uRWRpdG9yVGl0bGUoc2VjdGlvbiwgc2VjdGlvbkluZGV4KSxcbiAgICAgICAgICAgICAgICBob3N0T2JqZWN0OiBzZWN0aW9uRWRpdG9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VjdGlvbkNvbHVtbkJ5SWRGb3JFZGl0b3Ioc2VjdGlvbkNvbHVtbklkOiBzdHJpbmcpOiBJUGVwTGF5b3V0U2VjdGlvbkNvbHVtbiB8IG51bGwge1xuICAgICAgICBsZXQgY3VycmVudENvbHVtbiA9IG51bGw7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzZWN0aW9uIGFuZCBjb2x1bW4gYXJyYXkgYnkgdGhlIHBhdHRlcm4gb2YgdGhlIHNlY3Rpb24gY29sdW1uIGtleS5cbiAgICAgICAgY29uc3Qgc2VjdGlvbkNvbHVtblBhdHRlcm5TZXBhcmF0b3IgPSB0aGlzLmdldFNlY3Rpb25Db2x1bW5LZXkoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbkNvbHVtbkFyciA9IHNlY3Rpb25Db2x1bW5JZC5zcGxpdChzZWN0aW9uQ29sdW1uUGF0dGVyblNlcGFyYXRvcik7XG5cbiAgICAgICAgaWYgKHNlY3Rpb25Db2x1bW5BcnIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHNlY3Rpb24gaWQgdG8gZ2V0IHRoZSBzZWN0aW9uIGluZGV4LlxuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbklkID0gc2VjdGlvbkNvbHVtbkFyclswXTtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25JbmRleCA9IHNlY3Rpb25zLmZpbmRJbmRleChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uSWQpO1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBjb2x1bW4gaW5kZXguXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHNlY3Rpb25Db2x1bW5BcnJbMV0sIC0xKTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uSW5kZXggPj0gMCAmJiBjb2x1bW5JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudENvbHVtbiA9IHNlY3Rpb25zW3NlY3Rpb25JbmRleF0uQ29sdW1uc1tjb2x1bW5JbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudENvbHVtbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENzc1NjcmVlbldpZGgoc2NyZWVuVHlwZTogRGF0YVZpZXdTY3JlZW5TaXplKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHdpZHRoVG9TZXQgPSAnMTAwJSc7XG5cbiAgICAgICAgaWYgKHNjcmVlblR5cGUgPT09ICdUYWJsZXQnKSB7XG4gICAgICAgICAgICB3aWR0aFRvU2V0ID0gJzcyMCc7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NyZWVuVHlwZSA9PT0gJ1BoYWJsZXQnKSB7XG4gICAgICAgICAgICB3aWR0aFRvU2V0ID0gJzM2MCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2lkdGhUb1NldDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJsb2Nrc051bWJlcigpOiBudW1iZXIge1xuICAgICAgICBsZXQgYmxvY2tzTnVtYmVyID0gMDtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpPy5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNlY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25zW2luZGV4XTtcbiAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGxldCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgc2VjdGlvbi5Db2x1bW5zLmxlbmd0aDsgY29sdW1uSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHNlY3Rpb24uQ29sdW1uc1tjb2x1bW5JbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5CbG9ja0NvbnRhaW5lciAmJiBjb2x1bW4uQmxvY2tDb250YWluZXIuQmxvY2tLZXk/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzTnVtYmVyKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJsb2Nrc051bWJlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZUN1cnNvck9uRHJhZ1N0YXJ0KCkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2luaGVyaXRDdXJzb3JzJyk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZUN1cnNvck9uRHJhZ0VuZCgpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdpbmhlcml0Q3Vyc29ycycpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICd1bnNldCc7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpYyBmdW5jdGlvbnNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBnZXRCbG9ja1RpdGxlKGJsb2NrS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QmxvY2tUaXRsZShibG9ja0tleSkgfHwgYmxvY2tLZXk7XG4gICAgfVxuXG4gICAgc2V0U2VjdGlvbnNDb2x1bW5zRHJvcExpc3RDaGFuZ2Uoc2VjdGlvbnNDb2x1bW5zRHJvcExpc3Q6IGFueVtdKSB7XG4gICAgICAgIHRoaXMubm90aWZ5U2VjdGlvbnNDb2x1bW5zRHJvcExpc3RDaGFuZ2Uoc2VjdGlvbnNDb2x1bW5zRHJvcExpc3QpO1xuICAgIH1cblxuICAgIGNoYW5nZVByZXZpZXdNb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubm90aWZ5UHJldmlld01vZGVDaGFuZ2UodmFsdWUpO1xuICAgIH1cblxuICAgIGdldEN1cnJlbnRTY3JlZW5UeXBlKCk6IERhdGFWaWV3U2NyZWVuU2l6ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNjcmVlblR5cGUodGhpcy5fc2NyZWVuU2l6ZVN1YmplY3Q/LmdldFZhbHVlKCkgfHwgUGVwU2NyZWVuU2l6ZVR5cGUuTEcpO1xuICAgIH1cblxuICAgIGdldFNjcmVlblR5cGUoc2l6ZTogUGVwU2NyZWVuU2l6ZVR5cGUpOiBEYXRhVmlld1NjcmVlblNpemUge1xuICAgICAgICBjb25zdCBzY3JlZW5UeXBlOiBEYXRhVmlld1NjcmVlblNpemUgPVxuICAgICAgICAgICAgc2l6ZSA8IFBlcFNjcmVlblNpemVUeXBlLk1EID8gJ0xhbmRzY2FwZScgOlxuICAgICAgICAgICAgKHNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLk1EIHx8IHNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLlNNID8gJ1RhYmxldCcgOiAnUGhhYmxldCcpO1xuXG4gICAgICAgIHJldHVybiBzY3JlZW5UeXBlO1xuICAgIH1cblxuICAgIGdldFNlY3Rpb25Db2x1bW5LZXkoc2VjdGlvbktleSA9ICcnLCBpbmRleCA9ICcnKSB7XG4gICAgICAgIHJldHVybiBgJHtzZWN0aW9uS2V5fV9jb2x1bW5fJHtpbmRleH1gO1xuICAgIH1cblxuICAgIGdldElzSGlkZGVuKGhpZGVJbjogRGF0YVZpZXdTY3JlZW5TaXplW10gfCB1bmRlZmluZWQsIGN1cnJlbnRTY3JlZW5UeXBlOiBEYXRhVmlld1NjcmVlblNpemUpIHtcbiAgICAgICAgcmV0dXJuIChoaWRlSW4gJiYgaGlkZUluPy5sZW5ndGggPiAwKSA/IGhpZGVJbi5zb21lKGhpID0+IGhpID09PSBjdXJyZW50U2NyZWVuVHlwZSkgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBuYXZpZ2F0ZVRvRWRpdG9yKGVkaXRvclR5cGU6IFBlcExheW91dEVkaXRvclR5cGUsIGlkOiBzdHJpbmcsIHRpdGxlID0gJycpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgICAvLyBDYW5ub3QgbmF2aWdhdGUgaW50byAnbGF5b3V0LWJ1aWxkZXInIGJlY2F1c2UgdGhpcyBpcyBmaXJzdCBhbmQgY29uc3QgaW4gdGhlIGVkaXRvcnNCcmVhZENydW1icy5cbiAgICAgICAgaWYgKGVkaXRvclR5cGUgIT09ICdsYXlvdXQtYnVpbGRlcicgJiYgaWQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoaWNoIGVkaXRvciB3ZSBoYXZlIG5vd1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEVkaXRvciA9IHRoaXMuX2VkaXRvcnNCcmVhZENydW1iW3RoaXMuX2VkaXRvcnNCcmVhZENydW1iLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGlmIGl0J3MgYW5vdGhlciBlZGl0b3IuXG4gICAgICAgICAgICBpZihjdXJyZW50RWRpdG9yLmlkICE9PSBpZCkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWRpdG9yLnR5cGUgIT09ICdsYXlvdXQtYnVpbGRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIHBvcCB0aGUgbGFzdCBhbmQgaW5zZXJ0IHRoZSBjdXJyZW50LlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvckJ5VHlwZShlZGl0b3JUeXBlLCBpZCwgdGl0bGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5wdXNoKGVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ3VycmVudEVkaXRvcigpO1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgbmF2aWdhdGVCYWNrRnJvbUVkaXRvcigpIHtcbiAgICAgICAgLy8gS2VlcCB0aGUgbGF5b3V0IGJ1aWxkZXIgZWRpdG9yLlxuICAgICAgICBpZiAodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gTWF5YmUgd2Ugd2FudCB0byBjb21wYXJlIHRoZSBsYXN0IGVkaXRvciBmb3IgdmFsaWRhdGlvbiA/XG4gICAgICAgICAgICBjb25zdCBsYXN0RWRpdG9yID0gdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZUN1cnJlbnRFZGl0b3IoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZUxheW91dEZyb21FZGl0b3IoZWRpdG9yRGF0YTogSUxheW91dEVkaXRvcikge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcblxuICAgICAgICBpZiAobGF5b3V0Vmlldykge1xuICAgICAgICAgICAgbGF5b3V0Vmlldy5MYXlvdXQuTWF4V2lkdGggPSBlZGl0b3JEYXRhLm1heFdpZHRoO1xuICAgICAgICAgICAgbGF5b3V0Vmlldy5MYXlvdXQuSG9yaXpvbnRhbFNwYWNpbmcgPSBlZGl0b3JEYXRhLmhvcml6b250YWxTcGFjaW5nO1xuICAgICAgICAgICAgbGF5b3V0Vmlldy5MYXlvdXQuVmVydGljYWxTcGFjaW5nID0gZWRpdG9yRGF0YS52ZXJ0aWNhbFNwYWNpbmc7XG4gICAgICAgICAgICBsYXlvdXRWaWV3LkxheW91dC5TZWN0aW9uc0dhcCA9IGVkaXRvckRhdGEuc2VjdGlvbnNHYXA7XG4gICAgICAgICAgICBsYXlvdXRWaWV3LkxheW91dC5Db2x1bW5zR2FwID0gZWRpdG9yRGF0YS5jb2x1bW5zR2FwO1xuICAgICAgICAgICAgLy8gbGF5b3V0Vmlldy5MYXlvdXQuUm91bmRlZENvcm5lcnMgPSBlZGl0b3JEYXRhLnJvdW5kZWRDb3JuZXJzO1xuXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdXBkYXRlU2VjdGlvbkZyb21FZGl0b3Ioc2VjdGlvbkRhdGE6IElMYXlvdXRTZWN0aW9uRWRpdG9yKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbkluZGV4ID0gc2VjdGlvbnMuZmluZEluZGV4KHNlY3Rpb24gPT4gc2VjdGlvbi5LZXkgPT09IHNlY3Rpb25EYXRhLmlkKTtcblxuICAgICAgICAvLyBVcGRhdGUgc2VjdGlvbiBkZXRhaWxzLlxuICAgICAgICBpZiAoc2VjdGlvbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2Nrc0lkc1RvUmVtb3ZlID0gW107XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uID0gc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLk5hbWUgPSBzZWN0aW9uRGF0YS5zZWN0aW9uTmFtZTtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLlNwbGl0ID0gc2VjdGlvbkRhdGEuc3BsaXQ7XG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5IZWlnaHQgPSBzZWN0aW9uRGF0YS5oZWlnaHQ7XG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5Db2xsYXBzZU9uVGFibGV0ID0gc2VjdGlvbkRhdGEuY29sbGFwc2VPblRhYmxldDtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLkZpbGxIZWlnaHQgPSBzZWN0aW9uRGF0YS5maWxsSGVpZ2h0O1xuICAgICAgICAgICAgY3VycmVudFNlY3Rpb24uUGFkZGluZyA9IHNlY3Rpb25EYXRhLnBhZGRpbmc7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgbmV3IGNvbHVtbnMgbnVtYmVyIGZyb20gY3VycmVudFNlY3Rpb24uU3BsaXQsIGlmIGl0cyB1bmRlZmluZWQgcHV0IGEgZGVmYXVsdCAxLlxuICAgICAgICAgICAgY29uc3QgbmV3Q29sdW1uc0xlbmd0aCA9IGN1cnJlbnRTZWN0aW9uLlNwbGl0Py5zcGxpdCgnICcpLmxlbmd0aCB8fCAxO1xuICAgICAgICAgICAgaWYgKG5ld0NvbHVtbnNMZW5ndGggPiBjdXJyZW50U2VjdGlvbi5Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChuZXdDb2x1bW5zTGVuZ3RoID4gY3VycmVudFNlY3Rpb24uQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlY3Rpb24uQ29sdW1ucy5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0NvbHVtbnNMZW5ndGggPCBjdXJyZW50U2VjdGlvbi5Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChuZXdDb2x1bW5zTGVuZ3RoIDwgY3VycmVudFNlY3Rpb24uQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW5tID0gY3VycmVudFNlY3Rpb24uQ29sdW1ucy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYmxvY2sgaW4gdGhpcyBjb2x1bW4gZGVsZXRlIGl0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW5tICYmIGNvbHVubS5CbG9ja0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzSWRzVG9SZW1vdmUucHVzaChjb2x1bm0uQmxvY2tDb250YWluZXIuQmxvY2tLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgZWRpdG9yIHRpdGxlXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWRpdG9yID0gdGhpcy5fZWRpdG9yU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRFZGl0b3IgJiYgY3VycmVudEVkaXRvci50eXBlID09PSAnc2VjdGlvbicgJiYgY3VycmVudEVkaXRvci5pZCA9PT0gY3VycmVudFNlY3Rpb24uS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmdldFNlY3Rpb25FZGl0b3JUaXRsZShjdXJyZW50U2VjdGlvbiwgc2VjdGlvbkluZGV4KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50RWRpdG9yLnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlFZGl0b3JDaGFuZ2UoY3VycmVudEVkaXRvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzZWN0aW9ucyBjaGFuZ2UuXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBibG9ja3MgdG8gcmVtb3ZlLCBub3RpZnkgdGhlIGJsb2NrcyByZW1vdmVkLlxuICAgICAgICAgICAgaWYgKGJsb2Nrc0lkc1RvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUJsb2Nrc1JlbW92ZWQoYmxvY2tzSWRzVG9SZW1vdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkU2VjdGlvbihzZWN0aW9uOiBJUGVwTGF5b3V0U2VjdGlvbiB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgc2VjdGlvblxuICAgICAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgICAgICAgIHNlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgS2V5OiBQZXBHdWlkLm5ld0d1aWQoKSxcbiAgICAgICAgICAgICAgICBDb2x1bW5zOiBbe31dLCAvLyBBZGQgZW1wdHkgc2VjdGlvbiBjb2x1bW5cbiAgICAgICAgICAgICAgICBIaWRlOiBbXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRoZSBuZXcgc2VjdGlvbiB0byBsYXlvdXQgdmlldy5cbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBzZWN0aW9ucy5wdXNoKHNlY3Rpb24pO1xuICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlU2VjdGlvbihzZWN0aW9uSWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc2VjdGlvbnMuZmluZEluZGV4KHNlY3Rpb24gPT4gc2VjdGlvbi5LZXkgPT09IHNlY3Rpb25JZCk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGJsb2NrcyBpZCdzIHRvIHJlbW92ZS5cbiAgICAgICAgICAgIGNvbnN0IGJsb2Nrc0lkc1RvUmVtb3ZlOiBhbnkgPSBzZWN0aW9uc1tpbmRleF0uQ29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbj8uQmxvY2tDb250YWluZXI/LkJsb2NrS2V5KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHNlY3Rpb24uXG4gICAgICAgICAgICBzZWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYmxvY2tzIHRvIHJlbW92ZSwgbm90aWZ5IHRoZSBibG9ja3MgcmVtb3ZlZC5cbiAgICAgICAgICAgIGlmIChibG9ja3NJZHNUb1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlCbG9ja3NSZW1vdmVkKGJsb2Nrc0lkc1RvUmVtb3ZlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZVNlY3Rpb24oc2VjdGlvbklkOiBzdHJpbmcsIGhpZGVJbjogRGF0YVZpZXdTY3JlZW5TaXplW10pIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNlY3Rpb25zLmZpbmRJbmRleChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uSWQpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgc2VjdGlvbnNbaW5kZXhdLkhpZGUgPSBoaWRlSW47XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNlY3Rpb25Ecm9wcGVkKGV2ZW50OiBDZGtEcmFnRHJvcDxhbnlbXT4pIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkoc2VjdGlvbnMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICB9XG5cbiAgICBvblNlY3Rpb25EcmFnU3RhcnQoZXZlbnQ6IENka0RyYWdTdGFydCkge1xuICAgICAgICB0aGlzLmNoYW5nZUN1cnNvck9uRHJhZ1N0YXJ0KCk7XG4gICAgICAgIHRoaXMuX2RyYWdnaW5nU2VjdGlvbktleS5uZXh0KGV2ZW50LnNvdXJjZS5kYXRhKTtcbiAgICB9XG5cbiAgICBvblNlY3Rpb25EcmFnRW5kKGV2ZW50OiBDZGtEcmFnRW5kKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlQ3Vyc29yT25EcmFnRW5kKCk7XG4gICAgICAgIHRoaXMuX2RyYWdnaW5nU2VjdGlvbktleS5uZXh0KCcnKTtcbiAgICB9XG5cbiAgICByZW1vdmVCbG9ja0Zyb21TZWN0aW9uKGJsb2NrSWQ6IHN0cmluZykge1xuICAgICAgICBsZXQgYmxvY2tSZW1vdmVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBibG9jayBmcm9tIHNlY3Rpb24gY29sdW1uLlxuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBzZWN0aW9uSW5kZXggPSAwOyBzZWN0aW9uSW5kZXggPCBzZWN0aW9ucy5sZW5ndGg7IHNlY3Rpb25JbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBibG9jayBjb250YWluZXIuXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IHNlY3Rpb24uQ29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5CbG9ja0NvbnRhaW5lcj8uQmxvY2tLZXkgPT09IGJsb2NrSWQpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgc2VjdGlvbi5Db2x1bW5zW2NvbHVtbkluZGV4XS5CbG9ja0NvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgICAgICAgICAgICAgYmxvY2tSZW1vdmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGJsb2NrIHdhcyByZW1vdmVkLCBub3RpZnkgdGhlIGJsb2NrIHJlbW92ZWQuXG4gICAgICAgIGlmIChibG9ja1JlbW92ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5QmxvY2tzUmVtb3ZlZChbYmxvY2tJZF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZUJsb2NrKHNlY3Rpb25JZDogc3RyaW5nLCBibG9ja0lkOiBzdHJpbmcsIGhpZGVJbjogRGF0YVZpZXdTY3JlZW5TaXplW10pIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgaW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gc2VjdGlvbnNbaW5kZXhdLkNvbHVtbnMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uQmxvY2tDb250YWluZXI/LkJsb2NrS2V5ID09PSBibG9ja0lkKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvY2tDb250YWluZXIgPSBzZWN0aW9uc1tpbmRleF0uQ29sdW1uc1tjb2x1bW5JbmRleF0uQmxvY2tDb250YWluZXI7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrQ29udGFpbmVyLkhpZGUgPSBoaWRlSW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkJsb2NrRHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8SVBlcExheW91dFNlY3Rpb25Db2x1bW4sIGFueSwgYW55Piwgc2VjdGlvbklkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgaWYgKGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmlkID09PSBMYXlvdXRCdWlsZGVySW50ZXJuYWxTZXJ2aWNlLkFWQUlMQUJMRV9CTE9DS1NfQ09OVEFJTkVSX0lEKSB7XG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSBpZiBibG9ja3MgbnVtYmVyIGFsbG93LlxuICAgICAgICAgICAgaWYgKHRoaXMuX2Jsb2Nrc0xpbWl0TnVtYmVyID4gMCAmJiB0aGlzLmdldEJsb2Nrc051bWJlcigpID49IHRoaXMuX2Jsb2Nrc0xpbWl0TnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBQZXBEaWFsb2dEYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ01FU1NBR0VTLkRJQUxPR19OT1RJQ0VfVElUTEUnKSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTEFZT1VUX0JVSUxERVIuQkxPQ0tTX0NPVU5UX0xJTUlUX01FU1NBR0UnKSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuRGVmYXVsdERpYWxvZyhkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBibG9jayByZWxhdGlvbiAocHJldmlvdXNDb250YWluZXIuZGF0YSBpcyBJUGVwRHJhZ2dhYmxlSXRlbSBhbmQgaW5zaWRlIHdlIGhhdmUgQXZhaWxhYmxlQmxvY2sgb2JqZWN0KS5cbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnZ2FibGVJdGVtOiBJUGVwRHJhZ2dhYmxlSXRlbSA9IGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGFbZXZlbnQucHJldmlvdXNJbmRleF0gYXMgSVBlcERyYWdnYWJsZUl0ZW07XG5cbiAgICAgICAgICAgICAgICBpZiAoZHJhZ2dhYmxlSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2NrIHRoZSBzY3JlZW4gdW50aWxsIHRoZSBlZGl0b3Igd2lsbCBiZSBsb2FkZWQuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuX2xvY2tTY3JlZW5TdWJqZWN0Lm5leHQodHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjb2x1bW4uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSB0aGlzLmdldFNlY3Rpb25Db2x1bW5CeUlkRm9yRWRpdG9yKGV2ZW50LmNvbnRhaW5lci5pZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBibG9jayBrZXkgaW4gdGhlIHNlY3Rpb24gYmxvY2sgb25seSBpZiB0aGVyZSBpcyBhIGJsYW5rIGNvbHVtbi5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb2x1bW4gJiYgIWN1cnJlbnRDb2x1bW4uQmxvY2tDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBibG9jayB1dWlkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tLZXkgPSBQZXBHdWlkLm5ld0d1aWQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbHVtbi5CbG9ja0NvbnRhaW5lciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0tleTogYmxvY2tLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHVwZGF0ZSB0aGUgbGF5b3V0IHZpZXcgY2F1c2UgdGhlIGxheW91dCBpcyB1cGRhdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSYWlzZSBibG9jayBhZGRlZCBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrQWRkZWRFdmVudERhdGE6IElQZXBMYXlvdXRCbG9ja0FkZGVkRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tLZXk6IGJsb2NrS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdnYWJsZUl0ZW06IGRyYWdnYWJsZUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5QmxvY2tBZGRlZChibG9ja0FkZGVkRXZlbnREYXRhKTsgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbmF2aWdhdGVUb0VkaXRvckFmdGVyQmxvY2tBZGRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBibG9jayBlZGl0b3IuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvRWRpdG9yKCdibG9jaycsIGJsb2NrS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZHJhZ2dhYmxlSXRlbSBpcyBub3QgYSBJUGVwRHJhZ2dhYmxlSXRlbSB0eXBlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBibG9jayBtb3ZlZCBiZXR3ZWVuIGNvbHVtbnMgaW4gdGhlIHNhbWUgc2VjdGlvbiBvciBiZXR3ZWVuIGRpZmZlcmVudCBzZWN0aW9ucyBidXQgbm90IGluIHRoZSBzYW1lIGNvbHVtbi5cbiAgICAgICAgICAgIGlmIChldmVudC5jb250YWluZXIuaWQgIT09IGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmlkKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjb2x1bW4uXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuZ2V0U2VjdGlvbkNvbHVtbkJ5SWRGb3JFZGl0b3IoZXZlbnQuY29udGFpbmVyLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHByZXZpb3VzIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aXVvc0NvbHVtbiA9IHRoaXMuZ2V0U2VjdGlvbkNvbHVtbkJ5SWRGb3JFZGl0b3IoZXZlbnQucHJldmlvdXNDb250YWluZXIuaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb2x1bW4gJiYgcHJldml1b3NDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbHVtbi5CbG9ja0NvbnRhaW5lciA9IHByZXZpdW9zQ29sdW1uLkJsb2NrQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHJldml1b3NDb2x1bW4uQmxvY2tDb250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkJsb2NrRHJhZ1N0YXJ0KGV2ZW50OiBDZGtEcmFnU3RhcnQpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3JPbkRyYWdTdGFydCgpO1xuICAgICAgICAvLyBUYWtlIHRoZSBibG9jayBrZXkgaWYgZXhpc3QsIGVsc2UgdGFrZSB0aGUgYXZhaWxhYmxlIGJsb2NrIGtleSAocmVsYXRpb24ga2V5KS5cbiAgICAgICAgY29uc3QgYmxvY2tLZXkgPSBldmVudC5zb3VyY2UuZGF0YT8uQmxvY2tLZXkgfHwgZXZlbnQuc291cmNlLmRhdGE/LktleTtcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmdCbG9ja0tleS5uZXh0KGJsb2NrS2V5KTtcbiAgICB9XG5cbiAgICBvbkJsb2NrRHJhZ0VuZChldmVudDogQ2RrRHJhZ0VuZCkge1xuICAgICAgICB0aGlzLmNoYW5nZUN1cnNvck9uRHJhZ0VuZCgpO1xuICAgICAgICB0aGlzLl9kcmFnZ2luZ0Jsb2NrS2V5Lm5leHQoJycpO1xuICAgIH1cbiAgICBcbiAgICBkb2VzQ29sdW1uQ29udGFpbkJsb2NrKHNlY3Rpb25JZDogc3RyaW5nLCBjb2x1bW5JbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMuZmluZChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uSWQpO1xuXG4gICAgICAgIGlmIChzZWN0aW9uICYmIGNvbHVtbkluZGV4ID49IDAgJiYgc2VjdGlvbi5Db2x1bW5zLmxlbmd0aCA+IGNvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICByZXMgPSAhIXNlY3Rpb24uQ29sdW1uc1tjb2x1bW5JbmRleF0uQmxvY2tDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIHNldFNjcmVlbldpZHRoKHNjcmVlblR5cGU6IERhdGFWaWV3U2NyZWVuU2l6ZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0Q3NzU2NyZWVuV2lkaChzY3JlZW5UeXBlKVxuXG4gICAgICAgIGNvbnN0IHdpZHRoID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUsIDApO1xuICAgICAgICBpZiAod2lkdGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3NjcmVlbldpZHRoU3ViamVjdC5uZXh0KCcxMDAlJyk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeVNjcmVlblNpemVDaGFuZ2UoUGVwU2NyZWVuU2l6ZVR5cGUuWEwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2NyZWVuV2lkdGhTdWJqZWN0Lm5leHQoYCR7d2lkdGh9cHhgKTtcblxuICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBzaXplIGFjY29yZGluZyB0aGUgd2lkdGguXG4gICAgICAgICAgICBpZiAod2lkdGggPj0gMTkyMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5U2NyZWVuU2l6ZUNoYW5nZShQZXBTY3JlZW5TaXplVHlwZS5YTCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoID49IDEyODAgJiYgd2lkdGggPCAxOTIwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlTY3JlZW5TaXplQ2hhbmdlKFBlcFNjcmVlblNpemVUeXBlLkxHKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPj0gOTYwICYmIHdpZHRoIDwgMTI4MCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5U2NyZWVuU2l6ZUNoYW5nZShQZXBTY3JlZW5TaXplVHlwZS5NRCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoID49IDYwMCAmJiB3aWR0aCA8IDk2MCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5U2NyZWVuU2l6ZUNoYW5nZShQZXBTY3JlZW5TaXplVHlwZS5TTSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlTY3JlZW5TaXplQ2hhbmdlKFBlcFNjcmVlblNpemVUeXBlLlhTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNob3dTa2VsZXRvbihzaG93OiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gICAgIHRoaXMuX3Nob3dTa2VsZXRvblN1YmplY3QubmV4dChzaG93KTtcbiAgICAvLyB9XG4gICAgXG4gICAgLy8gbG9ja1NjcmVlbih2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vICAgICB0aGlzLm5vdGlmeUxvY2tTY3JlZW4odmFsdWUpO1xuICAgIC8vIH1cblxuICAgIGxvYWRMYXlvdXRCdWlsZGVyKGxheW91dFZpZXc6IElQZXBMYXlvdXRWaWV3KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRvck1vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBMb2FkIHRoZSBsYXlvdXQgZWRpdG9yLlxuICAgICAgICAgICAgICAgIHRoaXMubG9hZERlZmF1bHRFZGl0b3IobGF5b3V0Vmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIG9ubHkgdGhlIGxheW91dCB2aWV3LlxuICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgfVxufVxuIl19
|