@sitecore-jss/sitecore-jss-angular 21.5.2 → 21.5.3-canary.2
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/LICENSE.txt +202 -202
- package/README.md +7 -7
- package/angular.json +48 -48
- package/dist/README.md +7 -7
- package/dist/components/data-resolver-factory.d.ts +13 -13
- package/dist/components/date.directive.d.ts +20 -20
- package/dist/components/editframe.component.d.ts +22 -22
- package/dist/components/file.directive.d.ts +17 -17
- package/dist/components/generic-link.directive.d.ts +20 -20
- package/dist/components/guard-resolver-factory.d.ts +11 -11
- package/dist/components/hidden-rendering.component.d.ts +7 -7
- package/dist/components/image.directive.d.ts +35 -35
- package/dist/components/link.directive.d.ts +26 -26
- package/dist/components/missing-component.component.d.ts +7 -7
- package/dist/components/placeholder-loading.directive.d.ts +8 -8
- package/dist/components/placeholder.component.d.ts +59 -59
- package/dist/components/placeholder.token.d.ts +64 -64
- package/dist/components/raw.component.d.ts +12 -12
- package/dist/components/render-component.component.d.ts +33 -33
- package/dist/components/render-each.directive.d.ts +8 -8
- package/dist/components/render-empty.directive.d.ts +8 -8
- package/dist/components/rendering-field.d.ts +41 -41
- package/dist/components/rendering.d.ts +5 -5
- package/dist/components/rich-text.directive.d.ts +18 -18
- package/dist/components/router-link.directive.d.ts +19 -19
- package/dist/components/text.directive.d.ts +16 -16
- package/dist/esm2020/components/data-resolver-factory.mjs +58 -58
- package/dist/esm2020/components/date.directive.mjs +59 -59
- package/dist/esm2020/components/editframe.component.mjs +65 -65
- package/dist/esm2020/components/file.directive.mjs +44 -44
- package/dist/esm2020/components/generic-link.directive.mjs +64 -64
- package/dist/esm2020/components/guard-resolver-factory.mjs +85 -85
- package/dist/esm2020/components/hidden-rendering.component.mjs +20 -20
- package/dist/esm2020/components/image.directive.mjs +137 -137
- package/dist/esm2020/components/link.directive.mjs +117 -117
- package/dist/esm2020/components/missing-component.component.mjs +15 -15
- package/dist/esm2020/components/placeholder-loading.directive.mjs +15 -15
- package/dist/esm2020/components/placeholder.component.mjs +250 -250
- package/dist/esm2020/components/placeholder.token.mjs +23 -23
- package/dist/esm2020/components/raw.component.mjs +35 -35
- package/dist/esm2020/components/render-component.component.mjs +90 -90
- package/dist/esm2020/components/render-each.directive.mjs +15 -15
- package/dist/esm2020/components/render-empty.directive.mjs +15 -15
- package/dist/esm2020/components/rendering-field.mjs +1 -1
- package/dist/esm2020/components/rendering.mjs +7 -7
- package/dist/esm2020/components/rich-text.directive.mjs +62 -62
- package/dist/esm2020/components/router-link.directive.mjs +47 -47
- package/dist/esm2020/components/text.directive.mjs +57 -57
- package/dist/esm2020/jss-component-factory.service.mjs +82 -82
- package/dist/esm2020/lib.module.mjs +161 -161
- package/dist/esm2020/public_api.mjs +24 -24
- package/dist/esm2020/sitecore-jss-sitecore-jss-angular.mjs +4 -4
- package/dist/esm2020/utils.mjs +16 -16
- package/dist/fesm2015/sitecore-jss-sitecore-jss-angular.mjs +1406 -1406
- package/dist/fesm2020/sitecore-jss-sitecore-jss-angular.mjs +1413 -1413
- package/dist/index.d.ts +5 -5
- package/dist/jss-component-factory.service.d.ts +25 -25
- package/dist/lib.module.d.ts +46 -46
- package/dist/package.json +2 -2
- package/dist/public_api.d.ts +25 -25
- package/dist/utils.d.ts +7 -7
- package/ng-package.json +13 -13
- package/package.json +3 -3
- package/tsconfig.json +9 -9
- package/tsconfig.spec.json +16 -16
- package/typings/README.md +2 -2
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { Directive } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class PlaceholderLoadingDirective {
|
|
4
|
-
constructor(templateRef) {
|
|
5
|
-
this.templateRef = templateRef;
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
PlaceholderLoadingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderLoadingDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
9
|
-
PlaceholderLoadingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: PlaceholderLoadingDirective, selector: "[scPlaceholderLoading]", ngImport: i0 });
|
|
10
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderLoadingDirective, decorators: [{
|
|
11
|
-
type: Directive,
|
|
12
|
-
args: [{
|
|
13
|
-
selector: '[scPlaceholderLoading]',
|
|
14
|
-
}]
|
|
15
|
-
}], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
|
|
1
|
+
import { Directive } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class PlaceholderLoadingDirective {
|
|
4
|
+
constructor(templateRef) {
|
|
5
|
+
this.templateRef = templateRef;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
PlaceholderLoadingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderLoadingDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
9
|
+
PlaceholderLoadingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: PlaceholderLoadingDirective, selector: "[scPlaceholderLoading]", ngImport: i0 });
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderLoadingDirective, decorators: [{
|
|
11
|
+
type: Directive,
|
|
12
|
+
args: [{
|
|
13
|
+
selector: '[scPlaceholderLoading]',
|
|
14
|
+
}]
|
|
15
|
+
}], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
|
|
16
16
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXItbG9hZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9wbGFjZWhvbGRlci1sb2FkaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFlLE1BQU0sZUFBZSxDQUFDOztBQUt2RCxNQUFNLE9BQU8sMkJBQTJCO0lBQ3RDLFlBQW1CLFdBQWlDO1FBQWpDLGdCQUFXLEdBQVgsV0FBVyxDQUFzQjtJQUFHLENBQUM7O3dIQUQ3QywyQkFBMkI7NEdBQTNCLDJCQUEyQjsyRkFBM0IsMkJBQTJCO2tCQUh2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx3QkFBd0I7aUJBQ25DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbc2NQbGFjZWhvbGRlckxvYWRpbmddJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYWNlaG9sZGVyTG9hZGluZ0RpcmVjdGl2ZSB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx1bmtub3duPikge31cclxufVxyXG4iXX0=
|
|
@@ -1,266 +1,266 @@
|
|
|
1
|
-
/* eslint-disable @angular-eslint/no-conflicting-lifecycle */
|
|
2
|
-
import { isPlatformServer } from '@angular/common';
|
|
3
|
-
import { Component, ContentChild, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
4
|
-
import { UrlTree } from '@angular/router';
|
|
5
|
-
import { Observable } from 'rxjs';
|
|
6
|
-
import { takeWhile } from 'rxjs/operators';
|
|
7
|
-
import { HIDDEN_RENDERING_NAME } from './hidden-rendering.component';
|
|
8
|
-
import { PlaceholderLoadingDirective } from './placeholder-loading.directive';
|
|
9
|
-
import { DATA_RESOLVER, GUARD_RESOLVER, PLACEHOLDER_HIDDEN_RENDERING_COMPONENT, PLACEHOLDER_MISSING_COMPONENT_COMPONENT, } from './placeholder.token';
|
|
10
|
-
import { RenderEachDirective } from './render-each.directive';
|
|
11
|
-
import { RenderEmptyDirective } from './render-empty.directive';
|
|
12
|
-
import { isRawRendering } from './rendering';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "../jss-component-factory.service";
|
|
15
|
-
import * as i2 from "@angular/router";
|
|
16
|
-
import * as i3 from "@angular/common";
|
|
17
|
-
/**
|
|
18
|
-
* @param {ComponentRendering} rendering
|
|
19
|
-
* @param {string} name
|
|
20
|
-
*/
|
|
21
|
-
function getPlaceholder(rendering, name) {
|
|
22
|
-
if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
|
|
23
|
-
return rendering.placeholders[name];
|
|
24
|
-
}
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
export class PlaceholderComponent {
|
|
28
|
-
constructor(differs, componentFactory, changeDetectorRef, elementRef, renderer, router, missingComponentComponent, hiddenRenderingComponent, guardResolver, dataResolver,
|
|
29
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
30
|
-
platformId) {
|
|
31
|
-
this.differs = differs;
|
|
32
|
-
this.componentFactory = componentFactory;
|
|
33
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
34
|
-
this.elementRef = elementRef;
|
|
35
|
-
this.renderer = renderer;
|
|
36
|
-
this.router = router;
|
|
37
|
-
this.missingComponentComponent = missingComponentComponent;
|
|
38
|
-
this.hiddenRenderingComponent = hiddenRenderingComponent;
|
|
39
|
-
this.guardResolver = guardResolver;
|
|
40
|
-
this.dataResolver = dataResolver;
|
|
41
|
-
this.platformId = platformId;
|
|
42
|
-
this.clientOnly = false;
|
|
43
|
-
this.loaded = new EventEmitter();
|
|
44
|
-
this.isLoading = true;
|
|
45
|
-
this._componentInstances = [];
|
|
46
|
-
this.destroyed = false;
|
|
47
|
-
this.parentStyleAttribute = '';
|
|
48
|
-
}
|
|
49
|
-
set inputs(value) {
|
|
50
|
-
this._inputs = value;
|
|
51
|
-
if (!this._differ && value) {
|
|
52
|
-
this._differ = this.differs.find(value).create();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
ngOnInit() {
|
|
56
|
-
// just to ensure the element exists
|
|
57
|
-
const elem = this.elementRef.nativeElement;
|
|
58
|
-
if (elem) {
|
|
59
|
-
const attributes = elem.attributes;
|
|
60
|
-
for (let i = 0; i < attributes.length; i++) {
|
|
61
|
-
const attr = attributes.item(i);
|
|
62
|
-
if (attr && attr.name.indexOf('_ngcontent') !== -1) {
|
|
63
|
-
this.parentStyleAttribute = attr.name;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
ngOnDestroy() {
|
|
69
|
-
this.destroyed = true;
|
|
70
|
-
this._componentInstances = [];
|
|
71
|
-
}
|
|
72
|
-
ngOnChanges(changes) {
|
|
73
|
-
if (changes.rendering || changes.renderings) {
|
|
74
|
-
this._render();
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
ngDoCheck() {
|
|
78
|
-
if (!this._differ || !this._inputs || this._componentInstances.length === 0) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
const changes = this._differ.diff(this._inputs);
|
|
82
|
-
if (!changes) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
const updates = {};
|
|
86
|
-
changes.forEachRemovedItem((change) => (updates[change.key] = null));
|
|
87
|
-
changes.forEachAddedItem((change) => (updates[change.key] = change.currentValue));
|
|
88
|
-
changes.forEachChangedItem((change) => (updates[change.key] = change.currentValue));
|
|
89
|
-
this._componentInstances.forEach((componentInstance) => this._setComponentInputs(componentInstance, updates));
|
|
90
|
-
}
|
|
91
|
-
_setComponentInputs(componentInstance, inputs) {
|
|
92
|
-
Object.entries(inputs).forEach(([input, inputValue]) => (componentInstance[input] = inputValue));
|
|
93
|
-
}
|
|
94
|
-
_subscribeComponentOutputs(componentInstance, outputs) {
|
|
95
|
-
Object.keys(outputs)
|
|
96
|
-
.filter((output) => componentInstance[output] && componentInstance[output] instanceof Observable)
|
|
97
|
-
.forEach((output) => componentInstance[output]
|
|
98
|
-
.pipe(takeWhile(() => !this.destroyed))
|
|
99
|
-
.subscribe(outputs[output]));
|
|
100
|
-
}
|
|
101
|
-
async _render() {
|
|
102
|
-
if (this.clientOnly && isPlatformServer(this.platformId)) {
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
this._componentInstances = [];
|
|
106
|
-
this.view.clear();
|
|
107
|
-
if (!this.rendering && !this.renderings) {
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
if (!this.name && !this.renderings) {
|
|
111
|
-
console.warn('Placeholder name was not specified, and explicit renderings array was not passed. Placeholder requires either name and rendering, or renderings.');
|
|
112
|
-
this.isLoading = false;
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
const placeholder = this.renderings || getPlaceholder(this.rendering, this.name || '');
|
|
116
|
-
if (!placeholder) {
|
|
117
|
-
console.warn(`Placeholder '${this.name}' was not found in the current rendering data`, JSON.stringify(this.rendering, null, 2));
|
|
118
|
-
this.isLoading = false;
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
// if the placeholder is empty (contains only raw renderings), then we may need to use the empty template if it's defined
|
|
122
|
-
const placeholderIsEmpty = placeholder.every((rendering) => isRawRendering(rendering));
|
|
123
|
-
if (this.renderEmptyTemplate && placeholderIsEmpty) {
|
|
124
|
-
this.view.createEmbeddedView(this.renderEmptyTemplate.templateRef, {
|
|
125
|
-
renderings: placeholder,
|
|
126
|
-
});
|
|
127
|
-
this.isLoading = false;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
const factories = await this.componentFactory.getComponents(placeholder);
|
|
131
|
-
try {
|
|
132
|
-
const nonGuarded = await this.guardResolver(factories);
|
|
133
|
-
const withData = await this.dataResolver(nonGuarded);
|
|
134
|
-
withData.forEach((rendering, index) => {
|
|
135
|
-
if (this.renderEachTemplate && !isRawRendering(rendering.factory.componentDefinition)) {
|
|
136
|
-
this._renderTemplatedComponent(rendering.factory.componentDefinition, index);
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
this._renderEmbeddedComponent(rendering.factory, rendering.data, index);
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
this.isLoading = false;
|
|
143
|
-
this.changeDetectorRef.markForCheck();
|
|
144
|
-
this.loaded.emit(this.name);
|
|
145
|
-
}
|
|
146
|
-
catch (e) {
|
|
147
|
-
this.isLoading = false;
|
|
148
|
-
if (e instanceof UrlTree) {
|
|
149
|
-
this.router.navigateByUrl(e);
|
|
150
|
-
}
|
|
151
|
-
else if (typeof e === 'string') {
|
|
152
|
-
this.router.navigate([e]);
|
|
153
|
-
}
|
|
154
|
-
else if (Array.isArray(e)) {
|
|
155
|
-
this.router.navigate(e);
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
throw e;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
_renderTemplatedComponent(rendering, index) {
|
|
164
|
-
// the render-each template takes care of all component mapping etc
|
|
165
|
-
// generally using <sc-render-component> which is about like _renderEmbeddedComponent()
|
|
166
|
-
// as a separate component
|
|
167
|
-
this.view.createEmbeddedView(this.renderEachTemplate.templateRef, {
|
|
168
|
-
rendering,
|
|
169
|
-
index,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
_renderEmbeddedComponent(rendering, data, index) {
|
|
173
|
-
if (rendering.componentDefinition.componentName === HIDDEN_RENDERING_NAME) {
|
|
174
|
-
rendering.componentImplementation = this.hiddenRenderingComponent;
|
|
175
|
-
}
|
|
176
|
-
if (!rendering.componentImplementation) {
|
|
177
|
-
const componentName = rendering.componentDefinition.componentName;
|
|
1
|
+
/* eslint-disable @angular-eslint/no-conflicting-lifecycle */
|
|
2
|
+
import { isPlatformServer } from '@angular/common';
|
|
3
|
+
import { Component, ContentChild, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
4
|
+
import { UrlTree } from '@angular/router';
|
|
5
|
+
import { Observable } from 'rxjs';
|
|
6
|
+
import { takeWhile } from 'rxjs/operators';
|
|
7
|
+
import { HIDDEN_RENDERING_NAME } from './hidden-rendering.component';
|
|
8
|
+
import { PlaceholderLoadingDirective } from './placeholder-loading.directive';
|
|
9
|
+
import { DATA_RESOLVER, GUARD_RESOLVER, PLACEHOLDER_HIDDEN_RENDERING_COMPONENT, PLACEHOLDER_MISSING_COMPONENT_COMPONENT, } from './placeholder.token';
|
|
10
|
+
import { RenderEachDirective } from './render-each.directive';
|
|
11
|
+
import { RenderEmptyDirective } from './render-empty.directive';
|
|
12
|
+
import { isRawRendering } from './rendering';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "../jss-component-factory.service";
|
|
15
|
+
import * as i2 from "@angular/router";
|
|
16
|
+
import * as i3 from "@angular/common";
|
|
17
|
+
/**
|
|
18
|
+
* @param {ComponentRendering} rendering
|
|
19
|
+
* @param {string} name
|
|
20
|
+
*/
|
|
21
|
+
function getPlaceholder(rendering, name) {
|
|
22
|
+
if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
|
|
23
|
+
return rendering.placeholders[name];
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
export class PlaceholderComponent {
|
|
28
|
+
constructor(differs, componentFactory, changeDetectorRef, elementRef, renderer, router, missingComponentComponent, hiddenRenderingComponent, guardResolver, dataResolver,
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
30
|
+
platformId) {
|
|
31
|
+
this.differs = differs;
|
|
32
|
+
this.componentFactory = componentFactory;
|
|
33
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
34
|
+
this.elementRef = elementRef;
|
|
35
|
+
this.renderer = renderer;
|
|
36
|
+
this.router = router;
|
|
37
|
+
this.missingComponentComponent = missingComponentComponent;
|
|
38
|
+
this.hiddenRenderingComponent = hiddenRenderingComponent;
|
|
39
|
+
this.guardResolver = guardResolver;
|
|
40
|
+
this.dataResolver = dataResolver;
|
|
41
|
+
this.platformId = platformId;
|
|
42
|
+
this.clientOnly = false;
|
|
43
|
+
this.loaded = new EventEmitter();
|
|
44
|
+
this.isLoading = true;
|
|
45
|
+
this._componentInstances = [];
|
|
46
|
+
this.destroyed = false;
|
|
47
|
+
this.parentStyleAttribute = '';
|
|
48
|
+
}
|
|
49
|
+
set inputs(value) {
|
|
50
|
+
this._inputs = value;
|
|
51
|
+
if (!this._differ && value) {
|
|
52
|
+
this._differ = this.differs.find(value).create();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
ngOnInit() {
|
|
56
|
+
// just to ensure the element exists
|
|
57
|
+
const elem = this.elementRef.nativeElement;
|
|
58
|
+
if (elem) {
|
|
59
|
+
const attributes = elem.attributes;
|
|
60
|
+
for (let i = 0; i < attributes.length; i++) {
|
|
61
|
+
const attr = attributes.item(i);
|
|
62
|
+
if (attr && attr.name.indexOf('_ngcontent') !== -1) {
|
|
63
|
+
this.parentStyleAttribute = attr.name;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
ngOnDestroy() {
|
|
69
|
+
this.destroyed = true;
|
|
70
|
+
this._componentInstances = [];
|
|
71
|
+
}
|
|
72
|
+
ngOnChanges(changes) {
|
|
73
|
+
if (changes.rendering || changes.renderings) {
|
|
74
|
+
this._render();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
ngDoCheck() {
|
|
78
|
+
if (!this._differ || !this._inputs || this._componentInstances.length === 0) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const changes = this._differ.diff(this._inputs);
|
|
82
|
+
if (!changes) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const updates = {};
|
|
86
|
+
changes.forEachRemovedItem((change) => (updates[change.key] = null));
|
|
87
|
+
changes.forEachAddedItem((change) => (updates[change.key] = change.currentValue));
|
|
88
|
+
changes.forEachChangedItem((change) => (updates[change.key] = change.currentValue));
|
|
89
|
+
this._componentInstances.forEach((componentInstance) => this._setComponentInputs(componentInstance, updates));
|
|
90
|
+
}
|
|
91
|
+
_setComponentInputs(componentInstance, inputs) {
|
|
92
|
+
Object.entries(inputs).forEach(([input, inputValue]) => (componentInstance[input] = inputValue));
|
|
93
|
+
}
|
|
94
|
+
_subscribeComponentOutputs(componentInstance, outputs) {
|
|
95
|
+
Object.keys(outputs)
|
|
96
|
+
.filter((output) => componentInstance[output] && componentInstance[output] instanceof Observable)
|
|
97
|
+
.forEach((output) => componentInstance[output]
|
|
98
|
+
.pipe(takeWhile(() => !this.destroyed))
|
|
99
|
+
.subscribe(outputs[output]));
|
|
100
|
+
}
|
|
101
|
+
async _render() {
|
|
102
|
+
if (this.clientOnly && isPlatformServer(this.platformId)) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this._componentInstances = [];
|
|
106
|
+
this.view.clear();
|
|
107
|
+
if (!this.rendering && !this.renderings) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (!this.name && !this.renderings) {
|
|
111
|
+
console.warn('Placeholder name was not specified, and explicit renderings array was not passed. Placeholder requires either name and rendering, or renderings.');
|
|
112
|
+
this.isLoading = false;
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const placeholder = this.renderings || getPlaceholder(this.rendering, this.name || '');
|
|
116
|
+
if (!placeholder) {
|
|
117
|
+
console.warn(`Placeholder '${this.name}' was not found in the current rendering data`, JSON.stringify(this.rendering, null, 2));
|
|
118
|
+
this.isLoading = false;
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// if the placeholder is empty (contains only raw renderings), then we may need to use the empty template if it's defined
|
|
122
|
+
const placeholderIsEmpty = placeholder.every((rendering) => isRawRendering(rendering));
|
|
123
|
+
if (this.renderEmptyTemplate && placeholderIsEmpty) {
|
|
124
|
+
this.view.createEmbeddedView(this.renderEmptyTemplate.templateRef, {
|
|
125
|
+
renderings: placeholder,
|
|
126
|
+
});
|
|
127
|
+
this.isLoading = false;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const factories = await this.componentFactory.getComponents(placeholder);
|
|
131
|
+
try {
|
|
132
|
+
const nonGuarded = await this.guardResolver(factories);
|
|
133
|
+
const withData = await this.dataResolver(nonGuarded);
|
|
134
|
+
withData.forEach((rendering, index) => {
|
|
135
|
+
if (this.renderEachTemplate && !isRawRendering(rendering.factory.componentDefinition)) {
|
|
136
|
+
this._renderTemplatedComponent(rendering.factory.componentDefinition, index);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this._renderEmbeddedComponent(rendering.factory, rendering.data, index);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
this.isLoading = false;
|
|
143
|
+
this.changeDetectorRef.markForCheck();
|
|
144
|
+
this.loaded.emit(this.name);
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
this.isLoading = false;
|
|
148
|
+
if (e instanceof UrlTree) {
|
|
149
|
+
this.router.navigateByUrl(e);
|
|
150
|
+
}
|
|
151
|
+
else if (typeof e === 'string') {
|
|
152
|
+
this.router.navigate([e]);
|
|
153
|
+
}
|
|
154
|
+
else if (Array.isArray(e)) {
|
|
155
|
+
this.router.navigate(e);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
throw e;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
_renderTemplatedComponent(rendering, index) {
|
|
164
|
+
// the render-each template takes care of all component mapping etc
|
|
165
|
+
// generally using <sc-render-component> which is about like _renderEmbeddedComponent()
|
|
166
|
+
// as a separate component
|
|
167
|
+
this.view.createEmbeddedView(this.renderEachTemplate.templateRef, {
|
|
168
|
+
rendering,
|
|
169
|
+
index,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
_renderEmbeddedComponent(rendering, data, index) {
|
|
173
|
+
if (rendering.componentDefinition.componentName === HIDDEN_RENDERING_NAME) {
|
|
174
|
+
rendering.componentImplementation = this.hiddenRenderingComponent;
|
|
175
|
+
}
|
|
176
|
+
if (!rendering.componentImplementation) {
|
|
177
|
+
const componentName = rendering.componentDefinition.componentName;
|
|
178
178
|
console.error(`Placeholder ${this.name} contains unknown component ${componentName}.`, `Ensure component is mapped, like:
|
|
179
179
|
JssModule.withComponents([
|
|
180
180
|
{ name: '${componentName}', type: ${componentName}Component }
|
|
181
|
-
])`);
|
|
182
|
-
rendering.componentImplementation = this.missingComponentComponent;
|
|
183
|
-
}
|
|
184
|
-
// apply the parent style attribute _ngcontent
|
|
185
|
-
// work-around for https://github.com/angular/angular/issues/12215
|
|
186
|
-
const createdComponentRef = this.view.createComponent(rendering.componentImplementation, {
|
|
187
|
-
index: index,
|
|
188
|
-
});
|
|
189
|
-
if (this.parentStyleAttribute) {
|
|
190
|
-
this.renderer.setAttribute(createdComponentRef.location.nativeElement, this.parentStyleAttribute, '');
|
|
191
|
-
}
|
|
192
|
-
const componentInstance = createdComponentRef.instance;
|
|
193
|
-
componentInstance.rendering = rendering.componentDefinition;
|
|
194
|
-
componentInstance.data = data;
|
|
195
|
-
if (this._inputs) {
|
|
196
|
-
this._setComponentInputs(componentInstance, this._inputs);
|
|
197
|
-
}
|
|
198
|
-
if (this.outputs) {
|
|
199
|
-
this._subscribeComponentOutputs(componentInstance, this.outputs);
|
|
200
|
-
}
|
|
201
|
-
this._componentInstances.push(componentInstance);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
PlaceholderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i1.JssComponentFactoryService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.Router }, { token: PLACEHOLDER_MISSING_COMPONENT_COMPONENT }, { token: PLACEHOLDER_HIDDEN_RENDERING_COMPONENT }, { token: GUARD_RESOLVER }, { token: DATA_RESOLVER }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
|
|
181
|
+
])`);
|
|
182
|
+
rendering.componentImplementation = this.missingComponentComponent;
|
|
183
|
+
}
|
|
184
|
+
// apply the parent style attribute _ngcontent
|
|
185
|
+
// work-around for https://github.com/angular/angular/issues/12215
|
|
186
|
+
const createdComponentRef = this.view.createComponent(rendering.componentImplementation, {
|
|
187
|
+
index: index,
|
|
188
|
+
});
|
|
189
|
+
if (this.parentStyleAttribute) {
|
|
190
|
+
this.renderer.setAttribute(createdComponentRef.location.nativeElement, this.parentStyleAttribute, '');
|
|
191
|
+
}
|
|
192
|
+
const componentInstance = createdComponentRef.instance;
|
|
193
|
+
componentInstance.rendering = rendering.componentDefinition;
|
|
194
|
+
componentInstance.data = data;
|
|
195
|
+
if (this._inputs) {
|
|
196
|
+
this._setComponentInputs(componentInstance, this._inputs);
|
|
197
|
+
}
|
|
198
|
+
if (this.outputs) {
|
|
199
|
+
this._subscribeComponentOutputs(componentInstance, this.outputs);
|
|
200
|
+
}
|
|
201
|
+
this._componentInstances.push(componentInstance);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
PlaceholderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i1.JssComponentFactoryService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.Router }, { token: PLACEHOLDER_MISSING_COMPONENT_COMPONENT }, { token: PLACEHOLDER_HIDDEN_RENDERING_COMPONENT }, { token: GUARD_RESOLVER }, { token: DATA_RESOLVER }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
|
|
205
205
|
PlaceholderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: PlaceholderComponent, selector: "sc-placeholder,[sc-placeholder]", inputs: { name: "name", rendering: "rendering", renderings: "renderings", outputs: "outputs", clientOnly: "clientOnly", inputs: "inputs" }, outputs: { loaded: "loaded" }, queries: [{ propertyName: "renderEachTemplate", first: true, predicate: RenderEachDirective, descendants: true, static: true }, { propertyName: "renderEmptyTemplate", first: true, predicate: RenderEmptyDirective, descendants: true, static: true }, { propertyName: "placeholderLoading", first: true, predicate: PlaceholderLoadingDirective, descendants: true, static: true }], viewQueries: [{ propertyName: "view", first: true, predicate: ["view"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
206
206
|
<ng-template
|
|
207
207
|
*ngIf="isLoading"
|
|
208
208
|
[ngTemplateOutlet]="placeholderLoading?.templateRef"
|
|
209
209
|
></ng-template>
|
|
210
210
|
<ng-template #view></ng-template>
|
|
211
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
212
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderComponent, decorators: [{
|
|
213
|
-
type: Component,
|
|
214
|
-
args: [{
|
|
215
|
-
selector: 'sc-placeholder,[sc-placeholder]',
|
|
211
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderComponent, decorators: [{
|
|
213
|
+
type: Component,
|
|
214
|
+
args: [{
|
|
215
|
+
selector: 'sc-placeholder,[sc-placeholder]',
|
|
216
216
|
template: `
|
|
217
217
|
<ng-template
|
|
218
218
|
*ngIf="isLoading"
|
|
219
219
|
[ngTemplateOutlet]="placeholderLoading?.templateRef"
|
|
220
220
|
></ng-template>
|
|
221
221
|
<ng-template #view></ng-template>
|
|
222
|
-
`,
|
|
223
|
-
}]
|
|
224
|
-
}], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i1.JssComponentFactoryService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.Router }, { type: i0.Type, decorators: [{
|
|
225
|
-
type: Inject,
|
|
226
|
-
args: [PLACEHOLDER_MISSING_COMPONENT_COMPONENT]
|
|
227
|
-
}] }, { type: i0.Type, decorators: [{
|
|
228
|
-
type: Inject,
|
|
229
|
-
args: [PLACEHOLDER_HIDDEN_RENDERING_COMPONENT]
|
|
230
|
-
}] }, { type: undefined, decorators: [{
|
|
231
|
-
type: Inject,
|
|
232
|
-
args: [GUARD_RESOLVER]
|
|
233
|
-
}] }, { type: undefined, decorators: [{
|
|
234
|
-
type: Inject,
|
|
235
|
-
args: [DATA_RESOLVER]
|
|
236
|
-
}] }, { type: Object, decorators: [{
|
|
237
|
-
type: Inject,
|
|
238
|
-
args: [PLATFORM_ID]
|
|
239
|
-
}] }]; }, propDecorators: { name: [{
|
|
240
|
-
type: Input
|
|
241
|
-
}], rendering: [{
|
|
242
|
-
type: Input
|
|
243
|
-
}], renderings: [{
|
|
244
|
-
type: Input
|
|
245
|
-
}], outputs: [{
|
|
246
|
-
type: Input
|
|
247
|
-
}], clientOnly: [{
|
|
248
|
-
type: Input
|
|
249
|
-
}], loaded: [{
|
|
250
|
-
type: Output
|
|
251
|
-
}], renderEachTemplate: [{
|
|
252
|
-
type: ContentChild,
|
|
253
|
-
args: [RenderEachDirective, { static: true }]
|
|
254
|
-
}], renderEmptyTemplate: [{
|
|
255
|
-
type: ContentChild,
|
|
256
|
-
args: [RenderEmptyDirective, { static: true }]
|
|
257
|
-
}], placeholderLoading: [{
|
|
258
|
-
type: ContentChild,
|
|
259
|
-
args: [PlaceholderLoadingDirective, { static: true }]
|
|
260
|
-
}], view: [{
|
|
261
|
-
type: ViewChild,
|
|
262
|
-
args: ['view', { read: ViewContainerRef, static: true }]
|
|
263
|
-
}], inputs: [{
|
|
264
|
-
type: Input
|
|
265
|
-
}] } });
|
|
222
|
+
`,
|
|
223
|
+
}]
|
|
224
|
+
}], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i1.JssComponentFactoryService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.Router }, { type: i0.Type, decorators: [{
|
|
225
|
+
type: Inject,
|
|
226
|
+
args: [PLACEHOLDER_MISSING_COMPONENT_COMPONENT]
|
|
227
|
+
}] }, { type: i0.Type, decorators: [{
|
|
228
|
+
type: Inject,
|
|
229
|
+
args: [PLACEHOLDER_HIDDEN_RENDERING_COMPONENT]
|
|
230
|
+
}] }, { type: undefined, decorators: [{
|
|
231
|
+
type: Inject,
|
|
232
|
+
args: [GUARD_RESOLVER]
|
|
233
|
+
}] }, { type: undefined, decorators: [{
|
|
234
|
+
type: Inject,
|
|
235
|
+
args: [DATA_RESOLVER]
|
|
236
|
+
}] }, { type: Object, decorators: [{
|
|
237
|
+
type: Inject,
|
|
238
|
+
args: [PLATFORM_ID]
|
|
239
|
+
}] }]; }, propDecorators: { name: [{
|
|
240
|
+
type: Input
|
|
241
|
+
}], rendering: [{
|
|
242
|
+
type: Input
|
|
243
|
+
}], renderings: [{
|
|
244
|
+
type: Input
|
|
245
|
+
}], outputs: [{
|
|
246
|
+
type: Input
|
|
247
|
+
}], clientOnly: [{
|
|
248
|
+
type: Input
|
|
249
|
+
}], loaded: [{
|
|
250
|
+
type: Output
|
|
251
|
+
}], renderEachTemplate: [{
|
|
252
|
+
type: ContentChild,
|
|
253
|
+
args: [RenderEachDirective, { static: true }]
|
|
254
|
+
}], renderEmptyTemplate: [{
|
|
255
|
+
type: ContentChild,
|
|
256
|
+
args: [RenderEmptyDirective, { static: true }]
|
|
257
|
+
}], placeholderLoading: [{
|
|
258
|
+
type: ContentChild,
|
|
259
|
+
args: [PlaceholderLoadingDirective, { static: true }]
|
|
260
|
+
}], view: [{
|
|
261
|
+
type: ViewChild,
|
|
262
|
+
args: ['view', { read: ViewContainerRef, static: true }]
|
|
263
|
+
}], inputs: [{
|
|
264
|
+
type: Input
|
|
265
|
+
}] } });
|
|
266
266
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcGxhY2Vob2xkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFHWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFNTCxNQUFNLEVBQ04sV0FBVyxFQUlYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFRLE9BQU8sRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlFLE9BQU8sRUFFTCxhQUFhLEVBRWIsY0FBYyxFQUNkLHNDQUFzQyxFQUN0Qyx1Q0FBdUMsR0FDeEMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQUU3Qzs7O0dBR0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxTQUE2QixFQUFFLElBQVk7SUFDakUsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3pGLE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNyQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQWlCRCxNQUFNLE9BQU8sb0JBQW9CO0lBd0IvQixZQUNVLE9BQXdCLEVBQ3hCLGdCQUE0QyxFQUM1QyxpQkFBb0MsRUFDcEMsVUFBc0IsRUFDdEIsUUFBbUIsRUFDbkIsTUFBYyxFQUVkLHlCQUF3QyxFQUNRLHdCQUF1QyxFQUMvRCxhQUE0QixFQUM3QixZQUEwQjtJQUN6RCx3REFBd0Q7SUFDM0IsVUFBa0I7UUFadkMsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE0QjtRQUM1QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRWQsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUFlO1FBQ1EsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUFlO1FBQy9ELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzdCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRTVCLGVBQVUsR0FBVixVQUFVLENBQVE7UUFoQ3hDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFbEIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBU25ELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFJaEIsd0JBQW1CLEdBQWtDLEVBQUUsQ0FBQztRQUN4RCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztJQWdCL0IsQ0FBQztJQUVKLElBQ0ksTUFBTSxDQUFDLEtBQWlDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssRUFBRTtZQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixvQ0FBb0M7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFFM0MsSUFBSSxJQUFJLEVBQUU7WUFDUixNQUFNLFVBQVUsR0FBaUIsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsTUFBTSxJQUFJLEdBQWdCLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNsRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDdkM7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDM0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDM0UsT0FBTztTQUNSO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPO1NBQ1I7UUFDRCxNQUFNLE9BQU8sR0FBK0IsRUFBRSxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDbEYsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FDckQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUNyRCxDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQixDQUN6QixpQkFBNkMsRUFDN0MsTUFBa0M7UUFFbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQzVCLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBRU8sMEJBQTBCLENBQ2hDLGlCQUE2QyxFQUM3QyxPQUFzRDtRQUV0RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUNqQixNQUFNLENBQ0wsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxZQUFZLFVBQVUsQ0FDekY7YUFDQSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNqQixpQkFBaUIsQ0FBQyxNQUFNLENBQXlCO2FBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUM5QixDQUFDO0lBQ04sQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPO1FBQ25CLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDeEQsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWxCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN2QyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FDVixrSkFBa0osQ0FDbkosQ0FBQztZQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE9BQU87U0FDUjtRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV2RixJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLCtDQUErQyxFQUN4RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUN4QyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsT0FBTztTQUNSO1FBRUQseUhBQXlIO1FBQ3pILE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FDMUMsQ0FBQyxTQUFvRCxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQ3BGLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxrQkFBa0IsRUFBRTtZQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2pFLFVBQVUsRUFBRSxXQUFXO2FBQ3hCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO2FBQU07WUFDTCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFekUsSUFBSTtnQkFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFckQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDcEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO3dCQUNyRixJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDOUU7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDekU7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdCO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxZQUFZLE9BQU8sRUFBRTtvQkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzlCO3FCQUFNLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO29CQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNCO3FCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pCO3FCQUFNO29CQUNMLE1BQU0sQ0FBQyxDQUFDO2lCQUNUO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFTyx5QkFBeUIsQ0FDL0IsU0FBb0QsRUFDcEQsS0FBYTtRQUViLG1FQUFtRTtRQUNuRSx1RkFBdUY7UUFDdkYsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRTtZQUNoRSxTQUFTO1lBQ1QsS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxTQUFpQyxFQUFFLElBQVUsRUFBRSxLQUFhO1FBQzNGLElBQ0csU0FBUyxDQUFDLG1CQUEwQyxDQUFDLGFBQWEsS0FBSyxxQkFBcUIsRUFDN0Y7WUFDQSxTQUFTLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1NBQ25FO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRTtZQUN0QyxNQUFNLGFBQWEsR0FBSSxTQUFTLENBQUMsbUJBQTBDLENBQUMsYUFBYSxDQUFDO1lBQzFGLE9BQU8sQ0FBQyxLQUFLLENBQ1gsZUFBZSxJQUFJLENBQUMsSUFBSSwrQkFBK0IsYUFBYSxHQUFHLEVBQ3ZFOztxQkFFYSxhQUFhLFlBQVksYUFBYTtXQUNoRCxDQUNKLENBQUM7WUFFRixTQUFTLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1NBQ3BFO1FBQ0QsOENBQThDO1FBQzlDLGtFQUFrRTtRQUNsRSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRTtZQUN2RixLQUFLLEVBQUUsS0FBSztTQUNiLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUN4QixtQkFBbUIsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUMxQyxJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLEVBQUUsQ0FDSCxDQUFDO1NBQ0g7UUFFRCxNQUFNLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztRQUN2RCxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDO1FBQzVELGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0Q7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsRTtRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNuRCxDQUFDOztpSEF0UFUsb0JBQW9CLHFNQStCckIsdUNBQXVDLGFBRXZDLHNDQUFzQyxhQUN0QyxjQUFjLGFBQ2QsYUFBYSxhQUViLFdBQVc7cUdBckNWLG9CQUFvQixrU0FTakIsbUJBQW1CLG9HQUNuQixvQkFBb0IsbUdBQ3BCLDJCQUEyQix1SUFHZCxnQkFBZ0IsZ0VBdEJqQzs7Ozs7O0dBTVQ7MkZBRVUsb0JBQW9CO2tCQVZoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQ0FBaUM7b0JBQzNDLFFBQVEsRUFBRTs7Ozs7O0dBTVQ7aUJBQ0Y7OzBCQWdDSSxNQUFNOzJCQUFDLHVDQUF1Qzs7MEJBRTlDLE1BQU07MkJBQUMsc0NBQXNDOzswQkFDN0MsTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsTUFBTTsyQkFBQyxhQUFhOzswQkFFcEIsTUFBTTsyQkFBQyxXQUFXOzRDQXBDWixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFFOEMsa0JBQWtCO3NCQUF0RSxZQUFZO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDRyxtQkFBbUI7c0JBQXhFLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVwRCxrQkFBa0I7c0JBRGpCLFlBQVk7dUJBQUMsMkJBQTJCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdVLElBQUk7c0JBQXhFLFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBMkJ2RCxNQUFNO3NCQURULEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvbm8tY29uZmxpY3RpbmctbGlmZWN5Y2xlICovXHJcbmltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgRG9DaGVjayxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgS2V5VmFsdWVEaWZmZXIsXHJcbiAgS2V5VmFsdWVEaWZmZXJzLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBQTEFURk9STV9JRCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBUeXBlLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhLCBVcmxUcmVlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJpbmcsIEh0bWxFbGVtZW50UmVuZGVyaW5nIH0gZnJvbSAnQHNpdGVjb3JlLWpzcy9zaXRlY29yZS1qc3MvbGF5b3V0JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc3VsdCxcclxuICBKc3NDb21wb25lbnRGYWN0b3J5U2VydmljZSxcclxufSBmcm9tICcuLi9qc3MtY29tcG9uZW50LWZhY3Rvcnkuc2VydmljZSc7XHJcbmltcG9ydCB7IEhJRERFTl9SRU5ERVJJTkdfTkFNRSB9IGZyb20gJy4vaGlkZGVuLXJlbmRlcmluZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQbGFjZWhvbGRlckxvYWRpbmdEaXJlY3RpdmUgfSBmcm9tICcuL3BsYWNlaG9sZGVyLWxvYWRpbmcuZGlyZWN0aXZlJztcclxuaW1wb3J0IHtcclxuICBEYXRhUmVzb2x2ZXIsXHJcbiAgREFUQV9SRVNPTFZFUixcclxuICBHdWFyZFJlc29sdmVyLFxyXG4gIEdVQVJEX1JFU09MVkVSLFxyXG4gIFBMQUNFSE9MREVSX0hJRERFTl9SRU5ERVJJTkdfQ09NUE9ORU5ULFxyXG4gIFBMQUNFSE9MREVSX01JU1NJTkdfQ09NUE9ORU5UX0NPTVBPTkVOVCxcclxufSBmcm9tICcuL3BsYWNlaG9sZGVyLnRva2VuJztcclxuaW1wb3J0IHsgUmVuZGVyRWFjaERpcmVjdGl2ZSB9IGZyb20gJy4vcmVuZGVyLWVhY2guZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgUmVuZGVyRW1wdHlEaXJlY3RpdmUgfSBmcm9tICcuL3JlbmRlci1lbXB0eS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBpc1Jhd1JlbmRlcmluZyB9IGZyb20gJy4vcmVuZGVyaW5nJztcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0NvbXBvbmVudFJlbmRlcmluZ30gcmVuZGVyaW5nXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRQbGFjZWhvbGRlcihyZW5kZXJpbmc6IENvbXBvbmVudFJlbmRlcmluZywgbmFtZTogc3RyaW5nKSB7XHJcbiAgaWYgKHJlbmRlcmluZyAmJiByZW5kZXJpbmcucGxhY2Vob2xkZXJzICYmIE9iamVjdC5rZXlzKHJlbmRlcmluZy5wbGFjZWhvbGRlcnMpLmxlbmd0aCA+IDApIHtcclxuICAgIHJldHVybiByZW5kZXJpbmcucGxhY2Vob2xkZXJzW25hbWVdO1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGYWN0b3J5V2l0aERhdGEge1xyXG4gIGZhY3Rvcnk6IENvbXBvbmVudEZhY3RvcnlSZXN1bHQ7XHJcbiAgZGF0YT86IERhdGE7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2MtcGxhY2Vob2xkZXIsW3NjLXBsYWNlaG9sZGVyXScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAqbmdJZj1cImlzTG9hZGluZ1wiXHJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBsYWNlaG9sZGVyTG9hZGluZz8udGVtcGxhdGVSZWZcIlxyXG4gICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI3ZpZXc+PC9uZy10ZW1wbGF0ZT5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGxhY2Vob2xkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgRG9DaGVjaywgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBuYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJlbmRlcmluZzogQ29tcG9uZW50UmVuZGVyaW5nO1xyXG4gIEBJbnB1dCgpIHJlbmRlcmluZ3M/OiBBcnJheTxDb21wb25lbnRSZW5kZXJpbmcgfCBIdG1sRWxlbWVudFJlbmRlcmluZz47XHJcbiAgQElucHV0KCkgb3V0cHV0czogeyBbazogc3RyaW5nXTogKGV2ZW50VHlwZTogdW5rbm93bikgPT4gdm9pZCB9O1xyXG4gIEBJbnB1dCgpIGNsaWVudE9ubHkgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xyXG5cclxuICBAQ29udGVudENoaWxkKFJlbmRlckVhY2hEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIHJlbmRlckVhY2hUZW1wbGF0ZTogUmVuZGVyRWFjaERpcmVjdGl2ZTtcclxuICBAQ29udGVudENoaWxkKFJlbmRlckVtcHR5RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSByZW5kZXJFbXB0eVRlbXBsYXRlOiBSZW5kZXJFbXB0eURpcmVjdGl2ZTtcclxuICBAQ29udGVudENoaWxkKFBsYWNlaG9sZGVyTG9hZGluZ0RpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwbGFjZWhvbGRlckxvYWRpbmc/OiBQbGFjZWhvbGRlckxvYWRpbmdEaXJlY3RpdmU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZpZXcnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHZpZXc6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9pbnB1dHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xyXG4gIHByaXZhdGUgX2RpZmZlcjogS2V5VmFsdWVEaWZmZXI8c3RyaW5nLCB1bmtub3duPjtcclxuICBwcml2YXRlIF9jb21wb25lbnRJbnN0YW5jZXM6IHsgW3Byb3A6IHN0cmluZ106IHVua25vd24gfVtdID0gW107XHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIHBhcmVudFN0eWxlQXR0cmlidXRlID0gJyc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3Rvcnk6IEpzc0NvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgQEluamVjdChQTEFDRUhPTERFUl9NSVNTSU5HX0NPTVBPTkVOVF9DT01QT05FTlQpXHJcbiAgICBwcml2YXRlIG1pc3NpbmdDb21wb25lbnRDb21wb25lbnQ6IFR5cGU8dW5rbm93bj4sXHJcbiAgICBASW5qZWN0KFBMQUNFSE9MREVSX0hJRERFTl9SRU5ERVJJTkdfQ09NUE9ORU5UKSBwcml2YXRlIGhpZGRlblJlbmRlcmluZ0NvbXBvbmVudDogVHlwZTx1bmtub3duPixcclxuICAgIEBJbmplY3QoR1VBUkRfUkVTT0xWRVIpIHByaXZhdGUgZ3VhcmRSZXNvbHZlcjogR3VhcmRSZXNvbHZlcixcclxuICAgIEBJbmplY3QoREFUQV9SRVNPTFZFUikgcHJpdmF0ZSBkYXRhUmVzb2x2ZXI6IERhdGFSZXNvbHZlcixcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdFxyXG4gICkge31cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgaW5wdXRzKHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xyXG4gICAgdGhpcy5faW5wdXRzID0gdmFsdWU7XHJcbiAgICBpZiAoIXRoaXMuX2RpZmZlciAmJiB2YWx1ZSkge1xyXG4gICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIGp1c3QgdG8gZW5zdXJlIHRoZSBlbGVtZW50IGV4aXN0c1xyXG4gICAgY29uc3QgZWxlbSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIGlmIChlbGVtKSB7XHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IE5hbWVkTm9kZU1hcCA9IGVsZW0uYXR0cmlidXRlcztcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYXR0cjogQXR0ciB8IG51bGwgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7XHJcbiAgICAgICAgaWYgKGF0dHIgJiYgYXR0ci5uYW1lLmluZGV4T2YoJ19uZ2NvbnRlbnQnKSAhPT0gLTEpIHtcclxuICAgICAgICAgIHRoaXMucGFyZW50U3R5bGVBdHRyaWJ1dGUgPSBhdHRyLm5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcclxuICAgIHRoaXMuX2NvbXBvbmVudEluc3RhbmNlcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMucmVuZGVyaW5nIHx8IGNoYW5nZXMucmVuZGVyaW5ncykge1xyXG4gICAgICB0aGlzLl9yZW5kZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpIHtcclxuICAgIGlmICghdGhpcy5fZGlmZmVyIHx8ICF0aGlzLl9pbnB1dHMgfHwgdGhpcy5fY29tcG9uZW50SW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX2lucHV0cyk7XHJcbiAgICBpZiAoIWNoYW5nZXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdXBkYXRlczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fTtcclxuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChjaGFuZ2UpID0+ICh1cGRhdGVzW2NoYW5nZS5rZXldID0gbnVsbCkpO1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChjaGFuZ2UpID0+ICh1cGRhdGVzW2NoYW5nZS5rZXldID0gY2hhbmdlLmN1cnJlbnRWYWx1ZSkpO1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0oKGNoYW5nZSkgPT4gKHVwZGF0ZXNbY2hhbmdlLmtleV0gPSBjaGFuZ2UuY3VycmVudFZhbHVlKSk7XHJcbiAgICB0aGlzLl9jb21wb25lbnRJbnN0YW5jZXMuZm9yRWFjaCgoY29tcG9uZW50SW5zdGFuY2UpID0+XHJcbiAgICAgIHRoaXMuX3NldENvbXBvbmVudElucHV0cyhjb21wb25lbnRJbnN0YW5jZSwgdXBkYXRlcylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRDb21wb25lbnRJbnB1dHMoXHJcbiAgICBjb21wb25lbnRJbnN0YW5jZTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0sXHJcbiAgICBpbnB1dHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9XHJcbiAgKSB7XHJcbiAgICBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZvckVhY2goXHJcbiAgICAgIChbaW5wdXQsIGlucHV0VmFsdWVdKSA9PiAoY29tcG9uZW50SW5zdGFuY2VbaW5wdXRdID0gaW5wdXRWYWx1ZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdWJzY3JpYmVDb21wb25lbnRPdXRwdXRzKFxyXG4gICAgY29tcG9uZW50SW5zdGFuY2U6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LFxyXG4gICAgb3V0cHV0czogeyBbazogc3RyaW5nXTogKGV2ZW50VHlwZTogdW5rbm93bikgPT4gdm9pZCB9XHJcbiAgKSB7XHJcbiAgICBPYmplY3Qua2V5cyhvdXRwdXRzKVxyXG4gICAgICAuZmlsdGVyKFxyXG4gICAgICAgIChvdXRwdXQpID0+IGNvbXBvbmVudEluc3RhbmNlW291dHB1dF0gJiYgY29tcG9uZW50SW5zdGFuY2Vbb3V0cHV0XSBpbnN0YW5jZW9mIE9ic2VydmFibGVcclxuICAgICAgKVxyXG4gICAgICAuZm9yRWFjaCgob3V0cHV0KSA9PlxyXG4gICAgICAgIChjb21wb25lbnRJbnN0YW5jZVtvdXRwdXRdIGFzIE9ic2VydmFibGU8dW5rbm93bj4pXHJcbiAgICAgICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gIXRoaXMuZGVzdHJveWVkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUob3V0cHV0c1tvdXRwdXRdKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuY2xpZW50T25seSAmJiBpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2NvbXBvbmVudEluc3RhbmNlcyA9IFtdO1xyXG4gICAgdGhpcy52aWV3LmNsZWFyKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmluZyAmJiAhdGhpcy5yZW5kZXJpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMubmFtZSAmJiAhdGhpcy5yZW5kZXJpbmdzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAnUGxhY2Vob2xkZXIgbmFtZSB3YXMgbm90IHNwZWNpZmllZCwgYW5kIGV4cGxpY2l0IHJlbmRlcmluZ3MgYXJyYXkgd2FzIG5vdCBwYXNzZWQuIFBsYWNlaG9sZGVyIHJlcXVpcmVzIGVpdGhlciBuYW1lIGFuZCByZW5kZXJpbmcsIG9yIHJlbmRlcmluZ3MuJ1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLnJlbmRlcmluZ3MgfHwgZ2V0UGxhY2Vob2xkZXIodGhpcy5yZW5kZXJpbmcsIHRoaXMubmFtZSB8fCAnJyk7XHJcblxyXG4gICAgaWYgKCFwbGFjZWhvbGRlcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFBsYWNlaG9sZGVyICcke3RoaXMubmFtZX0nIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGRhdGFgLFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucmVuZGVyaW5nLCBudWxsLCAyKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgdGhlIHBsYWNlaG9sZGVyIGlzIGVtcHR5IChjb250YWlucyBvbmx5IHJhdyByZW5kZXJpbmdzKSwgdGhlbiB3ZSBtYXkgbmVlZCB0byB1c2UgdGhlIGVtcHR5IHRlbXBsYXRlIGlmIGl0J3MgZGVmaW5lZFxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXJJc0VtcHR5ID0gcGxhY2Vob2xkZXIuZXZlcnkoXHJcbiAgICAgIChyZW5kZXJpbmc6IENvbXBvbmVudFJlbmRlcmluZyB8IEh0bWxFbGVtZW50UmVuZGVyaW5nKSA9PiBpc1Jhd1JlbmRlcmluZyhyZW5kZXJpbmcpXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0aGlzLnJlbmRlckVtcHR5VGVtcGxhdGUgJiYgcGxhY2Vob2xkZXJJc0VtcHR5KSB7XHJcbiAgICAgIHRoaXMudmlldy5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5yZW5kZXJFbXB0eVRlbXBsYXRlLnRlbXBsYXRlUmVmLCB7XHJcbiAgICAgICAgcmVuZGVyaW5nczogcGxhY2Vob2xkZXIsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5jb21wb25lbnRGYWN0b3J5LmdldENvbXBvbmVudHMocGxhY2Vob2xkZXIpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBub25HdWFyZGVkID0gYXdhaXQgdGhpcy5ndWFyZFJlc29sdmVyKGZhY3Rvcmllcyk7XHJcbiAgICAgICAgY29uc3Qgd2l0aERhdGEgPSBhd2FpdCB0aGlzLmRhdGFSZXNvbHZlcihub25HdWFyZGVkKTtcclxuXHJcbiAgICAgICAgd2l0aERhdGEuZm9yRWFjaCgocmVuZGVyaW5nLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMucmVuZGVyRWFjaFRlbXBsYXRlICYmICFpc1Jhd1JlbmRlcmluZyhyZW5kZXJpbmcuZmFjdG9yeS5jb21wb25lbnREZWZpbml0aW9uKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJUZW1wbGF0ZWRDb21wb25lbnQocmVuZGVyaW5nLmZhY3RvcnkuY29tcG9uZW50RGVmaW5pdGlvbiwgaW5kZXgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyRW1iZWRkZWRDb21wb25lbnQocmVuZGVyaW5nLmZhY3RvcnksIHJlbmRlcmluZy5kYXRhLCBpbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLmxvYWRlZC5lbWl0KHRoaXMubmFtZSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgVXJsVHJlZSkge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2VdKTtcclxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVuZGVyVGVtcGxhdGVkQ29tcG9uZW50KFxyXG4gICAgcmVuZGVyaW5nOiBDb21wb25lbnRSZW5kZXJpbmcgfCBIdG1sRWxlbWVudFJlbmRlcmluZyxcclxuICAgIGluZGV4OiBudW1iZXJcclxuICApIHtcclxuICAgIC8vIHRoZSByZW5kZXItZWFjaCB0ZW1wbGF0ZSB0YWtlcyBjYXJlIG9mIGFsbCBjb21wb25lbnQgbWFwcGluZyBldGNcclxuICAgIC8vIGdlbmVyYWxseSB1c2luZyA8c2MtcmVuZGVyLWNvbXBvbmVudD4gd2hpY2ggaXMgYWJvdXQgbGlrZSBfcmVuZGVyRW1iZWRkZWRDb21wb25lbnQoKVxyXG4gICAgLy8gYXMgYSBzZXBhcmF0ZSBjb21wb25lbnRcclxuICAgIHRoaXMudmlldy5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5yZW5kZXJFYWNoVGVtcGxhdGUudGVtcGxhdGVSZWYsIHtcclxuICAgICAgcmVuZGVyaW5nLFxyXG4gICAgICBpbmRleCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVuZGVyRW1iZWRkZWRDb21wb25lbnQocmVuZGVyaW5nOiBDb21wb25lbnRGYWN0b3J5UmVzdWx0LCBkYXRhOiBEYXRhLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIChyZW5kZXJpbmcuY29tcG9uZW50RGVmaW5pdGlvbiBhcyBDb21wb25lbnRSZW5kZXJpbmcpLmNvbXBvbmVudE5hbWUgPT09IEhJRERFTl9SRU5ERVJJTkdfTkFNRVxyXG4gICAgKSB7XHJcbiAgICAgIHJlbmRlcmluZy5jb21wb25lbnRJbXBsZW1lbnRhdGlvbiA9IHRoaXMuaGlkZGVuUmVuZGVyaW5nQ29tcG9uZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcmVuZGVyaW5nLmNvbXBvbmVudEltcGxlbWVudGF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSAocmVuZGVyaW5nLmNvbXBvbmVudERlZmluaXRpb24gYXMgQ29tcG9uZW50UmVuZGVyaW5nKS5jb21wb25lbnROYW1lO1xyXG4gICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgIGBQbGFjZWhvbGRlciAke3RoaXMubmFtZX0gY29udGFpbnMgdW5rbm93biBjb21wb25lbnQgJHtjb21wb25lbnROYW1lfS5gLFxyXG4gICAgICAgIGBFbnN1cmUgY29tcG9uZW50IGlzIG1hcHBlZCwgbGlrZTpcclxuICAgICAgICBKc3NNb2R1bGUud2l0aENvbXBvbmVudHMoW1xyXG4gICAgICAgICAgeyBuYW1lOiAnJHtjb21wb25lbnROYW1lfScsIHR5cGU6ICR7Y29tcG9uZW50TmFtZX1Db21wb25lbnQgfVxyXG4gICAgICAgIF0pYFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmVuZGVyaW5nLmNvbXBvbmVudEltcGxlbWVudGF0aW9uID0gdGhpcy5taXNzaW5nQ29tcG9uZW50Q29tcG9uZW50O1xyXG4gICAgfVxyXG4gICAgLy8gYXBwbHkgdGhlIHBhcmVudCBzdHlsZSBhdHRyaWJ1dGUgX25nY29udGVudFxyXG4gICAgLy8gd29yay1hcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEyMjE1XHJcbiAgICBjb25zdCBjcmVhdGVkQ29tcG9uZW50UmVmID0gdGhpcy52aWV3LmNyZWF0ZUNvbXBvbmVudChyZW5kZXJpbmcuY29tcG9uZW50SW1wbGVtZW50YXRpb24sIHtcclxuICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5wYXJlbnRTdHlsZUF0dHJpYnV0ZSkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcclxuICAgICAgICBjcmVhdGVkQ29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgdGhpcy5wYXJlbnRTdHlsZUF0dHJpYnV0ZSxcclxuICAgICAgICAnJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlZENvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuICAgIGNvbXBvbmVudEluc3RhbmNlLnJlbmRlcmluZyA9IHJlbmRlcmluZy5jb21wb25lbnREZWZpbml0aW9uO1xyXG4gICAgY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IGRhdGE7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lucHV0cykge1xyXG4gICAgICB0aGlzLl9zZXRDb21wb25lbnRJbnB1dHMoY29tcG9uZW50SW5zdGFuY2UsIHRoaXMuX2lucHV0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vdXRwdXRzKSB7XHJcbiAgICAgIHRoaXMuX3N1YnNjcmliZUNvbXBvbmVudE91dHB1dHMoY29tcG9uZW50SW5zdGFuY2UsIHRoaXMub3V0cHV0cyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jb21wb25lbnRJbnN0YW5jZXMucHVzaChjb21wb25lbnRJbnN0YW5jZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|