@myrmidon/cadmus-refs-asserted-ids 5.1.5 → 5.1.7

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.
@@ -429,10 +429,10 @@ export class PinTargetLookupComponent {
429
429
  this._target = this.getTarget();
430
430
  this.targetChange.emit(this._target);
431
431
  }
432
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PinTargetLookupComponent, deps: [{ token: 'indexLookupDefinitions' }, { token: i1.ItemRefLookupService }, { token: i2.PinRefLookupService }, { token: i3.ItemService }, { token: i3.ThesaurusService }, { token: i4.MatSnackBar }, { token: i5.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
433
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: PinTargetLookupComponent, isStandalone: true, selector: "cadmus-pin-target-lookup", inputs: { pinByTypeMode: "pinByTypeMode", canSwitchMode: "canSwitchMode", canEditTarget: "canEditTarget", lookupDefinitions: "lookupDefinitions", extLookupConfigs: "extLookupConfigs", internalDefault: "internalDefault", target: "target", defaultPartTypeKey: "defaultPartTypeKey" }, outputs: { editorClose: "editorClose", targetChange: "targetChange", extMoreRequest: "extMoreRequest", extLookupConfigChange: "extLookupConfigChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- external -->\n <mat-checkbox [formControl]=\"external\">external</mat-checkbox>\n <!-- mode switcher -->\n @if (!external.value) {\n <div>\n @if (canSwitchMode) {\n <mat-checkbox [formControl]=\"byTypeMode\"> by type</mat-checkbox>\n }\n </div>\n }\n </div>\n\n <div class=\"form-row\">\n <!-- label -->\n <div>\n @if (external.value || canEditTarget) {\n <mat-form-field>\n <mat-label>label</mat-label>\n <input matInput [formControl]=\"label\" />\n @if ($any(label).errors?.required && (label.dirty || label.touched)) {\n <mat-error>label required</mat-error>\n } @if ( $any(label).errors?.maxLength && (label.dirty || label.touched)\n ) {\n <mat-error>label too long</mat-error>\n }\n </mat-form-field>\n } @if (!external.value && !canEditTarget && label.value) {\n <div class=\"info\"><span class=\"label\">label</span>{{ label.value }}</div>\n }\n </div>\n\n <!-- gid -->\n <div>\n @if (external.value || canEditTarget) {\n <mat-form-field>\n <mat-label>GID</mat-label>\n <input matInput [formControl]=\"gid\" />\n @if ($any(gid).errors?.required && (gid.dirty || gid.touched)) {\n <mat-error>GID required</mat-error>\n } @if ($any(gid).errors?.maxLength && (gid.dirty || gid.touched)) {\n <mat-error>GID too long</mat-error>\n }\n </mat-form-field>\n } @if (!external.value && !canEditTarget && gid.value) {\n <div class=\"info\">\n <span class=\"label\">GID</span> <span class=\"gid\">{{ gid.value }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- external lookup set -->\n @if (external.value && extLookupConfigs.length) {\n <div>\n <cadmus-ref-lookup-set\n [configs]=\"extLookupConfigs\"\n (itemChange)=\"onExtItemChange($event)\"\n (moreRequest)=\"onExtMoreRequest($event)\"\n (configChange)=\"onExtConfigChange($event)\"\n ></cadmus-ref-lookup-set>\n </div>\n }\n\n <!-- BY ITEM -->\n @if (!external.value) {\n <div>\n @if (!byTypeMode.value) {\n <fieldset class=\"form-row\">\n <legend>pin filters</legend>\n <!-- item filter -->\n <cadmus-ref-lookup\n [service]=\"itemLookupService\"\n label=\"item\"\n (itemChange)=\"onItemLookupChange($event)\"\n ></cadmus-ref-lookup>\n <!-- part filter -->\n @if (itemParts.length) {\n <mat-form-field>\n <mat-label>part</mat-label>\n <mat-select [formControl]=\"itemPart\">\n <mat-option [value]=\"null\">(any)</mat-option>\n @for (p of itemParts; track p) {\n <mat-option [value]=\"p\">{{\n p.typeId | flatLookup : modelEntries : \"id\" : \"value\"\n }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n </fieldset>\n }\n <!-- BY TYPE -->\n @if (byTypeMode.value) {\n <div>\n <!-- par type filter -->\n @if (partTypeKeys.length) {\n <mat-form-field>\n <mat-label>part type</mat-label>\n <mat-select [formControl]=\"partTypeKey\">\n @for (k of partTypeKeys; track k) {\n <mat-option [value]=\"k\">{{ k }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n </div>\n }\n <!-- PIN -->\n @if (partTypeKey.value) {\n <div>\n <!-- pin lookup -->\n <cadmus-ref-lookup\n [service]=\"pinLookupService\"\n [baseFilter]=\"filter\"\n [options]=\"pinFilterOptions\"\n label=\"pin\"\n (itemChange)=\"onPinLookupChange($event)\"\n ></cadmus-ref-lookup>\n </div>\n }\n <!-- data -->\n @if (lookupData?.pin?.name) {\n <mat-expansion-panel id=\"data\">\n <mat-expansion-panel-header>pin data</mat-expansion-panel-header>\n <!-- table -->\n <table>\n <thead>\n <th></th>\n <th>source</th>\n <th>value</th>\n </thead>\n <tbody>\n <!-- pin -->\n @if (lookupData?.pin?.value) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.value\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>pin</td>\n <td>{{ lookupData!.pin.value }}</td>\n </tr>\n }\n <!-- item ID -->\n @if (lookupData?.pin?.itemId) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.itemId\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>item ID</td>\n <td>{{ lookupData!.pin.itemId }}</td>\n </tr>\n }\n <!-- item title -->\n @if (lookupData?.item?.title) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.item!.title\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>item title</td>\n <td>{{ lookupData!.item!.title }}</td>\n </tr>\n }\n <!-- part ID -->\n @if (lookupData?.pin?.partId) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.partId\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>part ID</td>\n <td>{{ lookupData!.pin.partId }}</td>\n </tr>\n }\n <!-- part type ID -->\n @if (lookupData?.pin?.partTypeId) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.partTypeId\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>part type ID</td>\n <td>{{ lookupData!.pin!.partTypeId }}</td>\n </tr>\n }\n <!-- part role ID -->\n @if (lookupData?.pin?.roleId) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.roleId!\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>part role ID</td>\n <td>{{ lookupData!.pin!.roleId }}</td>\n </tr>\n }\n <!-- part's metadata -->\n @for ( m of lookupData?.metaPart?.metadata || []; track m; let i =\n $index) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"m.value\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td class=\"metadata\">{{ m.name }}</td>\n <td class=\"metadata\">{{ m.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n </mat-expansion-panel>\n }\n </div>\n }\n\n <!-- buttons -->\n <div class=\"button-row\">\n <button mat-icon-button type=\"button\" (click)=\"close()\">\n <mat-icon color=\"warn\" class=\"mat-warn\">close</mat-icon>\n </button>\n <button mat-flat-button type=\"submit\" [disabled]=\"form.invalid\">\n <mat-icon color=\"primary\" class=\"mat-primary\">check_circle</mat-icon>\n target\n </button>\n </div>\n</form>\n", styles: [".metadata{color:#4a3001}.info{border:1px solid silver;border-radius:6px;background-color:silver;color:#fff;padding:4px;margin:8px 0}.info .label{background-color:#fff;color:silver;margin:0 6px}#data{margin:8px 0}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.button-row{display:flex;align-items:center;flex-wrap:wrap}.label{border:1px solid silver;border-radius:6px;padding:4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 8px;margin-bottom:8px}legend{color:silver}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ClipboardModule }, { kind: "directive", type: i6.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i9.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i9.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i13.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i14.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: NgToolsModule }, { kind: "pipe", type: i15.FlatLookupPipe, name: "flatLookup" }, { kind: "component", type: RefLookupComponent, selector: "cadmus-ref-lookup", inputs: ["label", "limit", "baseFilter", "service", "item", "required", "hasMore", "linkTemplate", "optDialog", "options"], outputs: ["itemChange", "moreRequest"] }, { kind: "component", type: RefLookupSetComponent, selector: "cadmus-ref-lookup-set", inputs: ["configs", "iconSize"], outputs: ["configChange", "itemChange", "moreRequest"] }] }); }
432
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: PinTargetLookupComponent, deps: [{ token: 'indexLookupDefinitions' }, { token: i1.ItemRefLookupService }, { token: i2.PinRefLookupService }, { token: i3.ItemService }, { token: i3.ThesaurusService }, { token: i4.MatSnackBar }, { token: i5.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
433
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.2", type: PinTargetLookupComponent, isStandalone: true, selector: "cadmus-pin-target-lookup", inputs: { pinByTypeMode: "pinByTypeMode", canSwitchMode: "canSwitchMode", canEditTarget: "canEditTarget", lookupDefinitions: "lookupDefinitions", extLookupConfigs: "extLookupConfigs", internalDefault: "internalDefault", target: "target", defaultPartTypeKey: "defaultPartTypeKey" }, outputs: { editorClose: "editorClose", targetChange: "targetChange", extMoreRequest: "extMoreRequest", extLookupConfigChange: "extLookupConfigChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- external -->\r\n <mat-checkbox [formControl]=\"external\">external</mat-checkbox>\r\n <!-- mode switcher -->\r\n @if (!external.value) {\r\n <div>\r\n @if (canSwitchMode) {\r\n <mat-checkbox [formControl]=\"byTypeMode\"> by type</mat-checkbox>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <div>\r\n @if (external.value || canEditTarget) {\r\n <mat-form-field>\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n @if ($any(label).errors?.required && (label.dirty || label.touched)) {\r\n <mat-error>label required</mat-error>\r\n } @if ( $any(label).errors?.maxLength && (label.dirty || label.touched)\r\n ) {\r\n <mat-error>label too long</mat-error>\r\n }\r\n </mat-form-field>\r\n } @if (!external.value && !canEditTarget && label.value) {\r\n <div class=\"info\"><span class=\"label\">label</span>{{ label.value }}</div>\r\n }\r\n </div>\r\n\r\n <!-- gid -->\r\n <div>\r\n @if (external.value || canEditTarget) {\r\n <mat-form-field>\r\n <mat-label>GID</mat-label>\r\n <input matInput [formControl]=\"gid\" />\r\n @if ($any(gid).errors?.required && (gid.dirty || gid.touched)) {\r\n <mat-error>GID required</mat-error>\r\n } @if ($any(gid).errors?.maxLength && (gid.dirty || gid.touched)) {\r\n <mat-error>GID too long</mat-error>\r\n }\r\n </mat-form-field>\r\n } @if (!external.value && !canEditTarget && gid.value) {\r\n <div class=\"info\">\r\n <span class=\"label\">GID</span> <span class=\"gid\">{{ gid.value }}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- external lookup set -->\r\n @if (external.value && extLookupConfigs.length) {\r\n <div>\r\n <cadmus-ref-lookup-set\r\n [configs]=\"extLookupConfigs\"\r\n (itemChange)=\"onExtItemChange($event)\"\r\n (moreRequest)=\"onExtMoreRequest($event)\"\r\n (configChange)=\"onExtConfigChange($any($event))\"\r\n ></cadmus-ref-lookup-set>\r\n </div>\r\n }\r\n\r\n <!-- BY ITEM -->\r\n @if (!external.value) {\r\n <div>\r\n @if (!byTypeMode.value) {\r\n <fieldset class=\"form-row\">\r\n <legend>pin filters</legend>\r\n <!-- item filter -->\r\n <cadmus-ref-lookup\r\n [service]=\"itemLookupService\"\r\n label=\"item\"\r\n (itemChange)=\"onItemLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n <!-- part filter -->\r\n @if (itemParts.length) {\r\n <mat-form-field>\r\n <mat-label>part</mat-label>\r\n <mat-select [formControl]=\"itemPart\">\r\n <mat-option [value]=\"null\">(any)</mat-option>\r\n @for (p of itemParts; track p) {\r\n <mat-option [value]=\"p\">{{\r\n p.typeId | flatLookup : modelEntries : \"id\" : \"value\"\r\n }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </fieldset>\r\n }\r\n <!-- BY TYPE -->\r\n @if (byTypeMode.value) {\r\n <div>\r\n <!-- par type filter -->\r\n @if (partTypeKeys.length) {\r\n <mat-form-field>\r\n <mat-label>part type</mat-label>\r\n <mat-select [formControl]=\"partTypeKey\">\r\n @for (k of partTypeKeys; track k) {\r\n <mat-option [value]=\"k\">{{ k }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n }\r\n <!-- PIN -->\r\n @if (partTypeKey.value) {\r\n <div>\r\n <!-- pin lookup -->\r\n <cadmus-ref-lookup\r\n [service]=\"pinLookupService\"\r\n [baseFilter]=\"filter\"\r\n [options]=\"pinFilterOptions\"\r\n label=\"pin\"\r\n (itemChange)=\"onPinLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n </div>\r\n }\r\n <!-- data -->\r\n @if (lookupData?.pin?.name) {\r\n <mat-expansion-panel id=\"data\">\r\n <mat-expansion-panel-header>pin data</mat-expansion-panel-header>\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <th></th>\r\n <th>source</th>\r\n <th>value</th>\r\n </thead>\r\n <tbody>\r\n <!-- pin -->\r\n @if (lookupData?.pin?.value) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>pin</td>\r\n <td>{{ lookupData!.pin.value }}</td>\r\n </tr>\r\n }\r\n <!-- item ID -->\r\n @if (lookupData?.pin?.itemId) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.itemId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item ID</td>\r\n <td>{{ lookupData!.pin.itemId }}</td>\r\n </tr>\r\n }\r\n <!-- item title -->\r\n @if (lookupData?.item?.title) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.item!.title\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item title</td>\r\n <td>{{ lookupData!.item!.title }}</td>\r\n </tr>\r\n }\r\n <!-- part ID -->\r\n @if (lookupData?.pin?.partId) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part ID</td>\r\n <td>{{ lookupData!.pin.partId }}</td>\r\n </tr>\r\n }\r\n <!-- part type ID -->\r\n @if (lookupData?.pin?.partTypeId) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partTypeId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part type ID</td>\r\n <td>{{ lookupData!.pin!.partTypeId }}</td>\r\n </tr>\r\n }\r\n <!-- part role ID -->\r\n @if (lookupData?.pin?.roleId) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.roleId!\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part role ID</td>\r\n <td>{{ lookupData!.pin!.roleId }}</td>\r\n </tr>\r\n }\r\n <!-- part's metadata -->\r\n @for ( m of lookupData?.metaPart?.metadata || []; track m; let i =\r\n $index) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"m.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td class=\"metadata\">{{ m.name }}</td>\r\n <td class=\"metadata\">{{ m.value }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </mat-expansion-panel>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- buttons -->\r\n <div class=\"button-row\">\r\n <button mat-icon-button type=\"button\" (click)=\"close()\">\r\n <mat-icon color=\"warn\" class=\"mat-warn\">close</mat-icon>\r\n </button>\r\n <button mat-flat-button type=\"submit\" [disabled]=\"form.invalid\">\r\n <mat-icon>check_circle</mat-icon>\r\n target\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".metadata{color:#4a3001}.info{border:1px solid silver;border-radius:6px;background-color:silver;color:#fff;padding:4px;margin:8px 0}.info .label{background-color:#fff;color:silver;margin:0 6px}#data{margin:8px 0}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.button-row{display:flex;align-items:center;flex-wrap:wrap}.label{border:1px solid silver;border-radius:6px;padding:4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 8px;margin-bottom:8px}legend{color:silver}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ClipboardModule }, { kind: "directive", type: i6.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i9.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i9.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i13.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i14.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: NgToolsModule }, { kind: "pipe", type: i15.FlatLookupPipe, name: "flatLookup" }, { kind: "component", type: RefLookupComponent, selector: "cadmus-ref-lookup", inputs: ["label", "limit", "baseFilter", "service", "item", "required", "hasMore", "linkTemplate", "optDialog", "options"], outputs: ["itemChange", "moreRequest"] }, { kind: "component", type: RefLookupSetComponent, selector: "cadmus-ref-lookup-set", inputs: ["configs", "iconSize"], outputs: ["configChange", "itemChange", "moreRequest"] }] }); }
434
434
  }
435
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PinTargetLookupComponent, decorators: [{
435
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: PinTargetLookupComponent, decorators: [{
436
436
  type: Component,
437
437
  args: [{ standalone: true, selector: 'cadmus-pin-target-lookup', imports: [
438
438
  FormsModule,
@@ -448,7 +448,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
448
448
  NgToolsModule,
449
449
  RefLookupComponent,
450
450
  RefLookupSetComponent,
451
- ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- external -->\n <mat-checkbox [formControl]=\"external\">external</mat-checkbox>\n <!-- mode switcher -->\n @if (!external.value) {\n <div>\n @if (canSwitchMode) {\n <mat-checkbox [formControl]=\"byTypeMode\"> by type</mat-checkbox>\n }\n </div>\n }\n </div>\n\n <div class=\"form-row\">\n <!-- label -->\n <div>\n @if (external.value || canEditTarget) {\n <mat-form-field>\n <mat-label>label</mat-label>\n <input matInput [formControl]=\"label\" />\n @if ($any(label).errors?.required && (label.dirty || label.touched)) {\n <mat-error>label required</mat-error>\n } @if ( $any(label).errors?.maxLength && (label.dirty || label.touched)\n ) {\n <mat-error>label too long</mat-error>\n }\n </mat-form-field>\n } @if (!external.value && !canEditTarget && label.value) {\n <div class=\"info\"><span class=\"label\">label</span>{{ label.value }}</div>\n }\n </div>\n\n <!-- gid -->\n <div>\n @if (external.value || canEditTarget) {\n <mat-form-field>\n <mat-label>GID</mat-label>\n <input matInput [formControl]=\"gid\" />\n @if ($any(gid).errors?.required && (gid.dirty || gid.touched)) {\n <mat-error>GID required</mat-error>\n } @if ($any(gid).errors?.maxLength && (gid.dirty || gid.touched)) {\n <mat-error>GID too long</mat-error>\n }\n </mat-form-field>\n } @if (!external.value && !canEditTarget && gid.value) {\n <div class=\"info\">\n <span class=\"label\">GID</span> <span class=\"gid\">{{ gid.value }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- external lookup set -->\n @if (external.value && extLookupConfigs.length) {\n <div>\n <cadmus-ref-lookup-set\n [configs]=\"extLookupConfigs\"\n (itemChange)=\"onExtItemChange($event)\"\n (moreRequest)=\"onExtMoreRequest($event)\"\n (configChange)=\"onExtConfigChange($event)\"\n ></cadmus-ref-lookup-set>\n </div>\n }\n\n <!-- BY ITEM -->\n @if (!external.value) {\n <div>\n @if (!byTypeMode.value) {\n <fieldset class=\"form-row\">\n <legend>pin filters</legend>\n <!-- item filter -->\n <cadmus-ref-lookup\n [service]=\"itemLookupService\"\n label=\"item\"\n (itemChange)=\"onItemLookupChange($event)\"\n ></cadmus-ref-lookup>\n <!-- part filter -->\n @if (itemParts.length) {\n <mat-form-field>\n <mat-label>part</mat-label>\n <mat-select [formControl]=\"itemPart\">\n <mat-option [value]=\"null\">(any)</mat-option>\n @for (p of itemParts; track p) {\n <mat-option [value]=\"p\">{{\n p.typeId | flatLookup : modelEntries : \"id\" : \"value\"\n }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n </fieldset>\n }\n <!-- BY TYPE -->\n @if (byTypeMode.value) {\n <div>\n <!-- par type filter -->\n @if (partTypeKeys.length) {\n <mat-form-field>\n <mat-label>part type</mat-label>\n <mat-select [formControl]=\"partTypeKey\">\n @for (k of partTypeKeys; track k) {\n <mat-option [value]=\"k\">{{ k }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n </div>\n }\n <!-- PIN -->\n @if (partTypeKey.value) {\n <div>\n <!-- pin lookup -->\n <cadmus-ref-lookup\n [service]=\"pinLookupService\"\n [baseFilter]=\"filter\"\n [options]=\"pinFilterOptions\"\n label=\"pin\"\n (itemChange)=\"onPinLookupChange($event)\"\n ></cadmus-ref-lookup>\n </div>\n }\n <!-- data -->\n @if (lookupData?.pin?.name) {\n <mat-expansion-panel id=\"data\">\n <mat-expansion-panel-header>pin data</mat-expansion-panel-header>\n <!-- table -->\n <table>\n <thead>\n <th></th>\n <th>source</th>\n <th>value</th>\n </thead>\n <tbody>\n <!-- pin -->\n @if (lookupData?.pin?.value) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.value\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>pin</td>\n <td>{{ lookupData!.pin.value }}</td>\n </tr>\n }\n <!-- item ID -->\n @if (lookupData?.pin?.itemId) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.itemId\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>item ID</td>\n <td>{{ lookupData!.pin.itemId }}</td>\n </tr>\n }\n <!-- item title -->\n @if (lookupData?.item?.title) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.item!.title\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>item title</td>\n <td>{{ lookupData!.item!.title }}</td>\n </tr>\n }\n <!-- part ID -->\n @if (lookupData?.pin?.partId) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.partId\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>part ID</td>\n <td>{{ lookupData!.pin.partId }}</td>\n </tr>\n }\n <!-- part type ID -->\n @if (lookupData?.pin?.partTypeId) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.partTypeId\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>part type ID</td>\n <td>{{ lookupData!.pin!.partTypeId }}</td>\n </tr>\n }\n <!-- part role ID -->\n @if (lookupData?.pin?.roleId) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"lookupData!.pin!.roleId!\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td>part role ID</td>\n <td>{{ lookupData!.pin!.roleId }}</td>\n </tr>\n }\n <!-- part's metadata -->\n @for ( m of lookupData?.metaPart?.metadata || []; track m; let i =\n $index) {\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [cdkCopyToClipboard]=\"m.value\"\n (cdkCopyToClipboardCopied)=\"onCopied()\"\n >\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\n </button>\n </td>\n <td class=\"metadata\">{{ m.name }}</td>\n <td class=\"metadata\">{{ m.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n </mat-expansion-panel>\n }\n </div>\n }\n\n <!-- buttons -->\n <div class=\"button-row\">\n <button mat-icon-button type=\"button\" (click)=\"close()\">\n <mat-icon color=\"warn\" class=\"mat-warn\">close</mat-icon>\n </button>\n <button mat-flat-button type=\"submit\" [disabled]=\"form.invalid\">\n <mat-icon color=\"primary\" class=\"mat-primary\">check_circle</mat-icon>\n target\n </button>\n </div>\n</form>\n", styles: [".metadata{color:#4a3001}.info{border:1px solid silver;border-radius:6px;background-color:silver;color:#fff;padding:4px;margin:8px 0}.info .label{background-color:#fff;color:silver;margin:0 6px}#data{margin:8px 0}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.button-row{display:flex;align-items:center;flex-wrap:wrap}.label{border:1px solid silver;border-radius:6px;padding:4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 8px;margin-bottom:8px}legend{color:silver}\n"] }]
451
+ ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- external -->\r\n <mat-checkbox [formControl]=\"external\">external</mat-checkbox>\r\n <!-- mode switcher -->\r\n @if (!external.value) {\r\n <div>\r\n @if (canSwitchMode) {\r\n <mat-checkbox [formControl]=\"byTypeMode\"> by type</mat-checkbox>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <div>\r\n @if (external.value || canEditTarget) {\r\n <mat-form-field>\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n @if ($any(label).errors?.required && (label.dirty || label.touched)) {\r\n <mat-error>label required</mat-error>\r\n } @if ( $any(label).errors?.maxLength && (label.dirty || label.touched)\r\n ) {\r\n <mat-error>label too long</mat-error>\r\n }\r\n </mat-form-field>\r\n } @if (!external.value && !canEditTarget && label.value) {\r\n <div class=\"info\"><span class=\"label\">label</span>{{ label.value }}</div>\r\n }\r\n </div>\r\n\r\n <!-- gid -->\r\n <div>\r\n @if (external.value || canEditTarget) {\r\n <mat-form-field>\r\n <mat-label>GID</mat-label>\r\n <input matInput [formControl]=\"gid\" />\r\n @if ($any(gid).errors?.required && (gid.dirty || gid.touched)) {\r\n <mat-error>GID required</mat-error>\r\n } @if ($any(gid).errors?.maxLength && (gid.dirty || gid.touched)) {\r\n <mat-error>GID too long</mat-error>\r\n }\r\n </mat-form-field>\r\n } @if (!external.value && !canEditTarget && gid.value) {\r\n <div class=\"info\">\r\n <span class=\"label\">GID</span> <span class=\"gid\">{{ gid.value }}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- external lookup set -->\r\n @if (external.value && extLookupConfigs.length) {\r\n <div>\r\n <cadmus-ref-lookup-set\r\n [configs]=\"extLookupConfigs\"\r\n (itemChange)=\"onExtItemChange($event)\"\r\n (moreRequest)=\"onExtMoreRequest($event)\"\r\n (configChange)=\"onExtConfigChange($any($event))\"\r\n ></cadmus-ref-lookup-set>\r\n </div>\r\n }\r\n\r\n <!-- BY ITEM -->\r\n @if (!external.value) {\r\n <div>\r\n @if (!byTypeMode.value) {\r\n <fieldset class=\"form-row\">\r\n <legend>pin filters</legend>\r\n <!-- item filter -->\r\n <cadmus-ref-lookup\r\n [service]=\"itemLookupService\"\r\n label=\"item\"\r\n (itemChange)=\"onItemLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n <!-- part filter -->\r\n @if (itemParts.length) {\r\n <mat-form-field>\r\n <mat-label>part</mat-label>\r\n <mat-select [formControl]=\"itemPart\">\r\n <mat-option [value]=\"null\">(any)</mat-option>\r\n @for (p of itemParts; track p) {\r\n <mat-option [value]=\"p\">{{\r\n p.typeId | flatLookup : modelEntries : \"id\" : \"value\"\r\n }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </fieldset>\r\n }\r\n <!-- BY TYPE -->\r\n @if (byTypeMode.value) {\r\n <div>\r\n <!-- par type filter -->\r\n @if (partTypeKeys.length) {\r\n <mat-form-field>\r\n <mat-label>part type</mat-label>\r\n <mat-select [formControl]=\"partTypeKey\">\r\n @for (k of partTypeKeys; track k) {\r\n <mat-option [value]=\"k\">{{ k }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n }\r\n <!-- PIN -->\r\n @if (partTypeKey.value) {\r\n <div>\r\n <!-- pin lookup -->\r\n <cadmus-ref-lookup\r\n [service]=\"pinLookupService\"\r\n [baseFilter]=\"filter\"\r\n [options]=\"pinFilterOptions\"\r\n label=\"pin\"\r\n (itemChange)=\"onPinLookupChange($event)\"\r\n ></cadmus-ref-lookup>\r\n </div>\r\n }\r\n <!-- data -->\r\n @if (lookupData?.pin?.name) {\r\n <mat-expansion-panel id=\"data\">\r\n <mat-expansion-panel-header>pin data</mat-expansion-panel-header>\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <th></th>\r\n <th>source</th>\r\n <th>value</th>\r\n </thead>\r\n <tbody>\r\n <!-- pin -->\r\n @if (lookupData?.pin?.value) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>pin</td>\r\n <td>{{ lookupData!.pin.value }}</td>\r\n </tr>\r\n }\r\n <!-- item ID -->\r\n @if (lookupData?.pin?.itemId) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.itemId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item ID</td>\r\n <td>{{ lookupData!.pin.itemId }}</td>\r\n </tr>\r\n }\r\n <!-- item title -->\r\n @if (lookupData?.item?.title) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.item!.title\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>item title</td>\r\n <td>{{ lookupData!.item!.title }}</td>\r\n </tr>\r\n }\r\n <!-- part ID -->\r\n @if (lookupData?.pin?.partId) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part ID</td>\r\n <td>{{ lookupData!.pin.partId }}</td>\r\n </tr>\r\n }\r\n <!-- part type ID -->\r\n @if (lookupData?.pin?.partTypeId) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.partTypeId\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part type ID</td>\r\n <td>{{ lookupData!.pin!.partTypeId }}</td>\r\n </tr>\r\n }\r\n <!-- part role ID -->\r\n @if (lookupData?.pin?.roleId) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"lookupData!.pin!.roleId!\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td>part role ID</td>\r\n <td>{{ lookupData!.pin!.roleId }}</td>\r\n </tr>\r\n }\r\n <!-- part's metadata -->\r\n @for ( m of lookupData?.metaPart?.metadata || []; track m; let i =\r\n $index) {\r\n <tr>\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [cdkCopyToClipboard]=\"m.value\"\r\n (cdkCopyToClipboardCopied)=\"onCopied()\"\r\n >\r\n <mat-icon class=\"mat-primary\">content_copy</mat-icon>\r\n </button>\r\n </td>\r\n <td class=\"metadata\">{{ m.name }}</td>\r\n <td class=\"metadata\">{{ m.value }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </mat-expansion-panel>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- buttons -->\r\n <div class=\"button-row\">\r\n <button mat-icon-button type=\"button\" (click)=\"close()\">\r\n <mat-icon color=\"warn\" class=\"mat-warn\">close</mat-icon>\r\n </button>\r\n <button mat-flat-button type=\"submit\" [disabled]=\"form.invalid\">\r\n <mat-icon>check_circle</mat-icon>\r\n target\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".metadata{color:#4a3001}.info{border:1px solid silver;border-radius:6px;background-color:silver;color:#fff;padding:4px;margin:8px 0}.info .label{background-color:#fff;color:silver;margin:0 6px}#data{margin:8px 0}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.button-row{display:flex;align-items:center;flex-wrap:wrap}.label{border:1px solid silver;border-radius:6px;padding:4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 8px;margin-bottom:8px}legend{color:silver}\n"] }]
452
452
  }], ctorParameters: () => [{ type: undefined, decorators: [{
453
453
  type: Inject,
454
454
  args: ['indexLookupDefinitions']
@@ -477,4 +477,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
477
477
  }], extLookupConfigChange: [{
478
478
  type: Output
479
479
  }] } });
480
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvcGluLXRhcmdldC1sb29rdXAvcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvcGluLXRhcmdldC1sb29rdXAvcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUVMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsUUFBUSxFQUNSLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQVlkLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1B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T0FDbEIscUJBQXFCOzsyRkFHWix3QkFBd0I7a0JBckJwQyxTQUFTO2lDQUNJLElBQUksWUFDTiwwQkFBMEIsV0FHM0I7d0JBQ1AsV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGtCQUFrQjt3QkFDbEIsa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIscUJBQXFCO3FCQUN0Qjs7MEJBd0hFLE1BQU07MkJBQUMsd0JBQXdCOzJOQTNHdkIsYUFBYTtzQkFEdkIsS0FBSztnQkFpQkMsYUFBYTtzQkFEbkIsS0FBSztnQkFPQyxhQUFhO3NCQURuQixLQUFLO2dCQVdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFNQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBUUMsZUFBZTtzQkFEckIsS0FBSztnQkFPSyxNQUFNO3NCQURoQixLQUFLO2dCQWdCQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBT1UsV0FBVztzQkFEMUIsTUFBTTtnQkFPUyxZQUFZO3NCQUQzQixNQUFNO2dCQUlTLGNBQWM7c0JBRDdCLE1BQU07Z0JBSVMscUJBQXFCO3NCQURwQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICBTdWJzY3JpcHRpb24sXHJcbiAgZGVib3VuY2VUaW1lLFxyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZvcmtKb2luLFxyXG4gIHRha2UsXHJcbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBJdGVtU2VydmljZSwgVGhlc2F1cnVzU2VydmljZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtYXBpJztcclxuaW1wb3J0IHtcclxuICBEYXRhUGluSW5mbyxcclxuICBJbmRleExvb2t1cERlZmluaXRpb24sXHJcbiAgSW5kZXhMb29rdXBEZWZpbml0aW9ucyxcclxuICBJdGVtLFxyXG4gIFBhcnQsXHJcbiAgVGhlc2F1cnVzRW50cnksXHJcbn0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1jb3JlJztcclxuXHJcbmltcG9ydCB7IENsaXBib2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuXHJcbmltcG9ydCB7IE5nVG9vbHNNb2R1bGUgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5pbXBvcnQge1xyXG4gIFJlZkxvb2t1cENvbXBvbmVudCxcclxuICBSZWZMb29rdXBDb25maWcsXHJcbiAgUmVmTG9va3VwU2V0Q29tcG9uZW50LFxyXG4gIFJlZkxvb2t1cFNldEV2ZW50LFxyXG59IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtcmVmcy1sb29rdXAnO1xyXG5cclxuaW1wb3J0IHtcclxuICBQaW5SZWZMb29rdXBGaWx0ZXIsXHJcbiAgUGluUmVmTG9va3VwU2VydmljZSxcclxufSBmcm9tICcuLi9zZXJ2aWNlcy9waW4tcmVmLWxvb2t1cC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSXRlbVJlZkxvb2t1cFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9pdGVtLXJlZi1sb29rdXAuc2VydmljZSc7XHJcblxyXG4vLyBmcm9tIENhZG11cyBnZW5lcmFsIHBhcnRzXHJcbmNvbnN0IE1FVEFEQVRBX1BBUlRfSUQgPSAnaXQudmVkcGgubWV0YWRhdGEnO1xyXG5pbnRlcmZhY2UgTWV0YWRhdGFQYXJ0IGV4dGVuZHMgUGFydCB7XHJcbiAgbWV0YWRhdGE6IHtcclxuICAgIHR5cGU/OiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1bXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBpbiBsb29rdXAgZGF0YSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBvbmVudC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGluTG9va3VwRGF0YSB7XHJcbiAgcGluOiBEYXRhUGluSW5mbztcclxuICBpdGVtPzogSXRlbTtcclxuICBtZXRhUGFydD86IE1ldGFkYXRhUGFydDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcGluLWJhc2VkIHRhcmdldC4gVGhpcyBpbmNsdWRlcyBwaW4ncyBuYW1lIGFuZCB2YWx1ZSwgYW5kXHJcbiAqIHRoZSBpdGVtJ3MgSUQgYW5kIG9wdGlvbmFsIHBhcnQgSURzLiBUaGUgbGFiZWwgaXMgYSB1c2VyIGZyaWVuZGx5XHJcbiAqIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGFyZ2V0LCB3aGlsZSB0aGUgZ2lkIGlzIGEgZ2xvYmFsbHlcclxuICogdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0YXJnZXQuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBpblRhcmdldCB7XHJcbiAgZ2lkOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBpdGVtSWQ/OiBzdHJpbmc7XHJcbiAgcGFydElkPzogc3RyaW5nO1xyXG4gIHBhcnRUeXBlSWQ/OiBzdHJpbmc7XHJcbiAgcm9sZUlkPzogc3RyaW5nO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgdmFsdWU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qXHJcbiAqIFNjb3BlZCBwaW4tYmFzZWQgbG9va3VwIGNvbXBvbmVudC4gVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBsaXN0XHJcbiAqIG9mIHBpbi1iYXNlZCBzZWFyY2hlcywgd2l0aCBhIGxvb2t1cCBjb250cm9sLiBXaGVuZXZlciB0aGUgdXNlclxyXG4gKiBwaWNrcyBhIHBpbiB2YWx1ZSwgaGUgZ2V0cyB0aGUgZGV0YWlscyBhYm91dCBpdHMgaXRlbSBhbmQgcGFydCwgYW5kXHJcbiAqIGl0ZW0ncyBtZXRhZGF0YSBwYXJ0LCBpZiBhbnkuIEhlIGNhbiB0aGVuIHVzZSB0aGVzZSBkYXRhIHRvIGJ1aWxkXHJcbiAqIHNvbWUgRUlEIGJ5IHZhcmlvdXNseSBhc3NlbWJsaW5nIHRoZXNlIGNvbXBvbmVudHMuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHNlbGVjdG9yOiAnY2FkbXVzLXBpbi10YXJnZXQtbG9va3VwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Bpbi10YXJnZXQtbG9va3VwLmNvbXBvbmVudC5jc3MnXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBDbGlwYm9hcmRNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdEV4cGFuc2lvbk1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE5nVG9vbHNNb2R1bGUsXHJcbiAgICBSZWZMb29rdXBDb21wb25lbnQsXHJcbiAgICBSZWZMb29rdXBTZXRDb21wb25lbnQsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBpblRhcmdldExvb2t1cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXTtcclxuICBwcml2YXRlIF90YXJnZXQ6IFBpblRhcmdldCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9ub1RhcmdldFVwZGF0ZT86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfc3RhcnRXaXRoQnlUeXBlTW9kZT86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgd2hlbiB0aGUgYnktdHlwZSBwaW4gbG9va3VwIG1vZGUgaXMgYWN0aXZlLlxyXG4gICAqIFVzZXIgY2FuIGNoYW5nZSBtb2RlIHVubGVzcyBtb2RlU3dpdGNoaW5nIGlzIGZhbHNlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBwaW5CeVR5cGVNb2RlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuYnlUeXBlTW9kZT8udmFsdWU7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgcGluQnlUeXBlTW9kZSh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCF0aGlzLmJ5VHlwZU1vZGUpIHtcclxuICAgICAgdGhpcy5fc3RhcnRXaXRoQnlUeXBlTW9kZSA9IHZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ieVR5cGVNb2RlLnNldFZhbHVlKHZhbHVlIHx8IGZhbHNlKTtcclxuICAgICAgdGhpcy5ieVR5cGVNb2RlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gc3dpdGNoIGJldHdlZW4gYnktdHlwZSBhbmQgYnktaXRlbSBtb2RlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGNhblN3aXRjaE1vZGU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gZWRpdCB0aGUgdGFyZ2V0J3MgZ2lkL2xhYmVsIGZvciBpbnRlcm5hbFxyXG4gICAqIHRhcmdldHMuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY2FuRWRpdFRhcmdldD86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogVGhlIGxvb2t1cCBkZWZpbml0aW9ucyB0byBiZSB1c2VkIGZvciB0aGUgYnktdHlwZSBsb29rdXAuIElmXHJcbiAgICogbm90IHNwZWNpZmllZCwgdGhlIGxvb2t1cCBkZWZpbml0aW9ucyB3aWxsIGJlIGdvdCB2aWEgaW5qZWN0aW9uXHJcbiAgICogd2hlbiBhdmFpbGFibGU7IGlmIHRoZSBpbmplY3RlZCBkZWZpbml0aW9ucyBhcmUgZW1wdHksIHRoZVxyXG4gICAqIGxvb2t1cCBkZWZpbml0aW9ucyB3aWxsIGJlIGJ1aWx0IGZyb20gdGhlIG1vZGVsLXR5cGVzIHRoZXNhdXJ1cztcclxuICAgKiBpZiB0aGlzIGlzIG5vdCBhdmFpbGFibGUgZWl0aGVyLCB0aGUgYnktdHlwZSBsb29rdXAgd2lsbCBiZVxyXG4gICAqIGRpc2FibGVkLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGxvb2t1cERlZmluaXRpb25zPzogSW5kZXhMb29rdXBEZWZpbml0aW9ucztcclxuICAvKipcclxuICAgKiBUaGUgb3B0aW9uYWwgY29uZmlndXJhdGlvbnMgZm9yIHVzaW5nIGV4dGVybmFsIGxvb2t1cCBzZXJ2aWNlcy5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBleHRMb29rdXBDb25maWdzOiBSZWZMb29rdXBDb25maWdbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVHJ1ZSBpZiB3aGVuIGEgbmV3IHRhcmdldCBpcyBzZXQgaXQgc2hvdWxkIGJlIGludGVybmFsIHJhdGhlciB0aGFuXHJcbiAgICogZXh0ZXJuYWwgYnkgZGVmYXVsdC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpbnRlcm5hbERlZmF1bHQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0YXJnZXQgdG8gYmUgZWRpdGVkLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCB0YXJnZXQoKTogUGluVGFyZ2V0IHwgdW5kZWZpbmVkIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0O1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHRhcmdldCh2YWx1ZTogUGluVGFyZ2V0IHwgdW5kZWZpbmVkIHwgbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuX3RhcmdldCA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGFyZ2V0ID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtKHRoaXMuX3RhcmdldCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgcGFydCB0eXBlIGtleSB3aGVuIHRoZSBieS10eXBlIG1vZGUgaXMgYWN0aXZlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlZmF1bHRQYXJ0VHlwZUtleT86IHN0cmluZyB8IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbiB1c2VyIGNsb3NlcyB0aGUgZWRpdG9yLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBlZGl0b3JDbG9zZTogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuZXZlciB0aGUgdGFyZ2V0IGNoYW5nZXMuXHJcbiAgICogVGhlIGV2ZW50J3MgdmFsdWUgaXMgdGhlIG5ldyB0YXJnZXQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldENoYW5nZTogRXZlbnRFbWl0dGVyPFBpblRhcmdldD47XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBleHRNb3JlUmVxdWVzdDogRXZlbnRFbWl0dGVyPFJlZkxvb2t1cFNldEV2ZW50PjtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGV4dExvb2t1cENvbmZpZ0NoYW5nZTogRXZlbnRFbWl0dGVyPFJlZkxvb2t1cENvbmZpZz47XHJcblxyXG4gIC8vIGJ5IHR5cGVcclxuICBwdWJsaWMgbW9kZWxFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdO1xyXG4gIHB1YmxpYyBwYXJ0VHlwZUtleXM6IHN0cmluZ1tdO1xyXG4gIC8vIGJ5IGl0ZW1cclxuICBwdWJsaWMgaXRlbVBhcnRzOiBQYXJ0W107XHJcbiAgLy8gZm9ybSAtIGJ5IGl0ZW1cclxuICBwdWJsaWMgaXRlbTogRm9ybUNvbnRyb2w8SXRlbSB8IG51bGw+O1xyXG4gIHB1YmxpYyBpdGVtUGFydDogRm9ybUNvbnRyb2w8UGFydCB8IG51bGw+O1xyXG4gIC8vIGZvcm0gLSBieSB0eXBlXHJcbiAgcHVibGljIHBhcnRUeXBlS2V5OiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICAvLyBmb3JtIC0gYm90aFxyXG4gIHB1YmxpYyBnaWQ6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBsYWJlbDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGJ5VHlwZU1vZGU6IEZvcm1Db250cm9sPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyBleHRlcm5hbDogRm9ybUNvbnRyb2w8Ym9vbGVhbj47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIGZpbHRlcjogUGluUmVmTG9va3VwRmlsdGVyO1xyXG4gIHB1YmxpYyBwaW5GaWx0ZXJPcHRpb25zPzogSW5kZXhMb29rdXBEZWZpbml0aW9uO1xyXG4gIHB1YmxpYyBsb29rdXBEYXRhPzogUGluTG9va3VwRGF0YTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KCdpbmRleExvb2t1cERlZmluaXRpb25zJylcclxuICAgIHByaXZhdGUgX3ByZXNldExvb2t1cERlZnM6IEluZGV4TG9va3VwRGVmaW5pdGlvbnMsXHJcbiAgICBwdWJsaWMgaXRlbUxvb2t1cFNlcnZpY2U6IEl0ZW1SZWZMb29rdXBTZXJ2aWNlLFxyXG4gICAgcHVibGljIHBpbkxvb2t1cFNlcnZpY2U6IFBpblJlZkxvb2t1cFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90aGVzU2VydmljZTogVGhlc2F1cnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NuYWNrYmFyOiBNYXRTbmFja0JhcixcclxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlclxyXG4gICkge1xyXG4gICAgdGhpcy5wYXJ0VHlwZUtleXMgPSBbXTtcclxuICAgIHRoaXMuaXRlbVBhcnRzID0gW107XHJcbiAgICB0aGlzLl9zdWJzID0gW107XHJcbiAgICB0aGlzLm1vZGVsRW50cmllcyA9IFtdO1xyXG4gICAgdGhpcy5leHRMb29rdXBDb25maWdzID0gW107XHJcbiAgICAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IGZpbHRlciBmb3IgdGhlIHBpbiBsb29rdXAsIHdoaWNoIHdpbGxcclxuICAgIC8vIGJlIG1lcmdlZCB3aXRoIHZhbHVlcyBwcm92aWRlZCBieSB1c2VyIGhlcmVcclxuICAgIHRoaXMuZmlsdGVyID0ge1xyXG4gICAgICB0ZXh0OiAnJyxcclxuICAgICAgbGltaXQ6IDEwLFxyXG4gICAgfTtcclxuICAgIC8vIGZvcm1cclxuICAgIHRoaXMuaXRlbSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCk7XHJcbiAgICB0aGlzLml0ZW1QYXJ0ID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKTtcclxuICAgIHRoaXMucGFydFR5cGVLZXkgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwpO1xyXG4gICAgdGhpcy5naWQgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcclxuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzAwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5sYWJlbCA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCgzMDApLFxyXG4gICAgXSk7XHJcbiAgICB0aGlzLmJ5VHlwZU1vZGUgPSBmb3JtQnVpbGRlci5jb250cm9sKGZhbHNlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5leHRlcm5hbCA9IGZvcm1CdWlsZGVyLmNvbnRyb2woZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGl0ZW06IHRoaXMuaXRlbSxcclxuICAgICAgaXRlbVBhcnQ6IHRoaXMuaXRlbVBhcnQsXHJcbiAgICAgIHBhcnRUeXBlS2V5OiB0aGlzLnBhcnRUeXBlS2V5LFxyXG4gICAgICBnaWQ6IHRoaXMuZ2lkLFxyXG4gICAgICBsYWJlbDogdGhpcy5sYWJlbCxcclxuICAgICAgYnlUeXBlTW9kZTogdGhpcy5ieVR5cGVNb2RlLFxyXG4gICAgICBleHRlcm5hbDogdGhpcy5leHRlcm5hbCxcclxuICAgIH0pO1xyXG4gICAgLy8gZXZlbnRzXHJcbiAgICB0aGlzLnRhcmdldENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGluVGFyZ2V0PigpO1xyXG4gICAgdGhpcy5lZGl0b3JDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgdGhpcy5leHRNb3JlUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVmTG9va3VwU2V0RXZlbnQ+KCk7XHJcbiAgICB0aGlzLmV4dExvb2t1cENvbmZpZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVmTG9va3VwQ29uZmlnPigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JjZUJ5SXRlbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucGluQnlUeXBlTW9kZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5jYW5Td2l0Y2hNb2RlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwS2V5cygpOiB2b2lkIHtcclxuICAgIC8vIHVzZSBESSBwcmVzZXRzIGlmIG5vIGxvb2t1cCBkZWZpbml0aW9uc1xyXG4gICAgaWYgKCF0aGlzLmxvb2t1cERlZmluaXRpb25zKSB7XHJcbiAgICAgIHRoaXMubG9va3VwRGVmaW5pdGlvbnMgPSB0aGlzLl9wcmVzZXRMb29rdXBEZWZzO1xyXG4gICAgfVxyXG4gICAgLy8ga2V5cyBhcmUgYWxsIHRoZSBkZWZpbmVkIGxvb2t1cCBzZWFyY2hlc1xyXG4gICAgdGhpcy5wYXJ0VHlwZUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmxvb2t1cERlZmluaXRpb25zKTtcclxuXHJcbiAgICAvLyBpZiBubyBrZXlzLCBnZXQgdGhlbSBmcm9tIHRoZXNhdXJ1cyBtb2RlbC10eXBlcztcclxuICAgIC8vIGlmIHRoaXMgaXMgbm90IGF2YWlsYWJsZSwganVzdCBmb3JjZSBieSBpdGVtIG1vZGUuXHJcbiAgICBpZiAoIXRoaXMucGFydFR5cGVLZXlzLmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5tb2RlbEVudHJpZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgIC8vIHNldCBsb29rdXBEZWZpbml0aW9ucyBmcm9tIHRoZXNhdXJ1cyBlbnRyaWVzXHJcbiAgICAgICAgdGhpcy5sb29rdXBEZWZpbml0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMubW9kZWxFbnRyaWVzLmZvckVhY2goKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9va3VwRGVmaW5pdGlvbnMhW2UudmFsdWVdID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBlLnZhbHVlLFxyXG4gICAgICAgICAgICB0eXBlSWQ6IGUuaWQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIHNldCB0eXBlIGtleXMgZnJvbSB0aGVzYXVydXMgZW50cmllc1xyXG4gICAgICAgIHRoaXMucGFydFR5cGVLZXlzID0gdGhpcy5tb2RlbEVudHJpZXMubWFwKChlKSA9PiBlLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHN0aWxsIG5vIGtleXMsIGZvcmNlIGJ5IGl0ZW0gbW9kZVxyXG4gICAgaWYgKCF0aGlzLnBhcnRUeXBlS2V5cy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5mb3JjZUJ5SXRlbSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gc2V0IGRlZmF1bHQga2V5XHJcbiAgICAgIHRoaXMucGFydFR5cGVLZXkuc2V0VmFsdWUoXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0UGFydFR5cGVLZXkgfHwgdGhpcy5wYXJ0VHlwZUtleXNbMF1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIHNldCBzdGFydCBtb2RlIGlmIHJlcXVpcmVkXHJcbiAgICBpZiAodGhpcy5fc3RhcnRXaXRoQnlUeXBlTW9kZSkge1xyXG4gICAgICB0aGlzLmJ5VHlwZU1vZGUuc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbmV2ZXIgaXRlbSBjaGFuZ2VzLCB1cGRhdGUgaXRlbSdzIHBhcnRzIGFuZCBmaWx0ZXJcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5pdGVtLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHRoaXMuaXRlbVBhcnQuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICB0aGlzLml0ZW1QYXJ0cyA9IGl0ZW0/LnBhcnRzIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXIgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZmlsdGVyLFxyXG4gICAgICAgICAgICBpdGVtSWQ6IGl0ZW0/LmlkLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyB3aGVuZXZlciBpdGVtUGFydCBjaGFuZ2VzLCB1cGRhdGUgdGFyZ2V0IGFuZCBldmVudHVhbGx5IGdpZFxyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLml0ZW1QYXJ0LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHBhcnQpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5naWQudmFsdWUgfHwgdGhpcy5naWQucHJpc3RpbmUpIHtcclxuICAgICAgICAgICAgdGhpcy5naWQuc2V0VmFsdWUodGhpcy5idWlsZEdpZCgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZmlsdGVyID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmZpbHRlcixcclxuICAgICAgICAgICAgcGFydElkOiBwYXJ0Py5pZCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIHdoZW5ldmVyIHBhcnRUeXBlS2V5IGNoYW5nZXMsIHVwZGF0ZSBmaWx0ZXIncyBvcHRpb25zXHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMucGFydFR5cGVLZXkudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoa2V5KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBpbkZpbHRlck9wdGlvbnMgPSBrZXlcclxuICAgICAgICAgICAgPyB0aGlzLmxvb2t1cERlZmluaXRpb25zIVtrZXldXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIHdoZW5ldmVyIGV4dGVybmFsIGNoYW5nZXMsIHNldCByZXF1aXJlZCB2YWxpZGF0b3IgaW4gbGFiZWxcclxuICAgIC8vICh0cnVlIGZvciBleHRlcm5hbCwgZmFsc2UgZm9yIGludGVybmFsKVxyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLmV4dGVybmFsLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGV4dGVybmFsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZXh0ZXJuYWwpIHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5zZXRWYWxpZGF0b3JzKFtcclxuICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCksXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLm1heExlbmd0aCgzMDApXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBsb2FkIG1vZGVsLXR5cGVzIHRoZXNhdXJ1cyBlbnRyaWVzXHJcbiAgICB0aGlzLl90aGVzU2VydmljZS5nZXRUaGVzYXVydXMoJ21vZGVsLXR5cGVzJywgdHJ1ZSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHQpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGVsRW50cmllcyA9IHQuZW50cmllcyB8fCBbXTtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbEVudHJpZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5zZXR1cEtleXMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5mb3JjZUJ5SXRlbSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmZvcmNlQnlJdGVtKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc3Vicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLl9zdWJzW2ldLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkR2lkKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgLy8gdGhlIEdJRCBpcyB0aGUgcGFydCBJRCBpZiBhbnksIG9yIHRoZSBpdGVtIElELCBmb2xsb3dlZCBieVxyXG4gICAgLy8gdGhlIHBpbidzIHZhbHVlICg9RUlEKVxyXG4gICAgY29uc3QgcGluID0gdGhpcy5sb29rdXBEYXRhPy5waW47XHJcbiAgICBpZiAoIXBpbj8udmFsdWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGluLnBhcnRJZFxyXG4gICAgICA/IGBQJHtwaW4ucGFydElkfS8ke3Bpbi52YWx1ZX1gXHJcbiAgICAgIDogYEkke3Bpbi5pdGVtSWR9LyR7cGluLnZhbHVlfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkTGFiZWwoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubG9va3VwRGF0YT8ucGluKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2I6IHN0cmluZ1tdID0gW107XHJcbiAgICAvLyBwaW4gdmFsdWVcclxuICAgIGlmICh0aGlzLmxvb2t1cERhdGEucGluLnZhbHVlKSB7XHJcbiAgICAgIHNiLnB1c2godGhpcy5sb29rdXBEYXRhLnBpbi52YWx1ZSk7XHJcbiAgICAgIHNiLnB1c2goJyB8ICcpO1xyXG4gICAgfVxyXG4gICAgLy8gaXRlbSB0aXRsZVxyXG4gICAgc2IucHVzaCh0aGlzLmxvb2t1cERhdGEuaXRlbT8udGl0bGUgfHwgdGhpcy5sb29rdXBEYXRhLnBpbj8uaXRlbUlkKTtcclxuICAgIC8vIHBhcnQgdHlwZSBhbmQgcm9sZVxyXG4gICAgaWYgKHRoaXMubG9va3VwRGF0YS5waW4ucGFydFR5cGVJZCkge1xyXG4gICAgICBjb25zdCBlID0gdGhpcy5tb2RlbEVudHJpZXM/LmZpbmQoXHJcbiAgICAgICAgKGUpID0+IGUuaWQgPT09IHRoaXMubG9va3VwRGF0YSEucGluLnBhcnRUeXBlSWRcclxuICAgICAgKTtcclxuICAgICAgc2IucHVzaCgnICgnKTtcclxuICAgICAgc2IucHVzaChlPy52YWx1ZSB8fCB0aGlzLmxvb2t1cERhdGEucGluLnBhcnRUeXBlSWQpO1xyXG4gICAgICBpZiAodGhpcy5sb29rdXBEYXRhLnBpbi5yb2xlSWQpIHtcclxuICAgICAgICBzYi5wdXNoKGAsICR7dGhpcy5sb29rdXBEYXRhLnBpbi5yb2xlSWR9YCk7XHJcbiAgICAgIH1cclxuICAgICAgc2IucHVzaCgnKScpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNiLmpvaW4oJycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUYXJnZXQoKTogUGluVGFyZ2V0IHtcclxuICAgIGlmICh0aGlzLmV4dGVybmFsLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZ2lkOiB0aGlzLmdpZC52YWx1ZSB8fCAnJyxcclxuICAgICAgICBsYWJlbDogdGhpcy5sYWJlbC52YWx1ZSB8fCAnJyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHBpbiA9IHRoaXMubG9va3VwRGF0YT8ucGluO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGdpZDogdGhpcy5naWQudmFsdWUgfHwgJycsXHJcbiAgICAgICAgbGFiZWw6IHRoaXMubGFiZWwudmFsdWUgfHwgJycsXHJcbiAgICAgICAgaXRlbUlkOiBwaW4/Lml0ZW1JZCB8fCAnJyxcclxuICAgICAgICBwYXJ0SWQ6IHBpbj8ucGFydElkIHx8ICcnLFxyXG4gICAgICAgIHBhcnRUeXBlSWQ6IHBpbj8ucGFydFR5cGVJZCB8fCAnJyxcclxuICAgICAgICByb2xlSWQ6IHBpbj8ucm9sZUlkIHx8ICcnLFxyXG4gICAgICAgIG5hbWU6IHBpbj8ubmFtZSB8fCAnJyxcclxuICAgICAgICB2YWx1ZTogcGluPy52YWx1ZSB8fCAnJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGFyZ2V0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX25vVGFyZ2V0VXBkYXRlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5leHRlcm5hbC52YWx1ZSkge1xyXG4gICAgICB0aGlzLmdpZC5zZXRWYWx1ZSh0aGlzLmJ1aWxkR2lkKCkpO1xyXG4gICAgICB0aGlzLmdpZC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuZ2lkLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgIHRoaXMubGFiZWwuc2V0VmFsdWUodGhpcy5idWlsZExhYmVsKCkpO1xyXG4gICAgICB0aGlzLmxhYmVsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5sYWJlbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybSh0YXJnZXQ/OiBQaW5UYXJnZXQpOiB2b2lkIHtcclxuICAgIC8vIGJ1aWxkIHBpbiBpbmZvIGZyb20gdGFyZ2V0XHJcbiAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICB0aGlzLmxvb2t1cERhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuaXRlbS5yZXNldCgpO1xyXG4gICAgICB0aGlzLml0ZW1QYXJ0LnJlc2V0KCk7XHJcbiAgICAgIHRoaXMuZ2lkLnJlc2V0KCk7XHJcbiAgICAgIHRoaXMubGFiZWwucmVzZXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbm9UYXJnZXRVcGRhdGUgPSB0cnVlO1xyXG4gICAgdGhpcy5naWQuc2V0VmFsdWUodGFyZ2V0LmdpZCB8fCAnJyk7XHJcbiAgICB0aGlzLmxhYmVsLnNldFZhbHVlKHRhcmdldC5sYWJlbCB8fCAnJyk7XHJcbiAgICB0aGlzLmxvb2t1cERhdGEgPSB7XHJcbiAgICAgIHBpbjoge1xyXG4gICAgICAgIGl0ZW1JZDogdGFyZ2V0Lml0ZW1JZCB8fCAnJyxcclxuICAgICAgICBwYXJ0SWQ6IHRhcmdldC5wYXJ0SWQgfHwgJycsXHJcbiAgICAgICAgcGFydFR5cGVJZDogdGFyZ2V0LnBhcnRUeXBlSWQgfHwgJycsXHJcbiAgICAgICAgcm9sZUlkOiB0YXJnZXQucm9sZUlkIHx8ICcnLFxyXG4gICAgICAgIG5hbWU6IHRhcmdldC5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHZhbHVlOiB0YXJnZXQudmFsdWUgfHwgJycsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgLy8gZ2V0IGl0ZW1cclxuICAgIGlmICh0YXJnZXQuaXRlbUlkKSB7XHJcbiAgICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmdldEl0ZW0odGFyZ2V0Lml0ZW1JZCwgdHJ1ZSwgdHJ1ZSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pdGVtLnNldFZhbHVlKGl0ZW0pO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICB0aGlzLl9ub1RhcmdldFVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5leHRlcm5hbC5zZXRWYWx1ZSghdGFyZ2V0Lm5hbWUpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVUYXJnZXQoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmV4dGVybmFsLnNldFZhbHVlKCF0YXJnZXQubmFtZSk7XHJcbiAgICAgICAgICB0aGlzLl9ub1RhcmdldFVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5leHRlcm5hbC5zZXRWYWx1ZSghdGFyZ2V0Lm5hbWUgJiYgIXRoaXMuaW50ZXJuYWxEZWZhdWx0KTtcclxuICAgICAgdGhpcy5fbm9UYXJnZXRVcGRhdGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy51cGRhdGVUYXJnZXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBpdGVtIGxvb2t1cCBjaGFuZ2VzIChpdGVtIGlzIGxvb2tlZCB1cFxyXG4gICAqIGJ5IGl0cyB0aXRsZSkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSBnb3QgZnJvbSBsb29rdXAuXHJcbiAgICovXHJcbiAgcHVibGljIG9uSXRlbUxvb2t1cENoYW5nZShpdGVtOiBJdGVtKTogdm9pZCB7XHJcbiAgICAvLyBsb2FkIGl0ZW0ncyBwYXJ0c1xyXG4gICAgdGhpcy5faXRlbVNlcnZpY2UuZ2V0SXRlbShpdGVtLmlkLCB0cnVlLCB0cnVlKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoaSkgPT4ge1xyXG4gICAgICAgIC8vIHNldHRpbmcgdGhlIGl0ZW0gd2lsbCB0cmlnZ2VyIGl0cyBwYXJ0cyB1cGRhdGVcclxuICAgICAgICB0aGlzLml0ZW0uc2V0VmFsdWUoaSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYXJnZXQoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1QYXJ0LnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuaXRlbVBhcnRzID0gW107XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYXJnZXQoKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkSXRlbUluZm8ocGluOiBEYXRhUGluSW5mbyk6IHZvaWQge1xyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICBpdGVtOiB0aGlzLl9pdGVtU2VydmljZS5nZXRJdGVtKHBpbi5pdGVtSWQsIGZhbHNlLCB0cnVlKSxcclxuICAgICAgcGFydDogdGhpcy5faXRlbVNlcnZpY2UuZ2V0UGFydEZyb21UeXBlQW5kUm9sZShcclxuICAgICAgICBwaW4uaXRlbUlkLFxyXG4gICAgICAgIE1FVEFEQVRBX1BBUlRfSUQsXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKSxcclxuICAgIH0pXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9va3VwRGF0YSA9IHtcclxuICAgICAgICAgICAgcGluOiBwaW4sXHJcbiAgICAgICAgICAgIGl0ZW06IHJlc3VsdC5pdGVtISxcclxuICAgICAgICAgICAgbWV0YVBhcnQ6IHJlc3VsdC5wYXJ0IGFzIE1ldGFkYXRhUGFydCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb29rdXBEYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgZXJyb3IgPyBKU09OLnN0cmluZ2lmeShlcnJvcikgOiAnRXJyb3IgbG9hZGluZyBpdGVtL21ldGFkYXRhJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwaW4gbG9va3VwIGNoYW5nZS4gQSBwaW4gaXMgbG9va2VkIHVwIGJ5IGl0c1xyXG4gICAqIG5hbWUgYW5kIHZhbHVlICg9dGhlIGZpbHRlcidzIHRleHQpLCBhbmQgb3B0aW9uYWxseSBieTpcclxuICAgKiAtIGl0cyBpbmRleCBsb29rdXAgZGVmaW5pdGlvbiAoc2VsZWN0ZWQgYnkgcGFydFR5cGVLZXkpLlxyXG4gICAqIC0gaXRzIGl0ZW0gKGRlZmluZWQgYnkgaXRlbSwgaW4gZmlsdGVyKS5cclxuICAgKiAtIGl0cyBwYXJ0IChkZWZpbmVkIGJ5IGl0ZW1QYXJ0LCBpbiBmaWx0ZXIpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGluZm8gVGhlIHBpbiBpbmZvIGZyb20gcGluIGxvb2t1cC5cclxuICAgKi9cclxuICBwdWJsaWMgb25QaW5Mb29rdXBDaGFuZ2UoaW5mbzogRGF0YVBpbkluZm8pOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZEl0ZW1JbmZvKGluZm8pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRXh0SXRlbUNoYW5nZShldmVudDogUmVmTG9va3VwU2V0RXZlbnQpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmdpZC5zZXRWYWx1ZShldmVudC5pdGVtSWQpO1xyXG4gICAgICB0aGlzLmdpZC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuZ2lkLm1hcmtBc0RpcnR5KCk7XHJcblxyXG4gICAgICB0aGlzLmxhYmVsLnNldFZhbHVlKGV2ZW50Lml0ZW1MYWJlbCk7XHJcbiAgICAgIHRoaXMubGFiZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB0aGlzLmxhYmVsLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkV4dE1vcmVSZXF1ZXN0KGV2ZW50OiBSZWZMb29rdXBTZXRFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5leHRNb3JlUmVxdWVzdC5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNvcGllZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NuYWNrYmFyLm9wZW4oJ0NvcGllZCB0byBjbGlwYm9hcmQnLCAnT0snLCB7XHJcbiAgICAgIGR1cmF0aW9uOiAxNTAwLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FeHRDb25maWdDaGFuZ2UoY29uZmlnOiBSZWZMb29rdXBDb25maWcpOiB2b2lkIHtcclxuICAgIHRoaXMuZXh0TG9va3VwQ29uZmlnQ2hhbmdlLmVtaXQoY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdG9yQ2xvc2UuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXQoKTtcclxuICAgIHRoaXMudGFyZ2V0Q2hhbmdlLmVtaXQodGhpcy5fdGFyZ2V0KTtcclxuICB9XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgPCEtLSBleHRlcm5hbCAtLT5cbiAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbF09XCJleHRlcm5hbFwiPmV4dGVybmFsPC9tYXQtY2hlY2tib3g+XG4gICAgPCEtLSBtb2RlIHN3aXRjaGVyIC0tPlxuICAgIEBpZiAoIWV4dGVybmFsLnZhbHVlKSB7XG4gICAgPGRpdj5cbiAgICAgIEBpZiAoY2FuU3dpdGNoTW9kZSkge1xuICAgICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xdPVwiYnlUeXBlTW9kZVwiPiBieSB0eXBlPC9tYXQtY2hlY2tib3g+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICA8IS0tIGxhYmVsIC0tPlxuICAgIDxkaXY+XG4gICAgICBAaWYgKGV4dGVybmFsLnZhbHVlIHx8IGNhbkVkaXRUYXJnZXQpIHtcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1sYWJlbD5sYWJlbDwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImxhYmVsXCIgLz5cbiAgICAgICAgQGlmICgkYW55KGxhYmVsKS5lcnJvcnM/LnJlcXVpcmVkICYmIChsYWJlbC5kaXJ0eSB8fCBsYWJlbC50b3VjaGVkKSkge1xuICAgICAgICA8bWF0LWVycm9yPmxhYmVsIHJlcXVpcmVkPC9tYXQtZXJyb3I+XG4gICAgICAgIH0gQGlmICggJGFueShsYWJlbCkuZXJyb3JzPy5tYXhMZW5ndGggJiYgKGxhYmVsLmRpcnR5IHx8IGxhYmVsLnRvdWNoZWQpXG4gICAgICAgICkge1xuICAgICAgICA8bWF0LWVycm9yPmxhYmVsIHRvbyBsb25nPC9tYXQtZXJyb3I+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICB9IEBpZiAoIWV4dGVybmFsLnZhbHVlICYmICFjYW5FZGl0VGFyZ2V0ICYmIGxhYmVsLnZhbHVlKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5mb1wiPjxzcGFuIGNsYXNzPVwibGFiZWxcIj5sYWJlbDwvc3Bhbj57eyBsYWJlbC52YWx1ZSB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBnaWQgLS0+XG4gICAgPGRpdj5cbiAgICAgIEBpZiAoZXh0ZXJuYWwudmFsdWUgfHwgY2FuRWRpdFRhcmdldCkge1xuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsPkdJRDwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImdpZFwiIC8+XG4gICAgICAgIEBpZiAoJGFueShnaWQpLmVycm9ycz8ucmVxdWlyZWQgJiYgKGdpZC5kaXJ0eSB8fCBnaWQudG91Y2hlZCkpIHtcbiAgICAgICAgPG1hdC1lcnJvcj5HSUQgcmVxdWlyZWQ8L21hdC1lcnJvcj5cbiAgICAgICAgfSBAaWYgKCRhbnkoZ2lkKS5lcnJvcnM/Lm1heExlbmd0aCAmJiAoZ2lkLmRpcnR5IHx8IGdpZC50b3VjaGVkKSkge1xuICAgICAgICA8bWF0LWVycm9yPkdJRCB0b28gbG9uZzwvbWF0LWVycm9yPlxuICAgICAgICB9XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfSBAaWYgKCFleHRlcm5hbC52YWx1ZSAmJiAhY2FuRWRpdFRhcmdldCAmJiBnaWQudmFsdWUpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJpbmZvXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5HSUQ8L3NwYW4+IDxzcGFuIGNsYXNzPVwiZ2lkXCI+e3sgZ2lkLnZhbHVlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gZXh0ZXJuYWwgbG9va3VwIHNldCAtLT5cbiAgQGlmIChleHRlcm5hbC52YWx1ZSAmJiBleHRMb29rdXBDb25maWdzLmxlbmd0aCkge1xuICA8ZGl2PlxuICAgIDxjYWRtdXMtcmVmLWxvb2t1cC1zZXRcbiAgICAgIFtjb25maWdzXT1cImV4dExvb2t1cENvbmZpZ3NcIlxuICAgICAgKGl0ZW1DaGFuZ2UpPVwib25FeHRJdGVtQ2hhbmdlKCRldmVudClcIlxuICAgICAgKG1vcmVSZXF1ZXN0KT1cIm9uRXh0TW9yZVJlcXVlc3QoJGV2ZW50KVwiXG4gICAgICAoY29uZmlnQ2hhbmdlKT1cIm9uRXh0Q29uZmlnQ2hhbmdlKCRldmVudClcIlxuICAgID48L2NhZG11cy1yZWYtbG9va3VwLXNldD5cbiAgPC9kaXY+XG4gIH1cblxuICA8IS0tIEJZIElURU0gLS0+XG4gIEBpZiAoIWV4dGVybmFsLnZhbHVlKSB7XG4gIDxkaXY+XG4gICAgQGlmICghYnlUeXBlTW9kZS52YWx1ZSkge1xuICAgIDxmaWVsZHNldCBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICA8bGVnZW5kPnBpbiBmaWx0ZXJzPC9sZWdlbmQ+XG4gICAgICA8IS0tIGl0ZW0gZmlsdGVyIC0tPlxuICAgICAgPGNhZG11cy1yZWYtbG9va3VwXG4gICAgICAgIFtzZXJ2aWNlXT1cIml0ZW1Mb29rdXBTZXJ2aWNlXCJcbiAgICAgICAgbGFiZWw9XCJpdGVtXCJcbiAgICAgICAgKGl0ZW1DaGFuZ2UpPVwib25JdGVtTG9va3VwQ2hhbmdlKCRldmVudClcIlxuICAgICAgPjwvY2FkbXVzLXJlZi1sb29rdXA+XG4gICAgICA8IS0tIHBhcnQgZmlsdGVyIC0tPlxuICAgICAgQGlmIChpdGVtUGFydHMubGVuZ3RoKSB7XG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtbGFiZWw+cGFydDwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiaXRlbVBhcnRcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwibnVsbFwiPihhbnkpPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIEBmb3IgKHAgb2YgaXRlbVBhcnRzOyB0cmFjayBwKSB7XG4gICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInBcIj57e1xuICAgICAgICAgICAgcC50eXBlSWQgfCBmbGF0TG9va3VwIDogbW9kZWxFbnRyaWVzIDogXCJpZFwiIDogXCJ2YWx1ZVwiXG4gICAgICAgICAgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfVxuICAgIDwvZmllbGRzZXQ+XG4gICAgfVxuICAgIDwhLS0gQlkgVFlQRSAtLT5cbiAgICBAaWYgKGJ5VHlwZU1vZGUudmFsdWUpIHtcbiAgICA8ZGl2PlxuICAgICAgPCEtLSBwYXIgdHlwZSBmaWx0ZXIgLS0+XG4gICAgICBAaWYgKHBhcnRUeXBlS2V5cy5sZW5ndGgpIHtcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1sYWJlbD5wYXJ0IHR5cGU8L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInBhcnRUeXBlS2V5XCI+XG4gICAgICAgICAgQGZvciAoayBvZiBwYXJ0VHlwZUtleXM7IHRyYWNrIGspIHtcbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwia1wiPnt7IGsgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIH1cbiAgICA8IS0tIFBJTiAtLT5cbiAgICBAaWYgKHBhcnRUeXBlS2V5LnZhbHVlKSB7XG4gICAgPGRpdj5cbiAgICAgIDwhLS0gcGluIGxvb2t1cCAtLT5cbiAgICAgIDxjYWRtdXMtcmVmLWxvb2t1cFxuICAgICAgICBbc2VydmljZV09XCJwaW5Mb29rdXBTZXJ2aWNlXCJcbiAgICAgICAgW2Jhc2VGaWx0ZXJdPVwiZmlsdGVyXCJcbiAgICAgICAgW29wdGlvbnNdPVwicGluRmlsdGVyT3B0aW9uc1wiXG4gICAgICAgIGxhYmVsPVwicGluXCJcbiAgICAgICAgKGl0ZW1DaGFuZ2UpPVwib25QaW5Mb29rdXBDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+PC9jYWRtdXMtcmVmLWxvb2t1cD5cbiAgICA8L2Rpdj5cbiAgICB9XG4gICAgPCEtLSBkYXRhIC0tPlxuICAgIEBpZiAobG9va3VwRGF0YT8ucGluPy5uYW1lKSB7XG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwgaWQ9XCJkYXRhXCI+XG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+cGluIGRhdGE8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgPCEtLSB0YWJsZSAtLT5cbiAgICAgIDx0YWJsZT5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0aD48L3RoPlxuICAgICAgICAgIDx0aD5zb3VyY2U8L3RoPlxuICAgICAgICAgIDx0aD52YWx1ZTwvdGg+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8IS0tIHBpbiAtLT5cbiAgICAgICAgICBAaWYgKGxvb2t1cERhdGE/LnBpbj8udmFsdWUpIHtcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibG9va3VwRGF0YSEucGluIS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPnBpbjwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluLnZhbHVlIH19PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8IS0tIGl0ZW0gSUQgLS0+XG4gICAgICAgICAgQGlmIChsb29rdXBEYXRhPy5waW4/Lml0ZW1JZCkge1xuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLml0ZW1JZFwiXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPml0ZW0gSUQ8L3RkPlxuICAgICAgICAgICAgPHRkPnt7IGxvb2t1cERhdGEhLnBpbi5pdGVtSWQgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gaXRlbSB0aXRsZSAtLT5cbiAgICAgICAgICBAaWYgKGxvb2t1cERhdGE/Lml0ZW0/LnRpdGxlKSB7XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImxvb2t1cERhdGEhLml0ZW0hLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cIm9uQ29waWVkKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+aXRlbSB0aXRsZTwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEuaXRlbSEudGl0bGUgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gcGFydCBJRCAtLT5cbiAgICAgICAgICBAaWYgKGxvb2t1cERhdGE/LnBpbj8ucGFydElkKSB7XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImxvb2t1cERhdGEhLnBpbiEucGFydElkXCJcbiAgICAgICAgICAgICAgICAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cIm9uQ29waWVkKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+cGFydCBJRDwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluLnBhcnRJZCB9fTwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPCEtLSBwYXJ0IHR5cGUgSUQgLS0+XG4gICAgICAgICAgQGlmIChsb29rdXBEYXRhPy5waW4/LnBhcnRUeXBlSWQpIHtcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibG9va3VwRGF0YSEucGluIS5wYXJ0VHlwZUlkXCJcbiAgICAgICAgICAgICAgICAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cIm9uQ29waWVkKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+cGFydCB0eXBlIElEPC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyBsb29rdXBEYXRhIS5waW4hLnBhcnRUeXBlSWQgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gcGFydCByb2xlIElEIC0tPlxuICAgICAgICAgIEBpZiAobG9va3VwRGF0YT8ucGluPy5yb2xlSWQpIHtcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibG9va3VwRGF0YSEucGluIS5yb2xlSWQhXCJcbiAgICAgICAgICAgICAgICAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cIm9uQ29waWVkKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+cGFydCByb2xlIElEPC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyBsb29rdXBEYXRhIS5waW4hLnJvbGVJZCB9fTwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPCEtLSBwYXJ0J3MgbWV0YWRhdGEgLS0+XG4gICAgICAgICAgQGZvciAoIG0gb2YgbG9va3VwRGF0YT8ubWV0YVBhcnQ/Lm1ldGFkYXRhIHx8IFtdOyB0cmFjayBtOyBsZXQgaSA9XG4gICAgICAgICAgJGluZGV4KSB7XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cIm0udmFsdWVcIlxuICAgICAgICAgICAgICAgIChjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQpPVwib25Db3BpZWQoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1ldGFkYXRhXCI+e3sgbS5uYW1lIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1ldGFkYXRhXCI+e3sgbS52YWx1ZSB9fTwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICB9XG4gIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBidXR0b25zIC0tPlxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXJvd1wiPlxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgPG1hdC1pY29uIGNvbG9yPVwid2FyblwiIGNsYXNzPVwibWF0LXdhcm5cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIj5cbiAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgIHRhcmdldFxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
480
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvcGluLXRhcmdldC1sb29rdXAvcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvcGluLXRhcmdldC1sb29rdXAvcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUVMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsUUFBUSxFQUNSLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQVlkLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1B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T0FDbEIscUJBQXFCOzsyRkFHWix3QkFBd0I7a0JBckJwQyxTQUFTO2lDQUNJLElBQUksWUFDTiwwQkFBMEIsV0FHM0I7d0JBQ1AsV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGtCQUFrQjt3QkFDbEIsa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIscUJBQXFCO3FCQUN0Qjs7MEJBd0hFLE1BQU07MkJBQUMsd0JBQXdCOzJOQTNHdkIsYUFBYTtzQkFEdkIsS0FBSztnQkFpQkMsYUFBYTtzQkFEbkIsS0FBSztnQkFPQyxhQUFhO3NCQURuQixLQUFLO2dCQVdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFNQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBUUMsZUFBZTtzQkFEckIsS0FBSztnQkFPSyxNQUFNO3NCQURoQixLQUFLO2dCQWdCQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBT1UsV0FBVztzQkFEMUIsTUFBTTtnQkFPUyxZQUFZO3NCQUQzQixNQUFNO2dCQUlTLGNBQWM7c0JBRDdCLE1BQU07Z0JBSVMscUJBQXFCO3NCQURwQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICBTdWJzY3JpcHRpb24sXHJcbiAgZGVib3VuY2VUaW1lLFxyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZvcmtKb2luLFxyXG4gIHRha2UsXHJcbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBJdGVtU2VydmljZSwgVGhlc2F1cnVzU2VydmljZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtYXBpJztcclxuaW1wb3J0IHtcclxuICBEYXRhUGluSW5mbyxcclxuICBJbmRleExvb2t1cERlZmluaXRpb24sXHJcbiAgSW5kZXhMb29rdXBEZWZpbml0aW9ucyxcclxuICBJdGVtLFxyXG4gIFBhcnQsXHJcbiAgVGhlc2F1cnVzRW50cnksXHJcbn0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1jb3JlJztcclxuXHJcbmltcG9ydCB7IENsaXBib2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuXHJcbmltcG9ydCB7IE5nVG9vbHNNb2R1bGUgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5pbXBvcnQge1xyXG4gIFJlZkxvb2t1cENvbXBvbmVudCxcclxuICBSZWZMb29rdXBDb25maWcsXHJcbiAgUmVmTG9va3VwU2V0Q29tcG9uZW50LFxyXG4gIFJlZkxvb2t1cFNldEV2ZW50LFxyXG59IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtcmVmcy1sb29rdXAnO1xyXG5cclxuaW1wb3J0IHtcclxuICBQaW5SZWZMb29rdXBGaWx0ZXIsXHJcbiAgUGluUmVmTG9va3VwU2VydmljZSxcclxufSBmcm9tICcuLi9zZXJ2aWNlcy9waW4tcmVmLWxvb2t1cC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSXRlbVJlZkxvb2t1cFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9pdGVtLXJlZi1sb29rdXAuc2VydmljZSc7XHJcblxyXG4vLyBmcm9tIENhZG11cyBnZW5lcmFsIHBhcnRzXHJcbmNvbnN0IE1FVEFEQVRBX1BBUlRfSUQgPSAnaXQudmVkcGgubWV0YWRhdGEnO1xyXG5pbnRlcmZhY2UgTWV0YWRhdGFQYXJ0IGV4dGVuZHMgUGFydCB7XHJcbiAgbWV0YWRhdGE6IHtcclxuICAgIHR5cGU/OiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1bXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBpbiBsb29rdXAgZGF0YSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBvbmVudC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGluTG9va3VwRGF0YSB7XHJcbiAgcGluOiBEYXRhUGluSW5mbztcclxuICBpdGVtPzogSXRlbTtcclxuICBtZXRhUGFydD86IE1ldGFkYXRhUGFydDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcGluLWJhc2VkIHRhcmdldC4gVGhpcyBpbmNsdWRlcyBwaW4ncyBuYW1lIGFuZCB2YWx1ZSwgYW5kXHJcbiAqIHRoZSBpdGVtJ3MgSUQgYW5kIG9wdGlvbmFsIHBhcnQgSURzLiBUaGUgbGFiZWwgaXMgYSB1c2VyIGZyaWVuZGx5XHJcbiAqIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGFyZ2V0LCB3aGlsZSB0aGUgZ2lkIGlzIGEgZ2xvYmFsbHlcclxuICogdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0YXJnZXQuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBpblRhcmdldCB7XHJcbiAgZ2lkOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBpdGVtSWQ/OiBzdHJpbmc7XHJcbiAgcGFydElkPzogc3RyaW5nO1xyXG4gIHBhcnRUeXBlSWQ/OiBzdHJpbmc7XHJcbiAgcm9sZUlkPzogc3RyaW5nO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgdmFsdWU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qXHJcbiAqIFNjb3BlZCBwaW4tYmFzZWQgbG9va3VwIGNvbXBvbmVudC4gVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBsaXN0XHJcbiAqIG9mIHBpbi1iYXNlZCBzZWFyY2hlcywgd2l0aCBhIGxvb2t1cCBjb250cm9sLiBXaGVuZXZlciB0aGUgdXNlclxyXG4gKiBwaWNrcyBhIHBpbiB2YWx1ZSwgaGUgZ2V0cyB0aGUgZGV0YWlscyBhYm91dCBpdHMgaXRlbSBhbmQgcGFydCwgYW5kXHJcbiAqIGl0ZW0ncyBtZXRhZGF0YSBwYXJ0LCBpZiBhbnkuIEhlIGNhbiB0aGVuIHVzZSB0aGVzZSBkYXRhIHRvIGJ1aWxkXHJcbiAqIHNvbWUgRUlEIGJ5IHZhcmlvdXNseSBhc3NlbWJsaW5nIHRoZXNlIGNvbXBvbmVudHMuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHNlbGVjdG9yOiAnY2FkbXVzLXBpbi10YXJnZXQtbG9va3VwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGluLXRhcmdldC1sb29rdXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Bpbi10YXJnZXQtbG9va3VwLmNvbXBvbmVudC5jc3MnXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBDbGlwYm9hcmRNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdEV4cGFuc2lvbk1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE5nVG9vbHNNb2R1bGUsXHJcbiAgICBSZWZMb29rdXBDb21wb25lbnQsXHJcbiAgICBSZWZMb29rdXBTZXRDb21wb25lbnQsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBpblRhcmdldExvb2t1cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXTtcclxuICBwcml2YXRlIF90YXJnZXQ6IFBpblRhcmdldCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9ub1RhcmdldFVwZGF0ZT86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfc3RhcnRXaXRoQnlUeXBlTW9kZT86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgd2hlbiB0aGUgYnktdHlwZSBwaW4gbG9va3VwIG1vZGUgaXMgYWN0aXZlLlxyXG4gICAqIFVzZXIgY2FuIGNoYW5nZSBtb2RlIHVubGVzcyBtb2RlU3dpdGNoaW5nIGlzIGZhbHNlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBwaW5CeVR5cGVNb2RlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuYnlUeXBlTW9kZT8udmFsdWU7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgcGluQnlUeXBlTW9kZSh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCF0aGlzLmJ5VHlwZU1vZGUpIHtcclxuICAgICAgdGhpcy5fc3RhcnRXaXRoQnlUeXBlTW9kZSA9IHZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ieVR5cGVNb2RlLnNldFZhbHVlKHZhbHVlIHx8IGZhbHNlKTtcclxuICAgICAgdGhpcy5ieVR5cGVNb2RlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gc3dpdGNoIGJldHdlZW4gYnktdHlwZSBhbmQgYnktaXRlbSBtb2RlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGNhblN3aXRjaE1vZGU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gZWRpdCB0aGUgdGFyZ2V0J3MgZ2lkL2xhYmVsIGZvciBpbnRlcm5hbFxyXG4gICAqIHRhcmdldHMuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY2FuRWRpdFRhcmdldD86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogVGhlIGxvb2t1cCBkZWZpbml0aW9ucyB0byBiZSB1c2VkIGZvciB0aGUgYnktdHlwZSBsb29rdXAuIElmXHJcbiAgICogbm90IHNwZWNpZmllZCwgdGhlIGxvb2t1cCBkZWZpbml0aW9ucyB3aWxsIGJlIGdvdCB2aWEgaW5qZWN0aW9uXHJcbiAgICogd2hlbiBhdmFpbGFibGU7IGlmIHRoZSBpbmplY3RlZCBkZWZpbml0aW9ucyBhcmUgZW1wdHksIHRoZVxyXG4gICAqIGxvb2t1cCBkZWZpbml0aW9ucyB3aWxsIGJlIGJ1aWx0IGZyb20gdGhlIG1vZGVsLXR5cGVzIHRoZXNhdXJ1cztcclxuICAgKiBpZiB0aGlzIGlzIG5vdCBhdmFpbGFibGUgZWl0aGVyLCB0aGUgYnktdHlwZSBsb29rdXAgd2lsbCBiZVxyXG4gICAqIGRpc2FibGVkLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGxvb2t1cERlZmluaXRpb25zPzogSW5kZXhMb29rdXBEZWZpbml0aW9ucztcclxuICAvKipcclxuICAgKiBUaGUgb3B0aW9uYWwgY29uZmlndXJhdGlvbnMgZm9yIHVzaW5nIGV4dGVybmFsIGxvb2t1cCBzZXJ2aWNlcy5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBleHRMb29rdXBDb25maWdzOiBSZWZMb29rdXBDb25maWdbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVHJ1ZSBpZiB3aGVuIGEgbmV3IHRhcmdldCBpcyBzZXQgaXQgc2hvdWxkIGJlIGludGVybmFsIHJhdGhlciB0aGFuXHJcbiAgICogZXh0ZXJuYWwgYnkgZGVmYXVsdC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpbnRlcm5hbERlZmF1bHQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0YXJnZXQgdG8gYmUgZWRpdGVkLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCB0YXJnZXQoKTogUGluVGFyZ2V0IHwgdW5kZWZpbmVkIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0O1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHRhcmdldCh2YWx1ZTogUGluVGFyZ2V0IHwgdW5kZWZpbmVkIHwgbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuX3RhcmdldCA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGFyZ2V0ID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtKHRoaXMuX3RhcmdldCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgcGFydCB0eXBlIGtleSB3aGVuIHRoZSBieS10eXBlIG1vZGUgaXMgYWN0aXZlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlZmF1bHRQYXJ0VHlwZUtleT86IHN0cmluZyB8IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbiB1c2VyIGNsb3NlcyB0aGUgZWRpdG9yLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBlZGl0b3JDbG9zZTogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuZXZlciB0aGUgdGFyZ2V0IGNoYW5nZXMuXHJcbiAgICogVGhlIGV2ZW50J3MgdmFsdWUgaXMgdGhlIG5ldyB0YXJnZXQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldENoYW5nZTogRXZlbnRFbWl0dGVyPFBpblRhcmdldD47XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBleHRNb3JlUmVxdWVzdDogRXZlbnRFbWl0dGVyPFJlZkxvb2t1cFNldEV2ZW50PjtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGV4dExvb2t1cENvbmZpZ0NoYW5nZTogRXZlbnRFbWl0dGVyPFJlZkxvb2t1cENvbmZpZz47XHJcblxyXG4gIC8vIGJ5IHR5cGVcclxuICBwdWJsaWMgbW9kZWxFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdO1xyXG4gIHB1YmxpYyBwYXJ0VHlwZUtleXM6IHN0cmluZ1tdO1xyXG4gIC8vIGJ5IGl0ZW1cclxuICBwdWJsaWMgaXRlbVBhcnRzOiBQYXJ0W107XHJcbiAgLy8gZm9ybSAtIGJ5IGl0ZW1cclxuICBwdWJsaWMgaXRlbTogRm9ybUNvbnRyb2w8SXRlbSB8IG51bGw+O1xyXG4gIHB1YmxpYyBpdGVtUGFydDogRm9ybUNvbnRyb2w8UGFydCB8IG51bGw+O1xyXG4gIC8vIGZvcm0gLSBieSB0eXBlXHJcbiAgcHVibGljIHBhcnRUeXBlS2V5OiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICAvLyBmb3JtIC0gYm90aFxyXG4gIHB1YmxpYyBnaWQ6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBsYWJlbDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGJ5VHlwZU1vZGU6IEZvcm1Db250cm9sPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyBleHRlcm5hbDogRm9ybUNvbnRyb2w8Ym9vbGVhbj47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIGZpbHRlcjogUGluUmVmTG9va3VwRmlsdGVyO1xyXG4gIHB1YmxpYyBwaW5GaWx0ZXJPcHRpb25zPzogSW5kZXhMb29rdXBEZWZpbml0aW9uO1xyXG4gIHB1YmxpYyBsb29rdXBEYXRhPzogUGluTG9va3VwRGF0YTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KCdpbmRleExvb2t1cERlZmluaXRpb25zJylcclxuICAgIHByaXZhdGUgX3ByZXNldExvb2t1cERlZnM6IEluZGV4TG9va3VwRGVmaW5pdGlvbnMsXHJcbiAgICBwdWJsaWMgaXRlbUxvb2t1cFNlcnZpY2U6IEl0ZW1SZWZMb29rdXBTZXJ2aWNlLFxyXG4gICAgcHVibGljIHBpbkxvb2t1cFNlcnZpY2U6IFBpblJlZkxvb2t1cFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90aGVzU2VydmljZTogVGhlc2F1cnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NuYWNrYmFyOiBNYXRTbmFja0JhcixcclxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlclxyXG4gICkge1xyXG4gICAgdGhpcy5wYXJ0VHlwZUtleXMgPSBbXTtcclxuICAgIHRoaXMuaXRlbVBhcnRzID0gW107XHJcbiAgICB0aGlzLl9zdWJzID0gW107XHJcbiAgICB0aGlzLm1vZGVsRW50cmllcyA9IFtdO1xyXG4gICAgdGhpcy5leHRMb29rdXBDb25maWdzID0gW107XHJcbiAgICAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IGZpbHRlciBmb3IgdGhlIHBpbiBsb29rdXAsIHdoaWNoIHdpbGxcclxuICAgIC8vIGJlIG1lcmdlZCB3aXRoIHZhbHVlcyBwcm92aWRlZCBieSB1c2VyIGhlcmVcclxuICAgIHRoaXMuZmlsdGVyID0ge1xyXG4gICAgICB0ZXh0OiAnJyxcclxuICAgICAgbGltaXQ6IDEwLFxyXG4gICAgfTtcclxuICAgIC8vIGZvcm1cclxuICAgIHRoaXMuaXRlbSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCk7XHJcbiAgICB0aGlzLml0ZW1QYXJ0ID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKTtcclxuICAgIHRoaXMucGFydFR5cGVLZXkgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwpO1xyXG4gICAgdGhpcy5naWQgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcclxuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzAwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5sYWJlbCA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCgzMDApLFxyXG4gICAgXSk7XHJcbiAgICB0aGlzLmJ5VHlwZU1vZGUgPSBmb3JtQnVpbGRlci5jb250cm9sKGZhbHNlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5leHRlcm5hbCA9IGZvcm1CdWlsZGVyLmNvbnRyb2woZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGl0ZW06IHRoaXMuaXRlbSxcclxuICAgICAgaXRlbVBhcnQ6IHRoaXMuaXRlbVBhcnQsXHJcbiAgICAgIHBhcnRUeXBlS2V5OiB0aGlzLnBhcnRUeXBlS2V5LFxyXG4gICAgICBnaWQ6IHRoaXMuZ2lkLFxyXG4gICAgICBsYWJlbDogdGhpcy5sYWJlbCxcclxuICAgICAgYnlUeXBlTW9kZTogdGhpcy5ieVR5cGVNb2RlLFxyXG4gICAgICBleHRlcm5hbDogdGhpcy5leHRlcm5hbCxcclxuICAgIH0pO1xyXG4gICAgLy8gZXZlbnRzXHJcbiAgICB0aGlzLnRhcmdldENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGluVGFyZ2V0PigpO1xyXG4gICAgdGhpcy5lZGl0b3JDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgdGhpcy5leHRNb3JlUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVmTG9va3VwU2V0RXZlbnQ+KCk7XHJcbiAgICB0aGlzLmV4dExvb2t1cENvbmZpZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVmTG9va3VwQ29uZmlnPigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JjZUJ5SXRlbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucGluQnlUeXBlTW9kZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5jYW5Td2l0Y2hNb2RlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwS2V5cygpOiB2b2lkIHtcclxuICAgIC8vIHVzZSBESSBwcmVzZXRzIGlmIG5vIGxvb2t1cCBkZWZpbml0aW9uc1xyXG4gICAgaWYgKCF0aGlzLmxvb2t1cERlZmluaXRpb25zKSB7XHJcbiAgICAgIHRoaXMubG9va3VwRGVmaW5pdGlvbnMgPSB0aGlzLl9wcmVzZXRMb29rdXBEZWZzO1xyXG4gICAgfVxyXG4gICAgLy8ga2V5cyBhcmUgYWxsIHRoZSBkZWZpbmVkIGxvb2t1cCBzZWFyY2hlc1xyXG4gICAgdGhpcy5wYXJ0VHlwZUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmxvb2t1cERlZmluaXRpb25zKTtcclxuXHJcbiAgICAvLyBpZiBubyBrZXlzLCBnZXQgdGhlbSBmcm9tIHRoZXNhdXJ1cyBtb2RlbC10eXBlcztcclxuICAgIC8vIGlmIHRoaXMgaXMgbm90IGF2YWlsYWJsZSwganVzdCBmb3JjZSBieSBpdGVtIG1vZGUuXHJcbiAgICBpZiAoIXRoaXMucGFydFR5cGVLZXlzLmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5tb2RlbEVudHJpZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgIC8vIHNldCBsb29rdXBEZWZpbml0aW9ucyBmcm9tIHRoZXNhdXJ1cyBlbnRyaWVzXHJcbiAgICAgICAgdGhpcy5sb29rdXBEZWZpbml0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMubW9kZWxFbnRyaWVzLmZvckVhY2goKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9va3VwRGVmaW5pdGlvbnMhW2UudmFsdWVdID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBlLnZhbHVlLFxyXG4gICAgICAgICAgICB0eXBlSWQ6IGUuaWQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIHNldCB0eXBlIGtleXMgZnJvbSB0aGVzYXVydXMgZW50cmllc1xyXG4gICAgICAgIHRoaXMucGFydFR5cGVLZXlzID0gdGhpcy5tb2RlbEVudHJpZXMubWFwKChlKSA9PiBlLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHN0aWxsIG5vIGtleXMsIGZvcmNlIGJ5IGl0ZW0gbW9kZVxyXG4gICAgaWYgKCF0aGlzLnBhcnRUeXBlS2V5cy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5mb3JjZUJ5SXRlbSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gc2V0IGRlZmF1bHQga2V5XHJcbiAgICAgIHRoaXMucGFydFR5cGVLZXkuc2V0VmFsdWUoXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0UGFydFR5cGVLZXkgfHwgdGhpcy5wYXJ0VHlwZUtleXNbMF1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIHNldCBzdGFydCBtb2RlIGlmIHJlcXVpcmVkXHJcbiAgICBpZiAodGhpcy5fc3RhcnRXaXRoQnlUeXBlTW9kZSkge1xyXG4gICAgICB0aGlzLmJ5VHlwZU1vZGUuc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbmV2ZXIgaXRlbSBjaGFuZ2VzLCB1cGRhdGUgaXRlbSdzIHBhcnRzIGFuZCBmaWx0ZXJcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5pdGVtLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHRoaXMuaXRlbVBhcnQuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICB0aGlzLml0ZW1QYXJ0cyA9IGl0ZW0/LnBhcnRzIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXIgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZmlsdGVyLFxyXG4gICAgICAgICAgICBpdGVtSWQ6IGl0ZW0/LmlkLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyB3aGVuZXZlciBpdGVtUGFydCBjaGFuZ2VzLCB1cGRhdGUgdGFyZ2V0IGFuZCBldmVudHVhbGx5IGdpZFxyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLml0ZW1QYXJ0LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHBhcnQpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5naWQudmFsdWUgfHwgdGhpcy5naWQucHJpc3RpbmUpIHtcclxuICAgICAgICAgICAgdGhpcy5naWQuc2V0VmFsdWUodGhpcy5idWlsZEdpZCgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZmlsdGVyID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmZpbHRlcixcclxuICAgICAgICAgICAgcGFydElkOiBwYXJ0Py5pZCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIHdoZW5ldmVyIHBhcnRUeXBlS2V5IGNoYW5nZXMsIHVwZGF0ZSBmaWx0ZXIncyBvcHRpb25zXHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMucGFydFR5cGVLZXkudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoa2V5KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBpbkZpbHRlck9wdGlvbnMgPSBrZXlcclxuICAgICAgICAgICAgPyB0aGlzLmxvb2t1cERlZmluaXRpb25zIVtrZXldXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIHdoZW5ldmVyIGV4dGVybmFsIGNoYW5nZXMsIHNldCByZXF1aXJlZCB2YWxpZGF0b3IgaW4gbGFiZWxcclxuICAgIC8vICh0cnVlIGZvciBleHRlcm5hbCwgZmFsc2UgZm9yIGludGVybmFsKVxyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLmV4dGVybmFsLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGV4dGVybmFsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZXh0ZXJuYWwpIHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5zZXRWYWxpZGF0b3JzKFtcclxuICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCksXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLm1heExlbmd0aCgzMDApXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBsb2FkIG1vZGVsLXR5cGVzIHRoZXNhdXJ1cyBlbnRyaWVzXHJcbiAgICB0aGlzLl90aGVzU2VydmljZS5nZXRUaGVzYXVydXMoJ21vZGVsLXR5cGVzJywgdHJ1ZSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHQpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGVsRW50cmllcyA9IHQuZW50cmllcyB8fCBbXTtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbEVudHJpZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5zZXR1cEtleXMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5mb3JjZUJ5SXRlbSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmZvcmNlQnlJdGVtKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc3Vicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLl9zdWJzW2ldLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkR2lkKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgLy8gdGhlIEdJRCBpcyB0aGUgcGFydCBJRCBpZiBhbnksIG9yIHRoZSBpdGVtIElELCBmb2xsb3dlZCBieVxyXG4gICAgLy8gdGhlIHBpbidzIHZhbHVlICg9RUlEKVxyXG4gICAgY29uc3QgcGluID0gdGhpcy5sb29rdXBEYXRhPy5waW47XHJcbiAgICBpZiAoIXBpbj8udmFsdWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGluLnBhcnRJZFxyXG4gICAgICA/IGBQJHtwaW4ucGFydElkfS8ke3Bpbi52YWx1ZX1gXHJcbiAgICAgIDogYEkke3Bpbi5pdGVtSWR9LyR7cGluLnZhbHVlfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkTGFiZWwoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubG9va3VwRGF0YT8ucGluKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2I6IHN0cmluZ1tdID0gW107XHJcbiAgICAvLyBwaW4gdmFsdWVcclxuICAgIGlmICh0aGlzLmxvb2t1cERhdGEucGluLnZhbHVlKSB7XHJcbiAgICAgIHNiLnB1c2godGhpcy5sb29rdXBEYXRhLnBpbi52YWx1ZSk7XHJcbiAgICAgIHNiLnB1c2goJyB8ICcpO1xyXG4gICAgfVxyXG4gICAgLy8gaXRlbSB0aXRsZVxyXG4gICAgc2IucHVzaCh0aGlzLmxvb2t1cERhdGEuaXRlbT8udGl0bGUgfHwgdGhpcy5sb29rdXBEYXRhLnBpbj8uaXRlbUlkKTtcclxuICAgIC8vIHBhcnQgdHlwZSBhbmQgcm9sZVxyXG4gICAgaWYgKHRoaXMubG9va3VwRGF0YS5waW4ucGFydFR5cGVJZCkge1xyXG4gICAgICBjb25zdCBlID0gdGhpcy5tb2RlbEVudHJpZXM/LmZpbmQoXHJcbiAgICAgICAgKGUpID0+IGUuaWQgPT09IHRoaXMubG9va3VwRGF0YSEucGluLnBhcnRUeXBlSWRcclxuICAgICAgKTtcclxuICAgICAgc2IucHVzaCgnICgnKTtcclxuICAgICAgc2IucHVzaChlPy52YWx1ZSB8fCB0aGlzLmxvb2t1cERhdGEucGluLnBhcnRUeXBlSWQpO1xyXG4gICAgICBpZiAodGhpcy5sb29rdXBEYXRhLnBpbi5yb2xlSWQpIHtcclxuICAgICAgICBzYi5wdXNoKGAsICR7dGhpcy5sb29rdXBEYXRhLnBpbi5yb2xlSWR9YCk7XHJcbiAgICAgIH1cclxuICAgICAgc2IucHVzaCgnKScpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNiLmpvaW4oJycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUYXJnZXQoKTogUGluVGFyZ2V0IHtcclxuICAgIGlmICh0aGlzLmV4dGVybmFsLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZ2lkOiB0aGlzLmdpZC52YWx1ZSB8fCAnJyxcclxuICAgICAgICBsYWJlbDogdGhpcy5sYWJlbC52YWx1ZSB8fCAnJyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHBpbiA9IHRoaXMubG9va3VwRGF0YT8ucGluO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGdpZDogdGhpcy5naWQudmFsdWUgfHwgJycsXHJcbiAgICAgICAgbGFiZWw6IHRoaXMubGFiZWwudmFsdWUgfHwgJycsXHJcbiAgICAgICAgaXRlbUlkOiBwaW4/Lml0ZW1JZCB8fCAnJyxcclxuICAgICAgICBwYXJ0SWQ6IHBpbj8ucGFydElkIHx8ICcnLFxyXG4gICAgICAgIHBhcnRUeXBlSWQ6IHBpbj8ucGFydFR5cGVJZCB8fCAnJyxcclxuICAgICAgICByb2xlSWQ6IHBpbj8ucm9sZUlkIHx8ICcnLFxyXG4gICAgICAgIG5hbWU6IHBpbj8ubmFtZSB8fCAnJyxcclxuICAgICAgICB2YWx1ZTogcGluPy52YWx1ZSB8fCAnJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGFyZ2V0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX25vVGFyZ2V0VXBkYXRlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5leHRlcm5hbC52YWx1ZSkge1xyXG4gICAgICB0aGlzLmdpZC5zZXRWYWx1ZSh0aGlzLmJ1aWxkR2lkKCkpO1xyXG4gICAgICB0aGlzLmdpZC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuZ2lkLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgIHRoaXMubGFiZWwuc2V0VmFsdWUodGhpcy5idWlsZExhYmVsKCkpO1xyXG4gICAgICB0aGlzLmxhYmVsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5sYWJlbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybSh0YXJnZXQ/OiBQaW5UYXJnZXQpOiB2b2lkIHtcclxuICAgIC8vIGJ1aWxkIHBpbiBpbmZvIGZyb20gdGFyZ2V0XHJcbiAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICB0aGlzLmxvb2t1cERhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuaXRlbS5yZXNldCgpO1xyXG4gICAgICB0aGlzLml0ZW1QYXJ0LnJlc2V0KCk7XHJcbiAgICAgIHRoaXMuZ2lkLnJlc2V0KCk7XHJcbiAgICAgIHRoaXMubGFiZWwucmVzZXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbm9UYXJnZXRVcGRhdGUgPSB0cnVlO1xyXG4gICAgdGhpcy5naWQuc2V0VmFsdWUodGFyZ2V0LmdpZCB8fCAnJyk7XHJcbiAgICB0aGlzLmxhYmVsLnNldFZhbHVlKHRhcmdldC5sYWJlbCB8fCAnJyk7XHJcbiAgICB0aGlzLmxvb2t1cERhdGEgPSB7XHJcbiAgICAgIHBpbjoge1xyXG4gICAgICAgIGl0ZW1JZDogdGFyZ2V0Lml0ZW1JZCB8fCAnJyxcclxuICAgICAgICBwYXJ0SWQ6IHRhcmdldC5wYXJ0SWQgfHwgJycsXHJcbiAgICAgICAgcGFydFR5cGVJZDogdGFyZ2V0LnBhcnRUeXBlSWQgfHwgJycsXHJcbiAgICAgICAgcm9sZUlkOiB0YXJnZXQucm9sZUlkIHx8ICcnLFxyXG4gICAgICAgIG5hbWU6IHRhcmdldC5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHZhbHVlOiB0YXJnZXQudmFsdWUgfHwgJycsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgLy8gZ2V0IGl0ZW1cclxuICAgIGlmICh0YXJnZXQuaXRlbUlkKSB7XHJcbiAgICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmdldEl0ZW0odGFyZ2V0Lml0ZW1JZCwgdHJ1ZSwgdHJ1ZSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pdGVtLnNldFZhbHVlKGl0ZW0pO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICB0aGlzLl9ub1RhcmdldFVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5leHRlcm5hbC5zZXRWYWx1ZSghdGFyZ2V0Lm5hbWUpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVUYXJnZXQoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmV4dGVybmFsLnNldFZhbHVlKCF0YXJnZXQubmFtZSk7XHJcbiAgICAgICAgICB0aGlzLl9ub1RhcmdldFVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5leHRlcm5hbC5zZXRWYWx1ZSghdGFyZ2V0Lm5hbWUgJiYgIXRoaXMuaW50ZXJuYWxEZWZhdWx0KTtcclxuICAgICAgdGhpcy5fbm9UYXJnZXRVcGRhdGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy51cGRhdGVUYXJnZXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBpdGVtIGxvb2t1cCBjaGFuZ2VzIChpdGVtIGlzIGxvb2tlZCB1cFxyXG4gICAqIGJ5IGl0cyB0aXRsZSkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSBnb3QgZnJvbSBsb29rdXAuXHJcbiAgICovXHJcbiAgcHVibGljIG9uSXRlbUxvb2t1cENoYW5nZShpdGVtOiBJdGVtKTogdm9pZCB7XHJcbiAgICAvLyBsb2FkIGl0ZW0ncyBwYXJ0c1xyXG4gICAgdGhpcy5faXRlbVNlcnZpY2UuZ2V0SXRlbShpdGVtLmlkLCB0cnVlLCB0cnVlKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoaSkgPT4ge1xyXG4gICAgICAgIC8vIHNldHRpbmcgdGhlIGl0ZW0gd2lsbCB0cmlnZ2VyIGl0cyBwYXJ0cyB1cGRhdGVcclxuICAgICAgICB0aGlzLml0ZW0uc2V0VmFsdWUoaSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYXJnZXQoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1QYXJ0LnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuaXRlbVBhcnRzID0gW107XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYXJnZXQoKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkSXRlbUluZm8ocGluOiBEYXRhUGluSW5mbyk6IHZvaWQge1xyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICBpdGVtOiB0aGlzLl9pdGVtU2VydmljZS5nZXRJdGVtKHBpbi5pdGVtSWQsIGZhbHNlLCB0cnVlKSxcclxuICAgICAgcGFydDogdGhpcy5faXRlbVNlcnZpY2UuZ2V0UGFydEZyb21UeXBlQW5kUm9sZShcclxuICAgICAgICBwaW4uaXRlbUlkLFxyXG4gICAgICAgIE1FVEFEQVRBX1BBUlRfSUQsXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKSxcclxuICAgIH0pXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9va3VwRGF0YSA9IHtcclxuICAgICAgICAgICAgcGluOiBwaW4sXHJcbiAgICAgICAgICAgIGl0ZW06IHJlc3VsdC5pdGVtISxcclxuICAgICAgICAgICAgbWV0YVBhcnQ6IHJlc3VsdC5wYXJ0IGFzIE1ldGFkYXRhUGFydCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb29rdXBEYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgZXJyb3IgPyBKU09OLnN0cmluZ2lmeShlcnJvcikgOiAnRXJyb3IgbG9hZGluZyBpdGVtL21ldGFkYXRhJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwaW4gbG9va3VwIGNoYW5nZS4gQSBwaW4gaXMgbG9va2VkIHVwIGJ5IGl0c1xyXG4gICAqIG5hbWUgYW5kIHZhbHVlICg9dGhlIGZpbHRlcidzIHRleHQpLCBhbmQgb3B0aW9uYWxseSBieTpcclxuICAgKiAtIGl0cyBpbmRleCBsb29rdXAgZGVmaW5pdGlvbiAoc2VsZWN0ZWQgYnkgcGFydFR5cGVLZXkpLlxyXG4gICAqIC0gaXRzIGl0ZW0gKGRlZmluZWQgYnkgaXRlbSwgaW4gZmlsdGVyKS5cclxuICAgKiAtIGl0cyBwYXJ0IChkZWZpbmVkIGJ5IGl0ZW1QYXJ0LCBpbiBmaWx0ZXIpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGluZm8gVGhlIHBpbiBpbmZvIGZyb20gcGluIGxvb2t1cC5cclxuICAgKi9cclxuICBwdWJsaWMgb25QaW5Mb29rdXBDaGFuZ2UoaW5mbzogRGF0YVBpbkluZm8pOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZEl0ZW1JbmZvKGluZm8pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRXh0SXRlbUNoYW5nZShldmVudDogUmVmTG9va3VwU2V0RXZlbnQpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmdpZC5zZXRWYWx1ZShldmVudC5pdGVtSWQpO1xyXG4gICAgICB0aGlzLmdpZC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuZ2lkLm1hcmtBc0RpcnR5KCk7XHJcblxyXG4gICAgICB0aGlzLmxhYmVsLnNldFZhbHVlKGV2ZW50Lml0ZW1MYWJlbCk7XHJcbiAgICAgIHRoaXMubGFiZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB0aGlzLmxhYmVsLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkV4dE1vcmVSZXF1ZXN0KGV2ZW50OiBSZWZMb29rdXBTZXRFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5leHRNb3JlUmVxdWVzdC5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNvcGllZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NuYWNrYmFyLm9wZW4oJ0NvcGllZCB0byBjbGlwYm9hcmQnLCAnT0snLCB7XHJcbiAgICAgIGR1cmF0aW9uOiAxNTAwLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FeHRDb25maWdDaGFuZ2UoY29uZmlnOiBSZWZMb29rdXBDb25maWcpOiB2b2lkIHtcclxuICAgIHRoaXMuZXh0TG9va3VwQ29uZmlnQ2hhbmdlLmVtaXQoY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdG9yQ2xvc2UuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXQoKTtcclxuICAgIHRoaXMudGFyZ2V0Q2hhbmdlLmVtaXQodGhpcy5fdGFyZ2V0KTtcclxuICB9XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgIDwhLS0gZXh0ZXJuYWwgLS0+XHJcbiAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbF09XCJleHRlcm5hbFwiPmV4dGVybmFsPC9tYXQtY2hlY2tib3g+XHJcbiAgICA8IS0tIG1vZGUgc3dpdGNoZXIgLS0+XHJcbiAgICBAaWYgKCFleHRlcm5hbC52YWx1ZSkge1xyXG4gICAgPGRpdj5cclxuICAgICAgQGlmIChjYW5Td2l0Y2hNb2RlKSB7XHJcbiAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImJ5VHlwZU1vZGVcIj4gYnkgdHlwZTwvbWF0LWNoZWNrYm94PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8IS0tIGxhYmVsIC0tPlxyXG4gICAgPGRpdj5cclxuICAgICAgQGlmIChleHRlcm5hbC52YWx1ZSB8fCBjYW5FZGl0VGFyZ2V0KSB7XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8bWF0LWxhYmVsPmxhYmVsPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJsYWJlbFwiIC8+XHJcbiAgICAgICAgQGlmICgkYW55KGxhYmVsKS5lcnJvcnM/LnJlcXVpcmVkICYmIChsYWJlbC5kaXJ0eSB8fCBsYWJlbC50b3VjaGVkKSkge1xyXG4gICAgICAgIDxtYXQtZXJyb3I+bGFiZWwgcmVxdWlyZWQ8L21hdC1lcnJvcj5cclxuICAgICAgICB9IEBpZiAoICRhbnkobGFiZWwpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChsYWJlbC5kaXJ0eSB8fCBsYWJlbC50b3VjaGVkKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgIDxtYXQtZXJyb3I+bGFiZWwgdG9vIGxvbmc8L21hdC1lcnJvcj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIH0gQGlmICghZXh0ZXJuYWwudmFsdWUgJiYgIWNhbkVkaXRUYXJnZXQgJiYgbGFiZWwudmFsdWUpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImluZm9cIj48c3BhbiBjbGFzcz1cImxhYmVsXCI+bGFiZWw8L3NwYW4+e3sgbGFiZWwudmFsdWUgfX08L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBnaWQgLS0+XHJcbiAgICA8ZGl2PlxyXG4gICAgICBAaWYgKGV4dGVybmFsLnZhbHVlIHx8IGNhbkVkaXRUYXJnZXQpIHtcclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+R0lEPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJnaWRcIiAvPlxyXG4gICAgICAgIEBpZiAoJGFueShnaWQpLmVycm9ycz8ucmVxdWlyZWQgJiYgKGdpZC5kaXJ0eSB8fCBnaWQudG91Y2hlZCkpIHtcclxuICAgICAgICA8bWF0LWVycm9yPkdJRCByZXF1aXJlZDwvbWF0LWVycm9yPlxyXG4gICAgICAgIH0gQGlmICgkYW55KGdpZCkuZXJyb3JzPy5tYXhMZW5ndGggJiYgKGdpZC5kaXJ0eSB8fCBnaWQudG91Y2hlZCkpIHtcclxuICAgICAgICA8bWF0LWVycm9yPkdJRCB0b28gbG9uZzwvbWF0LWVycm9yPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgfSBAaWYgKCFleHRlcm5hbC52YWx1ZSAmJiAhY2FuRWRpdFRhcmdldCAmJiBnaWQudmFsdWUpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImluZm9cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+R0lEPC9zcGFuPiA8c3BhbiBjbGFzcz1cImdpZFwiPnt7IGdpZC52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIGV4dGVybmFsIGxvb2t1cCBzZXQgLS0+XHJcbiAgQGlmIChleHRlcm5hbC52YWx1ZSAmJiBleHRMb29rdXBDb25maWdzLmxlbmd0aCkge1xyXG4gIDxkaXY+XHJcbiAgICA8Y2FkbXVzLXJlZi1sb29rdXAtc2V0XHJcbiAgICAgIFtjb25maWdzXT1cImV4dExvb2t1cENvbmZpZ3NcIlxyXG4gICAgICAoaXRlbUNoYW5nZSk9XCJvbkV4dEl0ZW1DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgIChtb3JlUmVxdWVzdCk9XCJvbkV4dE1vcmVSZXF1ZXN0KCRldmVudClcIlxyXG4gICAgICAoY29uZmlnQ2hhbmdlKT1cIm9uRXh0Q29uZmlnQ2hhbmdlKCRhbnkoJGV2ZW50KSlcIlxyXG4gICAgPjwvY2FkbXVzLXJlZi1sb29rdXAtc2V0PlxyXG4gIDwvZGl2PlxyXG4gIH1cclxuXHJcbiAgPCEtLSBCWSBJVEVNIC0tPlxyXG4gIEBpZiAoIWV4dGVybmFsLnZhbHVlKSB7XHJcbiAgPGRpdj5cclxuICAgIEBpZiAoIWJ5VHlwZU1vZGUudmFsdWUpIHtcclxuICAgIDxmaWVsZHNldCBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICAgIDxsZWdlbmQ+cGluIGZpbHRlcnM8L2xlZ2VuZD5cclxuICAgICAgPCEtLSBpdGVtIGZpbHRlciAtLT5cclxuICAgICAgPGNhZG11cy1yZWYtbG9va3VwXHJcbiAgICAgICAgW3NlcnZpY2VdPVwiaXRlbUxvb2t1cFNlcnZpY2VcIlxyXG4gICAgICAgIGxhYmVsPVwiaXRlbVwiXHJcbiAgICAgICAgKGl0ZW1DaGFuZ2UpPVwib25JdGVtTG9va3VwQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICA+PC9jYWRtdXMtcmVmLWxvb2t1cD5cclxuICAgICAgPCEtLSBwYXJ0IGZpbHRlciAtLT5cclxuICAgICAgQGlmIChpdGVtUGFydHMubGVuZ3RoKSB7XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8bWF0LWxhYmVsPnBhcnQ8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiaXRlbVBhcnRcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJudWxsXCI+KGFueSk8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICBAZm9yIChwIG9mIGl0ZW1QYXJ0czsgdHJhY2sgcCkge1xyXG4gICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInBcIj57e1xyXG4gICAgICAgICAgICBwLnR5cGVJZCB8IGZsYXRMb29rdXAgOiBtb2RlbEVudHJpZXMgOiBcImlkXCIgOiBcInZhbHVlXCJcclxuICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgfVxyXG4gICAgPC9maWVsZHNldD5cclxuICAgIH1cclxuICAgIDwhLS0gQlkgVFlQRSAtLT5cclxuICAgIEBpZiAoYnlUeXBlTW9kZS52YWx1ZSkge1xyXG4gICAgPGRpdj5cclxuICAgICAgPCEtLSBwYXIgdHlwZSBmaWx0ZXIgLS0+XHJcbiAgICAgIEBpZiAocGFydFR5cGVLZXlzLmxlbmd0aCkge1xyXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5wYXJ0IHR5cGU8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwicGFydFR5cGVLZXlcIj5cclxuICAgICAgICAgIEBmb3IgKGsgb2YgcGFydFR5cGVLZXlzOyB0cmFjayBrKSB7XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwia1wiPnt7IGsgfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIDwhLS0gUElOIC0tPlxyXG4gICAgQGlmIChwYXJ0VHlwZUtleS52YWx1ZSkge1xyXG4gICAgPGRpdj5cclxuICAgICAgPCEtLSBwaW4gbG9va3VwIC0tPlxyXG4gICAgICA8Y2FkbXVzLXJlZi1sb29rdXBcclxuICAgICAgICBbc2VydmljZV09XCJwaW5Mb29rdXBTZXJ2aWNlXCJcclxuICAgICAgICBbYmFzZUZpbHRlcl09XCJmaWx0ZXJcIlxyXG4gICAgICAgIFtvcHRpb25zXT1cInBpbkZpbHRlck9wdGlvbnNcIlxyXG4gICAgICAgIGxhYmVsPVwicGluXCJcclxuICAgICAgICAoaXRlbUNoYW5nZSk9XCJvblBpbkxvb2t1cENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgPjwvY2FkbXVzLXJlZi1sb29rdXA+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIDwhLS0gZGF0YSAtLT5cclxuICAgIEBpZiAobG9va3VwRGF0YT8ucGluPy5uYW1lKSB7XHJcbiAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBpZD1cImRhdGFcIj5cclxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPnBpbiBkYXRhPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgPCEtLSB0YWJsZSAtLT5cclxuICAgICAgPHRhYmxlPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgPHRoPnNvdXJjZTwvdGg+XHJcbiAgICAgICAgICA8dGg+dmFsdWU8L3RoPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPCEtLSBwaW4gLS0+XHJcbiAgICAgICAgICBAaWYgKGxvb2t1cERhdGE/LnBpbj8udmFsdWUpIHtcclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImxvb2t1cERhdGEhLnBpbiEudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5waW48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluLnZhbHVlIH19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8IS0tIGl0ZW0gSUQgLS0+XHJcbiAgICAgICAgICBAaWYgKGxvb2t1cERhdGE/LnBpbj8uaXRlbUlkKSB7XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLml0ZW1JZFwiXHJcbiAgICAgICAgICAgICAgICAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cIm9uQ29waWVkKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPml0ZW0gSUQ8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluLml0ZW1JZCB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgPCEtLSBpdGVtIHRpdGxlIC0tPlxyXG4gICAgICAgICAgQGlmIChsb29rdXBEYXRhPy5pdGVtPy50aXRsZSkge1xyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibG9va3VwRGF0YSEuaXRlbSEudGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5pdGVtIHRpdGxlPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IGxvb2t1cERhdGEhLml0ZW0hLnRpdGxlIH19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8IS0tIHBhcnQgSUQgLS0+XHJcbiAgICAgICAgICBAaWYgKGxvb2t1cERhdGE/LnBpbj8ucGFydElkKSB7XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLnBhcnRJZFwiXHJcbiAgICAgICAgICAgICAgICAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cIm9uQ29waWVkKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnBhcnQgSUQ8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluLnBhcnRJZCB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgPCEtLSBwYXJ0IHR5cGUgSUQgLS0+XHJcbiAgICAgICAgICBAaWYgKGxvb2t1cERhdGE/LnBpbj8ucGFydFR5cGVJZCkge1xyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwibG9va3VwRGF0YSEucGluIS5wYXJ0VHlwZUlkXCJcclxuICAgICAgICAgICAgICAgIChjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQpPVwib25Db3BpZWQoKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+cGFydCB0eXBlIElEPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IGxvb2t1cERhdGEhLnBpbiEucGFydFR5cGVJZCB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgPCEtLSBwYXJ0IHJvbGUgSUQgLS0+XHJcbiAgICAgICAgICBAaWYgKGxvb2t1cERhdGE/LnBpbj8ucm9sZUlkKSB7XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJsb29rdXBEYXRhIS5waW4hLnJvbGVJZCFcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5wYXJ0IHJvbGUgSUQ8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgbG9va3VwRGF0YSEucGluIS5yb2xlSWQgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDwhLS0gcGFydCdzIG1ldGFkYXRhIC0tPlxyXG4gICAgICAgICAgQGZvciAoIG0gb2YgbG9va3VwRGF0YT8ubWV0YVBhcnQ/Lm1ldGFkYXRhIHx8IFtdOyB0cmFjayBtOyBsZXQgaSA9XHJcbiAgICAgICAgICAkaW5kZXgpIHtcclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cIm0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgKGNka0NvcHlUb0NsaXBib2FyZENvcGllZCk9XCJvbkNvcGllZCgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1ldGFkYXRhXCI+e3sgbS5uYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibWV0YWRhdGFcIj57eyBtLnZhbHVlIH19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIDwhLS0gYnV0dG9ucyAtLT5cclxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXJvd1wiPlxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbG9zZSgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjb2xvcj1cIndhcm5cIiBjbGFzcz1cIm1hdC13YXJuXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiPlxyXG4gICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cclxuICAgICAgdGFyZ2V0XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=