@myrmidon/cadmus-part-codicology-decorations 2.0.9 → 2.0.10

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.
@@ -104,6 +104,7 @@ export class CodDecorationElementComponent {
104
104
  if (this._element === value) {
105
105
  return;
106
106
  }
107
+ console.log('setting element');
107
108
  this._element = value;
108
109
  this.updateForm(value);
109
110
  }
@@ -217,12 +218,12 @@ export class CodDecorationElementComponent {
217
218
  console.log('hidden: ' + JSON.stringify(this.hidden));
218
219
  }
219
220
  ngOnInit() {
220
- this.onTabIndexChanged(0);
221
- this.adjustUI();
221
+ // this.adjustUI();
222
222
  this.type.valueChanges
223
223
  .pipe(distinctUntilChanged(), debounceTime(300))
224
- .subscribe(() => {
225
- if (!this._updatingForm) {
224
+ .subscribe((value) => {
225
+ if (!this._adjustingUI && !this._updatingForm) {
226
+ console.log('type value changed: ' + value);
226
227
  this.adjustUI();
227
228
  }
228
229
  });
@@ -269,15 +270,47 @@ export class CodDecorationElementComponent {
269
270
  this._adjustingUI = false;
270
271
  console.log('adjustUI exit');
271
272
  }
272
- onTabIndexChanged(index) {
273
- // HACK
274
- // https://github.com/atularen/ngx-monaco-editor/issues/19
275
- // https://stackoverflow.com/questions/37412950/ngx-monaco-editor-unable-to-set-layout-size-when-container-changes-using-tab
276
- if (index === 2) {
277
- setTimeout(() => {
278
- this.dscEditor?._editor?.layout();
279
- }, 150);
280
- }
273
+ // public onTabIndexChanged(index: number): void {
274
+ // https://github.com/atularen/ngx-monaco-editor/issues/19
275
+ // https://stackoverflow.com/questions/37412950/ngx-monaco-editor-unable-to-set-layout-size-when-container-changes-using-tab
276
+ // if (index === 2) {
277
+ // setTimeout(() => {
278
+ // this.dscEditor?._editor?.layout();
279
+ // }, 150);
280
+ // }
281
+ // }
282
+ updateTypeDependencies(element) {
283
+ console.log('updateTypeDependencies enter');
284
+ this.key.setValue(element.key || null);
285
+ this.parentKey.setValue(element.parentKey || null);
286
+ this.instanceCount.setValue(element.instanceCount || 0);
287
+ this.ranges.setValue(element.ranges || []);
288
+ this.initialRanges = element.ranges;
289
+ this.flags.setValue(element.flags || []);
290
+ this.initialFlags = element.flags;
291
+ // typologies
292
+ this.subject.setValue(element.subject || null);
293
+ this.colors.setValue(element.colors || []);
294
+ this.initialColors = element.colors || [];
295
+ this.typologies.setValue(element.typologies || []);
296
+ this.initialTypologies = element.typologies || [];
297
+ this.gildings.setValue(element.gildings || []);
298
+ this.initialGildings = element.gildings || [];
299
+ this.techniques.setValue(element.techniques || []);
300
+ this.initialTechniques = element.techniques || [];
301
+ this.tools.setValue(element.tools || []);
302
+ this.initialTools = element.tools || [];
303
+ this.positions.setValue(element.positions || []);
304
+ this.initialPositions = element.positions || [];
305
+ this.lineHeight.setValue(element.lineHeight || 0);
306
+ this.textRelation.setValue(element.textRelation || null);
307
+ // description
308
+ this.description.setValue(element.description || null);
309
+ this.initialImages = element.images || [];
310
+ this.note.setValue(element.note || null);
311
+ this.form.markAsPristine();
312
+ this._updatingForm = false;
313
+ console.log('updateTypeDependencies exit');
281
314
  }
282
315
  updateForm(element) {
283
316
  this._updatingForm = true;
@@ -289,43 +322,17 @@ export class CodDecorationElementComponent {
289
322
  return;
290
323
  }
291
324
  // general
292
- this.type.setValue(element.type);
293
- // let the UI adjust itself before setting type-dependent controls
294
- this.adjustUI();
295
- // set other controls
296
- // HACK
325
+ this.type.setValue(element.type, { emitEvent: false });
297
326
  setTimeout(() => {
298
- this.key.setValue(element.key || null);
299
- this.parentKey.setValue(element.parentKey || null);
300
- this.instanceCount.setValue(element.instanceCount || 0);
301
- this.ranges.setValue(element.ranges || []);
302
- this.initialRanges = element.ranges;
303
- this.flags.setValue(element.flags || []);
304
- this.initialFlags = element.flags;
305
- // typologies
306
- this.subject.setValue(element.subject || null);
307
- this.colors.setValue(element.colors || []);
308
- this.initialColors = this.colors.value;
309
- this.typologies.setValue(element.typologies || []);
310
- this.initialTypologies = this.typologies.value;
311
- this.gildings.setValue(element.gildings || []);
312
- this.initialGildings = this.gildings.value;
313
- this.techniques.setValue(element.techniques || []);
314
- this.initialTechniques = this.techniques.value;
315
- this.tools.setValue(element.tools || []);
316
- this.initialTools = this.tools.value;
317
- this.positions.setValue(element.positions || []);
318
- this.initialPositions = this.positions.value;
319
- this.lineHeight.setValue(element.lineHeight || 0);
320
- this.textRelation.setValue(element.textRelation || null);
321
- // description
322
- this.description.setValue(element.description || null);
323
- this.initialImages = element.images || [];
324
- this.note.setValue(element.note || null);
325
- this.form.markAsPristine();
326
- this._updatingForm = false;
327
- console.log('updateForm tm exit');
328
- }, 0);
327
+ // let the UI adjust itself before setting type-dependent controls
328
+ console.log('adjust UI from updateForm');
329
+ this.adjustUI();
330
+ // set type-dependent controls
331
+ setTimeout(() => {
332
+ this.updateTypeDependencies(element);
333
+ });
334
+ });
335
+ // set other controls
329
336
  console.log('updateForm exit');
330
337
  }
331
338
  getElement() {
@@ -435,10 +442,10 @@ export class CodDecorationElementComponent {
435
442
  }
436
443
  }
437
444
  CodDecorationElementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CodDecorationElementComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
438
- CodDecorationElementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: CodDecorationElementComponent, selector: "cadmus-cod-decoration-element", inputs: { element: "element", parentKeys: "parentKeys", decElemTypeEntries: "decElemTypeEntries", decTypeHiddenEntries: "decTypeHiddenEntries", decElemFlagEntries: "decElemFlagEntries", decElemColorEntries: "decElemColorEntries", decElemGildingEntries: "decElemGildingEntries", decElemTechEntries: "decElemTechEntries", decElemPosEntries: "decElemPosEntries", decElemToolEntries: "decElemToolEntries", decElemTypolEntries: "decElemTypolEntries", imgTypeEntries: "imgTypeEntries" }, outputs: { elementChange: "elementChange", editorClose: "editorClose" }, viewQueries: [{ propertyName: "dscEditor", first: true, predicate: ["dsceditor"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"type-head\">\r\n {{ type.value | flatLookup : decElemTypeEntries : \"id\" : \"value\" }}\r\n </div>\r\n <mat-tab-group (selectedIndexChange)=\"onTabIndexChanged($event)\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <!-- type (bound) -->\r\n <mat-form-field\r\n *ngIf=\"decElemTypeEntries?.length\"\r\n style=\"width: 14em\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option *ngFor=\"let e of decElemTypeEntries\" [value]=\"e.id\">{{\r\n e.value\r\n }}</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- instanceCount -->\r\n <mat-form-field style=\"width: 6em\">\r\n <mat-label>count</mat-label>\r\n <input matInput [formControl]=\"instanceCount\" type=\"number\" min=\"0\" />\r\n </mat-form-field>\r\n\r\n <!-- ranges -->\r\n <cadmus-cod-location\r\n label=\"ranges\"\r\n [required]=\"true\"\r\n [location]=\"initialRanges || null\"\r\n (locationChange)=\"onLocationChange($event)\"\r\n ></cadmus-cod-location>\r\n\r\n <!-- flags -->\r\n <fieldset *ngIf=\"availFlags?.length\">\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onFlagsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <br />\r\n <div>\r\n <!-- key -->\r\n <mat-form-field>\r\n <mat-label>key</mat-label>\r\n <input matInput [formControl]=\"key\" />\r\n <mat-error\r\n *ngIf=\"$any(key).errors?.pattern && (key.dirty || key.touched)\"\r\n >invalid key</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(key).errors?.maxLength && (key.dirty || key.touched)\"\r\n >key too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- parentKey -->\r\n <mat-form-field *ngIf=\"parentKeys?.length\">\r\n <mat-label>parent key</mat-label>\r\n <mat-select [formControl]=\"parentKey\">\r\n <mat-option [value]=\"null\">(none)</mat-option>\r\n <mat-option *ngFor=\"let k of parentKeys\" [value]=\"k\">{{\r\n k\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- TYPOLOGIES -->\r\n <mat-tab label=\"typologies\">\r\n <div style=\"display: flex; gap: 8px\">\r\n <!-- lineHeight -->\r\n <mat-form-field\r\n style=\"flex: 0 0 auto; width: 4em\"\r\n [hidden]=\"hidden?.lineHeight\"\r\n >\r\n <mat-label>ln.h</mat-label>\r\n <input matInput type=\"number\" min=\"0\" [formControl]=\"lineHeight\" />\r\n </mat-form-field>\r\n <!-- textRelation -->\r\n <mat-form-field\r\n [hidden]=\"hidden?.textRelation\"\r\n style=\"display: 1 0 auto\"\r\n >\r\n <mat-label>text relation</mat-label>\r\n <input matInput [formControl]=\"textRelation\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(textRelation).errors?.maxLength &&\r\n (textRelation.dirty || textRelation.touched)\r\n \"\r\n >text relation too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <!-- typologies -->\r\n <fieldset [hidden]=\"!availTypologies.length || hidden?.typologies\">\r\n <legend>typologies</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTypologies\"\r\n [selectedIds]=\"initialTypologies\"\r\n (selectedIdsChange)=\"onTypologiesChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- subject -->\r\n <div [hidden]=\"hidden?.subject\">\r\n <mat-form-field>\r\n <mat-label>subject</mat-label>\r\n <input matInput [formControl]=\"subject\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(subject).errors?.maxLength &&\r\n (subject.dirty || subject.touched)\r\n \"\r\n >subject too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- colors -->\r\n <fieldset [hidden]=\"!availColors.length || hidden?.colors\">\r\n <legend>colors</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availColors\"\r\n [selectedIds]=\"initialColors\"\r\n (selectedIdsChange)=\"onColorsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- gildings -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availGildings.length && !elemGildingFree) || hidden?.gildings\r\n \"\r\n >\r\n <legend>gildings</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availGildings\"\r\n [allowUserFlags]=\"elemGildingFree || false\"\r\n [selectedIds]=\"initialGildings\"\r\n (selectedIdsChange)=\"onGildingsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- techniques -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availTechniques.length && !elemTechniqueFree) || hidden?.techniques\r\n \"\r\n >\r\n <legend>techniques</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTechniques\"\r\n [allowUserFlags]=\"elemTechniqueFree || false\"\r\n [selectedIds]=\"initialTechniques\"\r\n (selectedIdsChange)=\"onTechniquesChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- tools -->\r\n <fieldset\r\n [hidden]=\"(!availTools.length && !elemToolFree) || hidden?.tools\"\r\n >\r\n <legend>tools</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTools\"\r\n [allowUserFlags]=\"elemToolFree || false\"\r\n [selectedIds]=\"initialTools\"\r\n (selectedIdsChange)=\"onToolsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- positions -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availPositions.length && !elemPositionFree) || hidden?.positions\r\n \"\r\n >\r\n <legend>positions</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availPositions\"\r\n [allowUserFlags]=\"elemPositionFree || false\"\r\n [selectedIds]=\"initialPositions\"\r\n (selectedIdsChange)=\"onPositionsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n </mat-tab>\r\n\r\n <!-- DESCRIPTION -->\r\n <mat-tab label=\"description\">\r\n <div>\r\n <ngx-monaco-editor\r\n #dsceditor\r\n [options]=\"editorOptions\"\r\n [formControl]=\"description\"\r\n ></ngx-monaco-editor>\r\n <mat-error\r\n *ngIf=\"\r\n $any(description).errors?.maxLength &&\r\n (description.touched || description.dirty)\r\n \"\r\n >description too long</mat-error\r\n >\r\n </div>\r\n <div>\r\n <!-- images -->\r\n <cadmus-cod-images\r\n [typeEntries]=\"imgTypeEntries\"\r\n [images]=\"initialImages\"\r\n (imagesChange)=\"onImagesChange($event)\"\r\n ></cadmus-cod-images>\r\n </div>\r\n <div>\r\n <!-- note -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard element changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept element changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> element\r\n </button>\r\n <span style=\"margin-left: 8px\">element</span>\r\n </div>\r\n</form>\r\n", styles: [".long-text{width:90%;max-width:600px}.type-head{font-size:90%;border:1px solid silver;border-radius:6px;padding:4px;background-color:#fafafa;text-align:center}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}[hidden]{display:none!important}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.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: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i9.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i9.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.EditorComponent, selector: "ngx-monaco-editor", inputs: ["options", "model"] }, { kind: "component", type: i12.FlagsPickerComponent, selector: "cadmus-ui-flags-picker", inputs: ["selectedIds", "flags", "numbering", "toolbar", "allowUserFlags"], outputs: ["selectedIdsChange", "flagsChange"] }, { kind: "component", type: i13.CodLocationComponent, selector: "cadmus-cod-location", inputs: ["label", "required", "single", "location"], outputs: ["locationChange"] }, { kind: "component", type: i14.CodImagesComponent, selector: "cadmus-cod-images", inputs: ["images", "typeEntries"], outputs: ["imagesChange"] }, { kind: "pipe", type: i15.FlatLookupPipe, name: "flatLookup" }] });
445
+ CodDecorationElementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: CodDecorationElementComponent, selector: "cadmus-cod-decoration-element", inputs: { element: "element", parentKeys: "parentKeys", decElemTypeEntries: "decElemTypeEntries", decTypeHiddenEntries: "decTypeHiddenEntries", decElemFlagEntries: "decElemFlagEntries", decElemColorEntries: "decElemColorEntries", decElemGildingEntries: "decElemGildingEntries", decElemTechEntries: "decElemTechEntries", decElemPosEntries: "decElemPosEntries", decElemToolEntries: "decElemToolEntries", decElemTypolEntries: "decElemTypolEntries", imgTypeEntries: "imgTypeEntries" }, outputs: { elementChange: "elementChange", editorClose: "editorClose" }, viewQueries: [{ propertyName: "dscEditor", first: true, predicate: ["dsceditor"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"type-head\">\r\n {{ type.value | flatLookup : decElemTypeEntries : \"id\" : \"value\" }}\r\n </div>\r\n <mat-tab-group>\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <!-- type (bound) -->\r\n <mat-form-field\r\n *ngIf=\"decElemTypeEntries?.length\"\r\n style=\"width: 14em\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option *ngFor=\"let e of decElemTypeEntries\" [value]=\"e.id\">{{\r\n e.value\r\n }}</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- instanceCount -->\r\n <mat-form-field style=\"width: 6em\">\r\n <mat-label>count</mat-label>\r\n <input matInput [formControl]=\"instanceCount\" type=\"number\" min=\"0\" />\r\n </mat-form-field>\r\n\r\n <!-- ranges -->\r\n <cadmus-cod-location\r\n label=\"ranges\"\r\n [required]=\"true\"\r\n [location]=\"initialRanges || null\"\r\n (locationChange)=\"onLocationChange($event)\"\r\n ></cadmus-cod-location>\r\n\r\n <!-- flags -->\r\n <fieldset *ngIf=\"availFlags?.length\">\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onFlagsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <br />\r\n <div>\r\n <!-- key -->\r\n <mat-form-field>\r\n <mat-label>key</mat-label>\r\n <input matInput [formControl]=\"key\" />\r\n <mat-error\r\n *ngIf=\"$any(key).errors?.pattern && (key.dirty || key.touched)\"\r\n >invalid key</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(key).errors?.maxLength && (key.dirty || key.touched)\"\r\n >key too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- parentKey -->\r\n <mat-form-field *ngIf=\"parentKeys?.length\">\r\n <mat-label>parent key</mat-label>\r\n <mat-select [formControl]=\"parentKey\">\r\n <mat-option [value]=\"null\">(none)</mat-option>\r\n <mat-option *ngFor=\"let k of parentKeys\" [value]=\"k\">{{\r\n k\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- TYPOLOGIES -->\r\n <mat-tab label=\"typologies\">\r\n <div style=\"display: flex; gap: 8px\">\r\n <!-- lineHeight -->\r\n <mat-form-field\r\n style=\"flex: 0 0 auto; width: 4em\"\r\n [hidden]=\"hidden?.lineHeight\"\r\n >\r\n <mat-label>ln.h</mat-label>\r\n <input matInput type=\"number\" min=\"0\" [formControl]=\"lineHeight\" />\r\n </mat-form-field>\r\n <!-- textRelation -->\r\n <mat-form-field\r\n [hidden]=\"hidden?.textRelation\"\r\n style=\"display: 1 0 auto\"\r\n >\r\n <mat-label>text relation</mat-label>\r\n <input matInput [formControl]=\"textRelation\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(textRelation).errors?.maxLength &&\r\n (textRelation.dirty || textRelation.touched)\r\n \"\r\n >text relation too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <!-- typologies -->\r\n <fieldset [hidden]=\"!availTypologies.length || hidden?.typologies\">\r\n <legend>typologies</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTypologies\"\r\n [selectedIds]=\"initialTypologies\"\r\n (selectedIdsChange)=\"onTypologiesChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- subject -->\r\n <div [hidden]=\"hidden?.subject\">\r\n <mat-form-field>\r\n <mat-label>subject</mat-label>\r\n <input matInput [formControl]=\"subject\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(subject).errors?.maxLength &&\r\n (subject.dirty || subject.touched)\r\n \"\r\n >subject too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- colors -->\r\n <fieldset [hidden]=\"!availColors.length || hidden?.colors\">\r\n <legend>colors</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availColors\"\r\n [selectedIds]=\"initialColors\"\r\n (selectedIdsChange)=\"onColorsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- gildings -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availGildings.length && !elemGildingFree) || hidden?.gildings\r\n \"\r\n >\r\n <legend>gildings</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availGildings\"\r\n [allowUserFlags]=\"elemGildingFree || false\"\r\n [selectedIds]=\"initialGildings\"\r\n (selectedIdsChange)=\"onGildingsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- techniques -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availTechniques.length && !elemTechniqueFree) || hidden?.techniques\r\n \"\r\n >\r\n <legend>techniques</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTechniques\"\r\n [allowUserFlags]=\"elemTechniqueFree || false\"\r\n [selectedIds]=\"initialTechniques\"\r\n (selectedIdsChange)=\"onTechniquesChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- tools -->\r\n <fieldset\r\n [hidden]=\"(!availTools.length && !elemToolFree) || hidden?.tools\"\r\n >\r\n <legend>tools</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTools\"\r\n [allowUserFlags]=\"elemToolFree || false\"\r\n [selectedIds]=\"initialTools\"\r\n (selectedIdsChange)=\"onToolsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- positions -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availPositions.length && !elemPositionFree) || hidden?.positions\r\n \"\r\n >\r\n <legend>positions</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availPositions\"\r\n [allowUserFlags]=\"elemPositionFree || false\"\r\n [selectedIds]=\"initialPositions\"\r\n (selectedIdsChange)=\"onPositionsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n </mat-tab>\r\n\r\n <!-- DESCRIPTION -->\r\n <mat-tab label=\"description\">\r\n <div>\r\n <ngx-monaco-editor\r\n #dsceditor\r\n [options]=\"editorOptions\"\r\n [formControl]=\"description\"\r\n ></ngx-monaco-editor>\r\n <mat-error\r\n *ngIf=\"\r\n $any(description).errors?.maxLength &&\r\n (description.touched || description.dirty)\r\n \"\r\n >description too long</mat-error\r\n >\r\n </div>\r\n <div>\r\n <!-- images -->\r\n <cadmus-cod-images\r\n [typeEntries]=\"imgTypeEntries\"\r\n [images]=\"initialImages\"\r\n (imagesChange)=\"onImagesChange($event)\"\r\n ></cadmus-cod-images>\r\n </div>\r\n <div>\r\n <!-- note -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard element changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept element changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> element\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".long-text{width:90%;max-width:600px}.type-head{font-size:90%;border:1px solid silver;border-radius:6px;padding:4px;background-color:#fafafa;text-align:center}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}[hidden]{display:none!important}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.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: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i9.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i9.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.EditorComponent, selector: "ngx-monaco-editor", inputs: ["options", "model"] }, { kind: "component", type: i12.FlagsPickerComponent, selector: "cadmus-ui-flags-picker", inputs: ["selectedIds", "flags", "numbering", "toolbar", "allowUserFlags"], outputs: ["selectedIdsChange", "flagsChange"] }, { kind: "component", type: i13.CodLocationComponent, selector: "cadmus-cod-location", inputs: ["label", "required", "single", "location"], outputs: ["locationChange"] }, { kind: "component", type: i14.CodImagesComponent, selector: "cadmus-cod-images", inputs: ["images", "typeEntries"], outputs: ["imagesChange"] }, { kind: "pipe", type: i15.FlatLookupPipe, name: "flatLookup" }] });
439
446
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CodDecorationElementComponent, decorators: [{
440
447
  type: Component,
441
- args: [{ selector: 'cadmus-cod-decoration-element', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"type-head\">\r\n {{ type.value | flatLookup : decElemTypeEntries : \"id\" : \"value\" }}\r\n </div>\r\n <mat-tab-group (selectedIndexChange)=\"onTabIndexChanged($event)\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <!-- type (bound) -->\r\n <mat-form-field\r\n *ngIf=\"decElemTypeEntries?.length\"\r\n style=\"width: 14em\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option *ngFor=\"let e of decElemTypeEntries\" [value]=\"e.id\">{{\r\n e.value\r\n }}</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- instanceCount -->\r\n <mat-form-field style=\"width: 6em\">\r\n <mat-label>count</mat-label>\r\n <input matInput [formControl]=\"instanceCount\" type=\"number\" min=\"0\" />\r\n </mat-form-field>\r\n\r\n <!-- ranges -->\r\n <cadmus-cod-location\r\n label=\"ranges\"\r\n [required]=\"true\"\r\n [location]=\"initialRanges || null\"\r\n (locationChange)=\"onLocationChange($event)\"\r\n ></cadmus-cod-location>\r\n\r\n <!-- flags -->\r\n <fieldset *ngIf=\"availFlags?.length\">\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onFlagsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <br />\r\n <div>\r\n <!-- key -->\r\n <mat-form-field>\r\n <mat-label>key</mat-label>\r\n <input matInput [formControl]=\"key\" />\r\n <mat-error\r\n *ngIf=\"$any(key).errors?.pattern && (key.dirty || key.touched)\"\r\n >invalid key</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(key).errors?.maxLength && (key.dirty || key.touched)\"\r\n >key too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- parentKey -->\r\n <mat-form-field *ngIf=\"parentKeys?.length\">\r\n <mat-label>parent key</mat-label>\r\n <mat-select [formControl]=\"parentKey\">\r\n <mat-option [value]=\"null\">(none)</mat-option>\r\n <mat-option *ngFor=\"let k of parentKeys\" [value]=\"k\">{{\r\n k\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- TYPOLOGIES -->\r\n <mat-tab label=\"typologies\">\r\n <div style=\"display: flex; gap: 8px\">\r\n <!-- lineHeight -->\r\n <mat-form-field\r\n style=\"flex: 0 0 auto; width: 4em\"\r\n [hidden]=\"hidden?.lineHeight\"\r\n >\r\n <mat-label>ln.h</mat-label>\r\n <input matInput type=\"number\" min=\"0\" [formControl]=\"lineHeight\" />\r\n </mat-form-field>\r\n <!-- textRelation -->\r\n <mat-form-field\r\n [hidden]=\"hidden?.textRelation\"\r\n style=\"display: 1 0 auto\"\r\n >\r\n <mat-label>text relation</mat-label>\r\n <input matInput [formControl]=\"textRelation\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(textRelation).errors?.maxLength &&\r\n (textRelation.dirty || textRelation.touched)\r\n \"\r\n >text relation too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <!-- typologies -->\r\n <fieldset [hidden]=\"!availTypologies.length || hidden?.typologies\">\r\n <legend>typologies</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTypologies\"\r\n [selectedIds]=\"initialTypologies\"\r\n (selectedIdsChange)=\"onTypologiesChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- subject -->\r\n <div [hidden]=\"hidden?.subject\">\r\n <mat-form-field>\r\n <mat-label>subject</mat-label>\r\n <input matInput [formControl]=\"subject\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(subject).errors?.maxLength &&\r\n (subject.dirty || subject.touched)\r\n \"\r\n >subject too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- colors -->\r\n <fieldset [hidden]=\"!availColors.length || hidden?.colors\">\r\n <legend>colors</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availColors\"\r\n [selectedIds]=\"initialColors\"\r\n (selectedIdsChange)=\"onColorsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- gildings -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availGildings.length && !elemGildingFree) || hidden?.gildings\r\n \"\r\n >\r\n <legend>gildings</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availGildings\"\r\n [allowUserFlags]=\"elemGildingFree || false\"\r\n [selectedIds]=\"initialGildings\"\r\n (selectedIdsChange)=\"onGildingsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- techniques -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availTechniques.length && !elemTechniqueFree) || hidden?.techniques\r\n \"\r\n >\r\n <legend>techniques</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTechniques\"\r\n [allowUserFlags]=\"elemTechniqueFree || false\"\r\n [selectedIds]=\"initialTechniques\"\r\n (selectedIdsChange)=\"onTechniquesChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- tools -->\r\n <fieldset\r\n [hidden]=\"(!availTools.length && !elemToolFree) || hidden?.tools\"\r\n >\r\n <legend>tools</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTools\"\r\n [allowUserFlags]=\"elemToolFree || false\"\r\n [selectedIds]=\"initialTools\"\r\n (selectedIdsChange)=\"onToolsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- positions -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availPositions.length && !elemPositionFree) || hidden?.positions\r\n \"\r\n >\r\n <legend>positions</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availPositions\"\r\n [allowUserFlags]=\"elemPositionFree || false\"\r\n [selectedIds]=\"initialPositions\"\r\n (selectedIdsChange)=\"onPositionsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n </mat-tab>\r\n\r\n <!-- DESCRIPTION -->\r\n <mat-tab label=\"description\">\r\n <div>\r\n <ngx-monaco-editor\r\n #dsceditor\r\n [options]=\"editorOptions\"\r\n [formControl]=\"description\"\r\n ></ngx-monaco-editor>\r\n <mat-error\r\n *ngIf=\"\r\n $any(description).errors?.maxLength &&\r\n (description.touched || description.dirty)\r\n \"\r\n >description too long</mat-error\r\n >\r\n </div>\r\n <div>\r\n <!-- images -->\r\n <cadmus-cod-images\r\n [typeEntries]=\"imgTypeEntries\"\r\n [images]=\"initialImages\"\r\n (imagesChange)=\"onImagesChange($event)\"\r\n ></cadmus-cod-images>\r\n </div>\r\n <div>\r\n <!-- note -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard element changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept element changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> element\r\n </button>\r\n <span style=\"margin-left: 8px\">element</span>\r\n </div>\r\n</form>\r\n", styles: [".long-text{width:90%;max-width:600px}.type-head{font-size:90%;border:1px solid silver;border-radius:6px;padding:4px;background-color:#fafafa;text-align:center}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}[hidden]{display:none!important}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\n"] }]
448
+ args: [{ selector: 'cadmus-cod-decoration-element', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"type-head\">\r\n {{ type.value | flatLookup : decElemTypeEntries : \"id\" : \"value\" }}\r\n </div>\r\n <mat-tab-group>\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <!-- type (bound) -->\r\n <mat-form-field\r\n *ngIf=\"decElemTypeEntries?.length\"\r\n style=\"width: 14em\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option *ngFor=\"let e of decElemTypeEntries\" [value]=\"e.id\">{{\r\n e.value\r\n }}</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- instanceCount -->\r\n <mat-form-field style=\"width: 6em\">\r\n <mat-label>count</mat-label>\r\n <input matInput [formControl]=\"instanceCount\" type=\"number\" min=\"0\" />\r\n </mat-form-field>\r\n\r\n <!-- ranges -->\r\n <cadmus-cod-location\r\n label=\"ranges\"\r\n [required]=\"true\"\r\n [location]=\"initialRanges || null\"\r\n (locationChange)=\"onLocationChange($event)\"\r\n ></cadmus-cod-location>\r\n\r\n <!-- flags -->\r\n <fieldset *ngIf=\"availFlags?.length\">\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onFlagsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <br />\r\n <div>\r\n <!-- key -->\r\n <mat-form-field>\r\n <mat-label>key</mat-label>\r\n <input matInput [formControl]=\"key\" />\r\n <mat-error\r\n *ngIf=\"$any(key).errors?.pattern && (key.dirty || key.touched)\"\r\n >invalid key</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(key).errors?.maxLength && (key.dirty || key.touched)\"\r\n >key too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- parentKey -->\r\n <mat-form-field *ngIf=\"parentKeys?.length\">\r\n <mat-label>parent key</mat-label>\r\n <mat-select [formControl]=\"parentKey\">\r\n <mat-option [value]=\"null\">(none)</mat-option>\r\n <mat-option *ngFor=\"let k of parentKeys\" [value]=\"k\">{{\r\n k\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- TYPOLOGIES -->\r\n <mat-tab label=\"typologies\">\r\n <div style=\"display: flex; gap: 8px\">\r\n <!-- lineHeight -->\r\n <mat-form-field\r\n style=\"flex: 0 0 auto; width: 4em\"\r\n [hidden]=\"hidden?.lineHeight\"\r\n >\r\n <mat-label>ln.h</mat-label>\r\n <input matInput type=\"number\" min=\"0\" [formControl]=\"lineHeight\" />\r\n </mat-form-field>\r\n <!-- textRelation -->\r\n <mat-form-field\r\n [hidden]=\"hidden?.textRelation\"\r\n style=\"display: 1 0 auto\"\r\n >\r\n <mat-label>text relation</mat-label>\r\n <input matInput [formControl]=\"textRelation\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(textRelation).errors?.maxLength &&\r\n (textRelation.dirty || textRelation.touched)\r\n \"\r\n >text relation too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <!-- typologies -->\r\n <fieldset [hidden]=\"!availTypologies.length || hidden?.typologies\">\r\n <legend>typologies</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTypologies\"\r\n [selectedIds]=\"initialTypologies\"\r\n (selectedIdsChange)=\"onTypologiesChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- subject -->\r\n <div [hidden]=\"hidden?.subject\">\r\n <mat-form-field>\r\n <mat-label>subject</mat-label>\r\n <input matInput [formControl]=\"subject\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(subject).errors?.maxLength &&\r\n (subject.dirty || subject.touched)\r\n \"\r\n >subject too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- colors -->\r\n <fieldset [hidden]=\"!availColors.length || hidden?.colors\">\r\n <legend>colors</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availColors\"\r\n [selectedIds]=\"initialColors\"\r\n (selectedIdsChange)=\"onColorsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- gildings -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availGildings.length && !elemGildingFree) || hidden?.gildings\r\n \"\r\n >\r\n <legend>gildings</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availGildings\"\r\n [allowUserFlags]=\"elemGildingFree || false\"\r\n [selectedIds]=\"initialGildings\"\r\n (selectedIdsChange)=\"onGildingsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- techniques -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availTechniques.length && !elemTechniqueFree) || hidden?.techniques\r\n \"\r\n >\r\n <legend>techniques</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTechniques\"\r\n [allowUserFlags]=\"elemTechniqueFree || false\"\r\n [selectedIds]=\"initialTechniques\"\r\n (selectedIdsChange)=\"onTechniquesChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- tools -->\r\n <fieldset\r\n [hidden]=\"(!availTools.length && !elemToolFree) || hidden?.tools\"\r\n >\r\n <legend>tools</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availTools\"\r\n [allowUserFlags]=\"elemToolFree || false\"\r\n [selectedIds]=\"initialTools\"\r\n (selectedIdsChange)=\"onToolsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- positions -->\r\n <fieldset\r\n [hidden]=\"\r\n (!availPositions.length && !elemPositionFree) || hidden?.positions\r\n \"\r\n >\r\n <legend>positions</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availPositions\"\r\n [allowUserFlags]=\"elemPositionFree || false\"\r\n [selectedIds]=\"initialPositions\"\r\n (selectedIdsChange)=\"onPositionsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n </mat-tab>\r\n\r\n <!-- DESCRIPTION -->\r\n <mat-tab label=\"description\">\r\n <div>\r\n <ngx-monaco-editor\r\n #dsceditor\r\n [options]=\"editorOptions\"\r\n [formControl]=\"description\"\r\n ></ngx-monaco-editor>\r\n <mat-error\r\n *ngIf=\"\r\n $any(description).errors?.maxLength &&\r\n (description.touched || description.dirty)\r\n \"\r\n >description too long</mat-error\r\n >\r\n </div>\r\n <div>\r\n <!-- images -->\r\n <cadmus-cod-images\r\n [typeEntries]=\"imgTypeEntries\"\r\n [images]=\"initialImages\"\r\n (imagesChange)=\"onImagesChange($event)\"\r\n ></cadmus-cod-images>\r\n </div>\r\n <div>\r\n <!-- note -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard element changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept element changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> element\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".long-text{width:90%;max-width:600px}.type-head{font-size:90%;border:1px solid silver;border-radius:6px;padding:4px;background-color:#fafafa;text-align:center}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}[hidden]{display:none!important}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\n"] }]
442
449
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { dscEditor: [{
443
450
  type: ViewChild,
444
451
  args: ['dsceditor', { static: false }]
@@ -471,4 +478,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImpor
471
478
  }], imgTypeEntries: [{
472
479
  type: Input
473
480
  }] } });
474
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kLWRlY29yYXRpb24tZWxlbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9jYWRtdXMtcGFydC1jb2RpY29sb2d5LWRlY29yYXRpb25zL3NyYy9saWIvY29kLWRlY29yYXRpb24tZWxlbWVudC9jb2QtZGVjb3JhdGlvbi1lbGVtZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2NhZG11cy1wYXJ0LWNvZGljb2xvZ3ktZGVjb3JhdGlvbnMvc3JjL2xpYi9jb2QtZGVjb3JhdGlvbi1lbGVtZW50L2NvZC1kZWNvcmF0aW9uLWVsZW1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBS3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEIxRCxNQUFNLE9BQU8sNkJBQTZCO0lBbU14QyxZQUFZLFdBQXdCO1FBdEw3QixrQkFBYSxHQUFHO1lBQ3JCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsMERBQTBEO1lBQzFELGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7UUFpTEEsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUM5RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEs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RTtJQUNyRSxxQ0FBcUM7SUFDckMsSUFBSTtJQUVHLE1BQU07UUFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNyQixPQUFPO1NBQ1I7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQzs7MEhBeGxCVSw2QkFBNkI7OEdBQTdCLDZCQUE2Qix3dEJDaEQxQyxtdlJBb1FBOzJGRHBOYSw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UsK0JBQStCO2tHQWdCRSxTQUFTO3NCQUFuRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBVTlCLE9BQU87c0JBRGpCLEtBQUs7Z0JBYUMsVUFBVTtzQkFEaEIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixNQUFNO2dCQUdBLFdBQVc7c0JBRGpCLE1BQU07Z0JBaURBLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxvQkFBb0I7c0JBRDFCLEtBQUs7Z0JBS0ssa0JBQWtCO3NCQUQ1QixLQUFLO2dCQVlLLG1CQUFtQjtzQkFEN0IsS0FBSztnQkFZSyxxQkFBcUI7c0JBRC9CLEtBQUs7Z0JBWUssa0JBQWtCO3NCQUQ1QixLQUFLO2dCQWVLLGlCQUFpQjtzQkFEM0IsS0FBSztnQkFZSyxrQkFBa0I7c0JBRDVCLEtBQUs7Z0JBWUssbUJBQW1CO3NCQUQ3QixLQUFLO2dCQVlDLGNBQWM7c0JBRHBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb2RMb2NhdGlvblJhbmdlIH0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1jb2QtbG9jYXRpb24nO1xyXG5pbXBvcnQgeyBDb2RJbWFnZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtY29kaWNvbG9neS11aSc7XHJcbmltcG9ydCB7IFRoZXNhdXJ1c0VudHJ5IH0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1jb3JlJztcclxuaW1wb3J0IHsgRmxhZyB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtdWktZmxhZ3MtcGlja2VyJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgQ29kRGVjb3JhdGlvbkVsZW1lbnQgfSBmcm9tICcuLi9jb2QtZGVjb3JhdGlvbnMtcGFydCc7XHJcblxyXG4vKipcclxuICogTGlzdCBvZiBoaWRkZW4gZmllbGRzIGluIGRlY29yYXRpb24gZWxlbWVudCBjb21wb25lbnQuXHJcbiAqIFRoaXMgaXMgc2V0IGJ5IGV4YW1pbmluZyB0aGUgdmFsdWVzIG9mIHRoZSB0aGVzYXVydXNcclxuICogbmFtZWQgXCJjb2QtZGVjb3JhdGlvbi10eXBlLWhpZGRlblwiIGhhdmluZyBhcyBrZXkgdGhlXHJcbiAqIGVsZW1lbnQgdHlwZSBJRCAoZS5nLiBcInBhZy1pbmNcIiksIGFuZCBhcyB2YWx1ZSBhIHNwYWNlXHJcbiAqIGRlbGltaXRlZCBsaXN0IG9mIGZpZWxkIG5hbWVzLiBFYWNoIG9mIHRoZXNlIGZpZWxkIG5hbWVzXHJcbiAqIGNvcnJlc3BvbmRzIHRvIGEgcHJvcGVydHkgb2YgdGhpcyBvYmplY3QuXHJcbiAqL1xyXG5pbnRlcmZhY2UgSGlkZGVuRGVjRWxlbUZpZWxkcyB7XHJcbiAgZmxhZ3M/OiBib29sZWFuO1xyXG4gIHR5cG9sb2dpZXM/OiBib29sZWFuO1xyXG4gIHN1YmplY3Q/OiBib29sZWFuO1xyXG4gIGNvbG9ycz86IGJvb2xlYW47XHJcbiAgZ2lsZGluZ3M/OiBib29sZWFuO1xyXG4gIHRlY2huaXF1ZXM/OiBib29sZWFuO1xyXG4gIHRvb2xzPzogYm9vbGVhbjtcclxuICBwb3NpdGlvbnM/OiBib29sZWFuO1xyXG4gIGxpbmVIZWlnaHQ/OiBib29sZWFuO1xyXG4gIHRleHRSZWxhdGlvbj86IGJvb2xlYW47XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2FkbXVzLWNvZC1kZWNvcmF0aW9uLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb2QtZGVjb3JhdGlvbi1lbGVtZW50LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb2QtZGVjb3JhdGlvbi1lbGVtZW50LmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENvZERlY29yYXRpb25FbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBwcml2YXRlIF9lbGVtZW50OiBDb2REZWNvcmF0aW9uRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9lbGVtRmxhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZWxlbUNvbG9yRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9lbGVtR2lsZGluZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZWxlbVRlY2hFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2VsZW1Qb3NFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2VsZW1Ub29sRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9lbGVtVHlwb2xFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3VwZGF0aW5nRm9ybT86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfYWRqdXN0aW5nVUk/OiBib29sZWFuO1xyXG5cclxuICBAVmlld0NoaWxkKCdkc2NlZGl0b3InLCB7IHN0YXRpYzogZmFsc2UgfSkgZHNjRWRpdG9yOiBhbnk7XHJcbiAgcHVibGljIGVkaXRvck9wdGlvbnMgPSB7XHJcbiAgICB0aGVtZTogJ3ZzLWxpZ2h0JyxcclxuICAgIGxhbmd1YWdlOiAnbWFya2Rvd24nLFxyXG4gICAgd29yZFdyYXA6ICdvbicsXHJcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXR1bGFyZW4vbmd4LW1vbmFjby1lZGl0b3IvaXNzdWVzLzE5XHJcbiAgICBhdXRvbWF0aWNMYXlvdXQ6IHRydWUsXHJcbiAgfTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogQ29kRGVjb3JhdGlvbkVsZW1lbnQgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZWxlbWVudCh2YWx1ZTogQ29kRGVjb3JhdGlvbkVsZW1lbnQgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl9lbGVtZW50ID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbGVtZW50ID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm0odmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcGFyZW50S2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBlbGVtZW50Q2hhbmdlOiBFdmVudEVtaXR0ZXI8Q29kRGVjb3JhdGlvbkVsZW1lbnQ+O1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBlZGl0b3JDbG9zZTogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIC8vIGdlbmVyYWxcclxuICBwdWJsaWMga2V5OiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgcGFyZW50S2V5OiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgdHlwZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZsYWdzOiBGb3JtQ29udHJvbDxzdHJpbmdbXT47XHJcbiAgcHVibGljIHJhbmdlczogRm9ybUNvbnRyb2w8Q29kTG9jYXRpb25SYW5nZVtdPjtcclxuICBwdWJsaWMgaW5zdGFuY2VDb3VudDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICAvLyB0eXBvbG9naWVzXHJcbiAgcHVibGljIHR5cG9sb2dpZXM6IEZvcm1Db250cm9sPHN0cmluZ1tdPjtcclxuICBwdWJsaWMgc3ViamVjdDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGNvbG9yczogRm9ybUNvbnRyb2w8c3RyaW5nW10+O1xyXG4gIHB1YmxpYyBnaWxkaW5nczogRm9ybUNvbnRyb2w8c3RyaW5nW10+O1xyXG4gIHB1YmxpYyB0ZWNobmlxdWVzOiBGb3JtQ29udHJvbDxzdHJpbmdbXT47XHJcbiAgcHVibGljIHRvb2xzOiBGb3JtQ29udHJvbDxzdHJpbmdbXT47XHJcbiAgcHVibGljIHBvc2l0aW9uczogRm9ybUNvbnRyb2w8c3RyaW5nW10+O1xyXG4gIHB1YmxpYyBsaW5lSGVpZ2h0OiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyB0ZXh0UmVsYXRpb246IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIC8vIGRlc2NyaXB0aW9uXHJcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgaW1hZ2VzOiBGb3JtQ29udHJvbDxDb2RJbWFnZVtdPjtcclxuICBwdWJsaWMgbm90ZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIGluaXRpYWxSYW5nZXM6IENvZExvY2F0aW9uUmFuZ2VbXTtcclxuICBwdWJsaWMgaW5pdGlhbEltYWdlczogQ29kSW1hZ2VbXTtcclxuICAvLyBmbGFnc1xyXG4gIHB1YmxpYyBpbml0aWFsRmxhZ3M6IHN0cmluZ1tdO1xyXG4gIHB1YmxpYyBpbml0aWFsVHlwb2xvZ2llczogc3RyaW5nW107XHJcbiAgcHVibGljIGluaXRpYWxDb2xvcnM6IHN0cmluZ1tdO1xyXG4gIHB1YmxpYyBpbml0aWFsR2lsZGluZ3M6IHN0cmluZ1tdO1xyXG4gIHB1YmxpYyBpbml0aWFsVGVjaG5pcXVlczogc3RyaW5nW107XHJcbiAgcHVibGljIGluaXRpYWxUb29sczogc3RyaW5nW107XHJcbiAgcHVibGljIGluaXRpYWxQb3NpdGlvbnM6IHN0cmluZ1tdO1xyXG5cclxuICBwdWJsaWMgYXZhaWxGbGFnczogRmxhZ1tdO1xyXG4gIHB1YmxpYyBhdmFpbFR5cG9sb2dpZXM6IEZsYWdbXTtcclxuICBwdWJsaWMgYXZhaWxDb2xvcnM6IEZsYWdbXTtcclxuICBwdWJsaWMgYXZhaWxHaWxkaW5nczogRmxhZ1tdO1xyXG4gIHB1YmxpYyBhdmFpbFRlY2huaXF1ZXM6IEZsYWdbXTtcclxuICBwdWJsaWMgYXZhaWxUb29sczogRmxhZ1tdO1xyXG4gIHB1YmxpYyBhdmFpbFBvc2l0aW9uczogRmxhZ1tdO1xyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXR5cGVzIChyZXF1aXJlZCkuIEFsbCB0aGUgb3RoZXIgdGhlc2F1cmlcclxuICAvLyAoZXhjZXB0IGRlY1R5cGVIaWRkZW5FbnRyaWVzKSBoYXZlIHRoZWlyIGVudHJpZXMgZmlsdGVyZWRcclxuICAvLyBieSB0aGUgdmFsdWUgc2VsZWN0ZWQgZnJvbSB0aGlzIHRoZXNhdXJ1cy5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtVHlwZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tdHlwZS1oaWRkZW5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNUeXBlSGlkZGVuRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1mbGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkZWNFbGVtRmxhZ0VudHJpZXMoKTogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZWxlbUZsYWdFbnRyaWVzO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY0VsZW1GbGFnRW50cmllcyh2YWx1ZTogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZWxlbUZsYWdFbnRyaWVzID0gdmFsdWU7XHJcbiAgICB0aGlzLmVsZW1GbGFnRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKHZhbHVlLCB0aGlzLnR5cGU/LnZhbHVlKTtcclxuICAgIHRoaXMuYXZhaWxGbGFncyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtRmxhZ0VudHJpZXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1jb2xvcnNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGVjRWxlbUNvbG9yRW50cmllcygpOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9lbGVtQ29sb3JFbnRyaWVzO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY0VsZW1Db2xvckVudHJpZXModmFsdWU6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2VsZW1Db2xvckVudHJpZXMgPSB2YWx1ZTtcclxuICAgIHRoaXMuZWxlbUNvbG9yRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKHZhbHVlLCB0aGlzLnR5cGU/LnZhbHVlKTtcclxuICAgIHRoaXMuYXZhaWxDb2xvcnMgPSB0aGlzLmdldEF2YWlsYWJsZUZsYWdzKHRoaXMuZWxlbUNvbG9yRW50cmllcyk7XHJcbiAgfVxyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LWdpbGRpbmdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGRlY0VsZW1HaWxkaW5nRW50cmllcygpOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9lbGVtR2lsZGluZ0VudHJpZXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGVjRWxlbUdpbGRpbmdFbnRyaWVzKHZhbHVlOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9lbGVtR2lsZGluZ0VudHJpZXMgPSB2YWx1ZTtcclxuICAgIHRoaXMuZWxlbUdpbGRpbmdFbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXModmFsdWUsIHRoaXMudHlwZT8udmFsdWUpO1xyXG4gICAgdGhpcy5hdmFpbEdpbGRpbmdzID0gdGhpcy5nZXRBdmFpbGFibGVGbGFncyh0aGlzLmVsZW1HaWxkaW5nRW50cmllcyk7XHJcbiAgfVxyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXRlY2huaXF1ZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGVjRWxlbVRlY2hFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1UZWNoRW50cmllcztcclxuICB9XHJcbiAgcHVibGljIHNldCBkZWNFbGVtVGVjaEVudHJpZXModmFsdWU6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2VsZW1UZWNoRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5lbGVtVGVjaG5pcXVlRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKFxyXG4gICAgICB2YWx1ZSxcclxuICAgICAgdGhpcy50eXBlPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHRoaXMuYXZhaWxUZWNobmlxdWVzID0gdGhpcy5nZXRBdmFpbGFibGVGbGFncyh0aGlzLmVsZW1UZWNobmlxdWVFbnRyaWVzKTtcclxuICB9XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtcG9zaXRpb25zXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGRlY0VsZW1Qb3NFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1Qb3NFbnRyaWVzO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY0VsZW1Qb3NFbnRyaWVzKHZhbHVlOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9lbGVtUG9zRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5lbGVtUG9zaXRpb25FbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXModmFsdWUsIHRoaXMudHlwZT8udmFsdWUpO1xyXG4gICAgdGhpcy5hdmFpbFBvc2l0aW9ucyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtUG9zaXRpb25FbnRyaWVzKTtcclxuICB9XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdG9vbHNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGVjRWxlbVRvb2xFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1Ub29sRW50cmllcztcclxuICB9XHJcbiAgcHVibGljIHNldCBkZWNFbGVtVG9vbEVudHJpZXModmFsdWU6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2VsZW1Ub29sRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5lbGVtVG9vbEVudHJpZXMgPSB0aGlzLmdldEZpbHRlcmVkRW50cmllcyh2YWx1ZSwgdGhpcy50eXBlPy52YWx1ZSk7XHJcbiAgICB0aGlzLmF2YWlsVG9vbHMgPSB0aGlzLmdldEF2YWlsYWJsZUZsYWdzKHRoaXMuZWxlbVRvb2xFbnRyaWVzKTtcclxuICB9XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdHlwb2xvZ2llc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkZWNFbGVtVHlwb2xFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1UeXBvbEVudHJpZXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGVjRWxlbVR5cG9sRW50cmllcyh2YWx1ZTogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZWxlbVR5cG9sRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5lbGVtVHlwb2xFbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXModmFsdWUsIHRoaXMudHlwZT8udmFsdWUpO1xyXG4gICAgdGhpcy5hdmFpbFR5cG9sb2dpZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZsYWdzKHRoaXMuZWxlbVR5cG9sRW50cmllcyk7XHJcbiAgfVxyXG5cclxuICAvLyBjb2QtaW1hZ2UtdHlwZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpbWdUeXBlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gdGhlIGZpbHRlcmVkIGVudHJpZXM6XHJcbiAgcHVibGljIGVsZW1GbGFnRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZWxlbUNvbG9yRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZWxlbUdpbGRpbmdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBlbGVtVGVjaG5pcXVlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZWxlbVBvc2l0aW9uRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZWxlbVRvb2xFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBlbGVtVHlwb2xFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZWxlbUdpbGRpbmdGcmVlPzogYm9vbGVhbjtcclxuICBwdWJsaWMgZWxlbVRlY2huaXF1ZUZyZWU/OiBib29sZWFuO1xyXG4gIHB1YmxpYyBlbGVtUG9zaXRpb25GcmVlPzogYm9vbGVhbjtcclxuICBwdWJsaWMgZWxlbVRvb2xGcmVlPzogYm9vbGVhbjtcclxuXHJcbiAgLy8gdGhpcyBvYmplY3QgaGFzIGEgcHJvcGVydHkgZm9yIGVhY2ggY29udHJvbFxyXG4gIC8vIHRvIGJlIGhpZGRlbiwgaGF2aW5nIHRoZSBzYW1lIG5hbWUgb2YgdGhlIGNvbnRyb2xcclxuICAvLyBhbmQgdmFsdWU9dHJ1ZS5cclxuICBwdWJsaWMgaGlkZGVuPzogSGlkZGVuRGVjRWxlbUZpZWxkcztcclxuXHJcbiAgY29uc3RydWN0b3IoZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENvZERlY29yYXRpb25FbGVtZW50PigpO1xyXG4gICAgdGhpcy5lZGl0b3JDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIHRoaXMuaW5pdGlhbFJhbmdlcyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsSW1hZ2VzID0gW107XHJcbiAgICAvLyBmbGFnc1xyXG4gICAgdGhpcy5pbml0aWFsRmxhZ3MgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFR5cG9sb2dpZXMgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbENvbG9ycyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsR2lsZGluZ3MgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFRlY2huaXF1ZXMgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFRvb2xzID0gW107XHJcbiAgICB0aGlzLmluaXRpYWxQb3NpdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxGbGFncyA9IFtdO1xyXG4gICAgdGhpcy5hdmFpbFR5cG9sb2dpZXMgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxDb2xvcnMgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxHaWxkaW5ncyA9IFtdO1xyXG4gICAgdGhpcy5hdmFpbFRlY2huaXF1ZXMgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxUb29scyA9IFtdO1xyXG4gICAgdGhpcy5hdmFpbFBvc2l0aW9ucyA9IFtdO1xyXG5cclxuICAgIC8vIGZvcm1cclxuICAgIHRoaXMua2V5ID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXlstYS16QS1aMC05X10rJCcpLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMucGFyZW50S2V5ID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXlstYS16QS1aMC05X10rJCcpLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMudHlwZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMuZmxhZ3MgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5yYW5nZXMgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5pbnN0YW5jZUNvdW50ID0gZm9ybUJ1aWxkZXIuY29udHJvbCgwLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy50eXBvbG9naWVzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuc3ViamVjdCA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKSk7XHJcbiAgICB0aGlzLmNvbG9ycyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmdpbGRpbmdzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudGVjaG5pcXVlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLnRvb2xzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMucG9zaXRpb25zID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMubGluZUhlaWdodCA9IGZvcm1CdWlsZGVyLmNvbnRyb2woMCwge1xyXG4gICAgICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLm1pbigwKSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMudGV4dFJlbGF0aW9uID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApKTtcclxuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMDApKTtcclxuICAgIHRoaXMuaW1hZ2VzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMubm90ZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTAwKSk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGtleTogdGhpcy5rZXksXHJcbiAgICAgIHBhcmVudEtleTogdGhpcy5wYXJlbnRLZXksXHJcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcclxuICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXHJcbiAgICAgIGluc3RhbmNlQ291bnQ6IHRoaXMuaW5zdGFuY2VDb3VudCxcclxuICAgICAgcmFuZ2VzOiB0aGlzLnJhbmdlcyxcclxuICAgICAgdHlwb2xvZ2llczogdGhpcy50eXBvbG9naWVzLFxyXG4gICAgICBzdWJqZWN0OiB0aGlzLnN1YmplY3QsXHJcbiAgICAgIGNvbG9yczogdGhpcy5jb2xvcnMsXHJcbiAgICAgIGdpbGRpbmdzOiB0aGlzLmdpbGRpbmdzLFxyXG4gICAgICB0ZWNobmlxdWVzOiB0aGlzLnRlY2huaXF1ZXMsXHJcbiAgICAgIHRvb2xzOiB0aGlzLnRvb2xzLFxyXG4gICAgICBwb3NpdGlvbnM6IHRoaXMucG9zaXRpb25zLFxyXG4gICAgICBsaW5lSGVpZ2h0OiB0aGlzLmxpbmVIZWlnaHQsXHJcbiAgICAgIHRleHRSZWxhdGlvbjogdGhpcy50ZXh0UmVsYXRpb24sXHJcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxyXG4gICAgICBpbWFnZXM6IHRoaXMuaW1hZ2VzLFxyXG4gICAgICBub3RlOiB0aGlzLm5vdGUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIHRoZXNhdXJ1cyBlbnRyaWVzIHJlcHJlc2VudCBhIGZyZWUgc2V0LlxyXG4gICAqIFRoaXMgaGFwcGVucyB3aGVuIHdlIGp1c3QgaGF2ZSBhIHNpbmdsZSBlbnRyeSB3aXRoIGEgc2luZ2xlIGRvdFxyXG4gICAqIGZvbGxvd2VkIGJ5IFwiLVwiLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGVudHJpZXMgVGhlIHRoZXNhdXJ1cyBlbnRyaWVzIHRvIHRlc3QuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZW50cmllcyByZXByZXNlbnQgYSBmcmVlIHNldC5cclxuICAgKi9cclxuICBwcml2YXRlIGlzRnJlZVNldChlbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZW50cmllcz8ubGVuZ3RoICE9PSAxKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRva2VucyA9IGVudHJpZXNbMF0uaWQuc3BsaXQoJy4nKTtcclxuICAgIHJldHVybiB0b2tlbnMubGVuZ3RoID09PSAyICYmIHRva2Vuc1sxXSA9PT0gJy0nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJlZEVudHJpZXMoXHJcbiAgICBlbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkIHwgbnVsbCxcclxuICAgIHByZWZpeDogc3RyaW5nIHwgbnVsbFxyXG4gICk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFwcmVmaXggfHwgIWVudHJpZXM/LnNvbWUoKGUpID0+IGUuaWQuaW5kZXhPZignLicpID4gLTEpKSB7XHJcbiAgICAgIHJldHVybiBlbnRyaWVzIHx8IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGNvbnN0IHAgPSBwcmVmaXggKyAnLic7XHJcbiAgICByZXR1cm4gZW50cmllcy5maWx0ZXIoKGUpID0+IGUuaWQuc3RhcnRzV2l0aChwKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEF2YWlsYWJsZUZsYWdzKGVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQpOiBGbGFnW10ge1xyXG4gICAgcmV0dXJuIGVudHJpZXM/Lmxlbmd0aFxyXG4gICAgICA/IGVudHJpZXNcclxuICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUudmFsdWU/Lmxlbmd0aClcclxuICAgICAgICAgIC5tYXAoKGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICBpZDogZS5pZCxcclxuICAgICAgICAgICAgICBsYWJlbDogZS52YWx1ZSxcclxuICAgICAgICAgICAgfSBhcyBGbGFnO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgOiBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJpbGl0eSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhpZGRlbjogYW55ID0ge307XHJcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZGVjVHlwZUhpZGRlbkVudHJpZXM/LmZpbmQoXHJcbiAgICAgIChlKSA9PiBlLmlkID09PSB0aGlzLnR5cGUudmFsdWVcclxuICAgICk7XHJcbiAgICBpZiAoZW50cnkpIHtcclxuICAgICAgY29uc3QgbmFtZXMgPSBlbnRyeS52YWx1ZS5zcGxpdCgnICcpLmZpbHRlcigocykgPT4gcyk7XHJcbiAgICAgIG5hbWVzLmZvckVhY2goKG4pID0+IHtcclxuICAgICAgICBoaWRkZW5bbl0gPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuaGlkZGVuID0gaGlkZGVuO1xyXG4gICAgY29uc29sZS5sb2coJ2hpZGRlbjogJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuaGlkZGVuKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMub25UYWJJbmRleENoYW5nZWQoMCk7XHJcblxyXG4gICAgdGhpcy5hZGp1c3RVSSgpO1xyXG5cclxuICAgIHRoaXMudHlwZS52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5fdXBkYXRpbmdGb3JtKSB7XHJcbiAgICAgICAgICB0aGlzLmFkanVzdFVJKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRqdXN0VUkoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fYWRqdXN0aW5nVUkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYWRqdXN0aW5nVUkgPSB0cnVlO1xyXG4gICAgY29uc29sZS5sb2coJ2FkanVzdFVJIGVudGVyJyk7XHJcbiAgICAvLyByZXNldCB0eXBlLWRlcGVuZGVudCB2YWx1ZXNcclxuICAgIHRoaXMuZmxhZ3MucmVzZXQoKTtcclxuICAgIHRoaXMudHlwb2xvZ2llcy5yZXNldCgpO1xyXG4gICAgdGhpcy5zdWJqZWN0LnJlc2V0KCk7XHJcbiAgICB0aGlzLmluaXRpYWxDb2xvcnMgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbEdpbGRpbmdzID0gW107XHJcbiAgICB0aGlzLmluaXRpYWxUZWNobmlxdWVzID0gW107XHJcbiAgICB0aGlzLmluaXRpYWxUb29scyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsUG9zaXRpb25zID0gW107XHJcbiAgICB0aGlzLmxpbmVIZWlnaHQucmVzZXQoKTtcclxuICAgIHRoaXMudGV4dFJlbGF0aW9uLnJlc2V0KCk7XHJcblxyXG4gICAgLy8gZmlsdGVyIGVudHJpZXMgZm9yIG11bHRpcGxlLXNlbGVjdGlvbnNcclxuICAgIHRoaXMuZWxlbUZsYWdFbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXMoXHJcbiAgICAgIHRoaXMuX2VsZW1GbGFnRW50cmllcyxcclxuICAgICAgdGhpcy50eXBlPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHRoaXMuYXZhaWxGbGFncyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtRmxhZ0VudHJpZXMpO1xyXG5cclxuICAgIHRoaXMuZWxlbUNvbG9yRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKFxyXG4gICAgICB0aGlzLl9lbGVtQ29sb3JFbnRyaWVzLFxyXG4gICAgICB0aGlzLnR5cGU/LnZhbHVlXHJcbiAgICApO1xyXG4gICAgdGhpcy5hdmFpbENvbG9ycyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtQ29sb3JFbnRyaWVzKTtcclxuXHJcbiAgICAvLyBmaWx0ZXIgZW50cmllcyBhbmQgc2V0IGZyZWUgZm9yIHNpbmdsZS1zZWxlY3Rpb25zXHJcbiAgICB0aGlzLmVsZW1HaWxkaW5nRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKFxyXG4gICAgICB0aGlzLl9lbGVtR2lsZGluZ0VudHJpZXMsXHJcbiAgICAgIHRoaXMudHlwZT8udmFsdWVcclxuICAgICk7XHJcbiAgICB0aGlzLmF2YWlsR2lsZGluZ3MgPSB0aGlzLmdldEF2YWlsYWJsZUZsYWdzKHRoaXMuZWxlbUdpbGRpbmdFbnRyaWVzKTtcclxuICAgIHRoaXMuZWxlbUdpbGRpbmdGcmVlID0gdGhpcy5pc0ZyZWVTZXQodGhpcy5lbGVtR2lsZGluZ0VudHJpZXMpO1xyXG5cclxuICAgIHRoaXMuZWxlbVRlY2huaXF1ZUVudHJpZXMgPSB0aGlzLmdldEZpbHRlcmVkRW50cmllcyhcclxuICAgICAgdGhpcy5fZWxlbVRlY2hFbnRyaWVzLFxyXG4gICAgICB0aGlzLnR5cGU/LnZhbHVlXHJcbiAgICApO1xyXG4gICAgdGhpcy5hdmFpbFRlY2huaXF1ZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZsYWdzKHRoaXMuZWxlbVRlY2huaXF1ZUVudHJpZXMpO1xyXG4gICAgdGhpcy5lbGVtVGVjaG5pcXVlRnJlZSA9IHRoaXMuaXNGcmVlU2V0KHRoaXMuZWxlbVRlY2huaXF1ZUVudHJpZXMpO1xyXG5cclxuICAgIHRoaXMuZWxlbVBvc2l0aW9uRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKFxyXG4gICAgICB0aGlzLl9lbGVtUG9zRW50cmllcyxcclxuICAgICAgdGhpcy50eXBlPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHRoaXMuYXZhaWxQb3NpdGlvbnMgPSB0aGlzLmdldEF2YWlsYWJsZUZsYWdzKHRoaXMuZWxlbVBvc2l0aW9uRW50cmllcyk7XHJcbiAgICB0aGlzLmVsZW1Qb3NpdGlvbkZyZWUgPSB0aGlzLmlzRnJlZVNldCh0aGlzLmVsZW1Qb3NpdGlvbkVudHJpZXMpO1xyXG5cclxuICAgIHRoaXMuZWxlbVRvb2xFbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXMoXHJcbiAgICAgIHRoaXMuX2VsZW1Ub29sRW50cmllcyxcclxuICAgICAgdGhpcy50eXBlPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHRoaXMuYXZhaWxUb29scyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtVG9vbEVudHJpZXMpO1xyXG4gICAgdGhpcy5lbGVtVG9vbEZyZWUgPSB0aGlzLmlzRnJlZVNldCh0aGlzLmVsZW1Ub29sRW50cmllcyk7XHJcblxyXG4gICAgdGhpcy5lbGVtVHlwb2xFbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXMoXHJcbiAgICAgIHRoaXMuX2VsZW1UeXBvbEVudHJpZXMsXHJcbiAgICAgIHRoaXMudHlwZT8udmFsdWVcclxuICAgICk7XHJcbiAgICB0aGlzLmF2YWlsVHlwb2xvZ2llcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtVHlwb2xFbnRyaWVzKTtcclxuXHJcbiAgICAvLyB2aXNpYmlsaXR5XHJcbiAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkoKTtcclxuICAgIHRoaXMuX2FkanVzdGluZ1VJID0gZmFsc2U7XHJcbiAgICBjb25zb2xlLmxvZygnYWRqdXN0VUkgZXhpdCcpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVGFiSW5kZXhDaGFuZ2VkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIEhBQ0tcclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdHVsYXJlbi9uZ3gtbW9uYWNvLWVkaXRvci9pc3N1ZXMvMTlcclxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM3NDEyOTUwL25neC1tb25hY28tZWRpdG9yLXVuYWJsZS10by1zZXQtbGF5b3V0LXNpemUtd2hlbi1jb250YWluZXItY2hhbmdlcy11c2luZy10YWJcclxuICAgIGlmIChpbmRleCA9PT0gMikge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmRzY0VkaXRvcj8uX2VkaXRvcj8ubGF5b3V0KCk7XHJcbiAgICAgIH0sIDE1MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZvcm0oZWxlbWVudDogQ29kRGVjb3JhdGlvbkVsZW1lbnQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3VwZGF0aW5nRm9ybSA9IHRydWU7XHJcbiAgICBjb25zb2xlLmxvZygndXBkYXRlRm9ybSBlbnRlcicpO1xyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgICB0aGlzLl91cGRhdGluZ0Zvcm0gPSBmYWxzZTtcclxuICAgICAgY29uc29sZS5sb2coJ3VwZGF0ZUZvcm0gZXhpdCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBnZW5lcmFsXHJcbiAgICB0aGlzLnR5cGUuc2V0VmFsdWUoZWxlbWVudC50eXBlKTtcclxuICAgIC8vIGxldCB0aGUgVUkgYWRqdXN0IGl0c2VsZiBiZWZvcmUgc2V0dGluZyB0eXBlLWRlcGVuZGVudCBjb250cm9sc1xyXG4gICAgdGhpcy5hZGp1c3RVSSgpO1xyXG5cclxuICAgIC8vIHNldCBvdGhlciBjb250cm9sc1xyXG4gICAgLy8gSEFDS1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMua2V5LnNldFZhbHVlKGVsZW1lbnQua2V5IHx8IG51bGwpO1xyXG4gICAgICB0aGlzLnBhcmVudEtleS5zZXRWYWx1ZShlbGVtZW50LnBhcmVudEtleSB8fCBudWxsKTtcclxuICAgICAgdGhpcy5pbnN0YW5jZUNvdW50LnNldFZhbHVlKGVsZW1lbnQuaW5zdGFuY2VDb3VudCB8fCAwKTtcclxuXHJcbiAgICAgIHRoaXMucmFuZ2VzLnNldFZhbHVlKGVsZW1lbnQucmFuZ2VzIHx8IFtdKTtcclxuICAgICAgdGhpcy5pbml0aWFsUmFuZ2VzID0gZWxlbWVudC5yYW5nZXM7XHJcblxyXG4gICAgICB0aGlzLmZsYWdzLnNldFZhbHVlKGVsZW1lbnQuZmxhZ3MgfHwgW10pO1xyXG4gICAgICB0aGlzLmluaXRpYWxGbGFncyA9IGVsZW1lbnQuZmxhZ3M7XHJcblxyXG4gICAgICAvLyB0eXBvbG9naWVzXHJcbiAgICAgIHRoaXMuc3ViamVjdC5zZXRWYWx1ZShlbGVtZW50LnN1YmplY3QgfHwgbnVsbCk7XHJcblxyXG4gICAgICB0aGlzLmNvbG9ycy5zZXRWYWx1ZShlbGVtZW50LmNvbG9ycyB8fCBbXSk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbENvbG9ycyA9IHRoaXMuY29sb3JzLnZhbHVlO1xyXG5cclxuICAgICAgdGhpcy50eXBvbG9naWVzLnNldFZhbHVlKGVsZW1lbnQudHlwb2xvZ2llcyB8fCBbXSk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbFR5cG9sb2dpZXMgPSB0aGlzLnR5cG9sb2dpZXMudmFsdWU7XHJcblxyXG4gICAgICB0aGlzLmdpbGRpbmdzLnNldFZhbHVlKGVsZW1lbnQuZ2lsZGluZ3MgfHwgW10pO1xyXG4gICAgICB0aGlzLmluaXRpYWxHaWxkaW5ncyA9IHRoaXMuZ2lsZGluZ3MudmFsdWU7XHJcblxyXG4gICAgICB0aGlzLnRlY2huaXF1ZXMuc2V0VmFsdWUoZWxlbWVudC50ZWNobmlxdWVzIHx8IFtdKTtcclxuICAgICAgdGhpcy5pbml0aWFsVGVjaG5pcXVlcyA9IHRoaXMudGVjaG5pcXVlcy52YWx1ZTtcclxuXHJcbiAgICAgIHRoaXMudG9vbHMuc2V0VmFsdWUoZWxlbWVudC50b29scyB8fCBbXSk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbFRvb2xzID0gdGhpcy50b29scy52YWx1ZTtcclxuXHJcbiAgICAgIHRoaXMucG9zaXRpb25zLnNldFZhbHVlKGVsZW1lbnQucG9zaXRpb25zIHx8IFtdKTtcclxuICAgICAgdGhpcy5pbml0aWFsUG9zaXRpb25zID0gdGhpcy5wb3NpdGlvbnMudmFsdWU7XHJcblxyXG4gICAgICB0aGlzLmxpbmVIZWlnaHQuc2V0VmFsdWUoZWxlbWVudC5saW5lSGVpZ2h0IHx8IDApO1xyXG4gICAgICB0aGlzLnRleHRSZWxhdGlvbi5zZXRWYWx1ZShlbGVtZW50LnRleHRSZWxhdGlvbiB8fCBudWxsKTtcclxuICAgICAgLy8gZGVzY3JpcHRpb25cclxuICAgICAgdGhpcy5kZXNjcmlwdGlvbi5zZXRWYWx1ZShlbGVtZW50LmRlc2NyaXB0aW9uIHx8IG51bGwpO1xyXG4gICAgICB0aGlzLmluaXRpYWxJbWFnZXMgPSBlbGVtZW50LmltYWdlcyB8fCBbXTtcclxuICAgICAgdGhpcy5ub3RlLnNldFZhbHVlKGVsZW1lbnQubm90ZSB8fCBudWxsKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICB0aGlzLl91cGRhdGluZ0Zvcm0gPSBmYWxzZTtcclxuICAgICAgY29uc29sZS5sb2coJ3VwZGF0ZUZvcm0gdG0gZXhpdCcpO1xyXG4gICAgfSwgMCk7XHJcbiAgICBjb25zb2xlLmxvZygndXBkYXRlRm9ybSBleGl0Jyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEVsZW1lbnQoKTogQ29kRGVjb3JhdGlvbkVsZW1lbnQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAga2V5OiB0aGlzLmtleS52YWx1ZT8udHJpbSgpLFxyXG4gICAgICBwYXJlbnRLZXk6IHRoaXMucGFyZW50S2V5LnZhbHVlPy50cmltKCksXHJcbiAgICAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZT8udHJpbSgpIHx8ICcnLFxyXG4gICAgICBmbGFnczogdGhpcy5mbGFncy52YWx1ZSB8fCBbXSxcclxuICAgICAgcmFuZ2VzOiB0aGlzLnJhbmdlcy52YWx1ZSB8fCBbXSxcclxuICAgICAgaW5zdGFuY2VDb3VudDogdGhpcy5pbnN0YW5jZUNvdW50LnZhbHVlIHx8IDAsXHJcbiAgICAgIHR5cG9sb2dpZXM6IHRoaXMudHlwb2xvZ2llcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLnR5cG9sb2dpZXMudmFsdWVcclxuICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgc3ViamVjdDogdGhpcy5zdWJqZWN0LnZhbHVlPy50cmltKCksXHJcbiAgICAgIGNvbG9yczogdGhpcy5jb2xvcnMudmFsdWU/Lmxlbmd0aCA/IHRoaXMuY29sb3JzLnZhbHVlIDogdW5kZWZpbmVkLFxyXG4gICAgICBnaWxkaW5nczogdGhpcy5naWxkaW5ncy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5naWxkaW5ncy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgdGVjaG5pcXVlczogdGhpcy50ZWNobmlxdWVzLnZhbHVlPy5sZW5ndGhcclxuICAgICAgICA/IHRoaXMudGVjaG5pcXVlcy52YWx1ZVxyXG4gICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICB0b29sczogdGhpcy50b29scy52YWx1ZT8ubGVuZ3RoID8gdGhpcy50b29scy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgcG9zaXRpb25zOiB0aGlzLnBvc2l0aW9ucy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLnBvc2l0aW9ucy52YWx1ZVxyXG4gICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICBsaW5lSGVpZ2h0OiB0aGlzLmxpbmVIZWlnaHQudmFsdWUsXHJcbiAgICAgIHRleHRSZWxhdGlvbjogdGhpcy50ZXh0UmVsYXRpb24udmFsdWU/LnRyaW0oKSxcclxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24udmFsdWU/LnRyaW0oKSxcclxuICAgICAgaW1hZ2VzOiB0aGlzLmltYWdlcy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5pbWFnZXMudmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICAgIG5vdGU6IHRoaXMubm90ZS52YWx1ZT8udHJpbSgpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkxvY2F0aW9uQ2hhbmdlKHJhbmdlczogQ29kTG9jYXRpb25SYW5nZVtdIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5yYW5nZXMuc2V0VmFsdWUocmFuZ2VzIHx8IFtdKTtcclxuICAgIHRoaXMucmFuZ2VzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMucmFuZ2VzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25JbWFnZXNDaGFuZ2UoaW1hZ2VzOiBDb2RJbWFnZVtdIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICB0aGlzLmltYWdlcy5zZXRWYWx1ZShpbWFnZXMgfHwgW10pO1xyXG4gICAgdGhpcy5pbWFnZXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5pbWFnZXMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZsYWdzQ2hhbmdlKGlkczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIHRoaXMuZmxhZ3Muc2V0VmFsdWUoaWRzKTtcclxuICAgIHRoaXMuZmxhZ3MudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5mbGFncy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVHlwb2xvZ2llc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdXBkYXRpbmdGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudHlwb2xvZ2llcy5zZXRWYWx1ZShpZHMpO1xyXG4gICAgdGhpcy50eXBvbG9naWVzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMudHlwb2xvZ2llcy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ29sb3JzQ2hhbmdlKGlkczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl91cGRhdGluZ0Zvcm0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb2xvcnMuc2V0VmFsdWUoaWRzKTtcclxuICAgIHRoaXMuY29sb3JzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuY29sb3JzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25HaWxkaW5nc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdXBkYXRpbmdGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZ2lsZGluZ3Muc2V0VmFsdWUoaWRzKTtcclxuICAgIHRoaXMuZ2lsZGluZ3MudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5naWxkaW5ncy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVGVjaG5pcXVlc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdXBkYXRpbmdGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudGVjaG5pcXVlcy5zZXRWYWx1ZShpZHMpO1xyXG4gICAgdGhpcy50ZWNobmlxdWVzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMudGVjaG5pcXVlcy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVG9vbHNDaGFuZ2UoaWRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3VwZGF0aW5nRm9ybSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnRvb2xzLnNldFZhbHVlKGlkcyk7XHJcbiAgICB0aGlzLnRvb2xzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMudG9vbHMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblBvc2l0aW9uc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdXBkYXRpbmdGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucG9zaXRpb25zLnNldFZhbHVlKGlkcyk7XHJcbiAgICB0aGlzLnBvc2l0aW9ucy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLnBvc2l0aW9ucy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIHR5cGVJZFRvU3RyaW5nKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIC8vICAgY29uc3QgZW50cnkgPSB0aGlzLmRlY0VsZW1UeXBlRW50cmllcz8uZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpO1xyXG4gIC8vICAgcmV0dXJuIGVudHJ5ID8gZW50cnkudmFsdWUgOiBpZDtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBjYW5jZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQoKTtcclxuICAgIHRoaXMuZWxlbWVudENoYW5nZS5lbWl0KGVsZW1lbnQpO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0eXBlLWhlYWRcIj5cclxuICAgIHt7IHR5cGUudmFsdWUgfCBmbGF0TG9va3VwIDogZGVjRWxlbVR5cGVFbnRyaWVzIDogXCJpZFwiIDogXCJ2YWx1ZVwiIH19XHJcbiAgPC9kaXY+XHJcbiAgPG1hdC10YWItZ3JvdXAgKHNlbGVjdGVkSW5kZXhDaGFuZ2UpPVwib25UYWJJbmRleENoYW5nZWQoJGV2ZW50KVwiPlxyXG4gICAgPCEtLSBHRU5FUkFMIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJnZW5lcmFsXCI+XHJcbiAgICAgIDwhLS0gdHlwZSAoYm91bmQpIC0tPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAqbmdJZj1cImRlY0VsZW1UeXBlRW50cmllcz8ubGVuZ3RoXCJcclxuICAgICAgICBzdHlsZT1cIndpZHRoOiAxNGVtXCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsPnR5cGU8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwidHlwZVwiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGUgb2YgZGVjRWxlbVR5cGVFbnRyaWVzXCIgW3ZhbHVlXT1cImUuaWRcIj57e1xyXG4gICAgICAgICAgICBlLnZhbHVlXHJcbiAgICAgICAgICB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgKm5nSWY9XCIkYW55KHR5cGUpLmVycm9ycz8ucmVxdWlyZWQgJiYgKHR5cGUuZGlydHkgfHwgdHlwZS50b3VjaGVkKVwiXHJcbiAgICAgICAgICA+dHlwZSByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAmbmJzcDtcclxuICAgICAgPCEtLSBpbnN0YW5jZUNvdW50IC0tPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogNmVtXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5jb3VudDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiaW5zdGFuY2VDb3VudFwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgLz5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgIDwhLS0gcmFuZ2VzIC0tPlxyXG4gICAgICA8Y2FkbXVzLWNvZC1sb2NhdGlvblxyXG4gICAgICAgIGxhYmVsPVwicmFuZ2VzXCJcclxuICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgW2xvY2F0aW9uXT1cImluaXRpYWxSYW5nZXMgfHwgbnVsbFwiXHJcbiAgICAgICAgKGxvY2F0aW9uQ2hhbmdlKT1cIm9uTG9jYXRpb25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgID48L2NhZG11cy1jb2QtbG9jYXRpb24+XHJcblxyXG4gICAgICA8IS0tIGZsYWdzIC0tPlxyXG4gICAgICA8ZmllbGRzZXQgKm5nSWY9XCJhdmFpbEZsYWdzPy5sZW5ndGhcIj5cclxuICAgICAgICA8bGVnZW5kPmZlYXR1cmVzPC9sZWdlbmQ+XHJcbiAgICAgICAgPGNhZG11cy11aS1mbGFncy1waWNrZXJcclxuICAgICAgICAgIFtmbGFnc109XCJhdmFpbEZsYWdzXCJcclxuICAgICAgICAgIFtzZWxlY3RlZElkc109XCJpbml0aWFsRmxhZ3NcIlxyXG4gICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uRmxhZ3NDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLXVpLWZsYWdzLXBpY2tlcj5cclxuICAgICAgPC9maWVsZHNldD5cclxuXHJcbiAgICAgIDxiciAvPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDwhLS0ga2V5IC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+a2V5PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImtleVwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShrZXkpLmVycm9ycz8ucGF0dGVybiAmJiAoa2V5LmRpcnR5IHx8IGtleS50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgID5pbnZhbGlkIGtleTwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShrZXkpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChrZXkuZGlydHkgfHwga2V5LnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPmtleSB0b28gbG9uZzwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAmbmJzcDtcclxuICAgICAgICA8IS0tIHBhcmVudEtleSAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJwYXJlbnRLZXlzPy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+cGFyZW50IGtleTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInBhcmVudEtleVwiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwibnVsbFwiPihub25lKTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGsgb2YgcGFyZW50S2V5c1wiIFt2YWx1ZV09XCJrXCI+e3tcclxuICAgICAgICAgICAgICBrXHJcbiAgICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtdGFiPlxyXG5cclxuICAgIDwhLS0gVFlQT0xPR0lFUyAtLT5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwidHlwb2xvZ2llc1wiPlxyXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHhcIj5cclxuICAgICAgICA8IS0tIGxpbmVIZWlnaHQgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICBzdHlsZT1cImZsZXg6IDAgMCBhdXRvOyB3aWR0aDogNGVtXCJcclxuICAgICAgICAgIFtoaWRkZW5dPVwiaGlkZGVuPy5saW5lSGVpZ2h0XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPmxuLmg8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIFtmb3JtQ29udHJvbF09XCJsaW5lSGVpZ2h0XCIgLz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwhLS0gdGV4dFJlbGF0aW9uIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgW2hpZGRlbl09XCJoaWRkZW4/LnRleHRSZWxhdGlvblwiXHJcbiAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IDEgMCBhdXRvXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnRleHQgcmVsYXRpb248L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidGV4dFJlbGF0aW9uXCIgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAkYW55KHRleHRSZWxhdGlvbikuZXJyb3JzPy5tYXhMZW5ndGggJiZcclxuICAgICAgICAgICAgICAodGV4dFJlbGF0aW9uLmRpcnR5IHx8IHRleHRSZWxhdGlvbi50b3VjaGVkKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+dGV4dCByZWxhdGlvbiB0b28gbG9uZzwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gdHlwb2xvZ2llcyAtLT5cclxuICAgICAgPGZpZWxkc2V0IFtoaWRkZW5dPVwiIWF2YWlsVHlwb2xvZ2llcy5sZW5ndGggfHwgaGlkZGVuPy50eXBvbG9naWVzXCI+XHJcbiAgICAgICAgPGxlZ2VuZD50eXBvbG9naWVzPC9sZWdlbmQ+XHJcbiAgICAgICAgPGNhZG11cy11aS1mbGFncy1waWNrZXJcclxuICAgICAgICAgIFtmbGFnc109XCJhdmFpbFR5cG9sb2dpZXNcIlxyXG4gICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImluaXRpYWxUeXBvbG9naWVzXCJcclxuICAgICAgICAgIChzZWxlY3RlZElkc0NoYW5nZSk9XCJvblR5cG9sb2dpZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLXVpLWZsYWdzLXBpY2tlcj5cclxuICAgICAgPC9maWVsZHNldD5cclxuXHJcbiAgICAgIDwhLS0gc3ViamVjdCAtLT5cclxuICAgICAgPGRpdiBbaGlkZGVuXT1cImhpZGRlbj8uc3ViamVjdFwiPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+c3ViamVjdDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJzdWJqZWN0XCIgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAkYW55KHN1YmplY3QpLmVycm9ycz8ubWF4TGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgKHN1YmplY3QuZGlydHkgfHwgc3ViamVjdC50b3VjaGVkKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+c3ViamVjdCB0b28gbG9uZzwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIGNvbG9ycyAtLT5cclxuICAgICAgPGZpZWxkc2V0IFtoaWRkZW5dPVwiIWF2YWlsQ29sb3JzLmxlbmd0aCB8fCBoaWRkZW4/LmNvbG9yc1wiPlxyXG4gICAgICAgIDxsZWdlbmQ+Y29sb3JzPC9sZWdlbmQ+XHJcbiAgICAgICAgPGNhZG11cy11aS1mbGFncy1waWNrZXJcclxuICAgICAgICAgIFtmbGFnc109XCJhdmFpbENvbG9yc1wiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwiaW5pdGlhbENvbG9yc1wiXHJcbiAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25Db2xvcnNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLXVpLWZsYWdzLXBpY2tlcj5cclxuICAgICAgPC9maWVsZHNldD5cclxuXHJcbiAgICAgIDwhLS0gZ2lsZGluZ3MgLS0+XHJcbiAgICAgIDxmaWVsZHNldFxyXG4gICAgICAgIFtoaWRkZW5dPVwiXHJcbiAgICAgICAgICAoIWF2YWlsR2lsZGluZ3MubGVuZ3RoICYmICFlbGVtR2lsZGluZ0ZyZWUpIHx8IGhpZGRlbj8uZ2lsZGluZ3NcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGxlZ2VuZD5naWxkaW5nczwvbGVnZW5kPlxyXG4gICAgICAgIDxjYWRtdXMtdWktZmxhZ3MtcGlja2VyXHJcbiAgICAgICAgICBbZmxhZ3NdPVwiYXZhaWxHaWxkaW5nc1wiXHJcbiAgICAgICAgICBbYWxsb3dVc2VyRmxhZ3NdPVwiZWxlbUdpbGRpbmdGcmVlIHx8IGZhbHNlXCJcclxuICAgICAgICAgIFtzZWxlY3RlZElkc109XCJpbml0aWFsR2lsZGluZ3NcIlxyXG4gICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uR2lsZGluZ3NDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLXVpLWZsYWdzLXBpY2tlcj5cclxuICAgICAgPC9maWVsZHNldD5cclxuXHJcbiAgICAgIDwhLS0gdGVjaG5pcXVlcyAtLT5cclxuICAgICAgPGZpZWxkc2V0XHJcbiAgICAgICAgW2hpZGRlbl09XCJcclxuICAgICAgICAgICghYXZhaWxUZWNobmlxdWVzLmxlbmd0aCAmJiAhZWxlbVRlY2huaXF1ZUZyZWUpIHx8IGhpZGRlbj8udGVjaG5pcXVlc1xyXG4gICAgICAgIFwiXHJcbiAgICAgID5cclxuICAgICAgICA8bGVnZW5kPnRlY2huaXF1ZXM8L2xlZ2VuZD5cclxuICAgICAgICA8Y2FkbXVzLXVpLWZsYWdzLXBpY2tlclxyXG4gICAgICAgICAgW2ZsYWdzXT1cImF2YWlsVGVjaG5pcXVlc1wiXHJcbiAgICAgICAgICBbYWxsb3dVc2VyRmxhZ3NdPVwiZWxlbVRlY2huaXF1ZUZyZWUgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImluaXRpYWxUZWNobmlxdWVzXCJcclxuICAgICAgICAgIChzZWxlY3RlZElkc0NoYW5nZSk9XCJvblRlY2huaXF1ZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLXVpLWZsYWdzLXBpY2tlcj5cclxuICAgICAgPC9maWVsZHNldD5cclxuXHJcbiAgICAgIDwhLS0gdG9vbHMgLS0+XHJcbiAgICAgIDxmaWVsZHNldFxyXG4gICAgICAgIFtoaWRkZW5dPVwiKCFhdmFpbFRvb2xzLmxlbmd0aCAmJiAhZWxlbVRvb2xGcmVlKSB8fCBoaWRkZW4/LnRvb2xzXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxsZWdlbmQ+dG9vbHM8L2xlZ2VuZD5cclxuICAgICAgICA8Y2FkbXVzLXVpLWZsYWdzLXBpY2tlclxyXG4gICAgICAgICAgW2ZsYWdzXT1cImF2YWlsVG9vbHNcIlxyXG4gICAgICAgICAgW2FsbG93VXNlckZsYWdzXT1cImVsZW1Ub29sRnJlZSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwiaW5pdGlhbFRvb2xzXCJcclxuICAgICAgICAgIChzZWxlY3RlZElkc0NoYW5nZSk9XCJvblRvb2xzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgID48L2NhZG11cy11aS1mbGFncy1waWNrZXI+XHJcbiAgICAgIDwvZmllbGRzZXQ+XHJcblxyXG4gICAgICA8IS0tIHBvc2l0aW9ucyAtLT5cclxuICAgICAgPGZpZWxkc2V0XHJcbiAgICAgICAgW2hpZGRlbl09XCJcclxuICAgICAgICAgICghYXZhaWxQb3NpdGlvbnMubGVuZ3RoICYmICFlbGVtUG9zaXRpb25GcmVlKSB8fCBoaWRkZW4/LnBvc2l0aW9uc1xyXG4gICAgICAgIFwiXHJcbiAgICAgID5cclxuICAgICAgICA8bGVnZW5kPnBvc2l0aW9uczwvbGVnZW5kPlxyXG4gICAgICAgIDxjYWRtdXMtdWktZmxhZ3MtcGlja2VyXHJcbiAgICAgICAgICBbZmxhZ3NdPVwiYXZhaWxQb3NpdGlvbnNcIlxyXG4gICAgICAgICAgW2FsbG93VXNlckZsYWdzXT1cImVsZW1Qb3NpdGlvbkZyZWUgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImluaXRpYWxQb3NpdGlvbnNcIlxyXG4gICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uUG9zaXRpb25zQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgID48L2NhZG11cy11aS1mbGFncy1waWNrZXI+XHJcbiAgICAgIDwvZmllbGRzZXQ+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBERVNDUklQVElPTiAtLT5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwiZGVzY3JpcHRpb25cIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8bmd4LW1vbmFjby1lZGl0b3JcclxuICAgICAgICAgICNkc2NlZGl0b3JcclxuICAgICAgICAgIFtvcHRpb25zXT1cImVkaXRvck9wdGlvbnNcIlxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cImRlc2NyaXB0aW9uXCJcclxuICAgICAgICA+PC9uZ3gtbW9uYWNvLWVkaXRvcj5cclxuICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAkYW55KGRlc2NyaXB0aW9uKS5lcnJvcnM/Lm1heExlbmd0aCAmJlxyXG4gICAgICAgICAgICAoZGVzY3JpcHRpb24udG91Y2hlZCB8fCBkZXNjcmlwdGlvbi5kaXJ0eSlcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+ZGVzY3JpcHRpb24gdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICAgID5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPCEtLSBpbWFnZXMgLS0+XHJcbiAgICAgICAgPGNhZG11cy1jb2QtaW1hZ2VzXHJcbiAgICAgICAgICBbdHlwZUVudHJpZXNdPVwiaW1nVHlwZUVudHJpZXNcIlxyXG4gICAgICAgICAgW2ltYWdlc109XCJpbml0aWFsSW1hZ2VzXCJcclxuICAgICAgICAgIChpbWFnZXNDaGFuZ2UpPVwib25JbWFnZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLWNvZC1pbWFnZXM+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDwhLS0gbm90ZSAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJsb25nLXRleHRcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+bm90ZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPHRleHRhcmVhIHJvd3M9XCIyXCIgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cIm5vdGVcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkobm90ZSkuZXJyb3JzPy5tYXhMZW5ndGggJiYgKG5vdGUuZGlydHkgfHwgbm90ZS50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgID5ub3RlIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LXRhYj5cclxuICA8L21hdC10YWItZ3JvdXA+XHJcblxyXG4gIDwhLS0gYnV0dG9ucyAtLT5cclxuICA8ZGl2IGNsYXNzPVwidG9vbGJhci1yb3dcIj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiRGlzY2FyZCBlbGVtZW50IGNoYW5nZXNcIlxyXG4gICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgbWF0VG9vbHRpcD1cIkFjY2VwdCBlbGVtZW50IGNoYW5nZXNcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkIHx8IGZvcm0ucHJpc3RpbmVcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj4gZWxlbWVudFxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHhcIj5lbGVtZW50PC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==
481
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kLWRlY29yYXRpb24tZWxlbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9jYWRtdXMtcGFydC1jb2RpY29sb2d5LWRlY29yYXRpb25zL3NyYy9saWIvY29kLWRlY29yYXRpb24tZWxlbWVudC9jb2QtZGVjb3JhdGlvbi1lbGVtZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2NhZG11cy1wYXJ0LWNvZGljb2xvZ3ktZGVjb3JhdGlvbnMvc3JjL2xpYi9jb2QtZGVjb3JhdGlvbi1lbGVtZW50L2NvZC1kZWNvcmF0aW9uLWVsZW1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBS3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEIxRCxNQUFNLE9BQU8sNkJBQTZCO0lBb014QyxZQUFZLFdBQXdCO1FBdkw3QixrQkFBYSxHQUFHO1lBQ3JCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsMERBQTBEO1lBQzFELGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7UUFrTEEsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUM5RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEs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QUFDO1lBQzVDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNO2dCQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO2dCQUN2QixDQUFDLENBQUMsU0FBUztZQUNiLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDbkMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDakUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDdkUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU07Z0JBQ3ZDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUs7Z0JBQ3ZCLENBQUMsQ0FBQyxTQUFTO1lBQ2IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDOUQsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU07Z0JBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7Z0JBQ3RCLENBQUMsQ0FBQyxTQUFTO1lBQ2IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztZQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzdDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDM0MsTUFBTSxF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LEtBQUs7Z0JBWUssbUJBQW1CO3NCQUQ3QixLQUFLO2dCQVlDLGNBQWM7c0JBRHBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb2RMb2NhdGlvblJhbmdlIH0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1jb2QtbG9jYXRpb24nO1xyXG5pbXBvcnQgeyBDb2RJbWFnZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtY29kaWNvbG9neS11aSc7XHJcbmltcG9ydCB7IFRoZXNhdXJ1c0VudHJ5IH0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1jb3JlJztcclxuaW1wb3J0IHsgRmxhZyB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtdWktZmxhZ3MtcGlja2VyJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgQ29kRGVjb3JhdGlvbkVsZW1lbnQgfSBmcm9tICcuLi9jb2QtZGVjb3JhdGlvbnMtcGFydCc7XHJcblxyXG4vKipcclxuICogTGlzdCBvZiBoaWRkZW4gZmllbGRzIGluIGRlY29yYXRpb24gZWxlbWVudCBjb21wb25lbnQuXHJcbiAqIFRoaXMgaXMgc2V0IGJ5IGV4YW1pbmluZyB0aGUgdmFsdWVzIG9mIHRoZSB0aGVzYXVydXNcclxuICogbmFtZWQgXCJjb2QtZGVjb3JhdGlvbi10eXBlLWhpZGRlblwiIGhhdmluZyBhcyBrZXkgdGhlXHJcbiAqIGVsZW1lbnQgdHlwZSBJRCAoZS5nLiBcInBhZy1pbmNcIiksIGFuZCBhcyB2YWx1ZSBhIHNwYWNlXHJcbiAqIGRlbGltaXRlZCBsaXN0IG9mIGZpZWxkIG5hbWVzLiBFYWNoIG9mIHRoZXNlIGZpZWxkIG5hbWVzXHJcbiAqIGNvcnJlc3BvbmRzIHRvIGEgcHJvcGVydHkgb2YgdGhpcyBvYmplY3QuXHJcbiAqL1xyXG5pbnRlcmZhY2UgSGlkZGVuRGVjRWxlbUZpZWxkcyB7XHJcbiAgZmxhZ3M/OiBib29sZWFuO1xyXG4gIHR5cG9sb2dpZXM/OiBib29sZWFuO1xyXG4gIHN1YmplY3Q/OiBib29sZWFuO1xyXG4gIGNvbG9ycz86IGJvb2xlYW47XHJcbiAgZ2lsZGluZ3M/OiBib29sZWFuO1xyXG4gIHRlY2huaXF1ZXM/OiBib29sZWFuO1xyXG4gIHRvb2xzPzogYm9vbGVhbjtcclxuICBwb3NpdGlvbnM/OiBib29sZWFuO1xyXG4gIGxpbmVIZWlnaHQ/OiBib29sZWFuO1xyXG4gIHRleHRSZWxhdGlvbj86IGJvb2xlYW47XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2FkbXVzLWNvZC1kZWNvcmF0aW9uLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb2QtZGVjb3JhdGlvbi1lbGVtZW50LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb2QtZGVjb3JhdGlvbi1lbGVtZW50LmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENvZERlY29yYXRpb25FbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBwcml2YXRlIF9lbGVtZW50OiBDb2REZWNvcmF0aW9uRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9lbGVtRmxhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZWxlbUNvbG9yRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9lbGVtR2lsZGluZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZWxlbVRlY2hFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2VsZW1Qb3NFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2VsZW1Ub29sRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9lbGVtVHlwb2xFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3VwZGF0aW5nRm9ybT86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfYWRqdXN0aW5nVUk/OiBib29sZWFuO1xyXG5cclxuICBAVmlld0NoaWxkKCdkc2NlZGl0b3InLCB7IHN0YXRpYzogZmFsc2UgfSkgZHNjRWRpdG9yOiBhbnk7XHJcbiAgcHVibGljIGVkaXRvck9wdGlvbnMgPSB7XHJcbiAgICB0aGVtZTogJ3ZzLWxpZ2h0JyxcclxuICAgIGxhbmd1YWdlOiAnbWFya2Rvd24nLFxyXG4gICAgd29yZFdyYXA6ICdvbicsXHJcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXR1bGFyZW4vbmd4LW1vbmFjby1lZGl0b3IvaXNzdWVzLzE5XHJcbiAgICBhdXRvbWF0aWNMYXlvdXQ6IHRydWUsXHJcbiAgfTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogQ29kRGVjb3JhdGlvbkVsZW1lbnQgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZWxlbWVudCh2YWx1ZTogQ29kRGVjb3JhdGlvbkVsZW1lbnQgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl9lbGVtZW50ID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnc2V0dGluZyBlbGVtZW50Jyk7XHJcbiAgICB0aGlzLl9lbGVtZW50ID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm0odmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcGFyZW50S2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBlbGVtZW50Q2hhbmdlOiBFdmVudEVtaXR0ZXI8Q29kRGVjb3JhdGlvbkVsZW1lbnQ+O1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBlZGl0b3JDbG9zZTogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIC8vIGdlbmVyYWxcclxuICBwdWJsaWMga2V5OiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgcGFyZW50S2V5OiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgdHlwZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZsYWdzOiBGb3JtQ29udHJvbDxzdHJpbmdbXT47XHJcbiAgcHVibGljIHJhbmdlczogRm9ybUNvbnRyb2w8Q29kTG9jYXRpb25SYW5nZVtdPjtcclxuICBwdWJsaWMgaW5zdGFuY2VDb3VudDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICAvLyB0eXBvbG9naWVzXHJcbiAgcHVibGljIHR5cG9sb2dpZXM6IEZvcm1Db250cm9sPHN0cmluZ1tdPjtcclxuICBwdWJsaWMgc3ViamVjdDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGNvbG9yczogRm9ybUNvbnRyb2w8c3RyaW5nW10+O1xyXG4gIHB1YmxpYyBnaWxkaW5nczogRm9ybUNvbnRyb2w8c3RyaW5nW10+O1xyXG4gIHB1YmxpYyB0ZWNobmlxdWVzOiBGb3JtQ29udHJvbDxzdHJpbmdbXT47XHJcbiAgcHVibGljIHRvb2xzOiBGb3JtQ29udHJvbDxzdHJpbmdbXT47XHJcbiAgcHVibGljIHBvc2l0aW9uczogRm9ybUNvbnRyb2w8c3RyaW5nW10+O1xyXG4gIHB1YmxpYyBsaW5lSGVpZ2h0OiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyB0ZXh0UmVsYXRpb246IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIC8vIGRlc2NyaXB0aW9uXHJcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgaW1hZ2VzOiBGb3JtQ29udHJvbDxDb2RJbWFnZVtdPjtcclxuICBwdWJsaWMgbm90ZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIGluaXRpYWxSYW5nZXM6IENvZExvY2F0aW9uUmFuZ2VbXTtcclxuICBwdWJsaWMgaW5pdGlhbEltYWdlczogQ29kSW1hZ2VbXTtcclxuICAvLyBmbGFnc1xyXG4gIHB1YmxpYyBpbml0aWFsRmxhZ3M6IHN0cmluZ1tdO1xyXG4gIHB1YmxpYyBpbml0aWFsVHlwb2xvZ2llczogc3RyaW5nW107XHJcbiAgcHVibGljIGluaXRpYWxDb2xvcnM6IHN0cmluZ1tdO1xyXG4gIHB1YmxpYyBpbml0aWFsR2lsZGluZ3M6IHN0cmluZ1tdO1xyXG4gIHB1YmxpYyBpbml0aWFsVGVjaG5pcXVlczogc3RyaW5nW107XHJcbiAgcHVibGljIGluaXRpYWxUb29sczogc3RyaW5nW107XHJcbiAgcHVibGljIGluaXRpYWxQb3NpdGlvbnM6IHN0cmluZ1tdO1xyXG5cclxuICBwdWJsaWMgYXZhaWxGbGFnczogRmxhZ1tdO1xyXG4gIHB1YmxpYyBhdmFpbFR5cG9sb2dpZXM6IEZsYWdbXTtcclxuICBwdWJsaWMgYXZhaWxDb2xvcnM6IEZsYWdbXTtcclxuICBwdWJsaWMgYXZhaWxHaWxkaW5nczogRmxhZ1tdO1xyXG4gIHB1YmxpYyBhdmFpbFRlY2huaXF1ZXM6IEZsYWdbXTtcclxuICBwdWJsaWMgYXZhaWxUb29sczogRmxhZ1tdO1xyXG4gIHB1YmxpYyBhdmFpbFBvc2l0aW9uczogRmxhZ1tdO1xyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXR5cGVzIChyZXF1aXJlZCkuIEFsbCB0aGUgb3RoZXIgdGhlc2F1cmlcclxuICAvLyAoZXhjZXB0IGRlY1R5cGVIaWRkZW5FbnRyaWVzKSBoYXZlIHRoZWlyIGVudHJpZXMgZmlsdGVyZWRcclxuICAvLyBieSB0aGUgdmFsdWUgc2VsZWN0ZWQgZnJvbSB0aGlzIHRoZXNhdXJ1cy5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtVHlwZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tdHlwZS1oaWRkZW5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNUeXBlSGlkZGVuRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1mbGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkZWNFbGVtRmxhZ0VudHJpZXMoKTogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZWxlbUZsYWdFbnRyaWVzO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY0VsZW1GbGFnRW50cmllcyh2YWx1ZTogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZWxlbUZsYWdFbnRyaWVzID0gdmFsdWU7XHJcbiAgICB0aGlzLmVsZW1GbGFnRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKHZhbHVlLCB0aGlzLnR5cGU/LnZhbHVlKTtcclxuICAgIHRoaXMuYXZhaWxGbGFncyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtRmxhZ0VudHJpZXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1jb2xvcnNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGVjRWxlbUNvbG9yRW50cmllcygpOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9lbGVtQ29sb3JFbnRyaWVzO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY0VsZW1Db2xvckVudHJpZXModmFsdWU6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2VsZW1Db2xvckVudHJpZXMgPSB2YWx1ZTtcclxuICAgIHRoaXMuZWxlbUNvbG9yRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKHZhbHVlLCB0aGlzLnR5cGU/LnZhbHVlKTtcclxuICAgIHRoaXMuYXZhaWxDb2xvcnMgPSB0aGlzLmdldEF2YWlsYWJsZUZsYWdzKHRoaXMuZWxlbUNvbG9yRW50cmllcyk7XHJcbiAgfVxyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LWdpbGRpbmdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGRlY0VsZW1HaWxkaW5nRW50cmllcygpOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9lbGVtR2lsZGluZ0VudHJpZXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGVjRWxlbUdpbGRpbmdFbnRyaWVzKHZhbHVlOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9lbGVtR2lsZGluZ0VudHJpZXMgPSB2YWx1ZTtcclxuICAgIHRoaXMuZWxlbUdpbGRpbmdFbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXModmFsdWUsIHRoaXMudHlwZT8udmFsdWUpO1xyXG4gICAgdGhpcy5hdmFpbEdpbGRpbmdzID0gdGhpcy5nZXRBdmFpbGFibGVGbGFncyh0aGlzLmVsZW1HaWxkaW5nRW50cmllcyk7XHJcbiAgfVxyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXRlY2huaXF1ZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGVjRWxlbVRlY2hFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1UZWNoRW50cmllcztcclxuICB9XHJcbiAgcHVibGljIHNldCBkZWNFbGVtVGVjaEVudHJpZXModmFsdWU6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2VsZW1UZWNoRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5lbGVtVGVjaG5pcXVlRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKFxyXG4gICAgICB2YWx1ZSxcclxuICAgICAgdGhpcy50eXBlPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHRoaXMuYXZhaWxUZWNobmlxdWVzID0gdGhpcy5nZXRBdmFpbGFibGVGbGFncyh0aGlzLmVsZW1UZWNobmlxdWVFbnRyaWVzKTtcclxuICB9XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtcG9zaXRpb25zXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGRlY0VsZW1Qb3NFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1Qb3NFbnRyaWVzO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY0VsZW1Qb3NFbnRyaWVzKHZhbHVlOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9lbGVtUG9zRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5lbGVtUG9zaXRpb25FbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXModmFsdWUsIHRoaXMudHlwZT8udmFsdWUpO1xyXG4gICAgdGhpcy5hdmFpbFBvc2l0aW9ucyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtUG9zaXRpb25FbnRyaWVzKTtcclxuICB9XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdG9vbHNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGVjRWxlbVRvb2xFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1Ub29sRW50cmllcztcclxuICB9XHJcbiAgcHVibGljIHNldCBkZWNFbGVtVG9vbEVudHJpZXModmFsdWU6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2VsZW1Ub29sRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5lbGVtVG9vbEVudHJpZXMgPSB0aGlzLmdldEZpbHRlcmVkRW50cmllcyh2YWx1ZSwgdGhpcy50eXBlPy52YWx1ZSk7XHJcbiAgICB0aGlzLmF2YWlsVG9vbHMgPSB0aGlzLmdldEF2YWlsYWJsZUZsYWdzKHRoaXMuZWxlbVRvb2xFbnRyaWVzKTtcclxuICB9XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdHlwb2xvZ2llc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkZWNFbGVtVHlwb2xFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1UeXBvbEVudHJpZXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGVjRWxlbVR5cG9sRW50cmllcyh2YWx1ZTogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZWxlbVR5cG9sRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5lbGVtVHlwb2xFbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXModmFsdWUsIHRoaXMudHlwZT8udmFsdWUpO1xyXG4gICAgdGhpcy5hdmFpbFR5cG9sb2dpZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZsYWdzKHRoaXMuZWxlbVR5cG9sRW50cmllcyk7XHJcbiAgfVxyXG5cclxuICAvLyBjb2QtaW1hZ2UtdHlwZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpbWdUeXBlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gdGhlIGZpbHRlcmVkIGVudHJpZXM6XHJcbiAgcHVibGljIGVsZW1GbGFnRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZWxlbUNvbG9yRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZWxlbUdpbGRpbmdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBlbGVtVGVjaG5pcXVlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZWxlbVBvc2l0aW9uRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZWxlbVRvb2xFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBlbGVtVHlwb2xFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZWxlbUdpbGRpbmdGcmVlPzogYm9vbGVhbjtcclxuICBwdWJsaWMgZWxlbVRlY2huaXF1ZUZyZWU/OiBib29sZWFuO1xyXG4gIHB1YmxpYyBlbGVtUG9zaXRpb25GcmVlPzogYm9vbGVhbjtcclxuICBwdWJsaWMgZWxlbVRvb2xGcmVlPzogYm9vbGVhbjtcclxuXHJcbiAgLy8gdGhpcyBvYmplY3QgaGFzIGEgcHJvcGVydHkgZm9yIGVhY2ggY29udHJvbFxyXG4gIC8vIHRvIGJlIGhpZGRlbiwgaGF2aW5nIHRoZSBzYW1lIG5hbWUgb2YgdGhlIGNvbnRyb2xcclxuICAvLyBhbmQgdmFsdWU9dHJ1ZS5cclxuICBwdWJsaWMgaGlkZGVuPzogSGlkZGVuRGVjRWxlbUZpZWxkcztcclxuXHJcbiAgY29uc3RydWN0b3IoZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENvZERlY29yYXRpb25FbGVtZW50PigpO1xyXG4gICAgdGhpcy5lZGl0b3JDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIHRoaXMuaW5pdGlhbFJhbmdlcyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsSW1hZ2VzID0gW107XHJcbiAgICAvLyBmbGFnc1xyXG4gICAgdGhpcy5pbml0aWFsRmxhZ3MgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFR5cG9sb2dpZXMgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbENvbG9ycyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsR2lsZGluZ3MgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFRlY2huaXF1ZXMgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFRvb2xzID0gW107XHJcbiAgICB0aGlzLmluaXRpYWxQb3NpdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxGbGFncyA9IFtdO1xyXG4gICAgdGhpcy5hdmFpbFR5cG9sb2dpZXMgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxDb2xvcnMgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxHaWxkaW5ncyA9IFtdO1xyXG4gICAgdGhpcy5hdmFpbFRlY2huaXF1ZXMgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxUb29scyA9IFtdO1xyXG4gICAgdGhpcy5hdmFpbFBvc2l0aW9ucyA9IFtdO1xyXG5cclxuICAgIC8vIGZvcm1cclxuICAgIHRoaXMua2V5ID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXlstYS16QS1aMC05X10rJCcpLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMucGFyZW50S2V5ID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXlstYS16QS1aMC05X10rJCcpLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMudHlwZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMuZmxhZ3MgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5yYW5nZXMgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5pbnN0YW5jZUNvdW50ID0gZm9ybUJ1aWxkZXIuY29udHJvbCgwLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy50eXBvbG9naWVzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuc3ViamVjdCA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKSk7XHJcbiAgICB0aGlzLmNvbG9ycyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmdpbGRpbmdzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudGVjaG5pcXVlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLnRvb2xzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMucG9zaXRpb25zID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMubGluZUhlaWdodCA9IGZvcm1CdWlsZGVyLmNvbnRyb2woMCwge1xyXG4gICAgICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLm1pbigwKSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMudGV4dFJlbGF0aW9uID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApKTtcclxuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMDApKTtcclxuICAgIHRoaXMuaW1hZ2VzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMubm90ZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTAwKSk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGtleTogdGhpcy5rZXksXHJcbiAgICAgIHBhcmVudEtleTogdGhpcy5wYXJlbnRLZXksXHJcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcclxuICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXHJcbiAgICAgIGluc3RhbmNlQ291bnQ6IHRoaXMuaW5zdGFuY2VDb3VudCxcclxuICAgICAgcmFuZ2VzOiB0aGlzLnJhbmdlcyxcclxuICAgICAgdHlwb2xvZ2llczogdGhpcy50eXBvbG9naWVzLFxyXG4gICAgICBzdWJqZWN0OiB0aGlzLnN1YmplY3QsXHJcbiAgICAgIGNvbG9yczogdGhpcy5jb2xvcnMsXHJcbiAgICAgIGdpbGRpbmdzOiB0aGlzLmdpbGRpbmdzLFxyXG4gICAgICB0ZWNobmlxdWVzOiB0aGlzLnRlY2huaXF1ZXMsXHJcbiAgICAgIHRvb2xzOiB0aGlzLnRvb2xzLFxyXG4gICAgICBwb3NpdGlvbnM6IHRoaXMucG9zaXRpb25zLFxyXG4gICAgICBsaW5lSGVpZ2h0OiB0aGlzLmxpbmVIZWlnaHQsXHJcbiAgICAgIHRleHRSZWxhdGlvbjogdGhpcy50ZXh0UmVsYXRpb24sXHJcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxyXG4gICAgICBpbWFnZXM6IHRoaXMuaW1hZ2VzLFxyXG4gICAgICBub3RlOiB0aGlzLm5vdGUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIHRoZXNhdXJ1cyBlbnRyaWVzIHJlcHJlc2VudCBhIGZyZWUgc2V0LlxyXG4gICAqIFRoaXMgaGFwcGVucyB3aGVuIHdlIGp1c3QgaGF2ZSBhIHNpbmdsZSBlbnRyeSB3aXRoIGEgc2luZ2xlIGRvdFxyXG4gICAqIGZvbGxvd2VkIGJ5IFwiLVwiLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGVudHJpZXMgVGhlIHRoZXNhdXJ1cyBlbnRyaWVzIHRvIHRlc3QuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZW50cmllcyByZXByZXNlbnQgYSBmcmVlIHNldC5cclxuICAgKi9cclxuICBwcml2YXRlIGlzRnJlZVNldChlbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZW50cmllcz8ubGVuZ3RoICE9PSAxKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRva2VucyA9IGVudHJpZXNbMF0uaWQuc3BsaXQoJy4nKTtcclxuICAgIHJldHVybiB0b2tlbnMubGVuZ3RoID09PSAyICYmIHRva2Vuc1sxXSA9PT0gJy0nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJlZEVudHJpZXMoXHJcbiAgICBlbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkIHwgbnVsbCxcclxuICAgIHByZWZpeDogc3RyaW5nIHwgbnVsbFxyXG4gICk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFwcmVmaXggfHwgIWVudHJpZXM/LnNvbWUoKGUpID0+IGUuaWQuaW5kZXhPZignLicpID4gLTEpKSB7XHJcbiAgICAgIHJldHVybiBlbnRyaWVzIHx8IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGNvbnN0IHAgPSBwcmVmaXggKyAnLic7XHJcbiAgICByZXR1cm4gZW50cmllcy5maWx0ZXIoKGUpID0+IGUuaWQuc3RhcnRzV2l0aChwKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEF2YWlsYWJsZUZsYWdzKGVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQpOiBGbGFnW10ge1xyXG4gICAgcmV0dXJuIGVudHJpZXM/Lmxlbmd0aFxyXG4gICAgICA/IGVudHJpZXNcclxuICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUudmFsdWU/Lmxlbmd0aClcclxuICAgICAgICAgIC5tYXAoKGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICBpZDogZS5pZCxcclxuICAgICAgICAgICAgICBsYWJlbDogZS52YWx1ZSxcclxuICAgICAgICAgICAgfSBhcyBGbGFnO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgOiBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJpbGl0eSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhpZGRlbjogYW55ID0ge307XHJcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZGVjVHlwZUhpZGRlbkVudHJpZXM/LmZpbmQoXHJcbiAgICAgIChlKSA9PiBlLmlkID09PSB0aGlzLnR5cGUudmFsdWVcclxuICAgICk7XHJcbiAgICBpZiAoZW50cnkpIHtcclxuICAgICAgY29uc3QgbmFtZXMgPSBlbnRyeS52YWx1ZS5zcGxpdCgnICcpLmZpbHRlcigocykgPT4gcyk7XHJcbiAgICAgIG5hbWVzLmZvckVhY2goKG4pID0+IHtcclxuICAgICAgICBoaWRkZW5bbl0gPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuaGlkZGVuID0gaGlkZGVuO1xyXG4gICAgY29uc29sZS5sb2coJ2hpZGRlbjogJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuaGlkZGVuKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMuYWRqdXN0VUkoKTtcclxuXHJcbiAgICB0aGlzLnR5cGUudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5fYWRqdXN0aW5nVUkgJiYgIXRoaXMuX3VwZGF0aW5nRm9ybSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ3R5cGUgdmFsdWUgY2hhbmdlZDogJyArIHZhbHVlKTtcclxuICAgICAgICAgIHRoaXMuYWRqdXN0VUkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGp1c3RVSSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9hZGp1c3RpbmdVSSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9hZGp1c3RpbmdVSSA9IHRydWU7XHJcbiAgICBjb25zb2xlLmxvZygnYWRqdXN0VUkgZW50ZXInKTtcclxuICAgIC8vIHJlc2V0IHR5cGUtZGVwZW5kZW50IHZhbHVlc1xyXG4gICAgdGhpcy5mbGFncy5yZXNldCgpO1xyXG4gICAgdGhpcy50eXBvbG9naWVzLnJlc2V0KCk7XHJcbiAgICB0aGlzLnN1YmplY3QucmVzZXQoKTtcclxuICAgIHRoaXMuaW5pdGlhbENvbG9ycyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsR2lsZGluZ3MgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFRlY2huaXF1ZXMgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFRvb2xzID0gW107XHJcbiAgICB0aGlzLmluaXRpYWxQb3NpdGlvbnMgPSBbXTtcclxuICAgIHRoaXMubGluZUhlaWdodC5yZXNldCgpO1xyXG4gICAgdGhpcy50ZXh0UmVsYXRpb24ucmVzZXQoKTtcclxuXHJcbiAgICAvLyBmaWx0ZXIgZW50cmllcyBmb3IgbXVsdGlwbGUtc2VsZWN0aW9uc1xyXG4gICAgdGhpcy5lbGVtRmxhZ0VudHJpZXMgPSB0aGlzLmdldEZpbHRlcmVkRW50cmllcyhcclxuICAgICAgdGhpcy5fZWxlbUZsYWdFbnRyaWVzLFxyXG4gICAgICB0aGlzLnR5cGU/LnZhbHVlXHJcbiAgICApO1xyXG4gICAgdGhpcy5hdmFpbEZsYWdzID0gdGhpcy5nZXRBdmFpbGFibGVGbGFncyh0aGlzLmVsZW1GbGFnRW50cmllcyk7XHJcblxyXG4gICAgdGhpcy5lbGVtQ29sb3JFbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXMoXHJcbiAgICAgIHRoaXMuX2VsZW1Db2xvckVudHJpZXMsXHJcbiAgICAgIHRoaXMudHlwZT8udmFsdWVcclxuICAgICk7XHJcbiAgICB0aGlzLmF2YWlsQ29sb3JzID0gdGhpcy5nZXRBdmFpbGFibGVGbGFncyh0aGlzLmVsZW1Db2xvckVudHJpZXMpO1xyXG5cclxuICAgIC8vIGZpbHRlciBlbnRyaWVzIGFuZCBzZXQgZnJlZSBmb3Igc2luZ2xlLXNlbGVjdGlvbnNcclxuICAgIHRoaXMuZWxlbUdpbGRpbmdFbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXMoXHJcbiAgICAgIHRoaXMuX2VsZW1HaWxkaW5nRW50cmllcyxcclxuICAgICAgdGhpcy50eXBlPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHRoaXMuYXZhaWxHaWxkaW5ncyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtR2lsZGluZ0VudHJpZXMpO1xyXG4gICAgdGhpcy5lbGVtR2lsZGluZ0ZyZWUgPSB0aGlzLmlzRnJlZVNldCh0aGlzLmVsZW1HaWxkaW5nRW50cmllcyk7XHJcblxyXG4gICAgdGhpcy5lbGVtVGVjaG5pcXVlRW50cmllcyA9IHRoaXMuZ2V0RmlsdGVyZWRFbnRyaWVzKFxyXG4gICAgICB0aGlzLl9lbGVtVGVjaEVudHJpZXMsXHJcbiAgICAgIHRoaXMudHlwZT8udmFsdWVcclxuICAgICk7XHJcbiAgICB0aGlzLmF2YWlsVGVjaG5pcXVlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtVGVjaG5pcXVlRW50cmllcyk7XHJcbiAgICB0aGlzLmVsZW1UZWNobmlxdWVGcmVlID0gdGhpcy5pc0ZyZWVTZXQodGhpcy5lbGVtVGVjaG5pcXVlRW50cmllcyk7XHJcblxyXG4gICAgdGhpcy5lbGVtUG9zaXRpb25FbnRyaWVzID0gdGhpcy5nZXRGaWx0ZXJlZEVudHJpZXMoXHJcbiAgICAgIHRoaXMuX2VsZW1Qb3NFbnRyaWVzLFxyXG4gICAgICB0aGlzLnR5cGU/LnZhbHVlXHJcbiAgICApO1xyXG4gICAgdGhpcy5hdmFpbFBvc2l0aW9ucyA9IHRoaXMuZ2V0QXZhaWxhYmxlRmxhZ3ModGhpcy5lbGVtUG9zaXRpb25FbnRyaWVzKTtcclxuICAgIHRoaXMuZWxlbVBvc2l0aW9uRnJlZSA9IHRoaXMuaXNGcmVlU2V0KHRoaXMuZWxlbVBvc2l0aW9uRW50cmllcyk7XHJcblxyXG4gICAgdGhpcy5lbGVtVG9vbEVudHJpZXMgPSB0aGlzLmdldEZpbHRlcmVkRW50cmllcyhcclxuICAgICAgdGhpcy5fZWxlbVRvb2xFbnRyaWVzLFxyXG4gICAgICB0aGlzLnR5cGU/LnZhbHVlXHJcbiAgICApO1xyXG4gICAgdGhpcy5hdmFpbFRvb2xzID0gdGhpcy5nZXRBdmFpbGFibGVGbGFncyh0aGlzLmVsZW1Ub29sRW50cmllcyk7XHJcbiAgICB0aGlzLmVsZW1Ub29sRnJlZSA9IHRoaXMuaXNGcmVlU2V0KHRoaXMuZWxlbVRvb2xFbnRyaWVzKTtcclxuXHJcbiAgICB0aGlzLmVsZW1UeXBvbEVudHJpZXMgPSB0aGlzLmdldEZpbHRlcmVkRW50cmllcyhcclxuICAgICAgdGhpcy5fZWxlbVR5cG9sRW50cmllcyxcclxuICAgICAgdGhpcy50eXBlPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHRoaXMuYXZhaWxUeXBvbG9naWVzID0gdGhpcy5nZXRBdmFpbGFibGVGbGFncyh0aGlzLmVsZW1UeXBvbEVudHJpZXMpO1xyXG5cclxuICAgIC8vIHZpc2liaWxpdHlcclxuICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSgpO1xyXG4gICAgdGhpcy5fYWRqdXN0aW5nVUkgPSBmYWxzZTtcclxuICAgIGNvbnNvbGUubG9nKCdhZGp1c3RVSSBleGl0Jyk7XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgb25UYWJJbmRleENoYW5nZWQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdHVsYXJlbi9uZ3gtbW9uYWNvLWVkaXRvci9pc3N1ZXMvMTlcclxuICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzQxMjk1MC9uZ3gtbW9uYWNvLWVkaXRvci11bmFibGUtdG8tc2V0LWxheW91dC1zaXplLXdoZW4tY29udGFpbmVyLWNoYW5nZXMtdXNpbmctdGFiXHJcbiAgLy8gaWYgKGluZGV4ID09PSAyKSB7XHJcbiAgLy8gICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAvLyAgICAgdGhpcy5kc2NFZGl0b3I/Ll9lZGl0b3I/LmxheW91dCgpO1xyXG4gIC8vICAgfSwgMTUwKTtcclxuICAvLyB9XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVR5cGVEZXBlbmRlbmNpZXMoZWxlbWVudDogQ29kRGVjb3JhdGlvbkVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCd1cGRhdGVUeXBlRGVwZW5kZW5jaWVzIGVudGVyJyk7XHJcbiAgICB0aGlzLmtleS5zZXRWYWx1ZShlbGVtZW50LmtleSB8fCBudWxsKTtcclxuICAgIHRoaXMucGFyZW50S2V5LnNldFZhbHVlKGVsZW1lbnQucGFyZW50S2V5IHx8IG51bGwpO1xyXG4gICAgdGhpcy5pbnN0YW5jZUNvdW50LnNldFZhbHVlKGVsZW1lbnQuaW5zdGFuY2VDb3VudCB8fCAwKTtcclxuXHJcbiAgICB0aGlzLnJhbmdlcy5zZXRWYWx1ZShlbGVtZW50LnJhbmdlcyB8fCBbXSk7XHJcbiAgICB0aGlzLmluaXRpYWxSYW5nZXMgPSBlbGVtZW50LnJhbmdlcztcclxuXHJcbiAgICB0aGlzLmZsYWdzLnNldFZhbHVlKGVsZW1lbnQuZmxhZ3MgfHwgW10pO1xyXG4gICAgdGhpcy5pbml0aWFsRmxhZ3MgPSBlbGVtZW50LmZsYWdzO1xyXG5cclxuICAgIC8vIHR5cG9sb2dpZXNcclxuICAgIHRoaXMuc3ViamVjdC5zZXRWYWx1ZShlbGVtZW50LnN1YmplY3QgfHwgbnVsbCk7XHJcblxyXG4gICAgdGhpcy5jb2xvcnMuc2V0VmFsdWUoZWxlbWVudC5jb2xvcnMgfHwgW10pO1xyXG4gICAgdGhpcy5pbml0aWFsQ29sb3JzID0gZWxlbWVudC5jb2xvcnMgfHwgW107XHJcblxyXG4gICAgdGhpcy50eXBvbG9naWVzLnNldFZhbHVlKGVsZW1lbnQudHlwb2xvZ2llcyB8fCBbXSk7XHJcbiAgICB0aGlzLmluaXRpYWxUeXBvbG9naWVzID0gZWxlbWVudC50eXBvbG9naWVzIHx8IFtdO1xyXG5cclxuICAgIHRoaXMuZ2lsZGluZ3Muc2V0VmFsdWUoZWxlbWVudC5naWxkaW5ncyB8fCBbXSk7XHJcbiAgICB0aGlzLmluaXRpYWxHaWxkaW5ncyA9IGVsZW1lbnQuZ2lsZGluZ3MgfHwgW107XHJcblxyXG4gICAgdGhpcy50ZWNobmlxdWVzLnNldFZhbHVlKGVsZW1lbnQudGVjaG5pcXVlcyB8fCBbXSk7XHJcbiAgICB0aGlzLmluaXRpYWxUZWNobmlxdWVzID0gZWxlbWVudC50ZWNobmlxdWVzIHx8IFtdO1xyXG5cclxuICAgIHRoaXMudG9vbHMuc2V0VmFsdWUoZWxlbWVudC50b29scyB8fCBbXSk7XHJcbiAgICB0aGlzLmluaXRpYWxUb29scyA9IGVsZW1lbnQudG9vbHMgfHwgW107XHJcblxyXG4gICAgdGhpcy5wb3NpdGlvbnMuc2V0VmFsdWUoZWxlbWVudC5wb3NpdGlvbnMgfHwgW10pO1xyXG4gICAgdGhpcy5pbml0aWFsUG9zaXRpb25zID0gZWxlbWVudC5wb3NpdGlvbnMgfHwgW107XHJcblxyXG4gICAgdGhpcy5saW5lSGVpZ2h0LnNldFZhbHVlKGVsZW1lbnQubGluZUhlaWdodCB8fCAwKTtcclxuICAgIHRoaXMudGV4dFJlbGF0aW9uLnNldFZhbHVlKGVsZW1lbnQudGV4dFJlbGF0aW9uIHx8IG51bGwpO1xyXG4gICAgLy8gZGVzY3JpcHRpb25cclxuICAgIHRoaXMuZGVzY3JpcHRpb24uc2V0VmFsdWUoZWxlbWVudC5kZXNjcmlwdGlvbiB8fCBudWxsKTtcclxuICAgIHRoaXMuaW5pdGlhbEltYWdlcyA9IGVsZW1lbnQuaW1hZ2VzIHx8IFtdO1xyXG4gICAgdGhpcy5ub3RlLnNldFZhbHVlKGVsZW1lbnQubm90ZSB8fCBudWxsKTtcclxuXHJcbiAgICB0aGlzLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgIHRoaXMuX3VwZGF0aW5nRm9ybSA9IGZhbHNlO1xyXG4gICAgY29uc29sZS5sb2coJ3VwZGF0ZVR5cGVEZXBlbmRlbmNpZXMgZXhpdCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKGVsZW1lbnQ6IENvZERlY29yYXRpb25FbGVtZW50IHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICB0aGlzLl91cGRhdGluZ0Zvcm0gPSB0cnVlO1xyXG4gICAgY29uc29sZS5sb2coJ3VwZGF0ZUZvcm0gZW50ZXInKTtcclxuICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcclxuICAgICAgdGhpcy5fdXBkYXRpbmdGb3JtID0gZmFsc2U7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd1cGRhdGVGb3JtIGV4aXQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gZ2VuZXJhbFxyXG4gICAgdGhpcy50eXBlLnNldFZhbHVlKGVsZW1lbnQudHlwZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIGxldCB0aGUgVUkgYWRqdXN0IGl0c2VsZiBiZWZvcmUgc2V0dGluZyB0eXBlLWRlcGVuZGVudCBjb250cm9sc1xyXG4gICAgICBjb25zb2xlLmxvZygnYWRqdXN0IFVJIGZyb20gdXBkYXRlRm9ybScpO1xyXG4gICAgICB0aGlzLmFkanVzdFVJKCk7XHJcbiAgICAgIC8vIHNldCB0eXBlLWRlcGVuZGVudCBjb250cm9sc1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVR5cGVEZXBlbmRlbmNpZXMoZWxlbWVudCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc2V0IG90aGVyIGNvbnRyb2xzXHJcbiAgICBjb25zb2xlLmxvZygndXBkYXRlRm9ybSBleGl0Jyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEVsZW1lbnQoKTogQ29kRGVjb3JhdGlvbkVsZW1lbnQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAga2V5OiB0aGlzLmtleS52YWx1ZT8udHJpbSgpLFxyXG4gICAgICBwYXJlbnRLZXk6IHRoaXMucGFyZW50S2V5LnZhbHVlPy50cmltKCksXHJcbiAgICAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZT8udHJpbSgpIHx8ICcnLFxyXG4gICAgICBmbGFnczogdGhpcy5mbGFncy52YWx1ZSB8fCBbXSxcclxuICAgICAgcmFuZ2VzOiB0aGlzLnJhbmdlcy52YWx1ZSB8fCBbXSxcclxuICAgICAgaW5zdGFuY2VDb3VudDogdGhpcy5pbnN0YW5jZUNvdW50LnZhbHVlIHx8IDAsXHJcbiAgICAgIHR5cG9sb2dpZXM6IHRoaXMudHlwb2xvZ2llcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLnR5cG9sb2dpZXMudmFsdWVcclxuICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgc3ViamVjdDogdGhpcy5zdWJqZWN0LnZhbHVlPy50cmltKCksXHJcbiAgICAgIGNvbG9yczogdGhpcy5jb2xvcnMudmFsdWU/Lmxlbmd0aCA/IHRoaXMuY29sb3JzLnZhbHVlIDogdW5kZWZpbmVkLFxyXG4gICAgICBnaWxkaW5nczogdGhpcy5naWxkaW5ncy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5naWxkaW5ncy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgdGVjaG5pcXVlczogdGhpcy50ZWNobmlxdWVzLnZhbHVlPy5sZW5ndGhcclxuICAgICAgICA/IHRoaXMudGVjaG5pcXVlcy52YWx1ZVxyXG4gICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICB0b29sczogdGhpcy50b29scy52YWx1ZT8ubGVuZ3RoID8gdGhpcy50b29scy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgcG9zaXRpb25zOiB0aGlzLnBvc2l0aW9ucy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLnBvc2l0aW9ucy52YWx1ZVxyXG4gICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICBsaW5lSGVpZ2h0OiB0aGlzLmxpbmVIZWlnaHQudmFsdWUsXHJcbiAgICAgIHRleHRSZWxhdGlvbjogdGhpcy50ZXh0UmVsYXRpb24udmFsdWU/LnRyaW0oKSxcclxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24udmFsdWU/LnRyaW0oKSxcclxuICAgICAgaW1hZ2VzOiB0aGlzLmltYWdlcy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5pbWFnZXMudmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICAgIG5vdGU6IHRoaXMubm90ZS52YWx1ZT8udHJpbSgpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkxvY2F0aW9uQ2hhbmdlKHJhbmdlczogQ29kTG9jYXRpb25SYW5nZVtdIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5yYW5nZXMuc2V0VmFsdWUocmFuZ2VzIHx8IFtdKTtcclxuICAgIHRoaXMucmFuZ2VzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMucmFuZ2VzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25JbWFnZXNDaGFuZ2UoaW1hZ2VzOiBDb2RJbWFnZVtdIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICB0aGlzLmltYWdlcy5zZXRWYWx1ZShpbWFnZXMgfHwgW10pO1xyXG4gICAgdGhpcy5pbWFnZXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5pbWFnZXMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZsYWdzQ2hhbmdlKGlkczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIHRoaXMuZmxhZ3Muc2V0VmFsdWUoaWRzKTtcclxuICAgIHRoaXMuZmxhZ3MudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5mbGFncy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVHlwb2xvZ2llc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdXBkYXRpbmdGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudHlwb2xvZ2llcy5zZXRWYWx1ZShpZHMpO1xyXG4gICAgdGhpcy50eXBvbG9naWVzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMudHlwb2xvZ2llcy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ29sb3JzQ2hhbmdlKGlkczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl91cGRhdGluZ0Zvcm0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb2xvcnMuc2V0VmFsdWUoaWRzKTtcclxuICAgIHRoaXMuY29sb3JzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuY29sb3JzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25HaWxkaW5nc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdXBkYXRpbmdGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZ2lsZGluZ3Muc2V0VmFsdWUoaWRzKTtcclxuICAgIHRoaXMuZ2lsZGluZ3MudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5naWxkaW5ncy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVGVjaG5pcXVlc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdXBkYXRpbmdGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudGVjaG5pcXVlcy5zZXRWYWx1ZShpZHMpO1xyXG4gICAgdGhpcy50ZWNobmlxdWVzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMudGVjaG5pcXVlcy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVG9vbHNDaGFuZ2UoaWRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3VwZGF0aW5nRm9ybSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnRvb2xzLnNldFZhbHVlKGlkcyk7XHJcbiAgICB0aGlzLnRvb2xzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMudG9vbHMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblBvc2l0aW9uc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdXBkYXRpbmdGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucG9zaXRpb25zLnNldFZhbHVlKGlkcyk7XHJcbiAgICB0aGlzLnBvc2l0aW9ucy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLnBvc2l0aW9ucy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIHR5cGVJZFRvU3RyaW5nKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIC8vICAgY29uc3QgZW50cnkgPSB0aGlzLmRlY0VsZW1UeXBlRW50cmllcz8uZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpO1xyXG4gIC8vICAgcmV0dXJuIGVudHJ5ID8gZW50cnkudmFsdWUgOiBpZDtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBjYW5jZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQoKTtcclxuICAgIHRoaXMuZWxlbWVudENoYW5nZS5lbWl0KGVsZW1lbnQpO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0eXBlLWhlYWRcIj5cclxuICAgIHt7IHR5cGUudmFsdWUgfCBmbGF0TG9va3VwIDogZGVjRWxlbVR5cGVFbnRyaWVzIDogXCJpZFwiIDogXCJ2YWx1ZVwiIH19XHJcbiAgPC9kaXY+XHJcbiAgPG1hdC10YWItZ3JvdXA+XHJcbiAgICA8IS0tIEdFTkVSQUwgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImdlbmVyYWxcIj5cclxuICAgICAgPCEtLSB0eXBlIChib3VuZCkgLS0+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICpuZ0lmPVwiZGVjRWxlbVR5cGVFbnRyaWVzPy5sZW5ndGhcIlxyXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDE0ZW1cIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+dHlwZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJ0eXBlXCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZSBvZiBkZWNFbGVtVHlwZUVudHJpZXNcIiBbdmFsdWVdPVwiZS5pZFwiPnt7XHJcbiAgICAgICAgICAgIGUudmFsdWVcclxuICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAqbmdJZj1cIiRhbnkodHlwZSkuZXJyb3JzPy5yZXF1aXJlZCAmJiAodHlwZS5kaXJ0eSB8fCB0eXBlLnRvdWNoZWQpXCJcclxuICAgICAgICAgID50eXBlIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICA+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICZuYnNwO1xyXG4gICAgICA8IS0tIGluc3RhbmNlQ291bnQgLS0+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBzdHlsZT1cIndpZHRoOiA2ZW1cIj5cclxuICAgICAgICA8bWF0LWxhYmVsPmNvdW50PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJpbnN0YW5jZUNvdW50XCIgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiAvPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgPCEtLSByYW5nZXMgLS0+XHJcbiAgICAgIDxjYWRtdXMtY29kLWxvY2F0aW9uXHJcbiAgICAgICAgbGFiZWw9XCJyYW5nZXNcIlxyXG4gICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcclxuICAgICAgICBbbG9jYXRpb25dPVwiaW5pdGlhbFJhbmdlcyB8fCBudWxsXCJcclxuICAgICAgICAobG9jYXRpb25DaGFuZ2UpPVwib25Mb2NhdGlvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgPjwvY2FkbXVzLWNvZC1sb2NhdGlvbj5cclxuXHJcbiAgICAgIDwhLS0gZmxhZ3MgLS0+XHJcbiAgICAgIDxmaWVsZHNldCAqbmdJZj1cImF2YWlsRmxhZ3M/Lmxlbmd0aFwiPlxyXG4gICAgICAgIDxsZWdlbmQ+ZmVhdHVyZXM8L2xlZ2VuZD5cclxuICAgICAgICA8Y2FkbXVzLXVpLWZsYWdzLXBpY2tlclxyXG4gICAgICAgICAgW2ZsYWdzXT1cImF2YWlsRmxhZ3NcIlxyXG4gICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImluaXRpYWxGbGFnc1wiXHJcbiAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25GbGFnc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICA+PC9jYWRtdXMtdWktZmxhZ3MtcGlja2VyPlxyXG4gICAgICA8L2ZpZWxkc2V0PlxyXG5cclxuICAgICAgPGJyIC8+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPCEtLSBrZXkgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5rZXk8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwia2V5XCIgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KGtleSkuZXJyb3JzPy5wYXR0ZXJuICYmIChrZXkuZGlydHkgfHwga2V5LnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPmludmFsaWQga2V5PC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KGtleSkuZXJyb3JzPy5tYXhMZW5ndGggJiYgKGtleS5kaXJ0eSB8fCBrZXkudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+a2V5IHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICZuYnNwO1xyXG4gICAgICAgIDwhLS0gcGFyZW50S2V5IC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInBhcmVudEtleXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5wYXJlbnQga2V5PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwicGFyZW50S2V5XCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJudWxsXCI+KG5vbmUpPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgayBvZiBwYXJlbnRLZXlzXCIgW3ZhbHVlXT1cImtcIj57e1xyXG4gICAgICAgICAgICAgIGtcclxuICAgICAgICAgICAgfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBUWVBPTE9HSUVTIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJ0eXBvbG9naWVzXCI+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweFwiPlxyXG4gICAgICAgIDwhLS0gbGluZUhlaWdodCAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIHN0eWxlPVwiZmxleDogMCAwIGF1dG87IHdpZHRoOiA0ZW1cIlxyXG4gICAgICAgICAgW2hpZGRlbl09XCJoaWRkZW4/LmxpbmVIZWlnaHRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+bG4uaDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgW2Zvcm1Db250cm9sXT1cImxpbmVIZWlnaHRcIiAvPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPCEtLSB0ZXh0UmVsYXRpb24gLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICBbaGlkZGVuXT1cImhpZGRlbj8udGV4dFJlbGF0aW9uXCJcclxuICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogMSAwIGF1dG9cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+dGV4dCByZWxhdGlvbjwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJ0ZXh0UmVsYXRpb25cIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICRhbnkodGV4dFJlbGF0aW9uKS5lcnJvcnM/Lm1heExlbmd0aCAmJlxyXG4gICAgICAgICAgICAgICh0ZXh0UmVsYXRpb24uZGlydHkgfHwgdGV4dFJlbGF0aW9uLnRvdWNoZWQpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID50ZXh0IHJlbGF0aW9uIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSB0eXBvbG9naWVzIC0tPlxyXG4gICAgICA8ZmllbGRzZXQgW2hpZGRlbl09XCIhYXZhaWxUeXBvbG9naWVzLmxlbmd0aCB8fCBoaWRkZW4/LnR5cG9sb2dpZXNcIj5cclxuICAgICAgICA8bGVnZW5kPnR5cG9sb2dpZXM8L2xlZ2VuZD5cclxuICAgICAgICA8Y2FkbXVzLXVpLWZsYWdzLXBpY2tlclxyXG4gICAgICAgICAgW2ZsYWdzXT1cImF2YWlsVHlwb2xvZ2llc1wiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwiaW5pdGlhbFR5cG9sb2dpZXNcIlxyXG4gICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uVHlwb2xvZ2llc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICA+PC9jYWRtdXMtdWktZmxhZ3MtcGlja2VyPlxyXG4gICAgICA8L2ZpZWxkc2V0PlxyXG5cclxuICAgICAgPCEtLSBzdWJqZWN0IC0tPlxyXG4gICAgICA8ZGl2IFtoaWRkZW5dPVwiaGlkZGVuPy5zdWJqZWN0XCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5zdWJqZWN0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInN1YmplY3RcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICRhbnkoc3ViamVjdCkuZXJyb3JzPy5tYXhMZW5ndGggJiZcclxuICAgICAgICAgICAgICAoc3ViamVjdC5kaXJ0eSB8fCBzdWJqZWN0LnRvdWNoZWQpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5zdWJqZWN0IHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gY29sb3JzIC0tPlxyXG4gICAgICA8ZmllbGRzZXQgW2hpZGRlbl09XCIhYXZhaWxDb2xvcnMubGVuZ3RoIHx8IGhpZGRlbj8uY29sb3JzXCI+XHJcbiAgICAgICAgPGxlZ2VuZD5jb2xvcnM8L2xlZ2VuZD5cclxuICAgICAgICA8Y2FkbXVzLXVpLWZsYWdzLXBpY2tlclxyXG4gICAgICAgICAgW2ZsYWdzXT1cImF2YWlsQ29sb3JzXCJcclxuICAgICAgICAgIFtzZWxlY3RlZElkc109XCJpbml0aWFsQ29sb3JzXCJcclxuICAgICAgICAgIChzZWxlY3RlZElkc0NoYW5nZSk9XCJvbkNvbG9yc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICA+PC9jYWRtdXMtdWktZmxhZ3MtcGlja2VyPlxyXG4gICAgICA8L2ZpZWxkc2V0PlxyXG5cclxuICAgICAgPCEtLSBnaWxkaW5ncyAtLT5cclxuICAgICAgPGZpZWxkc2V0XHJcbiAgICAgICAgW2hpZGRlbl09XCJcclxuICAgICAgICAgICghYXZhaWxHaWxkaW5ncy5sZW5ndGggJiYgIWVsZW1HaWxkaW5nRnJlZSkgfHwgaGlkZGVuPy5naWxkaW5nc1xyXG4gICAgICAgIFwiXHJcbiAgICAgID5cclxuICAgICAgICA8bGVnZW5kPmdpbGRpbmdzPC9sZWdlbmQ+XHJcbiAgICAgICAgPGNhZG11cy11aS1mbGFncy1waWNrZXJcclxuICAgICAgICAgIFtmbGFnc109XCJhdmFpbEdpbGRpbmdzXCJcclxuICAgICAgICAgIFthbGxvd1VzZXJGbGFnc109XCJlbGVtR2lsZGluZ0ZyZWUgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImluaXRpYWxHaWxkaW5nc1wiXHJcbiAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25HaWxkaW5nc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICA+PC9jYWRtdXMtdWktZmxhZ3MtcGlja2VyPlxyXG4gICAgICA8L2ZpZWxkc2V0PlxyXG5cclxuICAgICAgPCEtLSB0ZWNobmlxdWVzIC0tPlxyXG4gICAgICA8ZmllbGRzZXRcclxuICAgICAgICBbaGlkZGVuXT1cIlxyXG4gICAgICAgICAgKCFhdmFpbFRlY2huaXF1ZXMubGVuZ3RoICYmICFlbGVtVGVjaG5pcXVlRnJlZSkgfHwgaGlkZGVuPy50ZWNobmlxdWVzXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxsZWdlbmQ+dGVjaG5pcXVlczwvbGVnZW5kPlxyXG4gICAgICAgIDxjYWRtdXMtdWktZmxhZ3MtcGlja2VyXHJcbiAgICAgICAgICBbZmxhZ3NdPVwiYXZhaWxUZWNobmlxdWVzXCJcclxuICAgICAgICAgIFthbGxvd1VzZXJGbGFnc109XCJlbGVtVGVjaG5pcXVlRnJlZSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwiaW5pdGlhbFRlY2huaXF1ZXNcIlxyXG4gICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uVGVjaG5pcXVlc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICA+PC9jYWRtdXMtdWktZmxhZ3MtcGlja2VyPlxyXG4gICAgICA8L2ZpZWxkc2V0PlxyXG5cclxuICAgICAgPCEtLSB0b29scyAtLT5cclxuICAgICAgPGZpZWxkc2V0XHJcbiAgICAgICAgW2hpZGRlbl09XCIoIWF2YWlsVG9vbHMubGVuZ3RoICYmICFlbGVtVG9vbEZyZWUpIHx8IGhpZGRlbj8udG9vbHNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGxlZ2VuZD50b29sczwvbGVnZW5kPlxyXG4gICAgICAgIDxjYWRtdXMtdWktZmxhZ3MtcGlja2VyXHJcbiAgICAgICAgICBbZmxhZ3NdPVwiYXZhaWxUb29sc1wiXHJcbiAgICAgICAgICBbYWxsb3dVc2VyRmxhZ3NdPVwiZWxlbVRvb2xGcmVlIHx8IGZhbHNlXCJcclxuICAgICAgICAgIFtzZWxlY3RlZElkc109XCJpbml0aWFsVG9vbHNcIlxyXG4gICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uVG9vbHNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLXVpLWZsYWdzLXBpY2tlcj5cclxuICAgICAgPC9maWVsZHNldD5cclxuXHJcbiAgICAgIDwhLS0gcG9zaXRpb25zIC0tPlxyXG4gICAgICA8ZmllbGRzZXRcclxuICAgICAgICBbaGlkZGVuXT1cIlxyXG4gICAgICAgICAgKCFhdmFpbFBvc2l0aW9ucy5sZW5ndGggJiYgIWVsZW1Qb3NpdGlvbkZyZWUpIHx8IGhpZGRlbj8ucG9zaXRpb25zXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxsZWdlbmQ+cG9zaXRpb25zPC9sZWdlbmQ+XHJcbiAgICAgICAgPGNhZG11cy11aS1mbGFncy1waWNrZXJcclxuICAgICAgICAgIFtmbGFnc109XCJhdmFpbFBvc2l0aW9uc1wiXHJcbiAgICAgICAgICBbYWxsb3dVc2VyRmxhZ3NdPVwiZWxlbVBvc2l0aW9uRnJlZSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwiaW5pdGlhbFBvc2l0aW9uc1wiXHJcbiAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25Qb3NpdGlvbnNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLXVpLWZsYWdzLXBpY2tlcj5cclxuICAgICAgPC9maWVsZHNldD5cclxuICAgIDwvbWF0LXRhYj5cclxuXHJcbiAgICA8IS0tIERFU0NSSVBUSU9OIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJkZXNjcmlwdGlvblwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxuZ3gtbW9uYWNvLWVkaXRvclxyXG4gICAgICAgICAgI2RzY2VkaXRvclxyXG4gICAgICAgICAgW29wdGlvbnNdPVwiZWRpdG9yT3B0aW9uc1wiXHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZGVzY3JpcHRpb25cIlxyXG4gICAgICAgID48L25neC1tb25hY28tZWRpdG9yPlxyXG4gICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICRhbnkoZGVzY3JpcHRpb24pLmVycm9ycz8ubWF4TGVuZ3RoICYmXHJcbiAgICAgICAgICAgIChkZXNjcmlwdGlvbi50b3VjaGVkIHx8IGRlc2NyaXB0aW9uLmRpcnR5KVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgID5kZXNjcmlwdGlvbiB0b28gbG9uZzwvbWF0LWVycm9yXHJcbiAgICAgICAgPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8IS0tIGltYWdlcyAtLT5cclxuICAgICAgICA8Y2FkbXVzLWNvZC1pbWFnZXNcclxuICAgICAgICAgIFt0eXBlRW50cmllc109XCJpbWdUeXBlRW50cmllc1wiXHJcbiAgICAgICAgICBbaW1hZ2VzXT1cImluaXRpYWxJbWFnZXNcIlxyXG4gICAgICAgICAgKGltYWdlc0NoYW5nZSk9XCJvbkltYWdlc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICA+PC9jYWRtdXMtY29kLWltYWdlcz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPCEtLSBub3RlIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImxvbmctdGV4dFwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5ub3RlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8dGV4dGFyZWEgcm93cz1cIjJcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwibm90ZVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShub3RlKS5lcnJvcnM/Lm1heExlbmd0aCAmJiAobm90ZS5kaXJ0eSB8fCBub3RlLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPm5vdGUgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtdGFiPlxyXG4gIDwvbWF0LXRhYi1ncm91cD5cclxuXHJcbiAgPCEtLSBidXR0b25zIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJvd1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJEaXNjYXJkIGVsZW1lbnQgY2hhbmdlc1wiXHJcbiAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiQWNjZXB0IGVsZW1lbnQgY2hhbmdlc1wiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgZm9ybS5wcmlzdGluZVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jaGVja19jaXJjbGU8L21hdC1pY29uPiBlbGVtZW50XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=