ngx-tethys 16.1.13 → 16.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ## [16.1.14](https://github.com/atinc/ngx-tethys/compare/16.1.13...16.1.14) (2023-11-20)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **date-picker:** adjust updateReadableDate function INFR-10167 ([#2900](https://github.com/atinc/ngx-tethys/issues/2900)) ([4c2f14a](https://github.com/atinc/ngx-tethys/commit/4c2f14a59e86264e39343497dbae8aee4fba7440))
11
+ * **input:** adjust left margin of prefix element and right margin of suffix element #INFR-10515 ([8ad60ce](https://github.com/atinc/ngx-tethys/commit/8ad60ce0272e6fbc1313f37ce763455f6d13f1ec)), closes [#INFR-10515](https://github.com/atinc/ngx-tethys/issues/INFR-10515)
12
+
13
+
14
+ ### Features
15
+
16
+ * **anchor:** support horizontal display #INFR-10451 ([#2901](https://github.com/atinc/ngx-tethys/issues/2901)) ([bb5d10a](https://github.com/atinc/ngx-tethys/commit/bb5d10a5dde4832a496c24137750e635fead2ec5)), closes [#INFR-10451](https://github.com/atinc/ngx-tethys/issues/INFR-10451)
17
+
18
+
19
+
5
20
  ## [16.1.13](https://github.com/atinc/ngx-tethys/compare/16.1.12...16.1.13) (2023-11-16)
6
21
 
7
22
 
@@ -1,7 +1,7 @@
1
1
  import { Platform } from '@angular/cdk/platform';
2
- import { AfterViewInit, ChangeDetectorRef, EventEmitter, NgZone, OnChanges, OnDestroy, Renderer2, SimpleChanges } from '@angular/core';
3
- import { ThyAnchorLinkComponent } from './anchor-link.component';
2
+ import { AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter, NgZone, OnChanges, OnDestroy, Renderer2, SimpleChanges } from '@angular/core';
4
3
  import { ThyScrollService } from 'ngx-tethys/core';
4
+ import { ThyAnchorLinkComponent } from './anchor-link.component';
5
5
  import * as i0 from "@angular/core";
6
6
  /**
7
7
  * 锚点组件
@@ -14,6 +14,7 @@ export declare class ThyAnchorComponent implements OnDestroy, AfterViewInit, OnC
14
14
  private zone;
15
15
  private renderer;
16
16
  private scrollService;
17
+ private elementRef;
17
18
  private ink;
18
19
  /**
19
20
  * 固定模式
@@ -32,6 +33,11 @@ export declare class ThyAnchorComponent implements OnDestroy, AfterViewInit, OnC
32
33
  * @type string | HTMLElement
33
34
  */
34
35
  thyContainer?: string | HTMLElement;
36
+ /**
37
+ * 设置导航方向
38
+ * @type 'vertical' | 'horizontal'
39
+ */
40
+ thyDirection: 'vertical' | 'horizontal';
35
41
  /**
36
42
  * 点击项触发
37
43
  */
@@ -49,12 +55,13 @@ export declare class ThyAnchorComponent implements OnDestroy, AfterViewInit, OnC
49
55
  private animating;
50
56
  private destroy$;
51
57
  private handleScrollTimeoutID;
52
- constructor(document: any, cdr: ChangeDetectorRef, platform: Platform, zone: NgZone, renderer: Renderer2, scrollService: ThyScrollService);
58
+ constructor(document: any, cdr: ChangeDetectorRef, platform: Platform, zone: NgZone, renderer: Renderer2, scrollService: ThyScrollService, elementRef: ElementRef);
53
59
  registerLink(link: ThyAnchorLinkComponent): void;
54
60
  unregisterLink(link: ThyAnchorLinkComponent): void;
55
61
  private getContainer;
56
62
  ngAfterViewInit(): void;
57
63
  ngOnDestroy(): void;
64
+ private warningPrompt;
58
65
  private registerScrollEvent;
59
66
  handleScroll(): void;
60
67
  private clearActive;
@@ -63,5 +70,5 @@ export declare class ThyAnchorComponent implements OnDestroy, AfterViewInit, OnC
63
70
  handleScrollTo(linkComponent: ThyAnchorLinkComponent): void;
64
71
  ngOnChanges(changes: SimpleChanges): void;
65
72
  static ɵfac: i0.ɵɵFactoryDeclaration<ThyAnchorComponent, never>;
66
- static ɵcmp: i0.ɵɵComponentDeclaration<ThyAnchorComponent, "thy-anchor", ["thyAnchor"], { "thyAffix": { "alias": "thyAffix"; "required": false; }; "thyBounds": { "alias": "thyBounds"; "required": false; }; "thyOffsetTop": { "alias": "thyOffsetTop"; "required": false; }; "thyContainer": { "alias": "thyContainer"; "required": false; }; }, { "thyClick": "thyClick"; "thyScroll": "thyScroll"; }, never, ["*"], true, never>;
73
+ static ɵcmp: i0.ɵɵComponentDeclaration<ThyAnchorComponent, "thy-anchor", ["thyAnchor"], { "thyAffix": { "alias": "thyAffix"; "required": false; }; "thyBounds": { "alias": "thyBounds"; "required": false; }; "thyOffsetTop": { "alias": "thyOffsetTop"; "required": false; }; "thyContainer": { "alias": "thyContainer"; "required": false; }; "thyDirection": { "alias": "thyDirection"; "required": false; }; }, { "thyClick": "thyClick"; "thyScroll": "thyScroll"; }, never, ["*"], true, never>;
67
74
  }
