@sumaris-net/ngx-components 18.23.49 → 18.23.50
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/doc/changelog.md +4 -0
- package/esm2022/public_api.mjs +2 -1
- package/esm2022/src/app/admin/users/users.mjs +25 -22
- package/esm2022/src/app/core/account/new-token.form.mjs +12 -9
- package/esm2022/src/app/core/account/token.table.mjs +14 -11
- package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +9 -6
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +8 -5
- package/esm2022/src/app/core/form/list/list.form.mjs +8 -5
- package/esm2022/src/app/core/form/properties/properties.form.mjs +12 -9
- package/esm2022/src/app/core/form/properties/properties.table.mjs +15 -12
- package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +10 -7
- package/esm2022/src/app/core/home/home.mjs +21 -18
- package/esm2022/src/app/core/menu/menu.component.mjs +10 -7
- package/esm2022/src/app/core/settings/settings.page.mjs +10 -7
- package/esm2022/src/app/core/table/column/actions-column.component.mjs +8 -5
- package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +9 -6
- package/esm2022/src/app/core/table/testing/table.testing.mjs +27 -23
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +25 -22
- package/esm2022/src/app/shared/constants.mjs +3 -1
- package/esm2022/src/app/shared/directives/autotooltip.directive.mjs +35 -0
- package/esm2022/src/app/shared/directives/directives.module.mjs +33 -4
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +15 -12
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +13 -11
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +4 -2
- package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +5 -2
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +9 -6
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +15 -4
- package/esm2022/src/app/shared/material/chips/chips.module.mjs +5 -2
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +14 -12
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +8 -5
- package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +11 -9
- package/esm2022/src/app/social/feed/feed.component.mjs +15 -12
- package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +11 -8
- package/esm2022/src/app/social/job/progression/job-progression.list.mjs +12 -9
- package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +12 -8
- package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +12 -9
- package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +9 -6
- package/fesm2022/sumaris-net.ngx-components.mjs +194 -89
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/src/app/admin/users/users.d.ts +1 -0
- package/src/app/core/account/new-token.form.d.ts +1 -0
- package/src/app/core/account/token.table.d.ts +1 -0
- package/src/app/core/form/array/testing/form-array.test.d.ts +1 -0
- package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +1 -0
- package/src/app/core/form/list/list.form.d.ts +1 -0
- package/src/app/core/form/properties/properties.form.d.ts +1 -0
- package/src/app/core/form/properties/properties.table.d.ts +1 -0
- package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -0
- package/src/app/core/home/home.d.ts +1 -0
- package/src/app/core/menu/menu.component.d.ts +1 -0
- package/src/app/core/settings/settings.page.d.ts +1 -0
- package/src/app/core/table/column/actions-column.component.d.ts +1 -0
- package/src/app/core/table/column/nav-actions-column.component.d.ts +1 -0
- package/src/app/core/table/testing/table.testing.d.ts +1 -0
- package/src/app/core/table/testing/table2.testing.d.ts +1 -0
- package/src/app/shared/constants.d.ts +2 -0
- package/src/app/shared/directives/autotooltip.directive.d.ts +14 -0
- package/src/app/shared/directives/directives.module.d.ts +4 -3
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +1 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +1 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +2 -1
- package/src/app/shared/material/boolean/boolean.module.d.ts +2 -1
- package/src/app/shared/material/boolean/material.boolean.d.ts +1 -0
- package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +5 -0
- package/src/app/shared/material/chips/chips.module.d.ts +2 -1
- package/src/app/shared/material/chips/material.chips.d.ts +1 -0
- package/src/app/shared/named-filter/named-filter-selector.component.d.ts +1 -0
- package/src/app/shared/storage/storage-explorer.component.d.ts +1 -0
- package/src/app/social/feed/feed.component.d.ts +1 -0
- package/src/app/social/job/progression/job-progression.icon.d.ts +1 -0
- package/src/app/social/job/progression/job-progression.list.d.ts +1 -0
- package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +1 -0
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +2 -0
- package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +1 -0
- package/src/assets/manifest.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, numberAttribute, Optional, Output, ViewChild, } from '@angular/core';
|
|
1
|
+
import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, forwardRef, inject, Inject, Input, numberAttribute, Optional, Output, ViewChild, } from '@angular/core';
|
|
2
2
|
import { NG_VALUE_ACCESSOR, UntypedFormControl, Validators } from '@angular/forms';
|
|
3
3
|
import { BehaviorSubject, isObservable, merge, Subject, Subscription, timer } from 'rxjs';
|
|
4
4
|
import { debounceTime, distinctUntilChanged, filter, map, mergeMap, switchMap, takeUntil, tap } from 'rxjs/operators';
|
|
@@ -11,7 +11,7 @@ import { MatAutocompleteFieldUtils } from '../autocomplete/material.autocomplete
|
|
|
11
11
|
import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
|
|
12
12
|
import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
|
13
13
|
import { isMobile } from '../../platforms';
|
|
14
|
-
import { DEFAULT_JOIN_PROPERTIES_SEPARATOR } from '../../constants';
|
|
14
|
+
import { DEFAULT_JOIN_PROPERTIES_SEPARATOR, SHOW_TOOLTIP } from '../../constants';
|
|
15
15
|
import { ENTER } from '@angular/cdk/keycodes';
|
|
16
16
|
import { MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING } from '../material.config';
|
|
17
17
|
import * as i0 from "@angular/core";
|
|
@@ -27,13 +27,14 @@ import * as i9 from "@angular/material/icon";
|
|
|
27
27
|
import * as i10 from "@angular/material/button";
|
|
28
28
|
import * as i11 from "@angular/material/chips";
|
|
29
29
|
import * as i12 from "@ngx-translate/core";
|
|
30
|
-
import * as i13 from "
|
|
31
|
-
import * as i14 from "../../pipes/
|
|
32
|
-
import * as i15 from "../../pipes/
|
|
33
|
-
import * as i16 from "../../pipes/
|
|
34
|
-
import * as i17 from "../../pipes/
|
|
35
|
-
import * as i18 from "../../pipes/
|
|
36
|
-
import * as i19 from "
|
|
30
|
+
import * as i13 from "@angular/material/tooltip";
|
|
31
|
+
import * as i14 from "../../pipes/property.pipes";
|
|
32
|
+
import * as i15 from "../../pipes/highlight.pipe";
|
|
33
|
+
import * as i16 from "../../pipes/arrays.pipe";
|
|
34
|
+
import * as i17 from "../../pipes/maps.pipe";
|
|
35
|
+
import * as i18 from "../../pipes/string.pipes";
|
|
36
|
+
import * as i19 from "../../pipes/types.pipes";
|
|
37
|
+
import * as i20 from "@rx-angular/template/push";
|
|
37
38
|
const noop = () => { };
|
|
38
39
|
export class MatChipsField {
|
|
39
40
|
cd;
|
|
@@ -135,6 +136,7 @@ export class MatChipsField {
|
|
|
135
136
|
matInputText;
|
|
136
137
|
autocomplete;
|
|
137
138
|
autocompleteTrigger;
|
|
139
|
+
showTooltip = inject(SHOW_TOOLTIP);
|
|
138
140
|
constructor(cd, formGroupDir, defaultOptions) {
|
|
139
141
|
this.cd = cd;
|
|
140
142
|
this.formGroupDir = formGroupDir;
|
|
@@ -682,7 +684,7 @@ export class MatChipsField {
|
|
|
682
684
|
multi: true,
|
|
683
685
|
useExisting: forwardRef(() => MatChipsField),
|
|
684
686
|
},
|
|
685
|
-
], viewQueries: [{ propertyName: "matInputText", first: true, predicate: ["matInputText"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], ngImport: i0, template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n [class.mat-form-field-disabled]=\"formControl.disabled\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\"\n class=\"material-chips\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <mat-chip-grid\n #chipList\n (focus)=\"filterChipsFocusEvent($event)\"\n [disabled]=\"!readonly && disabled\"\n [required]=\"required\"\n [errorStateMatcher]=\"_errorStateMatcher\"\n >\n @if (showChips) {\n @for (item of value; track item) {\n <mat-chip-row\n class=\"ion-no-margin\"\n [removable]=\"!disabled\"\n (removed)=\"remove(item)\"\n [color]=\"chipColor\"\n [highlighted]=\"true\"\n >\n {{ item | toString: displayWith }}\n @if (enabled) {\n <mat-icon matChipRemove>cancel</mat-icon>\n }\n </mat-chip-row>\n }\n }\n <input\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"_inputControl\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [readonly]=\"readonly\"\n [hidden]=\"disabled\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n />\n </mat-chip-grid>\n\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"add($event.option.value)\"\n >\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n }\n\n <!-- Options -->\n @for (item of items; track $index) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item?.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\" [title]=\"text.innerText\" class=\"ion-align-self-center\">\n <ion-text>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: matInputText.value, withAccent: highlightAccent }\n \"\n ></span>\n </ion-text>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initAutocompleteInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((matInputText.value | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </mat-autocomplete>\n\n <div matSuffix class=\"mat-form-field-suffix-bottom\">\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- Hints -->\n @if (!formControl?.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <!-- Do the same as MatFormField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.errors; as errors) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('entity') {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n }\n </div>\n }\n </div>\n </ion-col>\n <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"toggleShowPanel($event)\"\n [class.hidden]=\"disabled\"\n [title]=\"dropButtonTitle || '' | translate\"\n >\n <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [class.hidden]=\"disabled || !formControl.value\"\n [title]=\"clearButtonTitle || '' | translate\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button.hidden{display:none;visibility:hidden}.mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 23px;margin:1px 0 0 8px!important;min-height:calc(31px - .5em)}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action{padding:0 2px}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action{padding-right:4px;padding-left:4px}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action mat-icon{color:inherit}.mat-mdc-chip.mat-mdc-standard-chip.mat-primary{background-color:var(--ion-color-primary);color:var(--ion-color-primary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-secondary{background-color:var(--ion-color-secondary);color:var(--ion-color-secondary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-tertiary{background-color:var(--ion-color-tertiary);color:var(--ion-color-tertiary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-accent{background-color:var(--ion-color-accent);color:var(--ion-color-accent-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-warning{background-color:var(--ion-color-warning);color:var(--ion-color-warning-contrast)}mat-form-field.mat-form-field-invalid ::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-app-error))}mat-form-field.mat-form-field-invalid ::ng-deep .mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple:after{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-app-error))}\n"], dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i5.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i11.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i11.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i11.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: i12.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i13.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i14.HighlightPipe, name: "highlight" }, { kind: "pipe", type: i15.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i15.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i16.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i17.ToStringPipe, name: "toString" }, { kind: "pipe", type: i17.StrLengthPipe, name: "strLength" }, { kind: "pipe", type: i18.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }, { kind: "pipe", type: i19.RxPush, name: "push" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
687
|
+
], viewQueries: [{ propertyName: "matInputText", first: true, predicate: ["matInputText"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], ngImport: i0, template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n [class.mat-form-field-disabled]=\"formControl.disabled\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\"\n class=\"material-chips\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <mat-chip-grid\n #chipList\n (focus)=\"filterChipsFocusEvent($event)\"\n [disabled]=\"!readonly && disabled\"\n [required]=\"required\"\n [errorStateMatcher]=\"_errorStateMatcher\"\n >\n @if (showChips) {\n @for (item of value; track item) {\n <mat-chip-row\n class=\"ion-no-margin\"\n [removable]=\"!disabled\"\n (removed)=\"remove(item)\"\n [color]=\"chipColor\"\n [highlighted]=\"true\"\n >\n {{ item | toString: displayWith }}\n @if (enabled) {\n <mat-icon matChipRemove>cancel</mat-icon>\n }\n </mat-chip-row>\n }\n }\n <input\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"_inputControl\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [readonly]=\"readonly\"\n [hidden]=\"disabled\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n />\n </mat-chip-grid>\n\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"add($event.option.value)\"\n >\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n }\n\n <!-- Options -->\n @for (item of items; track $index) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item?.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col\n [size]=\"displayColumnSizes[i]\"\n [title]=\"!showTooltip ? text.innerText : ''\"\n [matTooltip]=\"showTooltip ? text.innerText : ''\"\n class=\"ion-align-self-center\"\n >\n <ion-text>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: matInputText.value, withAccent: highlightAccent }\n \"\n ></span>\n </ion-text>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initAutocompleteInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((matInputText.value | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </mat-autocomplete>\n\n <div matSuffix class=\"mat-form-field-suffix-bottom\">\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- Hints -->\n @if (!formControl?.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <!-- Do the same as MatFormField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.errors; as errors) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('entity') {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n }\n </div>\n }\n </div>\n </ion-col>\n <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"toggleShowPanel($event)\"\n [class.hidden]=\"disabled\"\n [title]=\"!showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [class.hidden]=\"disabled || !formControl.value\"\n [title]=\"!showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button.hidden{display:none;visibility:hidden}.mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 23px;margin:1px 0 0 8px!important;min-height:calc(31px - .5em)}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action{padding:0 2px}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action{padding-right:4px;padding-left:4px}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action mat-icon{color:inherit}.mat-mdc-chip.mat-mdc-standard-chip.mat-primary{background-color:var(--ion-color-primary);color:var(--ion-color-primary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-secondary{background-color:var(--ion-color-secondary);color:var(--ion-color-secondary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-tertiary{background-color:var(--ion-color-tertiary);color:var(--ion-color-tertiary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-accent{background-color:var(--ion-color-accent);color:var(--ion-color-accent-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-warning{background-color:var(--ion-color-warning);color:var(--ion-color-warning-contrast)}mat-form-field.mat-form-field-invalid ::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-app-error))}mat-form-field.mat-form-field-invalid ::ng-deep .mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple:after{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-app-error))}\n"], dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i5.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i11.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i11.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i11.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: i12.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.HighlightPipe, name: "highlight" }, { kind: "pipe", type: i16.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i16.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i17.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i18.ToStringPipe, name: "toString" }, { kind: "pipe", type: i18.StrLengthPipe, name: "strLength" }, { kind: "pipe", type: i19.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }, { kind: "pipe", type: i20.RxPush, name: "push" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
686
688
|
}
|
|
687
689
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MatChipsField, decorators: [{
|
|
688
690
|
type: Component,
|
|
@@ -692,7 +694,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
692
694
|
multi: true,
|
|
693
695
|
useExisting: forwardRef(() => MatChipsField),
|
|
694
696
|
},
|
|
695
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n [class.mat-form-field-disabled]=\"formControl.disabled\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\"\n class=\"material-chips\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <mat-chip-grid\n #chipList\n (focus)=\"filterChipsFocusEvent($event)\"\n [disabled]=\"!readonly && disabled\"\n [required]=\"required\"\n [errorStateMatcher]=\"_errorStateMatcher\"\n >\n @if (showChips) {\n @for (item of value; track item) {\n <mat-chip-row\n class=\"ion-no-margin\"\n [removable]=\"!disabled\"\n (removed)=\"remove(item)\"\n [color]=\"chipColor\"\n [highlighted]=\"true\"\n >\n {{ item | toString: displayWith }}\n @if (enabled) {\n <mat-icon matChipRemove>cancel</mat-icon>\n }\n </mat-chip-row>\n }\n }\n <input\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"_inputControl\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [readonly]=\"readonly\"\n [hidden]=\"disabled\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n />\n </mat-chip-grid>\n\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"add($event.option.value)\"\n >\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n }\n\n <!-- Options -->\n @for (item of items; track $index) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item?.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\" [title]=\"text.innerText\" class=\"ion-align-self-center\">\n <ion-text>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: matInputText.value, withAccent: highlightAccent }\n \"\n ></span>\n </ion-text>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initAutocompleteInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((matInputText.value | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </mat-autocomplete>\n\n <div matSuffix class=\"mat-form-field-suffix-bottom\">\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- Hints -->\n @if (!formControl?.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <!-- Do the same as MatFormField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.errors; as errors) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('entity') {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n }\n </div>\n }\n </div>\n </ion-col>\n <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"toggleShowPanel($event)\"\n [class.hidden]=\"disabled\"\n [title]=\"dropButtonTitle || '' | translate\"\n >\n <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [class.hidden]=\"disabled || !formControl.value\"\n [title]=\"clearButtonTitle || '' | translate\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button.hidden{display:none;visibility:hidden}.mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 23px;margin:1px 0 0 8px!important;min-height:calc(31px - .5em)}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action{padding:0 2px}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action{padding-right:4px;padding-left:4px}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action mat-icon{color:inherit}.mat-mdc-chip.mat-mdc-standard-chip.mat-primary{background-color:var(--ion-color-primary);color:var(--ion-color-primary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-secondary{background-color:var(--ion-color-secondary);color:var(--ion-color-secondary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-tertiary{background-color:var(--ion-color-tertiary);color:var(--ion-color-tertiary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-accent{background-color:var(--ion-color-accent);color:var(--ion-color-accent-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-warning{background-color:var(--ion-color-warning);color:var(--ion-color-warning-contrast)}mat-form-field.mat-form-field-invalid ::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-app-error))}mat-form-field.mat-form-field-invalid ::ng-deep .mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple:after{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-app-error))}\n"] }]
|
|
697
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n [class.mat-form-field-disabled]=\"formControl.disabled\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\"\n class=\"material-chips\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <mat-chip-grid\n #chipList\n (focus)=\"filterChipsFocusEvent($event)\"\n [disabled]=\"!readonly && disabled\"\n [required]=\"required\"\n [errorStateMatcher]=\"_errorStateMatcher\"\n >\n @if (showChips) {\n @for (item of value; track item) {\n <mat-chip-row\n class=\"ion-no-margin\"\n [removable]=\"!disabled\"\n (removed)=\"remove(item)\"\n [color]=\"chipColor\"\n [highlighted]=\"true\"\n >\n {{ item | toString: displayWith }}\n @if (enabled) {\n <mat-icon matChipRemove>cancel</mat-icon>\n }\n </mat-chip-row>\n }\n }\n <input\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"_inputControl\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [readonly]=\"readonly\"\n [hidden]=\"disabled\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n />\n </mat-chip-grid>\n\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"add($event.option.value)\"\n >\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n }\n\n <!-- Options -->\n @for (item of items; track $index) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item?.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col\n [size]=\"displayColumnSizes[i]\"\n [title]=\"!showTooltip ? text.innerText : ''\"\n [matTooltip]=\"showTooltip ? text.innerText : ''\"\n class=\"ion-align-self-center\"\n >\n <ion-text>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: matInputText.value, withAccent: highlightAccent }\n \"\n ></span>\n </ion-text>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initAutocompleteInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((matInputText.value | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </mat-autocomplete>\n\n <div matSuffix class=\"mat-form-field-suffix-bottom\">\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- Hints -->\n @if (!formControl?.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <!-- Do the same as MatFormField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.errors; as errors) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('entity') {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n }\n </div>\n }\n </div>\n </ion-col>\n <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"toggleShowPanel($event)\"\n [class.hidden]=\"disabled\"\n [title]=\"!showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [class.hidden]=\"disabled || !formControl.value\"\n [title]=\"!showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button.hidden{display:none;visibility:hidden}.mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 23px;margin:1px 0 0 8px!important;min-height:calc(31px - .5em)}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action{padding:0 2px}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action{padding-right:4px;padding-left:4px}.mat-mdc-chip.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action mat-icon{color:inherit}.mat-mdc-chip.mat-mdc-standard-chip.mat-primary{background-color:var(--ion-color-primary);color:var(--ion-color-primary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-secondary{background-color:var(--ion-color-secondary);color:var(--ion-color-secondary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-tertiary{background-color:var(--ion-color-tertiary);color:var(--ion-color-tertiary-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-accent{background-color:var(--ion-color-accent);color:var(--ion-color-accent-contrast)}.mat-mdc-chip.mat-mdc-standard-chip.mat-warning{background-color:var(--ion-color-warning);color:var(--ion-color-warning-contrast)}mat-form-field.mat-form-field-invalid ::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-app-error))}mat-form-field.mat-form-field-invalid ::ng-deep .mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple:after{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-app-error))}\n"] }]
|
|
696
698
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.FormGroupDirective, decorators: [{
|
|
697
699
|
type: Optional
|
|
698
700
|
}] }, { type: undefined, decorators: [{
|
|
@@ -838,4 +840,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
838
840
|
}], items: [{
|
|
839
841
|
type: Input
|
|
840
842
|
}] } });
|
|
841
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuY2hpcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9jaGlwcy9tYXRlcmlhbC5jaGlwcy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2NoaXBzL21hdGVyaWFsLmNoaXBzLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBR2YsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE0QyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3SCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEcsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RILE9BQU8sRUFBRSxVQUFVLEVBQWdCLDJCQUEyQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXZHLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsWUFBWSxFQUNaLEtBQUssRUFDTCxZQUFZLEVBQ1osUUFBUSxFQUNSLGVBQWUsRUFDZixjQUFjLEVBQ2QsU0FBUyxFQUNULFFBQVEsR0FDVCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9B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QUVHLE9BQU87c0JBQXZCLE1BQU07dUJBQUMsT0FBTztnQkFDTCxlQUFlO3NCQUF4QixNQUFNO2dCQUNtQixhQUFhO3NCQUF0QyxNQUFNO3VCQUFDLGdCQUFnQjtnQkFDRCxVQUFVO3NCQUFoQyxNQUFNO3VCQUFDLGFBQWE7Z0JBRU0sWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNHLFlBQVk7c0JBQXZDLFNBQVM7dUJBQUMsZUFBZTtnQkFDUyxtQkFBbUI7c0JBQXJELFNBQVM7dUJBQUMsc0JBQXNCO2dCQW1CcEIsTUFBTTtzQkFBbEIsS0FBSztnQkFZTyxRQUFRO3NCQUFwQixLQUFLO2dCQVNPLEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Hcm91cERpcmVjdGl2ZSwgTkdfVkFMVUVfQUNDRVNTT1IsIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgaXNPYnNlcnZhYmxlLCBtZXJnZSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIG1lcmdlTWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZm9jdXNJbnB1dCwgSW5wdXRFbGVtZW50LCBzZWxlY3RJbnB1dENvbnRlbnRGcm9tRXZlbnQsIHNlbGVjdElucHV0UmFuZ2UgfSBmcm9tICcuLi8uLi9pbnB1dHMnO1xuaW1wb3J0IHsgRmV0Y2hNb3JlRm4sIExvYWRSZXN1bHQsIFN1Z2dlc3RGbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7XG4gIGNoYW5nZUNhc2VUb1VuZGVyc2NvcmUsXG4gIGlzRW1wdHlBcnJheSxcbiAgaXNOaWwsXG4gIGlzTmlsT3JCbGFuayxcbiAgaXNOb3ROaWwsXG4gIGlzTm90TmlsT3JCbGFuayxcbiAgaXNOb3ROaWxTdHJpbmcsXG4gIHRvQm9vbGVhbixcbiAgdG9OdW1iZXIsXG59IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBmaXJzdE5vdE5pbFByb21pc2UgfSBmcm9tICcuLi8uLi9vYnNlcnZhYmxlcyc7XG5pbXBvcnQgeyBmcm9tU2Nyb2xsRW5kRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMnO1xuaW1wb3J0IHsgRXJyb3JTdGF0ZU1hdGNoZXIsIFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgc3VnZ2VzdEZyb21BcnJheSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5jb25maWcnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlRmllbGRVdGlscyB9IGZyb20gJy4uL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUudXRpbHMnO1xuaW1wb3J0IHsgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLCBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9ucywgU3Vic2NyaXB0U2l6aW5nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHsgREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfQVBQRUFSQU5DRSwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HIH0gZnJvbSAnLi4vbWF0ZXJpYWwuY29uZmlnJztcbmltcG9ydCB7IEFwcEZsb2F0TGFiZWxUeXBlLCBEaXNwbGF5Rm4sIEVxdWFsc0ZuIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ21hdC1jaGlwcy1maWVsZCcsXG4gIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmNoaXBzLnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmNoaXBzLmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0Q2hpcHNGaWVsZCksXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdENoaXBzRmllbGQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXRFbGVtZW50LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG5cbiAgcHJpdmF0ZSBfb25GZXRjaE1vcmVDYWxsYmFjazogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxhbnk+PjtcbiAgcHJpdmF0ZSBfaW1wbGljaXRWYWx1ZTogYW55O1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2l0ZW1zU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX29wZW5lZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF8kZmlsdGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgX2l0ZW1Db3VudDogbnVtYmVyO1xuICBwcml2YXRlIF9zdWdnZXN0RXhlY3V0aW9uSWQ6IG51bWJlciA9IDA7IC8vIElkZW50aWZpZXIgb2YgdGhlIHN1Z2dlc3Qgam9iXG4gIHByaXZhdGUgX3JlbG9hZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHByaXZhdGUgX2FwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0U2l6aW5nOiBTdWJzY3JpcHRTaXppbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRTdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZztcblxuICBwcm90ZWN0ZWQgX3RhYmluZGV4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfJGlucHV0SXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgXyRmaWx0ZXJlZEl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIF9pbnB1dENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XG4gIHByb3RlY3RlZCBfbW9yZUl0ZW1zQ291bnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9mZXRjaE1vcmUkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgcHJvdGVjdGVkIF9lcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXI7XG5cbiAgQElucHV0KCkgZXF1YWxzOiBFcXVhbHNGbjtcbiAgQElucHV0KCkgbG9nUHJlZml4ID0gJ1ttYXQtY2hpcHNdICc7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KCkgZmxvYXRMYWJlbDogQXBwRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN1Z2dlc3RGbjogU3VnZ2VzdEZuPGFueSwgYW55PjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlcXVpcmVkOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNsZWFyYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBkZWJvdW5jZVRpbWU6IG51bWJlciA9IG51bGw7XG5cbiAgQElucHV0KCkgZGlzcGxheVNlcGFyYXRvcjogc3RyaW5nIHwgbnVsbDtcbiAgQElucHV0KCkgZGlzcGxheVdpdGg6IERpc3BsYXlGbiB8IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlBdHRyaWJ1dGVzOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgZGlzcGxheUNvbHVtblNpemVzOiAobnVtYmVyIHwgJ2F1dG8nIHwgdW5kZWZpbmVkKVtdO1xuICBASW5wdXQoKSBkaXNwbGF5Q29sdW1uTmFtZXM6IHN0cmluZ1tdO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaGlnaGxpZ2h0QWNjZW50OiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FsbE9uRm9jdXM6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93UGFuZWxPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIEBJbnB1dCgpIGkxOG5QcmVmaXggPSAnUkVGRVJFTlRJQUwuJztcbiAgQElucHV0KCkgbm9SZXN1bHRNZXNzYWdlID0gJ0NPTU1PTi5OT19SRVNVTFQnO1xuICBASW5wdXQoKSBwYW5lbENsYXNzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhbmVsV2lkdGg6IHN0cmluZztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpc2FibGVSaXBwbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbWF0QXV0b2NvbXBsZXRlUG9zaXRpb246ICdhdXRvJyB8ICdhYm92ZScgfCAnYmVsb3cnO1xuICBASW5wdXQoKSBpdGVtU2l6ZSA9ICc0OHB4JztcbiAgQElucHV0KCkgZmV0Y2hNb3JlVGhyZXNob2xkID0gJzE1JSc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQ6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93TG9hZGluZ1NwaW5uZXIgPSB0cnVlO1xuICBASW5wdXQoKSBjaGlwQ29sb3I6IFRoZW1lUGFsZXR0ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcGx5SW1wbGljaXRWYWx1ZTogYm9vbGVhbiB8ICgodmFsdWU6IGFueSkgPT4gYm9vbGVhbikgPSBmYWxzZTsgLy8gLyFcXCBmYWxzZSBieSBkZWZhdWx0IChub3QgbGlrZSBhdXRvY29tcGxldGUpXG4gIEBJbnB1dCgpIGRyb3BCdXR0b25UaXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBjbGVhckJ1dHRvblRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSB0cmltU2VhcmNoVGV4dDogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZGVSZXF1aXJlZE1hcmtlciA9IGZhbHNlO1xuICBASW5wdXQoKSBjb2xTaXplczogW251bWJlciB8ICdhdXRvJywgbnVtYmVyIHwgJ2F1dG8nXSA9IFt1bmRlZmluZWQsICdhdXRvJ107XG4gIEBJbnB1dCgpIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVJdO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0NoaXBzID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzZXQgYXBwZWFyYW5jZSh2YWx1ZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSkge1xuICAgIHRoaXMuX2FwcGVhcmFuY2UgPSB2YWx1ZTtcbiAgfVxuICBnZXQgYXBwZWFyYW5jZSgpOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwZWFyYW5jZSB8fCB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzdWJzY3JpcHRTaXppbmcodmFsdWU6IFN1YnNjcmlwdFNpemluZykge1xuICAgIHRoaXMuX3N1YnNjcmlwdFNpemluZyA9IHZhbHVlO1xuICB9XG4gIGdldCBzdWJzY3JpcHRTaXppbmcoKTogU3Vic2NyaXB0U2l6aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0U2l6aW5nIHx8IHRoaXMuX2RlZmF1bHRTdWJzY3JpcHRTaXppbmc7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHBhbmVsQ2xhc3MgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KHsgYWxpYXM6ICdjbGFzcycgfSkgc2V0IGNsYXNzTGlzdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wYW5lbENsYXNzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGNsYXNzTGlzdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhbmVsQ2xhc3M7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgnY2xpY2snKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgnYmx1cicpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCdmb2N1cycpIGZvY3VzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcm9wQnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50Pih0cnVlKTtcbiAgQE91dHB1dCgna2V5ZG93bi5lc2NhcGUnKSBrZXlkb3duRXNjYXBlID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgna2V5dXAuZW50ZXInKSBrZXl1cEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcblxuICBAVmlld0NoaWxkKCdtYXRJbnB1dFRleHQnKSBtYXRJbnB1dFRleHQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlKSBhdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSBhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUykgZGVmYXVsdE9wdGlvbnM/OiBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9uc1xuICApIHtcbiAgICB0aGlzLl9kZWZhdWx0U3Vic2NyaXB0U2l6aW5nID0gZGVmYXVsdE9wdGlvbnM/LnN1YnNjcmlwdFNpemluZyB8fCBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX1NVQlNDUklQVF9TSVpJTkc7XG4gICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSBkZWZhdWx0T3B0aW9ucz8uYXBwZWFyYW5jZSB8fCBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX0FQUEVBUkFOQ0U7XG4gIH1cblxuICBnZXQgaXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1Db3VudDtcbiAgfVxuXG4gIGdldCBjYW5GZXRjaE1vcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgJiYgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPiAwO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlcih2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl8kZmlsdGVyLnZhbHVlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgU2V0dGluZyBmaWx0ZXI6XCIsIHZhbHVlKTtcbiAgICAgIHRoaXMuXyRmaWx0ZXIubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpbHRlcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl8kZmlsdGVyLnZhbHVlO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRhYmluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90YWJpbmRleCA9IHZhbHVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgdGFiaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiaW5kZXg7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaXRlbXModmFsdWU6IE9ic2VydmFibGU8YW55W10+IHwgYW55W10pIHtcbiAgICAvLyBSZW1vdmUgcHJldmlvdXMgc3Vic2NyaXB0aW9uIG9uIGl0ZW1zIChpZiBleGlzdHMpXG4gICAgaWYgKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKSB7XG4gICAgICBjb25zb2xlLndhcm4odGhpcy5sb2dQcmVmaXggKyAnIEl0ZW1zIHJlY2VpdmVkIHR3aWNlICEnKTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5yZW1vdmUodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pO1xuICAgICAgdGhpcy5faXRlbXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNPYnNlcnZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5faXRlbXNTdWJzY3JpcHRpb24gPSB2YWx1ZS5zdWJzY3JpYmUoKHYpID0+IHRoaXMuXyRpbnB1dEl0ZW1zLm5leHQodikpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fJGlucHV0SXRlbXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy5fJGlucHV0SXRlbXMubmV4dCh2YWx1ZSBhcyBhbnlbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGl0ZW1zKCk6IE9ic2VydmFibGU8YW55W10+IHwgYW55W10ge1xuICAgIHJldHVybiB0aGlzLl8kaW5wdXRJdGVtcztcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgfHwgW107XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHkgfHwgdGhpcy5mb3JtQ29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2U7XG4gIH1cblxuICBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKCF0aGlzLnJlYWRvbmx5ICYmIHRoaXMuZm9ybUNvbnRyb2w/LmVuYWJsZWQpIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmlsKHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLnZhbHVlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wgPVxuICAgICAgdGhpcy5mb3JtQ29udHJvbCB8fCAodGhpcy5mb3JtQ29udHJvbE5hbWUgJiYgdGhpcy5mb3JtR3JvdXBEaXIgJiYgKHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0uZ2V0KHRoaXMuZm9ybUNvbnRyb2xOYW1lKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wpKTtcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IGF0dHJpYnV0ZSAnZm9ybUNvbnRyb2wnIG9yICdmb3JtQ29udHJvbE5hbWUnIGluIDxtYXQtY2hpcHMtZmllbGQ+LlwiKTtcblxuICAgIC8vIENvbmZpZ3VyYXRpb24gZnJvbSBjb25maWcgb2JqZWN0XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLnN1Z2dlc3RGbiA9IHRoaXMuc3VnZ2VzdEZuIHx8IHRoaXMuY29uZmlnLnN1Z2dlc3RGbjtcbiAgICAgIGlmICghdGhpcy5zdWdnZXN0Rm4gJiYgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuY29uZmlnLml0ZW1zO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXIgPSB0aGlzLmZpbHRlciB8fCB0aGlzLmNvbmZpZy5maWx0ZXI7XG4gICAgICB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID0gdGhpcy5kaXNwbGF5QXR0cmlidXRlcyA/PyB0aGlzLmNvbmZpZy5hdHRyaWJ1dGVzO1xuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXMgPSB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA/PyB0aGlzLmNvbmZpZy5jb2x1bW5TaXplcztcbiAgICAgIHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzID0gdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPz8gdGhpcy5jb25maWcuY29sdW1uTmFtZXM7XG4gICAgICB0aGlzLmRpc3BsYXlTZXBhcmF0b3IgPSB0aGlzLmRpc3BsYXlTZXBhcmF0b3IgPz8gdGhpcy5jb25maWcuZGlzcGxheVdpdGhTZXBhcmF0b3I7XG4gICAgICB0aGlzLmRpc3BsYXlXaXRoID0gdGhpcy5kaXNwbGF5V2l0aCA/PyB0aGlzLmNvbmZpZy5kaXNwbGF5V2l0aDtcbiAgICAgIHRoaXMudHJpbVNlYXJjaFRleHQgPSB0aGlzLnRyaW1TZWFyY2hUZXh0ID8/IHRoaXMuY29uZmlnLnRyaW1TZWFyY2hUZXh0O1xuICAgICAgdGhpcy5lcXVhbHMgPSB0aGlzLmVxdWFscyA/PyB0aGlzLmNvbmZpZy5lcXVhbHM7XG4gICAgICB0aGlzLm1vYmlsZSA9IHRoaXMubW9iaWxlID8/IHRoaXMuY29uZmlnLm1vYmlsZTtcbiAgICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA9IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA/PyB0aGlzLmNvbmZpZy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkO1xuICAgICAgdGhpcy5zaG93QWxsT25Gb2N1cyA9IHRoaXMuc2hvd0FsbE9uRm9jdXMgPz8gdGhpcy5jb25maWcuc2hvd0FsbE9uRm9jdXM7XG4gICAgICB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPSB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPz8gdGhpcy5jb25maWcuc2hvd1BhbmVsT25Gb2N1cztcbiAgICAgIHRoaXMucGFuZWxDbGFzcyA9IHRoaXMucGFuZWxDbGFzcyA/PyB0aGlzLmNvbmZpZy5wYW5lbENsYXNzID8/IHRoaXMuY29uZmlnLmNsYXNzO1xuICAgICAgdGhpcy5wYW5lbFdpZHRoID0gdGhpcy5wYW5lbFdpZHRoID8/IHRoaXMuY29uZmlnLnBhbmVsV2lkdGg7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZSA9IHRvTnVtYmVyKHRoaXMuZGVib3VuY2VUaW1lLCB0aGlzLmNvbmZpZy5kZWJvdW5jZVRpbWUpO1xuICAgICAgdGhpcy5oaWdobGlnaHRBY2NlbnQgPSB0b0Jvb2xlYW4odGhpcy5oaWdobGlnaHRBY2NlbnQsIHRvQm9vbGVhbih0aGlzLmNvbmZpZy5oaWdobGlnaHRBY2NlbnQpKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgIHRoaXMucmVxdWlyZWQgPSB0aGlzLnJlcXVpcmVkID8/IHRoaXMuZm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIHRoaXMubW9iaWxlID0gdGhpcy5tb2JpbGUgPz8gaXNNb2JpbGUod2luZG93KTtcbiAgICB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID0gdGhpcy5kaXNwbGF5QXR0cmlidXRlcyA/PyB0aGlzLmZpbHRlcj8uYXR0cmlidXRlcyA/PyBbJ2xhYmVsJywgJ25hbWUnXTtcbiAgICB0aGlzLmRpc3BsYXlTZXBhcmF0b3IgPSB0aGlzLmRpc3BsYXlTZXBhcmF0b3IgPz8gREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SO1xuICAgIHRoaXMuZGlzcGxheVdpdGggPSB0aGlzLmRpc3BsYXlXaXRoID8/IE1hdEF1dG9jb21wbGV0ZUZpZWxkVXRpbHMuY3JlYXRlRGlzcGxheUZuKHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMsIGZhbHNlLCB0aGlzLmRpc3BsYXlTZXBhcmF0b3IpO1xuICAgIHRoaXMudHJpbVNlYXJjaFRleHQgPSB0aGlzLnRyaW1TZWFyY2hUZXh0ID8/IHRydWU7XG4gICAgdGhpcy5lcXVhbHMgPSB0aGlzLmVxdWFscyA/PyBNYXRBdXRvY29tcGxldGVGaWVsZFV0aWxzLmRlZmF1bHRFcXVhbHM7XG4gICAgdGhpcy5jb2xTaXplcyA9IHRoaXMuY29sU2l6ZXMgPz8gW3VuZGVmaW5lZCwgJ2F1dG8nXTtcblxuICAgIGlmICh0aGlzLnJlcXVpcmVkKSB0aGlzLmZvcm1Db250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG5cbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA/P1xuICAgICAgLy8gaWYgb25seSBjb2x1bW46IGF1dG8gc2l6ZVxuICAgICAgKCh0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMSAmJiBbdW5kZWZpbmVkXSkgfHxcbiAgICAgICAgLy8gQ29tcHV0ZWQgY29sdW1uIHNpemU6XG4gICAgICAgIC8vIC0gaWYgbGFiZWwgdGhlbiBjb2wgc2l6ZSA9IDJcbiAgICAgICAgLy8gLSBpZiByYW5rT3JkZXIgdGhlbiBjb2wgc2l6ZSA9IDFcbiAgICAgICAgLy8gLSBlc2UgPT4gYXV0byBzaXplXG4gICAgICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMubWFwKChhdHRyKSA9PiBhdHRyICYmIChhdHRyLmVuZHNXaXRoKCdsYWJlbCcpID8gMyA6IGF0dHIuZW5kc1dpdGgoJ3JhbmtPcmRlcicpID8gMiA6IHVuZGVmaW5lZCkpKTtcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyA9IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMubWFwKFxuICAgICAgKGF0dHIsIGluZGV4KSA9PiAodGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgJiYgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXNbaW5kZXhdKSB8fCB0aGlzLmkxOG5QcmVmaXggKyBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlKGF0dHIpLnRvVXBwZXJDYXNlKClcbiAgICApO1xuICAgIGNvbnN0IHBhbmVsQ2xhc3NlcyA9IHRoaXMucGFuZWxDbGFzcz8uc3BsaXQoL1xccy8pO1xuICAgIHRoaXMucGFuZWxXaWR0aCA9XG4gICAgICB0aGlzLnBhbmVsV2lkdGggPz9cbiAgICAgIChwYW5lbENsYXNzZXMgJiZcbiAgICAgICAgKChwYW5lbENsYXNzZXMuaW5jbHVkZXMoJ21pbi13aWR0aC1tZWRpdW0nKSAmJiAnMzAwcHgnKSB8fFxuICAgICAgICAgIChwYW5lbENsYXNzZXMuaW5jbHVkZXMoJ21pbi13aWR0aC1sYXJnZScpICYmICc0MDBweCcpIHx8XG4gICAgICAgICAgKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLXhsYXJnZScpICYmICc0NTBweCcpIHx8XG4gICAgICAgICAgKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLTgwdncnKSAmJiAnODB2dycpIHx8XG4gICAgICAgICAgKChwYW5lbENsYXNzZXMuaW5jbHVkZXMoJ2Z1bGwtd2lkdGgnKSB8fCBwYW5lbENsYXNzZXMuaW5jbHVkZXMoJ2Z1bGwtc2l6ZScpKSAmJiAnMTAwdncnKSkpO1xuICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA9IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA/PyAwO1xuICAgIHRoaXMuc2hvd0FsbE9uRm9jdXMgPSB0aGlzLnNob3dBbGxPbkZvY3VzID8/IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA8PSAwO1xuICAgIHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA9IHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA/PyB0cnVlO1xuICAgIHRoaXMuZGVib3VuY2VUaW1lID0gdGhpcy5kZWJvdW5jZVRpbWUgPz8gKHRoaXMubW9iaWxlID8gNjUwIDogMjUwKTtcbiAgICB0aGlzLmhpZ2hsaWdodEFjY2VudCA9IHRoaXMuaGlnaGxpZ2h0QWNjZW50ID8/IGZhbHNlO1xuICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlUG9zaXRpb24gPSB0aGlzLm1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uID8/ICh0aGlzLm1vYmlsZSA/ICdhYm92ZScgOiAnYXV0bycpOyAvLyBPbiBtb2JpbGUsIHNldCBwb3NpdGlvbiB0byBhYm92ZSAoYmVjYXVzZSBvZiBib3R0b20ga2V5Ym9hcmQpXG5cbiAgICAvLyBObyBzdWdnZXN0Rm46IGZpbHRlciBvbiB0aGUgZ2l2ZW4gaXRlbXNcbiAgICBpZiAoIXRoaXMuc3VnZ2VzdEZuKSB7XG4gICAgICBjb25zdCBzdWdnZXN0RnJvbUFycmF5Rm46IFN1Z2dlc3RGbjxhbnksIGFueT4gPSBhc3luYyAodmFsdWUsIGZpbHRlcikgPT5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQ2FsbGluZyBzdWdnZXN0RnJvbUFycmF5IHdpdGggdmFsdWU9JywgdmFsdWUpO1xuXG4gICAgICAgIHN1Z2dlc3RGcm9tQXJyYXkodGhpcy5fJGlucHV0SXRlbXMudmFsdWUsIHZhbHVlLCB7XG4gICAgICAgICAgc2VhcmNoQXR0cmlidXRlczogdGhpcy5kaXNwbGF5QXR0cmlidXRlcyxcbiAgICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gV2FpdCAob25jZSkgdGhhdCBpdGVtcyBhcmUgbG9hZGVkLCB0aGVuIGNhbGwgc3VnZ2VzdCBmcm9tIGFycmF5IGZuXG4gICAgICB0aGlzLnN1Z2dlc3RGbiA9IGFzeW5jICh2YWx1ZSwgZmlsdGVyKSA9PiB7XG4gICAgICAgIGlmIChpc05pbCh0aGlzLl8kaW5wdXRJdGVtcy52YWx1ZSkpIHtcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1ttYXQtY2hpcHNdIFdhaXRpbmcgaXRlbXMgdG8gYmUgc2V0Li4uJyk7XG5cbiAgICAgICAgICBhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fJGlucHV0SXRlbXMpO1xuXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbbWF0LWNoaXBzXSBSZWNlaXZlZCBpdGVtczonLCB0aGlzLiRpbnB1dEl0ZW1zLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1Z2dlc3RGbiA9IHN1Z2dlc3RGcm9tQXJyYXlGbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpOyAvLyBMb29wXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNlbmQgdmFsdWUgdG8gc3VnZ2VzdCB3aGVuIDpcbiAgICAvLyAtIGlzIG5pbCBhbmQgJyonLCBhbmQgbm8gbWluIGxlbmd0aCB0aHJlc2hvbGRcbiAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIG5vdCBhIHN0cmluZyB0eXBlIChlLmcuIG9iamVjdClcbiAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIGlzIGEgc3RyaW5nLCBhbmQgaGFzIGVub3VnaCBjaGFyYWN0ZXJcbiAgICBjb25zdCB0aHJlc2hvbGRGaWx0ZXJGbiA9ICh2YWx1ZTogYW55KSA9PlxuICAgICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDAgfHxcbiAgICAgIChpc05vdE5pbCh2YWx1ZSkgJiYgKCEodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgfHwgKHZhbHVlICE9PSAnKicgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+PSB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpKSk7XG5cbiAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zQ2hhbmdlcyA9IG1lcmdlKFxuICAgICAgLy8gUmVsb2FkIGV2ZW50IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGUsIHRvIGZvcmNlIHJlbG9hZCBldmVuIGlmIHNhbWUgdmFsdWUpXG4gICAgICB0aGlzLl9yZWxvYWQkLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICBmaWx0ZXIodGhyZXNob2xkRmlsdGVyRm4pLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5zaG93TG9hZGluZ1NwaW5uZXIgJiYgdGhpcy5tYXJrQXNMb2FkaW5nKCkpXG4gICAgICApLFxuXG4gICAgICAvLyBTZWFyY2ggdGV4dCAobm8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBiZWNhdXNlIG9mIHRoZSBkZWJvdW5jZVRpbWUoKSBwaXBlKVxuICAgICAgdGhpcy5faW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICBmaWx0ZXIoKHZhbHVlKSA9PiB0aGlzLmVuYWJsZWQgJiYgaXNOb3ROaWxTdHJpbmcodmFsdWUpKSxcbiAgICAgICAgLy8gTWFyayBhcyBsb2FkaW5nICh0byBzaG93IGxvYWRpbmcgc3Bpbm5lcikgLSBhcyBzb29uIGFzIHBvc3NpYmxlLCBhbmQgYmVmb3JlIGRlYm91bmNlVGltZVxuICAgICAgICB0YXAoKF8pID0+IHRoaXMuc2hvd0xvYWRpbmdTcGlubmVyICYmIHRoaXMubWFya0FzTG9hZGluZygpKSxcbiAgICAgICAgLy8gRmlsdGVyIGlmIG5vdCBlbm91Z2ggY2hhcmFjdGVyXG4gICAgICAgIGZpbHRlcigodmFsdWUpID0+ICh2YWx1ZT8ubGVuZ3RoIHx8IDApID49IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCksXG4gICAgICAgIC8vIFdhaXQgYSBkZWJvdW5jZSB0aW1lXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSlcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy8sdGFwKCh2YWx1ZSkgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBTZWFyY2ggdGV4dCBjaGFuZ2VzOicsIHZhbHVlKSlcbiAgICAgICksXG5cbiAgICAgIC8vIE1lcmdlIHNvbWUgb2JzZXJ2YWJsZXMsIHdpdGggYSBjb21tb24gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBwaXBlXG4gICAgICBtZXJnZShcbiAgICAgICAgLy8gT24gZHJvcGRvd24gYnV0dG9uIGNsaWNrIChubyBkZWJvdW5jZVRpbWUpXG4gICAgICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChldmVudCkgPT4gIWV2ZW50IHx8ICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy8sdGFwKHZhbHVlID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgYW4gY29udHJvbCBvYmplY3QgdmFsdWU6ICcsIHZhbHVlKSlcbiAgICAgICAgKSxcbiAgICAgICAgLy8gRm9jdXMgb3IgY2xpY2sgPT4gTG9hZCBhbGwgKG5vIGRlYm91bmNlVGltZSlcbiAgICAgICAgbWVyZ2UodGhpcy5mb2N1c2VkLCB0aGlzLmNsaWNrZWQpLFxuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvLy5waXBlKHRhcCgoXykgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBmb2N1c2VkIG9yIGNsaWNrZWQgZXZlbnQnKSkpLFxuICAgICAgICAvLyBJbnB1dCBpdGVtcyBvciBmaWx0ZXIgY2hhbmdlc1xuICAgICAgICBtZXJnZSh0aGlzLl8kaW5wdXRJdGVtcywgdGhpcy5fJGZpbHRlcikucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMubG9hZGluZylcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vLHRhcCgoXykgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCAkaW5wdXRJdGVtcyBvciBmaWx0ZXIgZXZlbnQnKSlcbiAgICAgICAgKVxuICAgICAgKS5waXBlKFxuICAgICAgICBmaWx0ZXIoKF8pID0+IHRoaXMuZW5hYmxlZCksXG4gICAgICAgIG1hcCgoXykgPT4gKHRoaXMuc2hvd0FsbE9uRm9jdXMgJiYgaXNOaWxPckJsYW5rKHRoaXMuX2lucHV0Q29udHJvbC52YWx1ZSkgPyAnKicgOiB0aGlzLl9pbnB1dENvbnRyb2wudmFsdWUpKSxcbiAgICAgICAgLy8gRGlzdGluZ3Vpc2ggY2hhbmdlc1xuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgodjEsIHYyKSA9PlxuICAgICAgICAgIC8vIElmIGxvYWRpbmcgKG5vdCBsb2FkZWQgeWV0KSwgc2ltdWxhdGUgdGhhdCB2YWx1ZSBjaGFuZ2VkIHRvIGZvcmNlIGxvYWRcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPyBmYWxzZSA6IHYxID09PSB2MiB8fCB0aGlzLmVxdWFscyh2MSwgdjIpXG4gICAgICAgICksXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggY2hhcmFjdGVyc1xuICAgICAgICBmaWx0ZXIodGhyZXNob2xkRmlsdGVyRm4pXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vLHRhcCgodmFsdWUpID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgdXBkYXRlIGV2ZW50OiAnLCB2YWx1ZSkpXG4gICAgICApXG4gICAgKS5waXBlKFxuICAgICAgLy8gU3VnZ2VzdCB2YWx1ZXNcbiAgICAgIG1lcmdlTWFwKCh2YWx1ZSkgPT4gdGhpcy5zdWdnZXN0KHZhbHVlLCB0aGlzLmZpbHRlcikpLFxuXG4gICAgICAvLyBJZ25vcmUgdW5kZWZpbmVkIHJlc3VsdCAoZS5nLiB3aGVuIGEgbmV3ZXIgc3VnZ2VzdCBjYWxsIGlzIHJ1bm5pbmcpXG4gICAgICBmaWx0ZXIoaXNOb3ROaWwpLFxuXG4gICAgICAvLyBERUJVR1xuICAgICAgLy90YXAoaXRlbXMgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBmcm9tIHN1Z2dlc3Q6ICcsIGl0ZW1zKSksXG5cbiAgICAgIC8vIFN0b3JlIGltcGxpY2l0IHZhbHVlICh3aWxsIHVzZSBpdCBvbkJsdXIgaWYgbm90IG90aGVyIHZhbHVlIHNlbGVjdGVkKVxuICAgICAgdGFwKChpdGVtcykgPT4gdGhpcy51cGRhdGVJbXBsaWNpdFZhbHVlKGl0ZW1zKSlcbiAgICApO1xuXG4gICAgLy8gRmV0Y2ggbW9yZSBldmVudHNcbiAgICBjb25zdCBmZXRjaE1vcmVJdGVtc0NoYW5nZXMgPSB0aGlzLl9mZXRjaE1vcmUkLnBpcGUoXG4gICAgICB0YXAoKGV2ZW50KSA9PiBldmVudD8ucHJldmVudERlZmF1bHQoKSksIC8vIEF2b2lkIHRvIGNsb3NlIHRoZSBtYXQtc2VsZWN0XG4gICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5jYW5GZXRjaE1vcmUpLFxuICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5mZXRjaE1vcmUoKSksXG5cbiAgICAgIC8vIERFQlVHXG4gICAgICAvL3RhcChtb3JlSXRlbXMgPT4gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgZnJvbSBmZXRjaCBNb3JlOiAnLCBtb3JlSXRlbXMpKSxcblxuICAgICAgLy8gQ29uY2F0IHRvIGV4aXN0aW5nIGl0ZW1zXG4gICAgICBtYXAoKG1vcmVJdGVtcykgPT4gKHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLnZhbHVlIHx8IFtdKS5jb25jYXQobW9yZUl0ZW1zKSlcbiAgICApO1xuXG4gICAgLy8gVXBkYXRlIGZpbHRlcmVkIGl0ZW1zXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLl8kaW5wdXRJdGVtcyxcblxuICAgICAgICAvLyBVcGRhdGUgaXRlbXMgZXZlbnRzXG4gICAgICAgIGZpbHRlcmVkSXRlbXNDaGFuZ2VzLFxuXG4gICAgICAgIC8vIEZldGNoIG1vcmUgZXZlbnRzXG4gICAgICAgIGZldGNoTW9yZUl0ZW1zQ2hhbmdlc1xuICAgICAgKVxuICAgICAgICAvLyBFbWl0IGl0ZW1zXG4gICAgICAgIC5zdWJzY3JpYmUoKGl0ZW1zKSA9PiB0aGlzLl8kZmlsdGVyZWRJdGVtcy5uZXh0KGl0ZW1zKSlcbiAgICApO1xuXG4gICAgLy8gQXBwbHlpbmcgaW1wbGljaXQgdmFsdWUsIG9uIGJsdXJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5ibHVycmVkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgxNTApLFxuICAgICAgICAgIC8vIFNraXAgaWYgbXVsdGlwbGUgKG5vIGltcGxpY2l0IHZhbHVlKSBvciBkaXNhYmxlXG4gICAgICAgICAgZmlsdGVyKChfKSA9PiB0aGlzLmVuYWJsZWQpLFxuXG4gICAgICAgICAgbWFwKChfKSA9PiB0aGlzLl9pbnB1dENvbnRyb2wudmFsdWUpXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvLyx0YXAodmFsdWUgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBibHVycmVkIGV2ZW50OiAnLCB2YWx1ZSkpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgLy8gV2hlbiBsZWF2ZSBjb21wb25lbnQgd2l0aG91dCBvYmplY3QsIHVzZSBpbXBsaWNpdCB2YWx1ZSBpZiA6XG4gICAgICAgICAgLy8gLSBhbiBleHBsaWNpdCB2YWx1ZVxuICAgICAgICAgIC8vIC0gZmllbGQgaXMgbm90IGVtcHR5ICh1c2VyIGZpbGwgc29tZXRoaW5nKVxuICAgICAgICAgIC8vIC0gT1IgZmllbGQgZW1wdHkgYnV0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSAmJlxuICAgICAgICAgICAgKCh0aGlzLnJlcXVpcmVkICYmIGlzRW1wdHlBcnJheSh0aGlzLmZvcm1Db250cm9sLnZhbHVlKSkgfHwgKGlzTm90TmlsT3JCbGFuayh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLl9pbXBsaWNpdFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzZXQgc2VhcmNoIHRleHRcbiAgICAgICAgICAgIHRoaXMubWF0SW5wdXRUZXh0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX2lucHV0Q29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gbnVsbDsgLy8gcmVzZXQgdGhlIGltcGxpY2l0IHZhbHVlXG4gICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7IC8vIENsb25lIHBhbmVsXG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBmb3JtIGNvbnRyb2wgc3RhdHVzIGNoYW5nZVxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCBzdGF0ZVxuICAgICAgICAuc3Vic2NyaWJlKChzdGF0dXMpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGb3JtIGNvbnRyb2wgc3RhdHVzIGNoYW5nZWQ6ICcsIHN0YXR1cyk7XG4gICAgICAgICAgdGhpcy5jaGVja0lmVG91Y2hlZCgpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5rZXlkb3duRXNjYXBlLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgLy8gQXZvaWQgZm9ybSBvciBwYWdlIHRvIG1hbmFnZSBlc2NhcGUgZXZlbnRcbiAgICAgICAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIENsb3NpbmcgdGhlIHBhbmVsIChrZXlkb3duLmVzY2FwZSlcIik7XG5cbiAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5fJGlucHV0SXRlbXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl8kaW5wdXRJdGVtcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9yZWxvYWQkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fJGZpbHRlci5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5kcm9wQnV0dG9uQ2xpY2suY29tcGxldGUoKTtcbiAgICB0aGlzLmNsaWNrZWQuY29tcGxldGUoKTtcbiAgICB0aGlzLmJsdXJyZWQuY29tcGxldGUoKTtcbiAgICB0aGlzLmZvY3VzZWQuY29tcGxldGUoKTtcbiAgICB0aGlzLmtleWRvd25Fc2NhcGUuY29tcGxldGUoKTtcbiAgICB0aGlzLmtleXVwRW50ZXIuY29tcGxldGUoKTtcbiAgICB0aGlzLl9mZXRjaE1vcmUkLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wgPSBudWxsO1xuICAgIHRoaXMuZGlzcGxheVdpdGggPSBudWxsO1xuICAgIHRoaXMuZXF1YWxzID0gbnVsbDtcbiAgICB0aGlzLnN1Z2dlc3RGbiA9IG51bGw7XG4gICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMgPSBudWxsO1xuICAgIHRoaXMuY29uZmlnID0gbnVsbDtcbiAgICB0aGlzLnBhbmVsQ2xhc3MgPSBudWxsO1xuXG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSBudWxsO1xuXG4gICAgLy8gRGVzdHJveSB0aGUgJ2F1dG9jb21wbGV0ZScgaW5zdGFuY2UsIHRvIGF2b2lkIG1lbW9yeSBsZWFrXG4gICAgdGhpcy5hdXRvY29tcGxldGU/Lm5nT25EZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGl0ZW0gdG8gY2hpcHNcbiAgICpcbiAgICogQHBhcmFtIGl0ZW1cbiAgICovXG4gIGFkZChpdGVtOiBhbnkpIHtcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH1zZWxlY3RgLCBpdGVtKTtcbiAgICB0aGlzLndyaXRlVmFsdWUoWy4uLnRoaXMudmFsdWUsIGl0ZW1dKTtcbiAgICB0aGlzLm1hdElucHV0VGV4dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgdGhpcy5faW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgaXRlbSBmcm9tIGNoaXBzXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtXG4gICAqL1xuICByZW1vdmUoaXRlbTogYW55KSB7XG4gICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGNvbnN0IGluZGV4ID0gdmFsdWUgPyB2YWx1ZS5pbmRleE9mKGl0ZW0pIDogLTE7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZS5zbGljZSgpO1xuICAgICAgbmV3VmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdG8gcmVsb2FkIGNvbnRlbnQuIFVzZWZ1bCB3aGVuIGZpbHRlciBoYXMgYmVlbiBjaGFuZ2VkIGJ1dCBub3QgZGV0ZWN0ZWRcbiAgICovXG4gIHJlbG9hZEl0ZW1zKHZhbHVlPzogYW55KSB7XG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBBc2tpbmcgdG8gcmVsb2FkSXRlbXMoKScsIHZhbHVlKTtcbiAgICAvLyBGb3JjZSBhIHJlZnJlc2hcbiAgICB0aGlzLl9yZWxvYWQkLm5leHQodmFsdWUgfHwgKHRoaXMuc2hvd0FsbE9uRm9jdXMgJiYgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDAgPyAnKicgOiB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnlbXSk6IHZvaWQge1xuICAgIC8vIERFQlVHXG4gICAgLy8gaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFdyaXRpbmcgdmFsdWU6ICcsIHZhbHVlKTtcblxuICAgIGlmICh2YWx1ZSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gW3ZhbHVlXTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgV3JpdGluZyB2YWx1ZTogJywgdmFsdWUpO1xuXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnBhdGNoVmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaXNEaXNhYmxlZCAmJiB0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIGZvY3VzSW5wdXQodGhpcy5tYXRJbnB1dFRleHQpO1xuICB9XG5cbiAgZmlsdGVySW5wdXRUZXh0Rm9jdXNFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gSWdub3JlIGV2ZW50IGZyb20gbWF0LW9wdGlvblxuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZXZlbnQucmVsYXRlZFRhcmdldC50YWdOYW1lID09PSAnTUFULU9QVElPTicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG5cbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBDYW5jZWxsaW5nIGZvY3VzIGV2ZW50Jyk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFNlbGVjdCBpbnB1dCBjb250ZW50Jyk7XG4gICAgY29uc3QgaGFzQ29udGVudCA9IHNlbGVjdElucHV0Q29udGVudEZyb21FdmVudChldmVudCk7XG5cbiAgICBpZiAoaGFzQ29udGVudCkge1xuICAgICAgLy8gTW92ZSBjYXJldCB0byB0aGUgYmVnaW5uaW5nIChmaXggaXNzdWUgSU1BR0lORS00NjkpXG4gICAgICBzZWxlY3RJbnB1dFJhbmdlKGV2ZW50LnRhcmdldCBhcyBhbnksIDAsIDApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zaG93UGFuZWxPbkZvY3VzICYmIHRoaXMuc2hvd0FsbE9uRm9jdXMpIHtcbiAgICAgIC8vIElmIGNvbWJvIGlzIGVtcHR5LCBvciBpZiBoYXMgY29udGVudCBidXQgc2hvdWxkIGZvcmNlIHRvIHNob3cgcGFuZWwgb24gZm9jdXNcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBFbWl0IGZvY3VzIGV2ZW50Jyk7XG5cbiAgICAgIHRoaXMuZm9jdXNlZC5lbWl0KGV2ZW50KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVySW5wdXRUZXh0Qmx1ckV2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG5cbiAgICAvLyBFbWl0IGJsdXIgZXZlbnRcbiAgICB0aGlzLmJsdXJyZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBmaWx0ZXJDaGlwc0ZvY3VzRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEZvY3VzIGluIGNoaXBzIGxpc3QnLCBldmVudCk7XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgaW4gYnV0dG9uXG5cbiAgICB0aGlzLm1hdElucHV0VGV4dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBjbGVhclZhbHVlKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIHRoaXMud3JpdGVWYWx1ZShudWxsKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcbiAgfVxuXG4gIF9pbml0QXV0b2NvbXBsZXRlSW5maW5pdGVTY3JvbGwodGhyZXNob2xkPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmF1dG9jb21wbGV0ZSkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgSW5pdCBhdXRvY29tcGxldGUgc2Nyb2xsIGxpc3RlbmVyJyk7XG5cbiAgICBpZiAodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5yZW1vdmUodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuZWQkOiBPYnNlcnZhYmxlPGFueT4gPSB0aGlzLmF1dG9jb21wbGV0ZS5faXNPcGVuID8gdGltZXIoMCkgOiB0aGlzLmF1dG9jb21wbGV0ZS5vcGVuZWQucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCQucGlwZShcbiAgICAgIG1hcCgoXykgPT4gdGhpcy5nZXRBdXRvY29tcGxldGVQYW5lbCgpKSxcbiAgICAgIGZpbHRlcihpc05vdE5pbCksXG4gICAgICBzd2l0Y2hNYXAoKHBhbmVsKSA9PiBmcm9tU2Nyb2xsRW5kRXZlbnQocGFuZWwsIHRocmVzaG9sZCkpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuYXV0b2NvbXBsZXRlLmNsb3NlZClcbiAgICApO1xuXG4gICAgLy8gVHJpZ2dlciBmZXRjaCBtb3JlLCBlbmQgZW5kIHNjcm9sbCByZWFjaGVkXG4gICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uID0gc2Nyb2xsRW5kJC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZmV0Y2hNb3JlJC5lbWl0KCkpO1xuXG4gICAgLy8gUmVnaXN0ZXIgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdXRvY29tcGxldGU/LmlzT3BlbiB8fCBmYWxzZTtcbiAgfVxuXG4gIGNsb3NlUGFuZWwoKSB7XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcj8uY2xvc2VQYW5lbCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVTaG93UGFuZWwoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyb3BCdXR0b25DbGljay5lbWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIG1ldGhvZCAtLSAqL1xuXG4gIHByaXZhdGUgYXN5bmMgc3VnZ2VzdCh2YWx1ZTogYW55LCBmaWx0ZXI6IGFueSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10gfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBDb21wdXRlIGEgbmV3IGV4ZWN1dGlvbiBpZFxuICAgIGNvbnN0IGlkID0gKyt0aGlzLl9zdWdnZXN0RXhlY3V0aW9uSWQ7XG5cbiAgICAvLyBUcmltIHN0cmluZyB2YWx1ZSBiZWZvcmUgc2VhcmNoaW5nXG4gICAgaWYgKHRoaXMudHJpbVNlYXJjaFRleHQgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBzdWdnZXN0aW9uIGZ1bmN0aW9uXG4gICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpO1xuXG4gICAgLy8gSWdub3JlIHRoZSBjdXJyZW50IHJlc3VsdCwgaWYgYSBuZXdlciBleGVjdXRpb24gaGFzIGJlZW4gbGF1bmNoZWRcbiAgICBpZiAoaWQgIT09IHRoaXMuX3N1Z2dlc3RFeGVjdXRpb25JZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgRmlsdGVyZWQgaXRlbXMgYnkgc3VnZ2VzdEZuOicsIHZhbHVlLCByZXMpO1xuXG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IDA7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAwO1xuICAgICAgcmVzID0gW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgIHJlcyA9IHJlcyBhcyBhbnlbXTtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IHJlcz8ubGVuZ3RoIHx8IDA7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGRhdGEsIHRvdGFsLCBmZXRjaE1vcmUgfSA9IHJlcyBhcyBMb2FkUmVzdWx0PGFueT47XG4gICAgICB0aGlzLl9pdGVtQ291bnQgPSB0b051bWJlcih0b3RhbCwgKGRhdGEgJiYgZGF0YS5sZW5ndGgpIHx8IDApO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IGZldGNoTW9yZTtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gKGZldGNoTW9yZSAmJiB0aGlzLl9pdGVtQ291bnQgLSBkYXRhLmxlbmd0aCkgfHwgMDtcbiAgICAgIHJlcyA9IGRhdGE7XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBleGlzdGluZyBpdGVtc1xuICAgIGNvbnN0IGV4aXN0aW5nSXRlbXMgPSB0aGlzLnZhbHVlO1xuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IChyZXMgfHwgW10pLmZpbHRlcigoaXRlbTEpID0+ICFleGlzdGluZ0l0ZW1zPy5zb21lKChpdGVtMikgPT4gdGhpcy5lcXVhbHMoaXRlbTEsIGl0ZW0yKSkpO1xuICAgIGNvbnN0IHJlbW92ZWRJdGVtQ291bnQgPSAocmVzPy5sZW5ndGggfHwgMCkgLSBmaWx0ZXJlZERhdGEubGVuZ3RoO1xuXG4gICAgLy8gRGVjcmVhc2UgdGhlIGl0ZW0gY291bnQsIHdpdGggZGVsdGFcbiAgICB0aGlzLl9pdGVtQ291bnQgLT0gcmVtb3ZlZEl0ZW1Db3VudDtcblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgRmlsdGVyZWQgaXRlbXMgYnkgc3VnZ2VzdEZuOicsIHZhbHVlLCBmaWx0ZXJlZERhdGEpO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkRGF0YSBhcyBhbnlbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hNb3JlKCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoIXRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2spIHJldHVybiBbXTtcblxuICAgIC8vIFNhdmUgdGhlbiByZW1vdmUgZmV0Y2ggZnVuY3Rpb24gKHRvIGF2b2lkIG11bHRpLWNhbGwpXG4gICAgY29uc3QgZmV0Y2hNb3JlRm4gPSB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrO1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB7IGRhdGEsIHRvdGFsLCBmZXRjaE1vcmUgfSA9IGF3YWl0IGZldGNoTW9yZUZuKCk7XG4gICAgdGhpcy5faXRlbUNvdW50ID0gKHRvdGFsIHx8IHRoaXMuX2l0ZW1Db3VudCkgLSAodGhpcy52YWx1ZT8ubGVuZ3RoIHx8IDApO1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSBmZXRjaE1vcmU7XG4gICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSBNYXRoLm1heCgwLCB0aGlzLl9tb3JlSXRlbXNDb3VudCAtIGRhdGEubGVuZ3RoKTsgLy8gQm9ybmUgbWluID0gMFxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbXBsaWNpdFZhbHVlKGl0ZW1zOiBhbnlbXSkge1xuICAgIC8vIFN0b3JlIGltcGxpY2l0IHZhbHVlICh3aWxsIHVzZSBpdCBvbkJsdXIgaWYgbm90IG90aGVyIHZhbHVlIHNlbGVjdGVkKVxuICAgIGlmIChpdGVtcz8ubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBhcHBseUltcGxpY2l0VmFsdWUgPSB0eXBlb2YgdGhpcy5hcHBseUltcGxpY2l0VmFsdWUgPT09ICdmdW5jdGlvbicgPyB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZShpdGVtc1swXSkgOiB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZTtcbiAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSBhcHBseUltcGxpY2l0VmFsdWUgPyBpdGVtc1swXSA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZUb3VjaGVkKCkge1xuICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQgfHwgdGhpcy5faW5wdXRDb250cm9sLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXV0b2NvbXBsZXRlUGFuZWwoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGVsZSA9IHRoaXMuYXV0b2NvbXBsZXRlPy5vcHRpb25zLmxhc3Q/Ll9nZXRIb3N0RWxlbWVudCgpLnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFlbGUpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICBjb25zb2xlLndhcm4odGhpcy5sb2dQcmVmaXggKyAnIFVuYWJsZSB0byBmaW5kIHRoZSBhdXRvY29tcGxldGUgZGl2Li4uJyk7XG4gICAgfVxuICAgIHJldHVybiBlbGU7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNMb2FkaW5nKCkge1xuICAgIGlmICh0aGlzLl8kZmlsdGVyZWRJdGVtcy52YWx1ZSkge1xuICAgICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMubmV4dCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxufVxuIiwiPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgPGlvbi1yb3c+XG4gICAgPGlvbi1jb2wgW3NpemVdPVwiY29sU2l6ZXM/LlswXVwiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cIidkeW5hbWljJ1wiXG4gICAgICAgIFtoaWRlUmVxdWlyZWRNYXJrZXJdPVwiaGlkZVJlcXVpcmVkTWFya2VyXCJcbiAgICAgICAgW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXT1cImZvcm1Db250cm9sLmRpc2FibGVkXCJcbiAgICAgICAgW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWludmFsaWRdPVwiZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBmb3JtQ29udHJvbC5pbnZhbGlkXCJcbiAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1jaGlwc1wiXG4gICAgICA+XG4gICAgICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIH1cblxuICAgICAgICA8bWF0LWNoaXAtZ3JpZFxuICAgICAgICAgICNjaGlwTGlzdFxuICAgICAgICAgIChmb2N1cyk9XCJmaWx0ZXJDaGlwc0ZvY3VzRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFyZWFkb25seSAmJiBkaXNhYmxlZFwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICBbZXJyb3JTdGF0ZU1hdGNoZXJdPVwiX2Vycm9yU3RhdGVNYXRjaGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoc2hvd0NoaXBzKSB7XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIHZhbHVlOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgIDxtYXQtY2hpcC1yb3dcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1uby1tYXJnaW5cIlxuICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwiIWRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmUoaXRlbSlcIlxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJjaGlwQ29sb3JcIlxuICAgICAgICAgICAgICAgIFtoaWdobGlnaHRlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0gfCB0b1N0cmluZzogZGlzcGxheVdpdGggfX1cbiAgICAgICAgICAgICAgICBAaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L21hdC1jaGlwLXJvdz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjbWF0SW5wdXRUZXh0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlUG9zaXRpb25dPVwibWF0QXV0b2NvbXBsZXRlUG9zaXRpb25cIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIl9pbnB1dENvbnRyb2xcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZsb2F0TGFiZWwgPT09ICduZXZlcicgPyBwbGFjZWhvbGRlciA6IG51bGxcIlxuICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cIl90YWJpbmRleFwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGZvY3VzKT1cImZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoYmx1cik9XCJmaWx0ZXJJbnB1dFRleHRCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwia2V5ZG93bkVzY2FwZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImtleXVwRW50ZXIuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXl1cC5hcnJvd0Rvd24pPVwiIWF1dG9jb21wbGV0ZS5zaG93UGFuZWwgJiYgZHJvcEJ1dHRvbkNsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBMaXN0XCJcbiAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJzZXBhcmF0b3JLZXlzQ29kZXNcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWNoaXAtZ3JpZD5cblxuICAgICAgICA8IS0tIGF1dG9jb21wbGV0ZSAtLT5cbiAgICAgICAgPG1hdC1hdXRvY29tcGxldGVcbiAgICAgICAgICAjYXV0b2NvbXBsZXRlPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICBbYXV0b0FjdGl2ZUZpcnN0T3B0aW9uXT1cInRydWVcIlxuICAgICAgICAgIFtoaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yXT1cInRydWVcIlxuICAgICAgICAgIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5V2l0aFwiXG4gICAgICAgICAgW2NsYXNzXT1cInBhbmVsQ2xhc3NcIlxuICAgICAgICAgIFtwYW5lbFdpZHRoXT1cInBhbmVsV2lkdGhcIlxuICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cImRpc2FibGVSaXBwbGVcIlxuICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJhZGQoJGV2ZW50Lm9wdGlvbi52YWx1ZSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBIZWFkZXJzIC0tPlxuICAgICAgICAgIDxpb24tcm93IGNsYXNzPVwibWF0LWF1dG9jb21wbGV0ZS1oZWFkZXIgY29sdW1uIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICBAZm9yIChhdHRyIG9mIGRpc3BsYXlBdHRyaWJ1dGVzOyB0cmFjayBhdHRyOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8aW9uLWNvbCBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbaV1cIj5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtpbm5lckhUTUxdPVwiZGlzcGxheUNvbHVtbk5hbWVzW2ldIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2lvbi1yb3c+XG5cbiAgICAgICAgICBAaWYgKF8kZmlsdGVyZWRJdGVtcyB8IHB1c2g6ICd1c2VyQmxvY2tpbmcnOyBhcyBpdGVtcykge1xuICAgICAgICAgICAgPCEtLSBObyBpdGVtIG9wdGlvbiAtLT5cbiAgICAgICAgICAgIEBpZiAoaXRlbXMgfCBpc0VtcHR5QXJyYXkpIHtcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZyB0ZXh0LWl0YWxpY1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aT57eyBub1Jlc3VsdE1lc3NhZ2UgfCB0cmFuc2xhdGUgfX08L2k+XG4gICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBPcHRpb25zIC0tPlxuICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxpb24tcm93IFtjbGFzc0xpc3RdPVwiaXRlbT8uY2xhc3NMaXN0IHx8ICcnXCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChwYXRoIG9mIGRpc3BsYXlBdHRyaWJ1dGVzOyB0cmFjayBwYXRoOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbaV1cIiBbdGl0bGVdPVwidGV4dC5pbm5lclRleHRcIiBjbGFzcz1cImlvbi1hbGlnbi1zZWxmLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICN0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcm9wZXJ0eUdldDogcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaWdobGlnaHQ6IHsgc2VhcmNoOiBtYXRJbnB1dFRleHQudmFsdWUsIHdpdGhBY2NlbnQ6IGhpZ2hsaWdodEFjY2VudCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gTW9yZSBpdGVtIC0tPlxuICAgICAgICAgICAgQGlmIChfbW9yZUl0ZW1zQ291bnQpIHtcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKG5nSW5pdCk9XCJfaW5pdEF1dG9jb21wbGV0ZUluZmluaXRlU2Nyb2xsKClcIiBjbGFzcz1cImlvbi1wYWRkaW5nXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIGlmICgobWF0SW5wdXRUZXh0LnZhbHVlIHwgc3RyTGVuZ3RoKSA8IHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIDwhLS0gTmVlZCBtb3JlIGNoYXJhY3RlcnMgLS0+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAge3sgJ0lORk8uUExFQVNFX1RZUEVfTU9SRV9DSEFSQUNURVJTJyB8IHRyYW5zbGF0ZTogeyBtaW5MZW5ndGg6IHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgfSB9fVxuICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBzcGlubmVyIC0tPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZ1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIGZvb3RlciAtLT5cbiAgICAgICAgICBAaWYgKGl0ZW1Db3VudDsgYXMgY291bnQpIHtcbiAgICAgICAgICAgIDxpb24tcm93IGNsYXNzPVwibWF0LWF1dG9jb21wbGV0ZS1mb290ZXIgaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiaW9uLWZsb2F0LWVuZCBpb24tcGFkZGluZy1lbmRcIj5cbiAgICAgICAgICAgICAgICAgIDxpPnt7ICdDT01NT04uUkVTVUxUX0NPVU5UJyB8IHRyYW5zbGF0ZTogeyBjb3VudDogY291bnQgfSB9fTwvaT5cbiAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgPGRpdiBtYXRTdWZmaXggY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1zdWZmaXgtYm90dG9tXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gSGludHMgLS0+XG4gICAgICAgIEBpZiAoIWZvcm1Db250cm9sPy5pbnZhbGlkKSB7XG4gICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEhpbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDwhLS0gRG8gdGhlIHNhbWUgYXMgTWF0Rm9ybUZpZWxkIHNpbmNlIGFuZ3VsYXIgMTUgKHNlZSBjb21wb25lbnQgc291cmNlKS0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlclwiXG4gICAgICAgIFtjbGFzcy5tYXQtbWRjLWZvcm0tZmllbGQtYm90dG9tLWFsaWduXT1cInN1YnNjcmlwdFNpemluZyA9PT0gJ2ZpeGVkJ1wiXG4gICAgICAgIFtjbGFzcy5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LWR5bmFtaWMtc2l6ZV09XCJzdWJzY3JpcHRTaXppbmcgPT09ICdkeW5hbWljJ1wiXG4gICAgICA+XG4gICAgICAgIEBpZiAoZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBmb3JtQ29udHJvbC5lcnJvcnM7IGFzIGVycm9ycykge1xuICAgICAgICAgIDwhLS0gZXJyb3JzIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtZXJyb3Itd3JhcHBlclwiPlxuICAgICAgICAgICAgQGlmIChlcnJvcnMgfCBtYXBLZXlzIHwgYXJyYXlGaXJzdDsgYXMgZXJyb3JLZXkpIHtcbiAgICAgICAgICAgICAgQHN3aXRjaCAoZXJyb3JLZXkpIHtcbiAgICAgICAgICAgICAgICBAY2FzZSAoJ3JlcXVpcmVkJykge1xuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdlbnRpdHknKSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9JTlZBTElEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRFcnJvclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvaW9uLWNvbD5cbiAgICA8aW9uLWNvbCBbc2l6ZV09XCJjb2xTaXplcz8uWzFdXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdEFmdGVyXVwiPjwvbmctY29udGVudD5cbiAgICA8L2lvbi1jb2w+XG4gIDwvaW9uLXJvdz5cbjwvaW9uLWdyaWQ+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0UHJlZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRTdWZmaXhUZW1wbGF0ZT5cbiAgPGJ1dHRvblxuICAgIG1hdFN1ZmZpeFxuICAgIG1hdC1pY29uLWJ1dHRvblxuICAgIHRhYmluZGV4PVwiLTFcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJ0b2dnbGVTaG93UGFuZWwoJGV2ZW50KVwiXG4gICAgW2NsYXNzLmhpZGRlbl09XCJkaXNhYmxlZFwiXG4gICAgW3RpdGxlXT1cImRyb3BCdXR0b25UaXRsZSB8fCAnJyB8IHRyYW5zbGF0ZVwiXG4gID5cbiAgICA8bWF0LWljb24+e3sgbW9iaWxlID8gJ2Fycm93X2Ryb3BfZG93bicgOiAna2V5Ym9hcmRfYXJyb3dfZG93bicgfX08L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgQGlmIChjbGVhcmFibGUpIHtcbiAgICA8YnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgW2NsYXNzLmhpZGRlbl09XCJkaXNhYmxlZCB8fCAhZm9ybUNvbnRyb2wudmFsdWVcIlxuICAgICAgW3RpdGxlXT1cImNsZWFyQnV0dG9uVGl0bGUgfHwgJycgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIH1cblxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0RXJyb3JUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yLFttYXRFcnJvcl1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdEhpbnRUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludDpub3QoW2FsaWduPSdlbmQnXSksW21hdEhpbnRdXCI+PC9uZy1jb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC1zcGFjZXJcIj48L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludFthbGlnbj0nZW5kJ11cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
843
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuY2hpcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9jaGlwcy9tYXRlcmlhbC5jaGlwcy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2NoaXBzL21hdGVyaWFsLmNoaXBzLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsZUFBZSxFQUdmLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBNEMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0SCxPQUFPLEVBQUUsVUFBVSxFQUFnQiwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV2RyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLFlBQVksRUFDWixLQUFLLEVBQ0wsWUFBWSxFQUNaLFFBQVEsRUFDUixlQUFlLEVBQ2YsY0FBYyxFQUNkLFNBQVMsRUFDVCxRQUFRLEdBQ1QsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FB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QU87c0JBQXZCLE1BQU07dUJBQUMsT0FBTztnQkFFQyxPQUFPO3NCQUF0QixNQUFNO3VCQUFDLE1BQU07Z0JBRUcsT0FBTztzQkFBdkIsTUFBTTt1QkFBQyxPQUFPO2dCQUNMLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ21CLGFBQWE7c0JBQXRDLE1BQU07dUJBQUMsZ0JBQWdCO2dCQUNELFVBQVU7c0JBQWhDLE1BQU07dUJBQUMsYUFBYTtnQkFFTSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0csWUFBWTtzQkFBdkMsU0FBUzt1QkFBQyxlQUFlO2dCQUNTLG1CQUFtQjtzQkFBckQsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBcUJwQixNQUFNO3NCQUFsQixLQUFLO2dCQVlPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBU08sS0FBSztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGlzT2JzZXJ2YWJsZSwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBtZXJnZU1hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGZvY3VzSW5wdXQsIElucHV0RWxlbWVudCwgc2VsZWN0SW5wdXRDb250ZW50RnJvbUV2ZW50LCBzZWxlY3RJbnB1dFJhbmdlIH0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7IEZldGNoTW9yZUZuLCBMb2FkUmVzdWx0LCBTdWdnZXN0Rm4gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge1xuICBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlLFxuICBpc0VtcHR5QXJyYXksXG4gIGlzTmlsLFxuICBpc05pbE9yQmxhbmssXG4gIGlzTm90TmlsLFxuICBpc05vdE5pbE9yQmxhbmssXG4gIGlzTm90TmlsU3RyaW5nLFxuICB0b0Jvb2xlYW4sXG4gIHRvTnVtYmVyLFxufSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgZmlyc3ROb3ROaWxQcm9taXNlIH0gZnJvbSAnLi4vLi4vb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgZnJvbVNjcm9sbEVuZEV2ZW50IH0gZnJvbSAnLi4vLi4vZXZlbnRzJztcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVyLCBUaGVtZVBhbGV0dGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IHN1Z2dlc3RGcm9tQXJyYXkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZyB9IGZyb20gJy4uL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZUZpZWxkVXRpbHMgfSBmcm9tICcuLi9hdXRvY29tcGxldGUvbWF0ZXJpYWwuYXV0b2NvbXBsZXRlLnV0aWxzJztcbmltcG9ydCB7IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUywgTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgTWF0Rm9ybUZpZWxkRGVmYXVsdE9wdGlvbnMsIFN1YnNjcmlwdFNpemluZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1zJztcbmltcG9ydCB7IERFRkFVTFRfSk9JTl9QUk9QRVJUSUVTX1NFUEFSQVRPUiwgU0hPV19UT09MVElQIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfQVBQRUFSQU5DRSwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HIH0gZnJvbSAnLi4vbWF0ZXJpYWwuY29uZmlnJztcbmltcG9ydCB7IEFwcEZsb2F0TGFiZWxUeXBlLCBEaXNwbGF5Rm4sIEVxdWFsc0ZuIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ21hdC1jaGlwcy1maWVsZCcsXG4gIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmNoaXBzLnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmNoaXBzLmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0Q2hpcHNGaWVsZCksXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdENoaXBzRmllbGQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXRFbGVtZW50LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG5cbiAgcHJpdmF0ZSBfb25GZXRjaE1vcmVDYWxsYmFjazogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxhbnk+PjtcbiAgcHJpdmF0ZSBfaW1wbGljaXRWYWx1ZTogYW55O1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2l0ZW1zU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX29wZW5lZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF8kZmlsdGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgX2l0ZW1Db3VudDogbnVtYmVyO1xuICBwcml2YXRlIF9zdWdnZXN0RXhlY3V0aW9uSWQ6IG51bWJlciA9IDA7IC8vIElkZW50aWZpZXIgb2YgdGhlIHN1Z2dlc3Qgam9iXG4gIHByaXZhdGUgX3JlbG9hZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHByaXZhdGUgX2FwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0U2l6aW5nOiBTdWJzY3JpcHRTaXppbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRTdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZztcblxuICBwcm90ZWN0ZWQgX3RhYmluZGV4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfJGlucHV0SXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgXyRmaWx0ZXJlZEl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIF9pbnB1dENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XG4gIHByb3RlY3RlZCBfbW9yZUl0ZW1zQ291bnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9mZXRjaE1vcmUkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgcHJvdGVjdGVkIF9lcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXI7XG5cbiAgQElucHV0KCkgZXF1YWxzOiBFcXVhbHNGbjtcbiAgQElucHV0KCkgbG9nUHJlZml4ID0gJ1ttYXQtY2hpcHNdICc7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KCkgZmxvYXRMYWJlbDogQXBwRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN1Z2dlc3RGbjogU3VnZ2VzdEZuPGFueSwgYW55PjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlcXVpcmVkOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNsZWFyYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBkZWJvdW5jZVRpbWU6IG51bWJlciA9IG51bGw7XG5cbiAgQElucHV0KCkgZGlzcGxheVNlcGFyYXRvcjogc3RyaW5nIHwgbnVsbDtcbiAgQElucHV0KCkgZGlzcGxheVdpdGg6IERpc3BsYXlGbiB8IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlBdHRyaWJ1dGVzOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgZGlzcGxheUNvbHVtblNpemVzOiAobnVtYmVyIHwgJ2F1dG8nIHwgdW5kZWZpbmVkKVtdO1xuICBASW5wdXQoKSBkaXNwbGF5Q29sdW1uTmFtZXM6IHN0cmluZ1tdO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaGlnaGxpZ2h0QWNjZW50OiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FsbE9uRm9jdXM6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93UGFuZWxPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIEBJbnB1dCgpIGkxOG5QcmVmaXggPSAnUkVGRVJFTlRJQUwuJztcbiAgQElucHV0KCkgbm9SZXN1bHRNZXNzYWdlID0gJ0NPTU1PTi5OT19SRVNVTFQnO1xuICBASW5wdXQoKSBwYW5lbENsYXNzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhbmVsV2lkdGg6IHN0cmluZztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpc2FibGVSaXBwbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbWF0QXV0b2NvbXBsZXRlUG9zaXRpb246ICdhdXRvJyB8ICdhYm92ZScgfCAnYmVsb3cnO1xuICBASW5wdXQoKSBpdGVtU2l6ZSA9ICc0OHB4JztcbiAgQElucHV0KCkgZmV0Y2hNb3JlVGhyZXNob2xkID0gJzE1JSc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQ6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93TG9hZGluZ1NwaW5uZXIgPSB0cnVlO1xuICBASW5wdXQoKSBjaGlwQ29sb3I6IFRoZW1lUGFsZXR0ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcGx5SW1wbGljaXRWYWx1ZTogYm9vbGVhbiB8ICgodmFsdWU6IGFueSkgPT4gYm9vbGVhbikgPSBmYWxzZTsgLy8gLyFcXCBmYWxzZSBieSBkZWZhdWx0IChub3QgbGlrZSBhdXRvY29tcGxldGUpXG4gIEBJbnB1dCgpIGRyb3BCdXR0b25UaXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBjbGVhckJ1dHRvblRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSB0cmltU2VhcmNoVGV4dDogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZGVSZXF1aXJlZE1hcmtlciA9IGZhbHNlO1xuICBASW5wdXQoKSBjb2xTaXplczogW251bWJlciB8ICdhdXRvJywgbnVtYmVyIHwgJ2F1dG8nXSA9IFt1bmRlZmluZWQsICdhdXRvJ107XG4gIEBJbnB1dCgpIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVJdO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0NoaXBzID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzZXQgYXBwZWFyYW5jZSh2YWx1ZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSkge1xuICAgIHRoaXMuX2FwcGVhcmFuY2UgPSB2YWx1ZTtcbiAgfVxuICBnZXQgYXBwZWFyYW5jZSgpOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwZWFyYW5jZSB8fCB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzdWJzY3JpcHRTaXppbmcodmFsdWU6IFN1YnNjcmlwdFNpemluZykge1xuICAgIHRoaXMuX3N1YnNjcmlwdFNpemluZyA9IHZhbHVlO1xuICB9XG4gIGdldCBzdWJzY3JpcHRTaXppbmcoKTogU3Vic2NyaXB0U2l6aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0U2l6aW5nIHx8IHRoaXMuX2RlZmF1bHRTdWJzY3JpcHRTaXppbmc7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHBhbmVsQ2xhc3MgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KHsgYWxpYXM6ICdjbGFzcycgfSkgc2V0IGNsYXNzTGlzdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wYW5lbENsYXNzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGNsYXNzTGlzdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhbmVsQ2xhc3M7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgnY2xpY2snKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgnYmx1cicpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCdmb2N1cycpIGZvY3VzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcm9wQnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50Pih0cnVlKTtcbiAgQE91dHB1dCgna2V5ZG93bi5lc2NhcGUnKSBrZXlkb3duRXNjYXBlID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgna2V5dXAuZW50ZXInKSBrZXl1cEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcblxuICBAVmlld0NoaWxkKCdtYXRJbnB1dFRleHQnKSBtYXRJbnB1dFRleHQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlKSBhdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSBhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xuXG4gIHNob3dUb29sdGlwID0gaW5qZWN0KFNIT1dfVE9PTFRJUCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIEBJbmplY3QoTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TKSBkZWZhdWx0T3B0aW9ucz86IE1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zXG4gICkge1xuICAgIHRoaXMuX2RlZmF1bHRTdWJzY3JpcHRTaXppbmcgPSBkZWZhdWx0T3B0aW9ucz8uc3Vic2NyaXB0U2l6aW5nIHx8IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfU1VCU0NSSVBUX1NJWklORztcbiAgICB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9IGRlZmF1bHRPcHRpb25zPy5hcHBlYXJhbmNlIHx8IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfQVBQRUFSQU5DRTtcbiAgfVxuXG4gIGdldCBpdGVtQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbUNvdW50O1xuICB9XG5cbiAgZ2V0IGNhbkZldGNoTW9yZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayAmJiB0aGlzLl9tb3JlSXRlbXNDb3VudCA+IDA7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZmlsdGVyKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuXyRmaWx0ZXIudmFsdWUpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBTZXR0aW5nIGZpbHRlcjpcIiwgdmFsdWUpO1xuICAgICAgdGhpcy5fJGZpbHRlci5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmlsdGVyKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuXyRmaWx0ZXIudmFsdWU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpdGVtcyh2YWx1ZTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSkge1xuICAgIC8vIFJlbW92ZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gb24gaXRlbXMgKGlmIGV4aXN0cylcbiAgICBpZiAodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgSXRlbXMgcmVjZWl2ZWQgdHdpY2UgIScpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbik7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmIChpc09ic2VydmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbiA9IHZhbHVlLnN1YnNjcmliZSgodikgPT4gdGhpcy5fJGlucHV0SXRlbXMubmV4dCh2KSk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl8kaW5wdXRJdGVtcy52YWx1ZSkge1xuICAgICAgICB0aGlzLl8kaW5wdXRJdGVtcy5uZXh0KHZhbHVlIGFzIGFueVtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaXRlbXMoKTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuXyRpbnB1dEl0ZW1zO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSB8fCBbXTtcbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkb25seSB8fCB0aGlzLmZvcm1Db250cm9sPy5kaXNhYmxlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoIXRoaXMucmVhZG9ubHkgJiYgdGhpcy5mb3JtQ29udHJvbD8uZW5hYmxlZCkgfHwgZmFsc2U7XG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOaWwodGhpcy5fJGZpbHRlcmVkSXRlbXMudmFsdWUpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9XG4gICAgICB0aGlzLmZvcm1Db250cm9sIHx8ICh0aGlzLmZvcm1Db250cm9sTmFtZSAmJiB0aGlzLmZvcm1Hcm91cERpciAmJiAodGhpcy5mb3JtR3JvdXBEaXIuZm9ybS5nZXQodGhpcy5mb3JtQ29udHJvbE5hbWUpIGFzIFVudHlwZWRGb3JtQ29udHJvbCkpO1xuICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlICdmb3JtQ29udHJvbCcgb3IgJ2Zvcm1Db250cm9sTmFtZScgaW4gPG1hdC1jaGlwcy1maWVsZD4uXCIpO1xuXG4gICAgLy8gQ29uZmlndXJhdGlvbiBmcm9tIGNvbmZpZyBvYmplY3RcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gdGhpcy5zdWdnZXN0Rm4gfHwgdGhpcy5jb25maWcuc3VnZ2VzdEZuO1xuICAgICAgaWYgKCF0aGlzLnN1Z2dlc3RGbiAmJiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5jb25maWcuaXRlbXM7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyIHx8IHRoaXMuY29uZmlnLmZpbHRlcjtcbiAgICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID8/IHRoaXMuY29uZmlnLmF0dHJpYnV0ZXM7XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9IHRoaXMuZGlzcGxheUNvbHVtblNpemVzID8/IHRoaXMuY29uZmlnLmNvbHVtblNpemVzO1xuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyA/PyB0aGlzLmNvbmZpZy5jb2x1bW5OYW1lcztcbiAgICAgIHRoaXMuZGlzcGxheVNlcGFyYXRvciA9IHRoaXMuZGlzcGxheVNlcGFyYXRvciA/PyB0aGlzLmNvbmZpZy5kaXNwbGF5V2l0aFNlcGFyYXRvcjtcbiAgICAgIHRoaXMuZGlzcGxheVdpdGggPSB0aGlzLmRpc3BsYXlXaXRoID8/IHRoaXMuY29uZmlnLmRpc3BsYXlXaXRoO1xuICAgICAgdGhpcy50cmltU2VhcmNoVGV4dCA9IHRoaXMudHJpbVNlYXJjaFRleHQgPz8gdGhpcy5jb25maWcudHJpbVNlYXJjaFRleHQ7XG4gICAgICB0aGlzLmVxdWFscyA9IHRoaXMuZXF1YWxzID8/IHRoaXMuY29uZmlnLmVxdWFscztcbiAgICAgIHRoaXMubW9iaWxlID0gdGhpcy5tb2JpbGUgPz8gdGhpcy5jb25maWcubW9iaWxlO1xuICAgICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID8/IHRoaXMuY29uZmlnLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQ7XG4gICAgICB0aGlzLnNob3dBbGxPbkZvY3VzID0gdGhpcy5zaG93QWxsT25Gb2N1cyA/PyB0aGlzLmNvbmZpZy5zaG93QWxsT25Gb2N1cztcbiAgICAgIHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA9IHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA/PyB0aGlzLmNvbmZpZy5zaG93UGFuZWxPbkZvY3VzO1xuICAgICAgdGhpcy5wYW5lbENsYXNzID0gdGhpcy5wYW5lbENsYXNzID8/IHRoaXMuY29uZmlnLnBhbmVsQ2xhc3MgPz8gdGhpcy5jb25maWcuY2xhc3M7XG4gICAgICB0aGlzLnBhbmVsV2lkdGggPSB0aGlzLnBhbmVsV2lkdGggPz8gdGhpcy5jb25maWcucGFuZWxXaWR0aDtcbiAgICAgIHRoaXMuZGVib3VuY2VUaW1lID0gdG9OdW1iZXIodGhpcy5kZWJvdW5jZVRpbWUsIHRoaXMuY29uZmlnLmRlYm91bmNlVGltZSk7XG4gICAgICB0aGlzLmhpZ2hsaWdodEFjY2VudCA9IHRvQm9vbGVhbih0aGlzLmhpZ2hsaWdodEFjY2VudCwgdG9Cb29sZWFuKHRoaXMuY29uZmlnLmhpZ2hsaWdodEFjY2VudCkpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdmFsdWVzXG4gICAgdGhpcy5yZXF1aXJlZCA9IHRoaXMucmVxdWlyZWQgPz8gdGhpcy5mb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLm1vYmlsZSA/PyBpc01vYmlsZSh3aW5kb3cpO1xuICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID8/IHRoaXMuZmlsdGVyPy5hdHRyaWJ1dGVzID8/IFsnbGFiZWwnLCAnbmFtZSddO1xuICAgIHRoaXMuZGlzcGxheVNlcGFyYXRvciA9IHRoaXMuZGlzcGxheVNlcGFyYXRvciA/PyBERUZBVUxUX0pPSU5fUFJPUEVSVElFU19TRVBBUkFUT1I7XG4gICAgdGhpcy5kaXNwbGF5V2l0aCA9IHRoaXMuZGlzcGxheVdpdGggPz8gTWF0QXV0b2NvbXBsZXRlRmllbGRVdGlscy5jcmVhdGVEaXNwbGF5Rm4odGhpcy5kaXNwbGF5QXR0cmlidXRlcywgZmFsc2UsIHRoaXMuZGlzcGxheVNlcGFyYXRvcik7XG4gICAgdGhpcy50cmltU2VhcmNoVGV4dCA9IHRoaXMudHJpbVNlYXJjaFRleHQgPz8gdHJ1ZTtcbiAgICB0aGlzLmVxdWFscyA9IHRoaXMuZXF1YWxzID8/IE1hdEF1dG9jb21wbGV0ZUZpZWxkVXRpbHMuZGVmYXVsdEVxdWFscztcbiAgICB0aGlzLmNvbFNpemVzID0gdGhpcy5jb2xTaXplcyA/PyBbdW5kZWZpbmVkLCAnYXV0byddO1xuXG4gICAgaWYgKHRoaXMucmVxdWlyZWQpIHRoaXMuZm9ybUNvbnRyb2wuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcblxuICAgIHRoaXMuZGlzcGxheUNvbHVtblNpemVzID1cbiAgICAgIHRoaXMuZGlzcGxheUNvbHVtblNpemVzID8/XG4gICAgICAvLyBpZiBvbmx5IGNvbHVtbjogYXV0byBzaXplXG4gICAgICAoKHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMubGVuZ3RoID09PSAxICYmIFt1bmRlZmluZWRdKSB8fFxuICAgICAgICAvLyBDb21wdXRlZCBjb2x1bW4gc2l6ZTpcbiAgICAgICAgLy8gLSBpZiBsYWJlbCB0aGVuIGNvbCBzaXplID0gMlxuICAgICAgICAvLyAtIGlmIHJhbmtPcmRlciB0aGVuIGNvbCBzaXplID0gMVxuICAgICAgICAvLyAtIGVzZSA9PiBhdXRvIHNpemVcbiAgICAgICAgdGhpcy5kaXNwbGF5QXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGF0dHIgJiYgKGF0dHIuZW5kc1dpdGgoJ2xhYmVsJykgPyAzIDogYXR0ci5lbmRzV2l0aCgncmFua09yZGVyJykgPyAyIDogdW5kZWZpbmVkKSkpO1xuICAgIHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzID0gdGhpcy5kaXNwbGF5QXR0cmlidXRlcy5tYXAoXG4gICAgICAoYXR0ciwgaW5kZXgpID0+ICh0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyAmJiB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lc1tpbmRleF0pIHx8IHRoaXMuaTE4blByZWZpeCArIGNoYW5nZUNhc2VUb1VuZGVyc2NvcmUoYXR0cikudG9VcHBlckNhc2UoKVxuICAgICk7XG4gICAgY29uc3QgcGFuZWxDbGFzc2VzID0gdGhpcy5wYW5lbENsYXNzPy5zcGxpdCgvXFxzLyk7XG4gICAgdGhpcy5wYW5lbFdpZHRoID1cbiAgICAgIHRoaXMucGFuZWxXaWR0aCA/P1xuICAgICAgKHBhbmVsQ2xhc3NlcyAmJlxuICAgICAgICAoKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLW1lZGl1bScpICYmICczMDBweCcpIHx8XG4gICAgICAgICAgKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLWxhcmdlJykgJiYgJzQwMHB4JykgfHxcbiAgICAgICAgICAocGFuZWxDbGFzc2VzLmluY2x1ZGVzKCdtaW4td2lkdGgteGxhcmdlJykgJiYgJzQ1MHB4JykgfHxcbiAgICAgICAgICAocGFuZWxDbGFzc2VzLmluY2x1ZGVzKCdtaW4td2lkdGgtODB2dycpICYmICc4MHZ3JykgfHxcbiAgICAgICAgICAoKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnZnVsbC13aWR0aCcpIHx8IHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnZnVsbC1zaXplJykpICYmICcxMDB2dycpKSk7XG4gICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID8/IDA7XG4gICAgdGhpcy5zaG93QWxsT25Gb2N1cyA9IHRoaXMuc2hvd0FsbE9uRm9jdXMgPz8gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDA7XG4gICAgdGhpcy5zaG93UGFuZWxPbkZvY3VzID0gdGhpcy5zaG93UGFuZWxPbkZvY3VzID8/IHRydWU7XG4gICAgdGhpcy5kZWJvdW5jZVRpbWUgPSB0aGlzLmRlYm91bmNlVGltZSA/PyAodGhpcy5tb2JpbGUgPyA2NTAgOiAyNTApO1xuICAgIHRoaXMuaGlnaGxpZ2h0QWNjZW50ID0gdGhpcy5oaWdobGlnaHRBY2NlbnQgPz8gZmFsc2U7XG4gICAgdGhpcy5tYXRBdXRvY29tcGxldGVQb3NpdGlvbiA9IHRoaXMubWF0QXV0b2NvbXBsZXRlUG9zaXRpb24gPz8gKHRoaXMubW9iaWxlID8gJ2Fib3ZlJyA6ICdhdXRvJyk7IC8vIE9uIG1vYmlsZSwgc2V0IHBvc2l0aW9uIHRvIGFib3ZlIChiZWNhdXNlIG9mIGJvdHRvbSBrZXlib2FyZClcblxuICAgIC8vIE5vIHN1Z2dlc3RGbjogZmlsdGVyIG9uIHRoZSBnaXZlbiBpdGVtc1xuICAgIGlmICghdGhpcy5zdWdnZXN0Rm4pIHtcbiAgICAgIGNvbnN0IHN1Z2dlc3RGcm9tQXJyYXlGbjogU3VnZ2VzdEZuPGFueSwgYW55PiA9IGFzeW5jICh2YWx1ZSwgZmlsdGVyKSA9PlxuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBDYWxsaW5nIHN1Z2dlc3RGcm9tQXJyYXkgd2l0aCB2YWx1ZT0nLCB2YWx1ZSk7XG5cbiAgICAgICAgc3VnZ2VzdEZyb21BcnJheSh0aGlzLl8kaW5wdXRJdGVtcy52YWx1ZSwgdmFsdWUsIHtcbiAgICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLFxuICAgICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgfSk7XG4gICAgICAvLyBXYWl0IChvbmNlKSB0aGF0IGl0ZW1zIGFyZSBsb2FkZWQsIHRoZW4gY2FsbCBzdWdnZXN0IGZyb20gYXJyYXkgZm5cbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gYXN5bmMgKHZhbHVlLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKGlzTmlsKHRoaXMuXyRpbnB1dEl0ZW1zLnZhbHVlKSkge1xuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW21hdC1jaGlwc10gV2FpdGluZyBpdGVtcyB0byBiZSBzZXQuLi4nKTtcblxuICAgICAgICAgIGF3YWl0IGZpcnN0Tm90TmlsUHJvbWlzZSh0aGlzLl8kaW5wdXRJdGVtcyk7XG5cbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1ttYXQtY2hpcHNdIFJlY2VpdmVkIGl0ZW1zOicsIHRoaXMuJGlucHV0SXRlbXMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VnZ2VzdEZuID0gc3VnZ2VzdEZyb21BcnJheUZuO1xuICAgICAgICByZXR1cm4gdGhpcy5zdWdnZXN0Rm4odmFsdWUsIGZpbHRlcik7IC8vIExvb3BcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gU2VuZCB2YWx1ZSB0byBzdWdnZXN0IHdoZW4gOlxuICAgIC8vIC0gaXMgbmlsIGFuZCAnKicsIGFuZCBubyBtaW4gbGVuZ3RoIHRocmVzaG9sZFxuICAgIC8vIC0gaXMgbm90IG5pbCBhbmQgbm90IGEgc3RyaW5nIHR5cGUgKGUuZy4gb2JqZWN0KVxuICAgIC8vIC0gaXMgbm90IG5pbCBhbmQgaXMgYSBzdHJpbmcsIGFuZCBoYXMgZW5vdWdoIGNoYXJhY3RlclxuICAgIGNvbnN0IHRocmVzaG9sZEZpbHRlckZuID0gKHZhbHVlOiBhbnkpID0+XG4gICAgICB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPD0gMCB8fFxuICAgICAgKGlzTm90TmlsKHZhbHVlKSAmJiAoISh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB8fCAodmFsdWUgIT09ICcqJyAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID49IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCkpKTtcblxuICAgIGNvbnN0IGZpbHRlcmVkSXRlbXNDaGFuZ2VzID0gbWVyZ2UoXG4gICAgICAvLyBSZWxvYWQgZXZlbnQgKG5vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgcGlwZSwgdG8gZm9yY2UgcmVsb2FkIGV2ZW4gaWYgc2FtZSB2YWx1ZSlcbiAgICAgIHRoaXMuX3JlbG9hZCQucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZW5hYmxlZCksXG4gICAgICAgIGZpbHRlcih0aHJlc2hvbGRGaWx0ZXJGbiksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLnNob3dMb2FkaW5nU3Bpbm5lciAmJiB0aGlzLm1hcmtBc0xvYWRpbmcoKSlcbiAgICAgICksXG5cbiAgICAgIC8vIFNlYXJjaCB0ZXh0IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIGJlY2F1c2Ugb2YgdGhlIGRlYm91bmNlVGltZSgpIHBpcGUpXG4gICAgICB0aGlzLl9pbnB1dENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIGZpbHRlcigodmFsdWUpID0+IHRoaXMuZW5hYmxlZCAmJiBpc05vdE5pbFN0cmluZyh2YWx1ZSkpLFxuICAgICAgICAvLyBNYXJrIGFzIGxvYWRpbmcgKHRvIHNob3cgbG9hZGluZyBzcGlubmVyKSAtIGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCBiZWZvcmUgZGVib3VuY2VUaW1lXG4gICAgICAgIHRhcCgoXykgPT4gdGhpcy5zaG93TG9hZGluZ1NwaW5uZXIgJiYgdGhpcy5tYXJrQXNMb2FkaW5nKCkpLFxuICAgICAgICAvLyBGaWx0ZXIgaWYgbm90IGVub3VnaCBjaGFyYWN0ZXJcbiAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4gKHZhbHVlPy5sZW5ndGggfHwgMCkgPj0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkKSxcbiAgICAgICAgLy8gV2FpdCBhIGRlYm91bmNlIHRpbWVcbiAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKVxuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvLyx0YXAoKHZhbHVlKSA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFNlYXJjaCB0ZXh0IGNoYW5nZXM6JywgdmFsdWUpKVxuICAgICAgKSxcblxuICAgICAgLy8gTWVyZ2Ugc29tZSBvYnNlcnZhYmxlcywgd2l0aCBhIGNvbW1vbiBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGVcbiAgICAgIG1lcmdlKFxuICAgICAgICAvLyBPbiBkcm9wZG93biBidXR0b24gY2xpY2sgKG5vIGRlYm91bmNlVGltZSlcbiAgICAgICAgdGhpcy5kcm9wQnV0dG9uQ2xpY2sucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQgfHwgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvLyx0YXAodmFsdWUgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBhbiBjb250cm9sIG9iamVjdCB2YWx1ZTogJywgdmFsdWUpKVxuICAgICAgICApLFxuICAgICAgICAvLyBGb2N1cyBvciBjbGljayA9PiBMb2FkIGFsbCAobm8gZGVib3VuY2VUaW1lKVxuICAgICAgICBtZXJnZSh0aGlzLmZvY3VzZWQsIHRoaXMuY2xpY2tlZCksXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vLnBpcGUodGFwKChfKSA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGZvY3VzZWQgb3IgY2xpY2tlZCBldmVudCcpKSksXG4gICAgICAgIC8vIElucHV0IGl0ZW1zIG9yIGZpbHRlciBjaGFuZ2VzXG4gICAgICAgIG1lcmdlKHRoaXMuXyRpbnB1dEl0ZW1zLCB0aGlzLl8kZmlsdGVyKS5waXBlKFxuICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5sb2FkaW5nKVxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy8sdGFwKChfKSA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkICRpbnB1dEl0ZW1zIG9yIGZpbHRlciBldmVudCcpKVxuICAgICAgICApXG4gICAgICApLnBpcGUoXG4gICAgICAgIGZpbHRlcigoXykgPT4gdGhpcy5lbmFibGVkKSxcbiAgICAgICAgbWFwKChfKSA9PiAodGhpcy5zaG93QWxsT25Gb2N1cyAmJiBpc05pbE9yQmxhbmsodGhpcy5faW5wdXRDb250cm9sLnZhbHVlKSA/ICcqJyA6IHRoaXMuX2lucHV0Q29udHJvbC52YWx1ZSkpLFxuICAgICAgICAvLyBEaXN0aW5ndWlzaCBjaGFuZ2VzXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh2MSwgdjIpID0+XG4gICAgICAgICAgLy8gSWYgbG9hZGluZyAobm90IGxvYWRlZCB5ZXQpLCBzaW11bGF0ZSB0aGF0IHZhbHVlIGNoYW5nZWQgdG8gZm9yY2UgbG9hZFxuICAgICAgICAgIHRoaXMubG9hZGluZyA/IGZhbHNlIDogdjEgPT09IHYyIHx8IHRoaXMuZXF1YWxzKHYxLCB2MilcbiAgICAgICAgKSxcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBjaGFyYWN0ZXJzXG4gICAgICAgIGZpbHRlcih0aHJlc2hvbGRGaWx0ZXJGbilcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy8sdGFwKCh2YWx1ZSkgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCB1cGRhdGUgZXZlbnQ6ICcsIHZhbHVlKSlcbiAgICAgIClcbiAgICApLnBpcGUoXG4gICAgICAvLyBTdWdnZXN0IHZhbHVlc1xuICAgICAgbWVyZ2VNYXAoKHZhbHVlKSA9PiB0aGlzLnN1Z2dlc3QodmFsdWUsIHRoaXMuZmlsdGVyKSksXG5cbiAgICAgIC8vIElnbm9yZSB1bmRlZmluZWQgcmVzdWx0IChlLmcuIHdoZW4gYSBuZXdlciBzdWdnZXN0IGNhbGwgaXMgcnVubmluZylcbiAgICAgIGZpbHRlcihpc05vdE5pbCksXG5cbiAgICAgIC8vIERFQlVHXG4gICAgICAvL3RhcChpdGVtcyA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGZyb20gc3VnZ2VzdDogJywgaXRlbXMpKSxcblxuICAgICAgLy8gU3RvcmUgaW1wbGljaXQgdmFsdWUgKHdpbGwgdXNlIGl0IG9uQmx1ciBpZiBub3Qgb3RoZXIgdmFsdWUgc2VsZWN0ZWQpXG4gICAgICB0YXAoKGl0ZW1zKSA9PiB0aGlzLnVwZGF0ZUltcGxpY2l0VmFsdWUoaXRlbXMpKVxuICAgICk7XG5cbiAgICAvLyBGZXRjaCBtb3JlIGV2ZW50c1xuICAgIGNvbnN0IGZldGNoTW9yZUl0ZW1zQ2hhbmdlcyA9IHRoaXMuX2ZldGNoTW9yZSQucGlwZShcbiAgICAgIHRhcCgoZXZlbnQpID0+IGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpKSwgLy8gQXZvaWQgdG8gY2xvc2UgdGhlIG1hdC1zZWxlY3RcbiAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmNhbkZldGNoTW9yZSksXG4gICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmZldGNoTW9yZSgpKSxcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vdGFwKG1vcmVJdGVtcyA9PiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBmcm9tIGZldGNoIE1vcmU6ICcsIG1vcmVJdGVtcykpLFxuXG4gICAgICAvLyBDb25jYXQgdG8gZXhpc3RpbmcgaXRlbXNcbiAgICAgIG1hcCgobW9yZUl0ZW1zKSA9PiAodGhpcy5fJGZpbHRlcmVkSXRlbXMudmFsdWUgfHwgW10pLmNvbmNhdChtb3JlSXRlbXMpKVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgZmlsdGVyZWQgaXRlbXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMuXyRpbnB1dEl0ZW1zLFxuXG4gICAgICAgIC8vIFVwZGF0ZSBpdGVtcyBldmVudHNcbiAgICAgICAgZmlsdGVyZWRJdGVtc0NoYW5nZXMsXG5cbiAgICAgICAgLy8gRmV0Y2ggbW9yZSBldmVudHNcbiAgICAgICAgZmV0Y2hNb3JlSXRlbXNDaGFuZ2VzXG4gICAgICApXG4gICAgICAgIC8vIEVtaXQgaXRlbXNcbiAgICAgICAgLnN1YnNjcmliZSgoaXRlbXMpID0+IHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLm5leHQoaXRlbXMpKVxuICAgICk7XG5cbiAgICAvLyBBcHBseWluZyBpbXBsaWNpdCB2YWx1ZSwgb24gYmx1clxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmJsdXJyZWRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDE1MCksXG4gICAgICAgICAgLy8gU2tpcCBpZiBtdWx0aXBsZSAobm8gaW1wbGljaXQgdmFsdWUpIG9yIGRpc2FibGVcbiAgICAgICAgICBmaWx0ZXIoKF8pID0+IHRoaXMuZW5hYmxlZCksXG5cbiAgICAgICAgICBtYXAoKF8pID0+IHRoaXMuX2lucHV0Q29udHJvbC52YWx1ZSlcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vLHRhcCh2YWx1ZSA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGJsdXJyZWQgZXZlbnQ6ICcsIHZhbHVlKSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAvLyBXaGVuIGxlYXZlIGNvbXBvbmVudCB3aXRob3V0IG9iamVjdCwgdXNlIGltcGxpY2l0IHZhbHVlIGlmIDpcbiAgICAgICAgICAvLyAtIGFuIGV4cGxpY2l0IHZhbHVlXG4gICAgICAgICAgLy8gLSBmaWVsZCBpcyBub3QgZW1wdHkgKHVzZXIgZmlsbCBzb21ldGhpbmcpXG4gICAgICAgICAgLy8gLSBPUiBmaWVsZCBlbXB0eSBidXQgaXMgcmVxdWlyZWRcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlICYmXG4gICAgICAgICAgICAoKHRoaXMucmVxdWlyZWQgJiYgaXNFbXB0eUFycmF5KHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpKSB8fCAoaXNOb3ROaWxPckJsYW5rKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMuX2ltcGxpY2l0VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5jaGVja0lmVG91Y2hlZCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXNldCBzZWFyY2ggdGV4dFxuICAgICAgICAgICAgdGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgdGhpcy5faW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICAgICAgICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSBudWxsOyAvLyByZXNldCB0aGUgaW1wbGljaXQgdmFsdWVcbiAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTsgLy8gQ2xvbmUgcGFuZWxcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gTGlzdGVuIGZvcm0gY29udHJvbCBzdGF0dXMgY2hhbmdlXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IHN0YXRlXG4gICAgICAgIC5zdWJzY3JpYmUoKHN0YXR1cykgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEZvcm0gY29udHJvbCBzdGF0dXMgY2hhbmdlZDogJywgc3RhdHVzKTtcbiAgICAgICAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmtleWRvd25Fc2NhcGUuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAvLyBBdm9pZCBmb3JtIG9yIHBhZ2UgdG8gbWFuYWdlIGVzY2FwZSBldmVudFxuICAgICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgQ2xvc2luZyB0aGUgcGFuZWwgKGtleWRvd24uZXNjYXBlKVwiKTtcblxuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLl8kaW5wdXRJdGVtcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuXyRpbnB1dEl0ZW1zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbG9hZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLl8kZmlsdGVyLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmRyb3BCdXR0b25DbGljay5jb21wbGV0ZSgpO1xuICAgIHRoaXMuY2xpY2tlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuYmx1cnJlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZm9jdXNlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMua2V5ZG93bkVzY2FwZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMua2V5dXBFbnRlci5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2ZldGNoTW9yZSQuY29tcGxldGUoKTtcblxuICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9IG51bGw7XG4gICAgdGhpcy5kaXNwbGF5V2l0aCA9IG51bGw7XG4gICAgdGhpcy5lcXVhbHMgPSBudWxsO1xuICAgIHRoaXMuc3VnZ2VzdEZuID0gbnVsbDtcbiAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcyA9IG51bGw7XG4gICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgIHRoaXMucGFuZWxDbGFzcyA9IG51bGw7XG5cbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IG51bGw7XG5cbiAgICAvLyBEZXN0cm95IHRoZSAnYXV0b2NvbXBsZXRlJyBpbnN0YW5jZSwgdG8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZT8ubmdPbkRlc3Ryb3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgaXRlbSB0byBjaGlwc1xuICAgKlxuICAgKiBAcGFyYW0gaXRlbVxuICAgKi9cbiAgYWRkKGl0ZW06IGFueSkge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fXNlbGVjdGAsIGl0ZW0pO1xuICAgIHRoaXMud3JpdGVWYWx1ZShbLi4udGhpcy52YWx1ZSwgaXRlbV0pO1xuICAgIHRoaXMubWF0SW5wdXRUZXh0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB0aGlzLl9pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBpdGVtIGZyb20gY2hpcHNcbiAgICpcbiAgICogQHBhcmFtIGl0ZW1cbiAgICovXG4gIHJlbW92ZShpdGVtOiBhbnkpIHtcbiAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgY29uc3QgaW5kZXggPSB2YWx1ZSA/IHZhbHVlLmluZGV4T2YoaXRlbSkgOiAtMTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlLnNsaWNlKCk7XG4gICAgICBuZXdWYWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy53cml0ZVZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byByZWxvYWQgY29udGVudC4gVXNlZnVsIHdoZW4gZmlsdGVyIGhhcyBiZWVuIGNoYW5nZWQgYnV0IG5vdCBkZXRlY3RlZFxuICAgKi9cbiAgcmVsb2FkSXRlbXModmFsdWU/OiBhbnkpIHtcbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEFza2luZyB0byByZWxvYWRJdGVtcygpJywgdmFsdWUpO1xuICAgIC8vIEZvcmNlIGEgcmVmcmVzaFxuICAgIHRoaXMuX3JlbG9hZCQubmV4dCh2YWx1ZSB8fCAodGhpcy5zaG93QWxsT25Gb2N1cyAmJiB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPD0gMCA/ICcqJyA6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueVtdKTogdm9pZCB7XG4gICAgLy8gREVCVUdcbiAgICAvLyBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgV3JpdGluZyB2YWx1ZTogJywgdmFsdWUpO1xuXG4gICAgaWYgKHZhbHVlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBXcml0aW5nIHZhbHVlOiAnLCB2YWx1ZSk7XG5cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0Rpc2FibGVkICYmIHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgZm9jdXNJbnB1dCh0aGlzLm1hdElucHV0VGV4dCk7XG4gIH1cblxuICBmaWx0ZXJJbnB1dFRleHRGb2N1c0V2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIENhbmNlbGxpbmcgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VsZWN0IGlucHV0IGNvbnRlbnQnKTtcbiAgICBjb25zdCBoYXNDb250ZW50ID0gc2VsZWN0SW5wdXRDb250ZW50RnJvbUV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChoYXNDb250ZW50KSB7XG4gICAgICAvLyBNb3ZlIGNhcmV0IHRvIHRoZSBiZWdpbm5pbmcgKGZpeCBpc3N1ZSBJTUFHSU5FLTQ2OSlcbiAgICAgIHNlbGVjdElucHV0UmFuZ2UoZXZlbnQudGFyZ2V0IGFzIGFueSwgMCwgMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNob3dQYW5lbE9uRm9jdXMgJiYgdGhpcy5zaG93QWxsT25Gb2N1cykge1xuICAgICAgLy8gSWYgY29tYm8gaXMgZW1wdHksIG9yIGlmIGhhcyBjb250ZW50IGJ1dCBzaG91bGQgZm9yY2UgdG8gc2hvdyBwYW5lbCBvbiBmb2N1c1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEVtaXQgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWx0ZXJJbnB1dFRleHRCbHVyRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcblxuICAgIC8vIEVtaXQgYmx1ciBldmVudFxuICAgIHRoaXMuYmx1cnJlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGZpbHRlckNoaXBzRm9jdXNFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgRm9jdXMgaW4gY2hpcHMgbGlzdCcsIGV2ZW50KTtcblxuICAgIC8vIElnbm9yZSBldmVudCBpbiBidXR0b25cblxuICAgIHRoaXMubWF0SW5wdXRUZXh0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGNsZWFyVmFsdWUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgdGhpcy53cml0ZVZhbHVlKG51bGwpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICB9XG5cbiAgX2luaXRBdXRvY29tcGxldGVJbmZpbml0ZVNjcm9sbCh0aHJlc2hvbGQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSByZXR1cm47IC8vIFNraXBcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBJbml0IGF1dG9jb21wbGV0ZSBzY3JvbGwgbGlzdGVuZXInKTtcblxuICAgIGlmICh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW5lZCQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuYXV0b2NvbXBsZXRlLl9pc09wZW4gPyB0aW1lcigwKSA6IHRoaXMuYXV0b2NvbXBsZXRlLm9wZW5lZC5waXBlKGRlYm91bmNlVGltZSgyMDApKTtcbiAgICBjb25zdCBzY3JvbGxFbmQkID0gb3BlbmVkJC5waXBlKFxuICAgICAgbWFwKChfKSA9PiB0aGlzLmdldEF1dG9jb21wbGV0ZVBhbmVsKCkpLFxuICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKSksXG4gICAgICB0YWtlVW50aWwodGhpcy5hdXRvY29tcGxldGUuY2xvc2VkKVxuICAgICk7XG5cbiAgICAvLyBUcmlnZ2VyIGZldGNoIG1vcmUsIGVuZCBlbmQgc2Nyb2xsIHJlYWNoZWRcbiAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24gPSBzY3JvbGxFbmQkLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9mZXRjaE1vcmUkLmVtaXQoKSk7XG5cbiAgICAvLyBSZWdpc3RlciBzdWJzY3JpcHRpb25cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuIHx8IGZhbHNlO1xuICB9XG5cbiAgY2xvc2VQYW5lbCgpIHtcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGU/LmlzT3Blbikge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVUcmlnZ2VyPy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNob3dQYW5lbChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLmVtaXQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kIC0tICovXG5cbiAgcHJpdmF0ZSBhc3luYyBzdWdnZXN0KHZhbHVlOiBhbnksIGZpbHRlcjogYW55IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxhbnlbXSB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIENvbXB1dGUgYSBuZXcgZXhlY3V0aW9uIGlkXG4gICAgY29uc3QgaWQgPSArK3RoaXMuX3N1Z2dlc3RFeGVjdXRpb25JZDtcblxuICAgIC8vIFRyaW0gc3RyaW5nIHZhbHVlIGJlZm9yZSBzZWFyY2hpbmdcbiAgICBpZiAodGhpcy50cmltU2VhcmNoVGV4dCAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIHN1Z2dlc3Rpb24gZnVuY3Rpb25cbiAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zdWdnZXN0Rm4odmFsdWUsIGZpbHRlcik7XG5cbiAgICAvLyBJZ25vcmUgdGhlIGN1cnJlbnQgcmVzdWx0LCBpZiBhIG5ld2VyIGV4ZWN1dGlvbiBoYXMgYmVlbiBsYXVuY2hlZFxuICAgIGlmIChpZCAhPT0gdGhpcy5fc3VnZ2VzdEV4ZWN1dGlvbklkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGaWx0ZXJlZCBpdGVtcyBieSBzdWdnZXN0Rm46JywgdmFsdWUsIHJlcyk7XG5cbiAgICBpZiAoIXJlcykge1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gMDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgICByZXMgPSBbXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgcmVzID0gcmVzIGFzIGFueVtdO1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gcmVzPy5sZW5ndGggfHwgMDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgdG90YWwsIGZldGNoTW9yZSB9ID0gcmVzIGFzIExvYWRSZXN1bHQ8YW55PjtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IHRvTnVtYmVyKHRvdGFsLCAoZGF0YSAmJiBkYXRhLmxlbmd0aCkgfHwgMCk7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gZmV0Y2hNb3JlO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAoZmV0Y2hNb3JlICYmIHRoaXMuX2l0ZW1Db3VudCAtIGRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgcmVzID0gZGF0YTtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGV4aXN0aW5nIGl0ZW1zXG4gICAgY29uc3QgZXhpc3RpbmdJdGVtcyA9IHRoaXMudmFsdWU7XG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0gKHJlcyB8fCBbXSkuZmlsdGVyKChpdGVtMSkgPT4gIWV4aXN0aW5nSXRlbXM/LnNvbWUoKGl0ZW0yKSA9PiB0aGlzLmVxdWFscyhpdGVtMSwgaXRlbTIpKSk7XG4gICAgY29uc3QgcmVtb3ZlZEl0ZW1Db3VudCA9IChyZXM/Lmxlbmd0aCB8fCAwKSAtIGZpbHRlcmVkRGF0YS5sZW5ndGg7XG5cbiAgICAvLyBEZWNyZWFzZSB0aGUgaXRlbSBjb3VudCwgd2l0aCBkZWx0YVxuICAgIHRoaXMuX2l0ZW1Db3VudCAtPSByZW1vdmVkSXRlbUNvdW50O1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGaWx0ZXJlZCBpdGVtcyBieSBzdWdnZXN0Rm46JywgdmFsdWUsIGZpbHRlcmVkRGF0YSk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWREYXRhIGFzIGFueVtdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE1vcmUoKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGlmICghdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjaykgcmV0dXJuIFtdO1xuXG4gICAgLy8gU2F2ZSB0aGVuIHJlbW92ZSBmZXRjaCBmdW5jdGlvbiAodG8gYXZvaWQgbXVsdGktY2FsbClcbiAgICBjb25zdCBmZXRjaE1vcmVGbiA9IHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2s7XG4gICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHsgZGF0YSwgdG90YWwsIGZldGNoTW9yZSB9ID0gYXdhaXQgZmV0Y2hNb3JlRm4oKTtcbiAgICB0aGlzLl9pdGVtQ291bnQgPSAodG90YWwgfHwgdGhpcy5faXRlbUNvdW50KSAtICh0aGlzLnZhbHVlPy5sZW5ndGggfHwgMCk7XG4gICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IGZldGNoTW9yZTtcbiAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IE1hdGgubWF4KDAsIHRoaXMuX21vcmVJdGVtc0NvdW50IC0gZGF0YS5sZW5ndGgpOyAvLyBCb3JuZSBtaW4gPSAwXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUltcGxpY2l0VmFsdWUoaXRlbXM6IGFueVtdKSB7XG4gICAgLy8gU3RvcmUgaW1wbGljaXQgdmFsdWUgKHdpbGwgdXNlIGl0IG9uQmx1ciBpZiBub3Qgb3RoZXIgdmFsdWUgc2VsZWN0ZWQpXG4gICAgaWYgKGl0ZW1zPy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGFwcGx5SW1wbGljaXRWYWx1ZSA9IHR5cGVvZiB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlKGl0ZW1zWzBdKSA6IHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlO1xuICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IGFwcGx5SW1wbGljaXRWYWx1ZSA/IGl0ZW1zWzBdIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJZlRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCB8fCB0aGlzLl9pbnB1dENvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRvY29tcGxldGVQYW5lbCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlID0gdGhpcy5hdXRvY29tcGxldGU/Lm9wdGlvbnMubGFzdD8uX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgVW5hYmxlIHRvIGZpbmQgdGhlIGF1dG9jb21wbGV0ZSBkaXYuLi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtBc0xvYWRpbmcoKSB7XG4gICAgaWYgKHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLnZhbHVlKSB7XG4gICAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcy5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLl9pdGVtQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gMDtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG59XG4iLCI8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICA8aW9uLXJvdz5cbiAgICA8aW9uLWNvbCBbc2l6ZV09XCJjb2xTaXplcz8uWzBdXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgIFtzdWJzY3JpcHRTaXppbmddPVwiJ2R5bmFtaWMnXCJcbiAgICAgICAgW2hpZGVSZXF1aXJlZE1hcmtlcl09XCJoaWRlUmVxdWlyZWRNYXJrZXJcIlxuICAgICAgICBbY2xhc3MubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRdPVwiZm9ybUNvbnRyb2wuZGlzYWJsZWRcIlxuICAgICAgICBbY2xhc3MubWF0LWZvcm0tZmllbGQtaW52YWxpZF09XCJmb3JtQ29udHJvbC50b3VjaGVkICYmIGZvcm1Db250cm9sLmludmFsaWRcIlxuICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWNoaXBzXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgICAgIDxtYXQtbGFiZWw+e3sgcGxhY2Vob2xkZXIgfX08L21hdC1sYWJlbD5cbiAgICAgICAgfVxuXG4gICAgICAgIDxtYXQtY2hpcC1ncmlkXG4gICAgICAgICAgI2NoaXBMaXN0XG4gICAgICAgICAgKGZvY3VzKT1cImZpbHRlckNoaXBzRm9jdXNFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXJlYWRvbmx5ICYmIGRpc2FibGVkXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgIFtlcnJvclN0YXRlTWF0Y2hlcl09XCJfZXJyb3JTdGF0ZU1hdGNoZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChzaG93Q2hpcHMpIHtcbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgdmFsdWU7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgPG1hdC1jaGlwLXJvd1xuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLW5vLW1hcmdpblwiXG4gICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCIhZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cImNoaXBDb2xvclwiXG4gICAgICAgICAgICAgICAgW2hpZ2hsaWdodGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgaXRlbSB8IHRvU3RyaW5nOiBkaXNwbGF5V2l0aCB9fVxuICAgICAgICAgICAgICAgIEBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNtYXRJbnB1dFRleHRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVQb3NpdGlvbl09XCJtYXRBdXRvY29tcGxldGVQb3NpdGlvblwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiX2lucHV0Q29udHJvbFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmxvYXRMYWJlbCA9PT0gJ25ldmVyJyA/IHBsYWNlaG9sZGVyIDogbnVsbFwiXG4gICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwiX3RhYmluZGV4XCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICBbaGlkZGVuXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGlja2VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZm9jdXMpPVwiZmlsdGVySW5wdXRUZXh0Rm9jdXNFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChibHVyKT1cImZpbHRlcklucHV0VGV4dEJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJrZXlkb3duRXNjYXBlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwia2V5dXBFbnRlci5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGtleXVwLmFycm93RG93bik9XCIhYXV0b2NvbXBsZXRlLnNob3dQYW5lbCAmJiBkcm9wQnV0dG9uQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIlxuICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cInNlcGFyYXRvcktleXNDb2Rlc1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9tYXQtY2hpcC1ncmlkPlxuXG4gICAgICAgIDwhLS0gYXV0b2NvbXBsZXRlIC0tPlxuICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAgICNhdXRvY29tcGxldGU9XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgIFthdXRvQWN0aXZlRmlyc3RPcHRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgW2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlXaXRoXCJcbiAgICAgICAgICBbY2xhc3NdPVwicGFuZWxDbGFzc1wiXG4gICAgICAgICAgW3BhbmVsV2lkdGhdPVwicGFuZWxXaWR0aFwiXG4gICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiZGlzYWJsZVJpcHBsZVwiXG4gICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cImFkZCgkZXZlbnQub3B0aW9uLnZhbHVlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIEhlYWRlcnMgLS0+XG4gICAgICAgICAgPGlvbi1yb3cgY2xhc3M9XCJtYXQtYXV0b2NvbXBsZXRlLWhlYWRlciBjb2x1bW4gaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgIEBmb3IgKGF0dHIgb2YgZGlzcGxheUF0dHJpYnV0ZXM7IHRyYWNrIGF0dHI7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxpb24tY29sIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tpXVwiPlxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgW2lubmVySFRNTF09XCJkaXNwbGF5Q29sdW1uTmFtZXNbaV0gfCB0cmFuc2xhdGVcIj48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXJvdz5cblxuICAgICAgICAgIEBpZiAoXyRmaWx0ZXJlZEl0ZW1zIHwgcHVzaDogJ3VzZXJCbG9ja2luZyc7IGFzIGl0ZW1zKSB7XG4gICAgICAgICAgICA8IS0tIE5vIGl0ZW0gb3B0aW9uIC0tPlxuICAgICAgICAgICAgQGlmIChpdGVtcyB8IGlzRW1wdHlBcnJheSkge1xuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpPnt7IG5vUmVzdWx0TWVzc2FnZSB8IHRyYW5zbGF0ZSB9fTwvaT5cbiAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIE9wdGlvbnMgLS0+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW1cIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1yb3cgW2NsYXNzTGlzdF09XCJpdGVtPy5jbGFzc0xpc3QgfHwgJydcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHBhdGggb2YgZGlzcGxheUF0dHJpYnV0ZXM7IHRyYWNrIHBhdGg7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY29sXG4gICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiZGlzcGxheUNvbHVtblNpemVzW2ldXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gdGV4dC5pbm5lclRleHQgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyB0ZXh0LmlubmVyVGV4dCA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1hbGlnbi1zZWxmLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAjdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvcGVydHlHZXQ6IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGlnaGxpZ2h0OiB7IHNlYXJjaDogbWF0SW5wdXRUZXh0LnZhbHVlLCB3aXRoQWNjZW50OiBoaWdobGlnaHRBY2NlbnQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8IS0tIE1vcmUgaXRlbSAtLT5cbiAgICAgICAgICAgIEBpZiAoX21vcmVJdGVtc0NvdW50KSB7XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChuZ0luaXQpPVwiX2luaXRBdXRvY29tcGxldGVJbmZpbml0ZVNjcm9sbCgpXCIgY2xhc3M9XCJpb24tcGFkZGluZ1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBAZWxzZSBpZiAoKG1hdElucHV0VGV4dC52YWx1ZSB8IHN0ckxlbmd0aCkgPCBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkKSB7XG4gICAgICAgICAgICA8IS0tIE5lZWQgbW9yZSBjaGFyYWN0ZXJzIC0tPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZyB0ZXh0LWl0YWxpY1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgIHt7ICdJTkZPLlBMRUFTRV9UWVBFX01PUkVfQ0hBUkFDVEVSUycgfCB0cmFuc2xhdGU6IHsgbWluTGVuZ3RoOiBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkIH0gfX1cbiAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8IS0tIExvYWRpbmcgc3Bpbm5lciAtLT5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBmb290ZXIgLS0+XG4gICAgICAgICAgQGlmIChpdGVtQ291bnQ7IGFzIGNvdW50KSB7XG4gICAgICAgICAgICA8aW9uLXJvdyBjbGFzcz1cIm1hdC1hdXRvY29tcGxldGUtZm9vdGVyIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImlvbi1mbG9hdC1lbmQgaW9uLXBhZGRpbmctZW5kXCI+XG4gICAgICAgICAgICAgICAgICA8aT57eyAnQ09NTU9OLlJFU1VMVF9DT1VOVCcgfCB0cmFuc2xhdGU6IHsgY291bnQ6IGNvdW50IH0gfX08L2k+XG4gICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgIDxkaXYgbWF0U3VmZml4IGNsYXNzPVwibWF0LWZvcm0tZmllbGQtc3VmZml4LWJvdHRvbVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEhpbnRzIC0tPlxuICAgICAgICBAaWYgKCFmb3JtQ29udHJvbD8uaW52YWxpZCkge1xuICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRIaW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICB9XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8IS0tIERvIHRoZSBzYW1lIGFzIE1hdEZvcm1GaWVsZCBzaW5jZSBhbmd1bGFyIDE1IChzZWUgY29tcG9uZW50IHNvdXJjZSktLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJcIlxuICAgICAgICBbY2xhc3MubWF0LW1kYy1mb3JtLWZpZWxkLWJvdHRvbS1hbGlnbl09XCJzdWJzY3JpcHRTaXppbmcgPT09ICdmaXhlZCdcIlxuICAgICAgICBbY2xhc3MubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC1keW5hbWljLXNpemVdPVwic3Vic2NyaXB0U2l6aW5nID09PSAnZHluYW1pYydcIlxuICAgICAgPlxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLnRvdWNoZWQgJiYgZm9ybUNvbnRyb2wuZXJyb3JzOyBhcyBlcnJvcnMpIHtcbiAgICAgICAgICA8IS0tIGVycm9ycyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWVycm9yLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIEBpZiAoZXJyb3JzIHwgbWFwS2V5cyB8IGFycmF5Rmlyc3Q7IGFzIGVycm9yS2V5KSB7XG4gICAgICAgICAgICAgIEBzd2l0Y2ggKGVycm9yS2V5KSB7XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdyZXF1aXJlZCcpIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnZW50aXR5Jykge1xuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfSU5WQUxJRDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0RXJyb3JUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2lvbi1jb2w+XG4gICAgPGlvbi1jb2wgW3NpemVdPVwiY29sU2l6ZXM/LlsxXVwiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRBZnRlcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9pb24tY29sPlxuICA8L2lvbi1yb3c+XG48L2lvbi1ncmlkPlxuXG48bmctdGVtcGxhdGUgI21hdFByZWZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0UHJlZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIDxidXR0b25cbiAgICBtYXRTdWZmaXhcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlU2hvd1BhbmVsKCRldmVudClcIlxuICAgIFtjbGFzcy5oaWRkZW5dPVwiZGlzYWJsZWRcIlxuICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoZHJvcEJ1dHRvblRpdGxlIHx8ICcnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChkcm9wQnV0dG9uVGl0bGUgfHwgJycgfCB0cmFuc2xhdGUpIDogJydcIlxuICA+XG4gICAgPG1hdC1pY29uPnt7IG1vYmlsZSA/ICdhcnJvd19kcm9wX2Rvd24nIDogJ2tleWJvYXJkX2Fycm93X2Rvd24nIH19PC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIEBpZiAoY2xlYXJhYmxlKSB7XG4gICAgPGJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgIFtjbGFzcy5oaWRkZW5dPVwiZGlzYWJsZWQgfHwgIWZvcm1Db250cm9sLnZhbHVlXCJcbiAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoY2xlYXJCdXR0b25UaXRsZSB8fCAnJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChjbGVhckJ1dHRvblRpdGxlIHx8ICcnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICB9XG5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdEVycm9yVGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1lcnJvcixbbWF0RXJyb3JdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRIaW50VGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC13cmFwcGVyXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWhpbnQ6bm90KFthbGlnbj0nZW5kJ10pLFttYXRIaW50XVwiPjwvbmctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtc3BhY2VyXCI+PC9kaXY+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWhpbnRbYWxpZ249J2VuZCddXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|