@openziti/ziti-console-lib 0.12.1 → 0.12.3
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/assets/styles/global.scss +16 -1
- package/esm2022/lib/features/config-editor/config-editor.component.mjs +1 -1
- package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +3 -3
- package/esm2022/lib/features/data-table/data-table.component.mjs +36 -3
- package/esm2022/lib/features/json-view/json-view.component.mjs +6 -3
- package/esm2022/lib/features/no-items/no-items.component.mjs +3 -3
- package/esm2022/lib/features/projectable-forms/api-session/api-session-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/auth-policy/auth-policy-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/certificate-authority/certificate-authority-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/config-type/config-type-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +3 -3
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +3 -3
- package/esm2022/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.mjs +120 -30
- package/esm2022/lib/features/projectable-forms/posture-check/posture-check-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +3 -2
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/session/session-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/terminator/terminator-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/transit-router/transit-router-form.component.mjs +1 -1
- package/esm2022/lib/models/api-session.mjs +1 -1
- package/esm2022/lib/pages/api-sessions/api-sessions-page.component.mjs +3 -3
- package/esm2022/lib/pages/api-sessions/api-sessions-page.service.mjs +55 -17
- package/esm2022/lib/pages/callback/callback.component.mjs +156 -0
- package/esm2022/lib/pages/jwt-signers/jwt-signers-page.component.mjs +3 -3
- package/esm2022/lib/pages/sessions/sessions-page.component.mjs +3 -3
- package/esm2022/lib/pages/sessions/sessions-page.service.mjs +47 -18
- package/esm2022/lib/pages/terminators/terminators-page.component.mjs +3 -3
- package/esm2022/lib/pages/terminators/terminators-page.service.mjs +43 -3
- package/esm2022/lib/services/auth.service.mjs +7 -6
- package/esm2022/lib/services/login-service.class.mjs +15 -1
- package/esm2022/lib/services/validation.service.mjs +13 -2
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/lib/ziti-console-lib.module.mjs +13 -4
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/openziti-ziti-console-lib.mjs +501 -94
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
- package/lib/features/data-table/data-table.component.d.ts.map +1 -1
- package/lib/features/json-view/json-view.component.d.ts +2 -1
- package/lib/features/json-view/json-view.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts +1 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts +14 -3
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/projectable-form.class.d.ts +1 -0
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
- package/lib/models/api-session.d.ts +3 -2
- package/lib/models/api-session.d.ts.map +1 -1
- package/lib/pages/api-sessions/api-sessions-page.service.d.ts +1 -0
- package/lib/pages/api-sessions/api-sessions-page.service.d.ts.map +1 -1
- package/lib/pages/callback/callback.component.d.ts +22 -0
- package/lib/pages/callback/callback.component.d.ts.map +1 -0
- package/lib/pages/sessions/sessions-page.service.d.ts.map +1 -1
- package/lib/pages/terminators/terminators-page.service.d.ts.map +1 -1
- package/lib/services/auth.service.d.ts +1 -1
- package/lib/services/auth.service.d.ts.map +1 -1
- package/lib/services/login-service.class.d.ts +2 -0
- package/lib/services/login-service.class.d.ts.map +1 -1
- package/lib/services/validation.service.d.ts +4 -0
- package/lib/services/validation.service.d.ts.map +1 -1
- package/lib/ziti-console-lib.module.d.ts +19 -18
- package/lib/ziti-console-lib.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
- package/public-api.d.ts.map +1 -1
|
@@ -60,7 +60,7 @@ body {
|
|
|
60
60
|
--inputBorderRadius: 0.4375rem;
|
|
61
61
|
--inputBorderWidth: 0.125rem;
|
|
62
62
|
--formFieldBorder: none;
|
|
63
|
-
--jsonEditorBorder:
|
|
63
|
+
--jsonEditorBorder: 0.125rem solid var(--stroke);
|
|
64
64
|
|
|
65
65
|
--spinnerSizeMedium: 1.25rem;
|
|
66
66
|
--spinnerSizeLarge: 2rem;
|
|
@@ -1767,3 +1767,18 @@ a {
|
|
|
1767
1767
|
animation: loading .5s infinite linear;
|
|
1768
1768
|
margin-left: var(--marginSmall);
|
|
1769
1769
|
}
|
|
1770
|
+
|
|
1771
|
+
#jsoneditor {
|
|
1772
|
+
.jse-main .jse-text-mode .jse-contents {
|
|
1773
|
+
border: none;
|
|
1774
|
+
}
|
|
1775
|
+
&.hide-line-numbers {
|
|
1776
|
+
.jse-status-bar {
|
|
1777
|
+
display: none;
|
|
1778
|
+
}
|
|
1779
|
+
.cm-gutters {
|
|
1780
|
+
opacity: 0;
|
|
1781
|
+
max-width: 0.5rem;
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
@@ -306,7 +306,7 @@ class ConfigEditorComponent {
|
|
|
306
306
|
return data;
|
|
307
307
|
}
|
|
308
308
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigEditorComponent, deps: [{ token: i1.SchemaService }, { token: i2.GrowlerService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
309
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ConfigEditorComponent, selector: "lib-config-editor", inputs: { configErrors: "configErrors", configData: "configData", showJsonView: "showJsonView", schema: "schema" }, outputs: { configErrorsChange: "configErrorsChange", configDataChange: "configDataChange" }, viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: ["dynamicform"], descendants: true, read: ViewContainerRef }, { propertyName: "editor", first: true, predicate: JsonEditorComponent, descendants: true }], ngImport: i0, template: "<div class=\"form-field-extended-fields\" [hidden]=\"showJsonView\" (mouseup)=\"formDataChangedDebounced($event)\" (keyup)=\"formDataChangedDebounced($event)\" (clickOutside)=\"formDataChangedDebounced($event)\">\n <ng-container #dynamicform></ng-container>\n</div>\n<lib-json-view *ngIf=\"showJsonView && !hideConfigJSON\" (dataChange)=\"jsonDataChangedDebounced($event)\" [(data)]=\"configData\"></lib-json-view>\n<lib-json-view *ngIf=\"showJsonView && hideConfigJSON\" [(data)]=\"configData\"></lib-json-view>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "component", type: i5.JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }] }); }
|
|
309
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ConfigEditorComponent, selector: "lib-config-editor", inputs: { configErrors: "configErrors", configData: "configData", showJsonView: "showJsonView", schema: "schema" }, outputs: { configErrorsChange: "configErrorsChange", configDataChange: "configDataChange" }, viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: ["dynamicform"], descendants: true, read: ViewContainerRef }, { propertyName: "editor", first: true, predicate: JsonEditorComponent, descendants: true }], ngImport: i0, template: "<div class=\"form-field-extended-fields\" [hidden]=\"showJsonView\" (mouseup)=\"formDataChangedDebounced($event)\" (keyup)=\"formDataChangedDebounced($event)\" (clickOutside)=\"formDataChangedDebounced($event)\">\n <ng-container #dynamicform></ng-container>\n</div>\n<lib-json-view *ngIf=\"showJsonView && !hideConfigJSON\" (dataChange)=\"jsonDataChangedDebounced($event)\" [(data)]=\"configData\"></lib-json-view>\n<lib-json-view *ngIf=\"showJsonView && hideConfigJSON\" [(data)]=\"configData\"></lib-json-view>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "component", type: i5.JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }] }); }
|
|
310
310
|
}
|
|
311
311
|
export { ConfigEditorComponent };
|
|
312
312
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigEditorComponent, decorators: [{
|
|
@@ -26,11 +26,11 @@ class TableCellNameComponent {
|
|
|
26
26
|
if (!result?.confirmed) {
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
-
this.router.navigateByUrl(`${this.cellParams.pathRoot}/${this.item.id}`);
|
|
29
|
+
this.router.navigateByUrl(`${this.cellParams.pathRoot}/${get(this.item, this.cellParams.itemProp, this.item.id)}`);
|
|
30
30
|
});
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
this.router.navigateByUrl(`${this.cellParams.pathRoot}/${this.item.id}`);
|
|
33
|
+
this.router.navigateByUrl(`${this.cellParams.pathRoot}/${get(this.item, this.cellParams.itemProp, this.item.id)}`);
|
|
34
34
|
}
|
|
35
35
|
get cellText() {
|
|
36
36
|
let val = get(this.item, this.cellParams?.colDef?.field);
|
|
@@ -47,4 +47,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
47
47
|
type: Component,
|
|
48
48
|
args: [{ selector: 'lib-table-cell-name', template: "<span class=\"cell-name-container\">\n <a href=\"./{{cellParams.pathRoot}}/{{item.id}}\" (click)=\"linkClicked($event)\">\n <div class=\"col cell-name-renderer\" data-id=\"{{item.id}}\">\n <div *ngIf=\"cellParams.showIdentityIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.hasApiSession}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.hasEdgeRouterConnection}}\" title=\"Edge Router Connected\"></span>\n </div>\n <div *ngIf=\"cellParams.showRouterIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.isVerified}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.isOnline}}\" title=\"Edge Router Connected\"></span>\n </div>\n <strong>{{cellText}}</strong>\n </div>\n </a>\n</span>\n", styles: [".cell-name-renderer{display:flex;flex-direction:row;gap:.3125rem}.cell-name-container{display:flex;flex-direction:row;flex-wrap:nowrap}.cell-status-container{position:relative;display:flex;align-items:center;justify-content:center;gap:.25rem}\n"] }]
|
|
49
49
|
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.Router }]; } });
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY2VsbC1uYW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy9kYXRhLXRhYmxlL2NlbGxzL3RhYmxlLWNlbGwtbmFtZS90YWJsZS1jZWxsLW5hbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL2RhdGEtdGFibGUvY2VsbHMvdGFibGUtY2VsbC1uYW1lL3RhYmxlLWNlbGwtbmFtZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTTFDLE9BQU8sRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQzs7Ozs7QUFFaEQsTUFLYSxzQkFBc0I7SUFNakMsWUFBbUIsVUFBcUIsRUFBVSxNQUFjO1FBQTdDLGVBQVUsR0FBVixVQUFVLENBQVc7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQ2hFLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBMkI7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBZ0M7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFLO1FBQ2YsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLEVBQUU7WUFDakQsSUFBSSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQzNELElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFO29CQUN0QixPQUFPO2lCQUNSO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckgsQ0FBQyxDQUFDLENBQUE7WUFDRixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JILENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQixHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDdEI7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7K0dBekNVLHNCQUFzQjttR0FBdEIsc0JBQXNCLDJEQ2JuQywwM0JBZUE7O1NERmEsc0JBQXNCOzRGQUF0QixzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0lDZWxsUmVuZGVyZXJBbmd1bGFyQ29tcH0gZnJvbSBcImFnLWdyaWQtYW5ndWxhclwiO1xuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcbmltcG9ydCB7SUNlbGxSZW5kZXJlclBhcmFtc30gZnJvbSBcImFnLWdyaWQtY29tbXVuaXR5XCI7XG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuXG5pbXBvcnQge2lzRW1wdHksIGlzRnVuY3Rpb24sIGdldH0gZnJvbSAnbG9kYXNoJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXRhYmxlLWNlbGwtbmFtZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1jZWxsLW5hbWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1jZWxsLW5hbWUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNlbGxOYW1lQ29tcG9uZW50ICBpbXBsZW1lbnRzIElDZWxsUmVuZGVyZXJBbmd1bGFyQ29tcCB7XG5cbiAgY2VsbFBhcmFtczogYW55O1xuICBpdGVtOiBhbnk7XG4gIGRpYWxvZ1JlZjogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dGb3JtOiBNYXREaWFsb2csIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIpIHtcbiAgfVxuXG4gIGFnSW5pdChwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxQYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5pdGVtID0gcGFyYW1zLmRhdGE7XG4gIH1cblxuICByZWZyZXNoKHBhcmFtczogSUNlbGxSZW5kZXJlclBhcmFtczxhbnk+KTogYm9vbGVhbiB7XG4gICAgdGhpcy5jZWxsUGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuaXRlbSA9IHBhcmFtcy5kYXRhO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGlua0NsaWNrZWQoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMuY2VsbFBhcmFtcz8uY2VsbE5hbWVQcmVDaGVjaykpIHtcbiAgICAgIHRoaXMuY2VsbFBhcmFtcz8uY2VsbE5hbWVQcmVDaGVjayh0aGlzLml0ZW0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdD8uY29uZmlybWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoYCR7dGhpcy5jZWxsUGFyYW1zLnBhdGhSb290fS8ke2dldCh0aGlzLml0ZW0sIHRoaXMuY2VsbFBhcmFtcy5pdGVtUHJvcCwgdGhpcy5pdGVtLmlkKX1gKTtcbiAgICAgIH0pXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoYCR7dGhpcy5jZWxsUGFyYW1zLnBhdGhSb290fS8ke2dldCh0aGlzLml0ZW0sIHRoaXMuY2VsbFBhcmFtcy5pdGVtUHJvcCwgdGhpcy5pdGVtLmlkKX1gKTtcbiAgfVxuXG4gIGdldCBjZWxsVGV4dCgpIHtcbiAgICBsZXQgdmFsID0gZ2V0KHRoaXMuaXRlbSwgdGhpcy5jZWxsUGFyYW1zPy5jb2xEZWY/LmZpZWxkKTtcbiAgICBpZiAoaXNFbXB0eSh2YWwpKSB7XG4gICAgICB2YWwgPSB0aGlzLml0ZW0ubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuIiwiPHNwYW4gY2xhc3M9XCJjZWxsLW5hbWUtY29udGFpbmVyXCI+XG4gICAgPGEgaHJlZj1cIi4ve3tjZWxsUGFyYW1zLnBhdGhSb290fX0ve3tpdGVtLmlkfX1cIiAoY2xpY2spPVwibGlua0NsaWNrZWQoJGV2ZW50KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGNlbGwtbmFtZS1yZW5kZXJlclwiIGRhdGEtaWQ9XCJ7e2l0ZW0uaWR9fVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNlbGxQYXJhbXMuc2hvd0lkZW50aXR5SWNvbnNcIiBjbGFzcz1cImNlbGwtc3RhdHVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2lyY2xlIHt7aXRlbS5oYXNBcGlTZXNzaW9ufX1cIiB0aXRsZT1cIkFwaSBTZXNzaW9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2lyY2xlIHt7aXRlbS5oYXNFZGdlUm91dGVyQ29ubmVjdGlvbn19XCIgdGl0bGU9XCJFZGdlIFJvdXRlciBDb25uZWN0ZWRcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjZWxsUGFyYW1zLnNob3dSb3V0ZXJJY29uc1wiIGNsYXNzPVwiY2VsbC1zdGF0dXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaXJjbGUge3tpdGVtLmlzVmVyaWZpZWR9fVwiIHRpdGxlPVwiQXBpIFNlc3Npb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaXJjbGUge3tpdGVtLmlzT25saW5lfX1cIiB0aXRsZT1cIkVkZ2UgUm91dGVyIENvbm5lY3RlZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHN0cm9uZz57e2NlbGxUZXh0fX08L3N0cm9uZz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9hPlxuPC9zcGFuPlxuIl19
|