@@ -1,4 +1,4 @@
1
- @use "../../styles/variables";
1
+ @use '../../styles/variables';
2
2
 
3
3
  $anchor-border-width: 2px;
4
4
 
@@ -7,30 +7,74 @@ $anchor-border-width: 2px;
7
7
  padding-left: $anchor-border-width;
8
8
 
9
9
  &-wrapper {
10
- margin-left: -4px;
11
- padding-left: 4px;
10
+ margin-block-start: -4px;
11
+ padding-block-start: 4px;
12
12
  overflow: auto;
13
13
  background-color: variables.$white;
14
- }
15
14
 
16
- &-ink {
17
- position: absolute;
18
- top: 0;
19
- left: 0;
20
- height: 100%;
21
- &::before {
22
- position: relative;
23
- display: block;
24
- width: $anchor-border-width;
25
- height: 100%;
26
- margin: 0 auto;
27
- background-color: variables.$nav-border-color;
28
- content: ' ';
15
+ &:not(&-horizontal) {
16
+ .thy-anchor {
17
+ &-ink {
18
+ position: absolute;
19
+ top: 0;
20
+ left: 0;
21
+ height: 100%;
22
+
23
+ &::before {
24
+ position: relative;
25
+ display: block;
26
+ width: $anchor-border-width;
27
+ height: 100%;
28
+ margin: 0 auto;
29
+ background-color: variables.$nav-border-color;
30
+ content: ' ';
31
+ }
32
+
33
+ &-full {
34
+ position: absolute;
35
+ border-left: $anchor-border-width solid variables.$primary;
36
+ transition: top 0.2s ease-in-out;
37
+ }
38
+ }
39
+ }
29
40
  }
30
- &-full {
31
- position: absolute;
32
- border-left: $anchor-border-width solid variables.$primary;
33
- transition: top 0.2s ease-in-out;
41
+ &-horizontal {
42
+ position: relative;
43
+
44
+ .thy-anchor {
45
+ display: flex;
46
+ overflow-x: scroll;
47
+ scrollbar-width: none;
48
+
49
+ &-ink {
50
+ position: absolute;
51
+ bottom: 0;
52
+ left: 0;
53
+ width: 100%;
54
+ height: 2px;
55
+
56
+ &::before {
57
+ position: relative;
58
+ display: block;
59
+ width: 100%;
60
+ height: $anchor-border-width;
61
+ margin: 0 auto;
62
+ background-color: variables.$nav-border-color;
63
+ content: ' ';
64
+ }
65
+
66
+ &-full {
67
+ position: absolute;
68
+ bottom: 0;
69
+ border-top: $anchor-border-width solid variables.$primary;
70
+ transition: left 0.2s ease-in-out, width 0.2s ease-in-out;
71
+ }
72
+ }
73
+ &-link-title {
74
+ padding-left: 8px;
75
+ padding-right: 8px;
76
+ }
77
+ }
34
78
  }
35
79
  }
36
80
 
@@ -5,7 +5,6 @@ import { AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter } from '@ang
5
5
  import { DateHelperService } from './date-helper.service';
6
6
  import { CompatibleValue, RangePartType } from './inner-types';
7
7
  import { ThyDateGranularity } from './standard-types';
8
- import { BehaviorSubject } from 'rxjs';
9
8
  import * as i0 from "@angular/core";
10
9
  /**
11
10
  * @private
@@ -43,7 +42,6 @@ export declare class ThyPickerComponent implements AfterViewInit {
43
42
  private innerFormat;
44
43
  private innerValue;
45
44
  entering: boolean;
46
- readableValue$: BehaviorSubject<string>;
47
45
  prefixCls: string;
48
46
  animationOpenState: boolean;
49
47
  overlayOpen: boolean;
@@ -1,12 +1,12 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import { Platform } from '@angular/cdk/platform';
3
3
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgZone, Output, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core';
4
- import { fromEvent, Subject } from 'rxjs';
4
+ import { Subject, fromEvent } from 'rxjs';
5
5
  import { takeUntil, throttleTime } from 'rxjs/operators';
6
- import { getOffset } from 'ngx-tethys/util';
7
- import { InputBoolean, InputNumber, ThyScrollService } from 'ngx-tethys/core';
8
- import { DOCUMENT, NgIf, NgTemplateOutlet, NgStyle } from '@angular/common';
6
+ import { DOCUMENT, NgClass, NgIf, NgStyle, NgTemplateOutlet } from '@angular/common';
9
7
  import { ThyAffixComponent } from 'ngx-tethys/affix';
8
+ import { InputBoolean, InputNumber, ThyScrollService } from 'ngx-tethys/core';
9
+ import { getOffset } from 'ngx-tethys/util';
10
10
  import * as i0 from "@angular/core";
11
11
  import * as i1 from "@angular/cdk/platform";
12
12
  import * as i2 from "ngx-tethys/core";
@@ -16,13 +16,14 @@ const sharpMatcherRegx = /#([^#]+)$/;
16
16
  * @name thy-anchor
17
17
  */
18
18
  export class ThyAnchorComponent {
19
- constructor(document, cdr, platform, zone, renderer, scrollService) {
19
+ constructor(document, cdr, platform, zone, renderer, scrollService, elementRef) {
20
20
  this.document = document;
21
21
  this.cdr = cdr;
22
22
  this.platform = platform;
23
23
  this.zone = zone;
24
24
  this.renderer = renderer;
25
25
  this.scrollService = scrollService;
26
+ this.elementRef = elementRef;
26
27
  /**
27
28
  * 固定模式
28
29
  */
@@ -35,6 +36,11 @@ export class ThyAnchorComponent {
35
36
  * 缓冲的偏移量阈值
36
37
  */
37
38
  this.thyOffsetTop = undefined;
39
+ /**
40
+ * 设置导航方向
41
+ * @type 'vertical' | 'horizontal'
42
+ */
43
+ this.thyDirection = 'vertical';
38
44
  /**
39
45
  * 点击项触发
40
46
  */
@@ -60,6 +66,7 @@ export class ThyAnchorComponent {
60
66
  return this.container || window;
61
67
  }
62
68
  ngAfterViewInit() {
69
+ this.warningPrompt();
63
70
  this.registerScrollEvent();
64
71
  }
65
72
  ngOnDestroy() {
@@ -67,6 +74,14 @@ export class ThyAnchorComponent {
67
74
  this.destroy$.next();
68
75
  this.destroy$.complete();
69
76
  }
77
+ warningPrompt() {
78
+ if (this.thyDirection === 'horizontal') {
79
+ const hasChildren = this.links.some(link => Array.from(link?.elementRef?.nativeElement?.childNodes)?.some((item) => item?.className.includes('thy-anchor-link')));
80
+ if (hasChildren) {
81
+ console.warn("Anchor link nesting is not supported when 'Anchor' direction is horizontal.");
82
+ }
83
+ }
84
+ }
70
85
  registerScrollEvent() {
71
86
  if (!this.platform.isBrowser) {
72
87
  return;
@@ -124,8 +139,11 @@ export class ThyAnchorComponent {
124
139
  this.clearActive();
125
140
  linkComponent.setActive();
126
141
  const linkNode = linkComponent.getLinkTitleElement();
127
- this.ink.nativeElement.style.top = `${linkNode.offsetTop}px`;
128
- this.ink.nativeElement.style.height = `${linkNode.clientHeight}px`;
142
+ const horizontalAnchor = this.thyDirection === 'horizontal';
143
+ this.ink.nativeElement.style.top = horizontalAnchor ? '' : `${linkNode.offsetTop}px`;
144
+ this.ink.nativeElement.style.height = horizontalAnchor ? '' : `${linkNode.clientHeight}px`;
145
+ this.ink.nativeElement.style.left = horizontalAnchor ? `${linkNode.offsetLeft}px` : '';
146
+ this.ink.nativeElement.style.width = horizontalAnchor ? `${linkNode.clientWidth}px` : '';
129
147
  this.visible = true;
130
148
  this.setVisible();
131
149
  this.thyScroll.emit(linkComponent);
@@ -171,13 +189,16 @@ export class ThyAnchorComponent {
171
189
  this.registerScrollEvent();
172
190
  }
173
191
  }
174
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ThyAnchorComponent, deps: [{ token: DOCUMENT }, { token: i0.ChangeDetectorRef }, { token: i1.Platform }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i2.ThyScrollService }], target: i0.ɵɵFactoryTarget.Component }); }
175
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: ThyAnchorComponent, isStandalone: true, selector: "thy-anchor", inputs: { thyAffix: "thyAffix", thyBounds: "thyBounds", thyOffsetTop: "thyOffsetTop", thyContainer: "thyContainer" }, outputs: { thyClick: "thyClick", thyScroll: "thyScroll" }, viewQueries: [{ propertyName: "ink", first: true, predicate: ["ink"], descendants: true }], exportAs: ["thyAnchor"], usesOnChanges: true, ngImport: i0, template: `
192
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ThyAnchorComponent, deps: [{ token: DOCUMENT }, { token: i0.ChangeDetectorRef }, { token: i1.Platform }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i2.ThyScrollService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
193
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: ThyAnchorComponent, isStandalone: true, selector: "thy-anchor", inputs: { thyAffix: "thyAffix", thyBounds: "thyBounds", thyOffsetTop: "thyOffsetTop", thyContainer: "thyContainer", thyDirection: "thyDirection" }, outputs: { thyClick: "thyClick", thyScroll: "thyScroll" }, viewQueries: [{ propertyName: "ink", first: true, predicate: ["ink"], descendants: true }], exportAs: ["thyAnchor"], usesOnChanges: true, ngImport: i0, template: `
176
194
  <thy-affix *ngIf="thyAffix; else content" [thyOffsetTop]="thyOffsetTop" [thyContainer]="container">
177
195
  <ng-template [ngTemplateOutlet]="content"></ng-template>
178
196
  </thy-affix>
179
197
  <ng-template #content>
180
- <div class="thy-anchor-wrapper" [ngStyle]="wrapperStyle">
198
+ <div
199
+ class="thy-anchor-wrapper"
200
+ [ngClass]="{ 'thy-anchor-wrapper-horizontal': thyDirection === 'horizontal' }"
201
+ [ngStyle]="wrapperStyle">
181
202
  <div class="thy-anchor">
182
203
  <div class="thy-anchor-ink">
183
204
  <div class="thy-anchor-ink-full" #ink></div>
@@ -186,7 +207,7 @@ export class ThyAnchorComponent {
186
207
  </div>
187
208
  </div>
188
209
  </ng-template>
189
- `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThyAffixComponent, selector: "thy-affix", inputs: ["thyContainer", "thyOffsetTop", "thyOffsetBottom"], outputs: ["thyChange"], exportAs: ["thyAffix"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
210
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThyAffixComponent, selector: "thy-affix", inputs: ["thyContainer", "thyOffsetTop", "thyOffsetBottom"], outputs: ["thyChange"], exportAs: ["thyAffix"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
190
211
  }
191
212
  __decorate([
192
213
  InputBoolean(),
@@ -211,7 +232,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImpor
211
232
  <ng-template [ngTemplateOutlet]="content"></ng-template>
212
233
  </thy-affix>
213
234
  <ng-template #content>
214
- <div class="thy-anchor-wrapper" [ngStyle]="wrapperStyle">
235
+ <div
236
+ class="thy-anchor-wrapper"
237
+ [ngClass]="{ 'thy-anchor-wrapper-horizontal': thyDirection === 'horizontal' }"
238
+ [ngStyle]="wrapperStyle">
215
239
  <div class="thy-anchor">
216
240
  <div class="thy-anchor-ink">
217
241
  <div class="thy-anchor-ink-full" #ink></div>
@@ -224,12 +248,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImpor
224
248
  encapsulation: ViewEncapsulation.None,
225
249
  changeDetection: ChangeDetectionStrategy.OnPush,
226
250
  standalone: true,
227
- imports: [NgIf, ThyAffixComponent, NgTemplateOutlet, NgStyle]
251
+ imports: [NgIf, ThyAffixComponent, NgTemplateOutlet, NgStyle, NgClass]
228
252
  }]
229
253
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
230
254
  type: Inject,
231
255
  args: [DOCUMENT]
232
- }] }, { type: i0.ChangeDetectorRef }, { type: i1.Platform }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i2.ThyScrollService }]; }, propDecorators: { ink: [{
256
+ }] }, { type: i0.ChangeDetectorRef }, { type: i1.Platform }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i2.ThyScrollService }, { type: i0.ElementRef }]; }, propDecorators: { ink: [{
233
257
  type: ViewChild,
234
258
  args: ['ink']
235
259
  }], thyAffix: [{
@@ -240,9 +264,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImpor
240
264
  type: Input
241
265
  }], thyContainer: [{
242
266
  type: Input
267
+ }], thyDirection: [{
268
+ type: Input
243
269
  }], thyClick: [{
244
270
  type: Output
245
271
  }], thyScroll: [{
246
272
  type: Output
247
273
  }] } });
248
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hbmNob3IvYW5jaG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBT3JELE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO0FBRXJDOzs7R0FHRztBQXlCSCxNQUFNLE9BQU8sa0JBQWtCO0lBb0QzQixZQUM4QixRQUFhLEVBQy9CLEdBQXNCLEVBQ3RCLFFBQWtCLEVBQ2xCLElBQVksRUFDWixRQUFtQixFQUNuQixhQUErQjtRQUxiLGFBQVEsR0FBUixRQUFRLENBQUs7UUFDL0IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtR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QkFPTixTQUFTO3NCQUZSLEtBQUs7Z0JBU04sWUFBWTtzQkFGWCxLQUFLO2dCQVFHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS2EsUUFBUTtzQkFBMUIsTUFBTTtnQkFLWSxTQUFTO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFRoeUFuY2hvckxpbmtDb21wb25lbnQgfSBmcm9tICcuL2FuY2hvci1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXRPZmZzZXQgfSBmcm9tICduZ3gtdGV0aHlzL3V0aWwnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuLCBJbnB1dE51bWJlciwgVGh5U2Nyb2xsU2VydmljZSB9IGZyb20gJ25neC10ZXRoeXMvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUaHlBZmZpeENvbXBvbmVudCB9IGZyb20gJ25neC10ZXRoeXMvYWZmaXgnO1xuXG5pbnRlcmZhY2UgU2VjdGlvbiB7XG4gICAgbGlua0NvbXBvbmVudDogVGh5QW5jaG9yTGlua0NvbXBvbmVudDtcbiAgICB0b3A6IG51bWJlcjtcbn1cblxuY29uc3Qgc2hhcnBNYXRjaGVyUmVneCA9IC8jKFteI10rKSQvO1xuXG4vKipcbiAqIOmUmueCuee7hOS7tlxuICogQG5hbWUgdGh5LWFuY2hvclxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoeS1hbmNob3InLFxuICAgIGV4cG9ydEFzOiAndGh5QW5jaG9yJyxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8dGh5LWFmZml4ICpuZ0lmPVwidGh5QWZmaXg7IGVsc2UgY29udGVudFwiIFt0aHlPZmZzZXRUb3BdPVwidGh5T2Zmc2V0VG9wXCIgW3RoeUNvbnRhaW5lcl09XCJjb250YWluZXJcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90aHktYWZmaXg+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aHktYW5jaG9yLXdyYXBwZXJcIiBbbmdTdHlsZV09XCJ3cmFwcGVyU3R5bGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGh5LWFuY2hvclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGh5LWFuY2hvci1pbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aHktYW5jaG9yLWluay1mdWxsXCIgI2luaz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIGAsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0lmLCBUaHlBZmZpeENvbXBvbmVudCwgTmdUZW1wbGF0ZU91dGxldCwgTmdTdHlsZV1cbn0pXG5leHBvcnQgY2xhc3MgVGh5QW5jaG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICAgIEBWaWV3Q2hpbGQoJ2luaycpIHByaXZhdGUgaW5rITogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIOWbuuWumuaooeW8j1xuICAgICAqL1xuICAgIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB0aHlBZmZpeCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiDplJrngrnljLrln5/ovrnnlYzvvIzljZXkvY3vvJpweFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQElucHV0TnVtYmVyKClcbiAgICB0aHlCb3VuZHMgPSA1O1xuXG4gICAgLyoqXG4gICAgICog57yT5Yay55qE5YGP56e76YeP6ZiI5YC8XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASW5wdXROdW1iZXIoKVxuICAgIHRoeU9mZnNldFRvcD86IG51bWJlciA9IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIOaMh+Wumua7muWKqOeahOWuueWZqFxuICAgICAqIEB0eXBlIHN0cmluZyB8IEhUTUxFbGVtZW50XG4gICAgICovXG4gICAgQElucHV0KCkgdGh5Q29udGFpbmVyPzogc3RyaW5nIHwgSFRNTEVsZW1lbnQ7XG5cbiAgICAvKipcbiAgICAgKiDngrnlh7vpobnop6blj5FcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdGh5Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFRoeUFuY2hvckxpbmtDb21wb25lbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDmu5rliqjliLDmn5DplJrngrnml7bop6blj5FcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdGh5U2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxUaHlBbmNob3JMaW5rQ29tcG9uZW50PigpO1xuXG4gICAgdmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgd3JhcHBlclN0eWxlID0geyAnbWF4LWhlaWdodCc6ICcxMDB2aCcgfTtcblxuICAgIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgV2luZG93O1xuXG4gICAgcHJpdmF0ZSBsaW5rczogVGh5QW5jaG9yTGlua0NvbXBvbmVudFtdID0gW107XG5cbiAgICBwcml2YXRlIGFuaW1hdGluZyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwcml2YXRlIGhhbmRsZVNjcm9sbFRpbWVvdXRJRCA9IC0xO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlOiBUaHlTY3JvbGxTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgcmVnaXN0ZXJMaW5rKGxpbms6IFRoeUFuY2hvckxpbmtDb21wb25lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saW5rcy5wdXNoKGxpbmspO1xuICAgIH1cblxuICAgIHVucmVnaXN0ZXJMaW5rKGxpbms6IFRoeUFuY2hvckxpbmtDb21wb25lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saW5rcy5zcGxpY2UodGhpcy5saW5rcy5pbmRleE9mKGxpbmspLCAxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IFdpbmRvdyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lciB8fCB3aW5kb3c7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGFuZGxlU2Nyb2xsVGltZW91dElEKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyU2Nyb2xsRXZlbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wbGF0Zm9ybS5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLmdldENvbnRhaW5lcigpLCAnc2Nyb2xsJywgeyBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgLnBpcGUodGhyb3R0bGVUaW1lKDUwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oYW5kbGVTY3JvbGwoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBCcm93c2VyIHdvdWxkIG1haW50YWluIHRoZSBzY3JvbGxpbmcgcG9zaXRpb24gd2hlbiByZWZyZXNoaW5nLlxuICAgICAgICAvLyBTbyB3ZSBoYXZlIHRvIGRlbGF5IGNhbGN1bGF0aW9uIGluIGF2b2lkIG9mIGdldHRpbmcgYSBpbmNvcnJlY3QgcmVzdWx0LlxuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbFRpbWVvdXRJRCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oYW5kbGVTY3JvbGwoKSk7XG4gICAgfVxuXG4gICAgaGFuZGxlU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmFuaW1hdGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gdGhpcy5jb250YWluZXIgOiB0aGlzLmRvY3VtZW50O1xuXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zOiBTZWN0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSAodGhpcy50aHlPZmZzZXRUb3AgfHwgMCkgKyB0aGlzLnRoeUJvdW5kcztcbiAgICAgICAgdGhpcy5saW5rcy5mb3JFYWNoKGxpbmtDb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2hhcnBMaW5rTWF0Y2ggPSBzaGFycE1hdGNoZXJSZWd4LmV4ZWMobGlua0NvbXBvbmVudC50aHlIcmVmLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgaWYgKCFzaGFycExpbmtNYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAjJHtzaGFycExpbmtNYXRjaFsxXX1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSBnZXRPZmZzZXQodGFyZ2V0LCB0aGlzLmdldENvbnRhaW5lcigpKS50b3A7XG4gICAgICAgICAgICAgICAgaWYgKHRvcCA8IHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua0NvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9ICEhc2VjdGlvbnMubGVuZ3RoO1xuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWF4U2VjdGlvbiA9IHNlY3Rpb25zLnJlZHVjZSgocHJldiwgY3VycikgPT4gKGN1cnIudG9wID4gcHJldi50b3AgPyBjdXJyIDogcHJldikpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3RpdmUobWF4U2VjdGlvbi5saW5rQ29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZpc2libGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyQWN0aXZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpbmtzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBpLnVuc2V0QWN0aXZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQWN0aXZlKGxpbmtDb21wb25lbnQ6IFRoeUFuY2hvckxpbmtDb21wb25lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgICBsaW5rQ29tcG9uZW50LnNldEFjdGl2ZSgpO1xuICAgICAgICBjb25zdCBsaW5rTm9kZSA9IGxpbmtDb21wb25lbnQuZ2V0TGlua1RpdGxlRWxlbWVudCgpO1xuXG4gICAgICAgIHRoaXMuaW5rLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gYCR7bGlua05vZGUub2Zmc2V0VG9wfXB4YDtcbiAgICAgICAgdGhpcy5pbmsubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtsaW5rTm9kZS5jbGllbnRIZWlnaHR9cHhgO1xuICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldFZpc2libGUoKTtcbiAgICAgICAgdGhpcy50aHlTY3JvbGwuZW1pdChsaW5rQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZpc2libGUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLnZpc2libGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVDbGFzc25hbWUgPSAndmlzaWJsZSc7XG4gICAgICAgIGlmICh0aGlzLmluaykge1xuICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaW5rLm5hdGl2ZUVsZW1lbnQsIHZpc2libGVDbGFzc25hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuaW5rLm5hdGl2ZUVsZW1lbnQsIHZpc2libGVDbGFzc25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlU2Nyb2xsVG8obGlua0NvbXBvbmVudDogVGh5QW5jaG9yTGlua0NvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250YWluZXI6IEhUTUxFbGVtZW50ID0gdGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHRoaXMuY29udGFpbmVyIDogdGhpcy5kb2N1bWVudDtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQ6IEhUTUxFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IobGlua0NvbXBvbmVudC50aHlIcmVmKTtcbiAgICAgICAgaWYgKCFsaW5rRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBjb250YWluZXJTY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFNlcnZpY2UuZ2V0U2Nyb2xsKHRoaXMuZ2V0Q29udGFpbmVyKCkpO1xuICAgICAgICBjb25zdCBlbGVtZW50T2Zmc2V0VG9wID0gZ2V0T2Zmc2V0KGxpbmtFbGVtZW50LCB0aGlzLmdldENvbnRhaW5lcigpKS50b3A7XG4gICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IGNvbnRhaW5lclNjcm9sbFRvcCArIGVsZW1lbnRPZmZzZXRUb3AgLSAodGhpcy50aHlPZmZzZXRUb3AgfHwgMCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxUbyh0aGlzLmdldENvbnRhaW5lcigpLCB0YXJnZXRTY3JvbGxUb3AsIHVuZGVmaW5lZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGFuZGxlQWN0aXZlKGxpbmtDb21wb25lbnQpO1xuICAgICAgICB0aGlzLnRoeUNsaWNrLmVtaXQobGlua0NvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IHRoeU9mZnNldFRvcCwgdGh5Q29udGFpbmVyIH0gPSBjaGFuZ2VzO1xuICAgICAgICBpZiAodGh5T2Zmc2V0VG9wKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXJTdHlsZSA9IHtcbiAgICAgICAgICAgICAgICAnbWF4LWhlaWdodCc6IGBjYWxjKDEwMHZoIC0gJHt0aGlzLnRoeU9mZnNldFRvcH1weClgXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aHlDb250YWluZXIgJiYgdGhpcy50aHlDb250YWluZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudGh5Q29udGFpbmVyO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0eXBlb2YgY29udGFpbmVyID09PSAnc3RyaW5nJyA/IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpIDogY29udGFpbmVyO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlclNjcm9sbEV2ZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hbmNob3IvYW5jaG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQVE1QyxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUVyQzs7O0dBR0c7QUE0QkgsTUFBTSxPQUFPLGtCQUFrQjtJQTBEM0IsWUFDOEIsUUFBYSxFQUMvQixHQUFzQixFQUN0QixRQUFrQixFQUNsQixJQUFZLEVBQ1osUUFBbUIsRUFDbkIsYUFBK0IsRUFDL0IsVUFBc0I7UUFOSixhQUFRLEdBQVIsUUFBUSxDQUFLO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RC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QyxLQUFLO2dCQU9OLFNBQVM7c0JBRlIsS0FBSztnQkFTTixZQUFZO3NCQUZYLEtBQUs7Z0JBUUcsWUFBWTtzQkFBcEIsS0FBSztnQkFNRyxZQUFZO3NCQUFwQixLQUFLO2dCQUthLFFBQVE7c0JBQTFCLE1BQU07Z0JBS1ksU0FBUztzQkFBM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgdGhyb3R0bGVUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBET0NVTUVOVCwgTmdDbGFzcywgTmdJZiwgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUaHlBZmZpeENvbXBvbmVudCB9IGZyb20gJ25neC10ZXRoeXMvYWZmaXgnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuLCBJbnB1dE51bWJlciwgVGh5U2Nyb2xsU2VydmljZSB9IGZyb20gJ25neC10ZXRoeXMvY29yZSc7XG5pbXBvcnQgeyBnZXRPZmZzZXQgfSBmcm9tICduZ3gtdGV0aHlzL3V0aWwnO1xuaW1wb3J0IHsgVGh5QW5jaG9yTGlua0NvbXBvbmVudCB9IGZyb20gJy4vYW5jaG9yLWxpbmsuY29tcG9uZW50JztcblxuaW50ZXJmYWNlIFNlY3Rpb24ge1xuICAgIGxpbmtDb21wb25lbnQ6IFRoeUFuY2hvckxpbmtDb21wb25lbnQ7XG4gICAgdG9wOiBudW1iZXI7XG59XG5cbmNvbnN0IHNoYXJwTWF0Y2hlclJlZ3ggPSAvIyhbXiNdKykkLztcblxuLyoqXG4gKiDplJrngrnnu4Tku7ZcbiAqIEBuYW1lIHRoeS1hbmNob3JcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aHktYW5jaG9yJyxcbiAgICBleHBvcnRBczogJ3RoeUFuY2hvcicsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPHRoeS1hZmZpeCAqbmdJZj1cInRoeUFmZml4OyBlbHNlIGNvbnRlbnRcIiBbdGh5T2Zmc2V0VG9wXT1cInRoeU9mZnNldFRvcFwiIFt0aHlDb250YWluZXJdPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGh5LWFmZml4PlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0aHktYW5jaG9yLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3RoeS1hbmNob3Itd3JhcHBlci1ob3Jpem9udGFsJzogdGh5RGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgfVwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwid3JhcHBlclN0eWxlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoeS1hbmNob3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoeS1hbmNob3ItaW5rXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGh5LWFuY2hvci1pbmstZnVsbFwiICNpbms+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTmdJZiwgVGh5QWZmaXhDb21wb25lbnQsIE5nVGVtcGxhdGVPdXRsZXQsIE5nU3R5bGUsIE5nQ2xhc3NdXG59KVxuZXhwb3J0IGNsYXNzIFRoeUFuY2hvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgICBAVmlld0NoaWxkKCdpbmsnKSBwcml2YXRlIGluayE6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiDlm7rlrprmqKHlvI9cbiAgICAgKi9cbiAgICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgdGh5QWZmaXggPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICog6ZSa54K55Yy65Z+f6L6555WM77yM5Y2V5L2N77yacHhcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBJbnB1dE51bWJlcigpXG4gICAgdGh5Qm91bmRzID0gNTtcblxuICAgIC8qKlxuICAgICAqIOe8k+WGsueahOWBj+enu+mHj+mYiOWAvFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQElucHV0TnVtYmVyKClcbiAgICB0aHlPZmZzZXRUb3A/OiBudW1iZXIgPSB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiDmjIflrprmu5rliqjnmoTlrrnlmahcbiAgICAgKiBAdHlwZSBzdHJpbmcgfCBIVE1MRWxlbWVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeUNvbnRhaW5lcj86IHN0cmluZyB8IEhUTUxFbGVtZW50O1xuXG4gICAgLyoqXG4gICAgICog6K6+572u5a+86Iiq5pa55ZCRXG4gICAgICogQHR5cGUgJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeURpcmVjdGlvbjogJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJyA9ICd2ZXJ0aWNhbCc7XG5cbiAgICAvKipcbiAgICAgKiDngrnlh7vpobnop6blj5FcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdGh5Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFRoeUFuY2hvckxpbmtDb21wb25lbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDmu5rliqjliLDmn5DplJrngrnml7bop6blj5FcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdGh5U2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxUaHlBbmNob3JMaW5rQ29tcG9uZW50PigpO1xuXG4gICAgdmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgd3JhcHBlclN0eWxlID0geyAnbWF4LWhlaWdodCc6ICcxMDB2aCcgfTtcblxuICAgIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgV2luZG93O1xuXG4gICAgcHJpdmF0ZSBsaW5rczogVGh5QW5jaG9yTGlua0NvbXBvbmVudFtdID0gW107XG5cbiAgICBwcml2YXRlIGFuaW1hdGluZyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwcml2YXRlIGhhbmRsZVNjcm9sbFRpbWVvdXRJRCA9IC0xO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlOiBUaHlTY3JvbGxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcbiAgICApIHt9XG5cbiAgICByZWdpc3RlckxpbmsobGluazogVGh5QW5jaG9yTGlua0NvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgdW5yZWdpc3RlckxpbmsobGluazogVGh5QW5jaG9yTGlua0NvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpbmtzLnNwbGljZSh0aGlzLmxpbmtzLmluZGV4T2YobGluayksIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHwgV2luZG93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyIHx8IHdpbmRvdztcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMud2FybmluZ1Byb21wdCgpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGFuZGxlU2Nyb2xsVGltZW91dElEKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdhcm5pbmdQcm9tcHQoKSB7XG4gICAgICAgIGlmICh0aGlzLnRoeURpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgICBjb25zdCBoYXNDaGlsZHJlbiA9IHRoaXMubGlua3Muc29tZShsaW5rID0+XG4gICAgICAgICAgICAgICAgQXJyYXkuZnJvbShsaW5rPy5lbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50Py5jaGlsZE5vZGVzKT8uc29tZSgoaXRlbTogSFRNTEVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0/LmNsYXNzTmFtZS5pbmNsdWRlcygndGh5LWFuY2hvci1saW5rJylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGhhc0NoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQW5jaG9yIGxpbmsgbmVzdGluZyBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gJ0FuY2hvcicgZGlyZWN0aW9uIGlzIGhvcml6b250YWwuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclNjcm9sbEV2ZW50KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBmcm9tRXZlbnQodGhpcy5nZXRDb250YWluZXIoKSwgJ3Njcm9sbCcsIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIC5waXBlKHRocm90dGxlVGltZSg1MCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGFuZGxlU2Nyb2xsKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQnJvd3NlciB3b3VsZCBtYWludGFpbiB0aGUgc2Nyb2xsaW5nIHBvc2l0aW9uIHdoZW4gcmVmcmVzaGluZy5cbiAgICAgICAgLy8gU28gd2UgaGF2ZSB0byBkZWxheSBjYWxjdWxhdGlvbiBpbiBhdm9pZCBvZiBnZXR0aW5nIGEgaW5jb3JyZWN0IHJlc3VsdC5cbiAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxUaW1lb3V0SUQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGFuZGxlU2Nyb2xsKCkpO1xuICAgIH1cblxuICAgIGhhbmRsZVNjcm9sbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5hbmltYXRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250YWluZXI6IEhUTUxFbGVtZW50ID0gdGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHRoaXMuY29udGFpbmVyIDogdGhpcy5kb2N1bWVudDtcblxuICAgICAgICBjb25zdCBzZWN0aW9uczogU2VjdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHNjb3BlID0gKHRoaXMudGh5T2Zmc2V0VG9wIHx8IDApICsgdGhpcy50aHlCb3VuZHM7XG4gICAgICAgIHRoaXMubGlua3MuZm9yRWFjaChsaW5rQ29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJwTGlua01hdGNoID0gc2hhcnBNYXRjaGVyUmVneC5leGVjKGxpbmtDb21wb25lbnQudGh5SHJlZi50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmICghc2hhcnBMaW5rTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgIyR7c2hhcnBMaW5rTWF0Y2hbMV19YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9wID0gZ2V0T2Zmc2V0KHRhcmdldCwgdGhpcy5nZXRDb250YWluZXIoKSkudG9wO1xuICAgICAgICAgICAgICAgIGlmICh0b3AgPCBzY29wZSkge1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZpc2libGUgPSAhIXNlY3Rpb25zLmxlbmd0aDtcbiAgICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFNlY3Rpb24gPSBzZWN0aW9ucy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IChjdXJyLnRvcCA+IHByZXYudG9wID8gY3VyciA6IHByZXYpKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQWN0aXZlKG1heFNlY3Rpb24ubGlua0NvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRWaXNpYmxlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhckFjdGl2ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saW5rcy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgaS51bnNldEFjdGl2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUFjdGl2ZShsaW5rQ29tcG9uZW50OiBUaHlBbmNob3JMaW5rQ29tcG9uZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcbiAgICAgICAgbGlua0NvbXBvbmVudC5zZXRBY3RpdmUoKTtcbiAgICAgICAgY29uc3QgbGlua05vZGUgPSBsaW5rQ29tcG9uZW50LmdldExpbmtUaXRsZUVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbEFuY2hvciA9IHRoaXMudGh5RGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCc7XG5cbiAgICAgICAgdGhpcy5pbmsubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSBob3Jpem9udGFsQW5jaG9yID8gJycgOiBgJHtsaW5rTm9kZS5vZmZzZXRUb3B9cHhgO1xuICAgICAgICB0aGlzLmluay5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGhvcml6b250YWxBbmNob3IgPyAnJyA6IGAke2xpbmtOb2RlLmNsaWVudEhlaWdodH1weGA7XG4gICAgICAgIHRoaXMuaW5rLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGhvcml6b250YWxBbmNob3IgPyBgJHtsaW5rTm9kZS5vZmZzZXRMZWZ0fXB4YCA6ICcnO1xuICAgICAgICB0aGlzLmluay5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gaG9yaXpvbnRhbEFuY2hvciA/IGAke2xpbmtOb2RlLmNsaWVudFdpZHRofXB4YCA6ICcnO1xuICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldFZpc2libGUoKTtcbiAgICAgICAgdGhpcy50aHlTY3JvbGwuZW1pdChsaW5rQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZpc2libGUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLnZpc2libGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVDbGFzc25hbWUgPSAndmlzaWJsZSc7XG4gICAgICAgIGlmICh0aGlzLmluaykge1xuICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaW5rLm5hdGl2ZUVsZW1lbnQsIHZpc2libGVDbGFzc25hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuaW5rLm5hdGl2ZUVsZW1lbnQsIHZpc2libGVDbGFzc25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlU2Nyb2xsVG8obGlua0NvbXBvbmVudDogVGh5QW5jaG9yTGlua0NvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250YWluZXI6IEhUTUxFbGVtZW50ID0gdGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHRoaXMuY29udGFpbmVyIDogdGhpcy5kb2N1bWVudDtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQ6IEhUTUxFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IobGlua0NvbXBvbmVudC50aHlIcmVmKTtcbiAgICAgICAgaWYgKCFsaW5rRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBjb250YWluZXJTY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFNlcnZpY2UuZ2V0U2Nyb2xsKHRoaXMuZ2V0Q29udGFpbmVyKCkpO1xuICAgICAgICBjb25zdCBlbGVtZW50T2Zmc2V0VG9wID0gZ2V0T2Zmc2V0KGxpbmtFbGVtZW50LCB0aGlzLmdldENvbnRhaW5lcigpKS50b3A7XG4gICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IGNvbnRhaW5lclNjcm9sbFRvcCArIGVsZW1lbnRPZmZzZXRUb3AgLSAodGhpcy50aHlPZmZzZXRUb3AgfHwgMCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxUbyh0aGlzLmdldENvbnRhaW5lcigpLCB0YXJnZXRTY3JvbGxUb3AsIHVuZGVmaW5lZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGFuZGxlQWN0aXZlKGxpbmtDb21wb25lbnQpO1xuICAgICAgICB0aGlzLnRoeUNsaWNrLmVtaXQobGlua0NvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IHRoeU9mZnNldFRvcCwgdGh5Q29udGFpbmVyIH0gPSBjaGFuZ2VzO1xuICAgICAgICBpZiAodGh5T2Zmc2V0VG9wKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXJTdHlsZSA9IHtcbiAgICAgICAgICAgICAgICAnbWF4LWhlaWdodCc6IGBjYWxjKDEwMHZoIC0gJHt0aGlzLnRoeU9mZnNldFRvcH1weClgXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aHlDb250YWluZXIgJiYgdGhpcy50aHlDb250YWluZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudGh5Q29udGFpbmVyO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0eXBlb2YgY29udGFpbmVyID09PSAnc3RyaW5nJyA/IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpIDogY29udGFpbmVyO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlclNjcm9sbEV2ZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=