http-request-manager 18.0.1 → 18.0.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/esm2022/lib/http-request-manager.module.mjs +4 -4
- package/esm2022/lib/http-request-services-demo/database-data-demo/database-data-demo.component.mjs +4 -4
- package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +5 -5
- package/esm2022/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.mjs +6 -6
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +4 -4
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +4 -4
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +5 -5
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.mjs +5 -5
- package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +5 -5
- package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +5 -5
- package/esm2022/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.mjs +4 -4
- package/esm2022/lib/interceptors/credentials.interceptor.mjs +4 -4
- package/esm2022/lib/interceptors/proxy-debugger.interceptor.mjs +6 -6
- package/esm2022/lib/interceptors/request-error.interceptor.mjs +4 -4
- package/esm2022/lib/interceptors/request-header.interceptor.mjs +5 -5
- package/esm2022/lib/services/database-manager-services/database.manager.service.mjs +5 -5
- package/esm2022/lib/services/database-manager-services/db.storage.service.mjs +5 -5
- package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +6 -6
- package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +6 -6
- package/esm2022/lib/services/request-manager-services/request.service.mjs +4 -4
- package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +1 -1
- package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +6 -6
- package/esm2022/lib/services/utils/app.service.mjs +5 -5
- package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +6 -6
- package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +5 -5
- package/esm2022/lib/services/utils/encryption/random.mjs +1 -1
- package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +5 -5
- package/esm2022/lib/services/utils/headers.service.mjs +3 -3
- package/esm2022/lib/services/utils/object-merger.service.mjs +5 -5
- package/esm2022/lib/services/utils/path-query.service.mjs +4 -4
- package/esm2022/lib/services/utils/utils.service.mjs +5 -5
- package/fesm2022/http-request-manager.mjs +119 -119
- package/fesm2022/http-request-manager.mjs.map +1 -1
- package/http-request-manager-18.0.3.tgz +0 -0
- package/package.json +7 -7
- package/http-request-manager-18.0.1.tgz +0 -0
|
@@ -7,13 +7,13 @@ export class SpinnerComponent {
|
|
|
7
7
|
}
|
|
8
8
|
ngOnInit() {
|
|
9
9
|
}
|
|
10
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
11
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
10
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
11
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SpinnerComponent, selector: "app-spinner", inputs: { color: "color", diameter: "diameter", display: "display", mode: "mode", strokeWidth: "strokeWidth", value: "value" }, ngImport: i0, template: "<div class=\"spinner-background\">{{display}}</div>\n<mat-progress-spinner\n [color]=\"color\"\n [diameter]=\"diameter\"\n [mode]=\"mode || 'indeterminate'\"\n [strokeWidth]=\"strokeWidth\"\n [value]=\"value\">\n</mat-progress-spinner>\n", styles: [".example-h2{margin:24px 0}:not(spinner-container).spinner-container{position:relative}:not(spinner-container).spinner-container .spinner-background{position:absolute;width:80px;height:80px;line-height:80px;text-align:center;overflow:hidden;border-color:#673ab71f;border-radius:50%;border-style:solid;border-width:10px}\n"], dependencies: [{ kind: "component", type: i1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
12
12
|
}
|
|
13
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinnerComponent, decorators: [{
|
|
14
14
|
type: Component,
|
|
15
15
|
args: [{ selector: 'app-spinner', template: "<div class=\"spinner-background\">{{display}}</div>\n<mat-progress-spinner\n [color]=\"color\"\n [diameter]=\"diameter\"\n [mode]=\"mode || 'indeterminate'\"\n [strokeWidth]=\"strokeWidth\"\n [value]=\"value\">\n</mat-progress-spinner>\n", styles: [".example-h2{margin:24px 0}:not(spinner-container).spinner-container{position:relative}:not(spinner-container).spinner-container .spinner-background{position:absolute;width:80px;height:80px;line-height:80px;text-align:center;overflow:hidden;border-color:#673ab71f;border-radius:50%;border-style:solid;border-width:10px}\n"] }]
|
|
16
|
-
}], ctorParameters:
|
|
16
|
+
}], ctorParameters: () => [], propDecorators: { color: [{
|
|
17
17
|
type: Input
|
|
18
18
|
}], diameter: [{
|
|
19
19
|
type: Input
|
|
@@ -26,4 +26,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
26
26
|
}], value: [{
|
|
27
27
|
type: Input
|
|
28
28
|
}] } });
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1kZW1vL2ZpbGUtZG93bmxvYWRlci9zcGlubmVyL3NwaW5uZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItZGVtby9maWxlLWRvd25sb2FkZXIvc3Bpbm5lci9zcGlubmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7QUFTekQsTUFBTSxPQUFPLGdCQUFnQjtJQVUzQjtRQUZTLFVBQUssR0FBRyxDQUFDLENBQUE7SUFFRixDQUFDO0lBRWpCLFFBQVE7SUFDUixDQUFDOytHQWJVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLG1MQ1Q3Qiw4UEFRQTs7NEZEQ2EsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGFBQWE7d0RBTWQsS0FBSztzQkFBYixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zcGlubmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwaW5uZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGlubmVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3Bpbm5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgY29sb3I6IFRoZW1lUGFsZXR0ZTtcblxuICBASW5wdXQoKSBkaWFtZXRlcj86IG51bWJlcjtcbiAgQElucHV0KCkgZGlzcGxheT86IHN0cmluZyB8IG51bWJlcjtcbiAgQElucHV0KCkgbW9kZT86IFByb2dyZXNzU3Bpbm5lck1vZGU7XG4gIEBJbnB1dCgpIHN0cm9rZVdpZHRoPzogbnVtYmVyO1xuICBASW5wdXQoKSB2YWx1ZSA9IDBcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJzcGlubmVyLWJhY2tncm91bmRcIj57e2Rpc3BsYXl9fTwvZGl2PlxuPG1hdC1wcm9ncmVzcy1zcGlubmVyXG4gICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICBbZGlhbWV0ZXJdPVwiZGlhbWV0ZXJcIlxuICAgIFttb2RlXT1cIm1vZGUgfHwgJ2luZGV0ZXJtaW5hdGUnXCJcbiAgICBbc3Ryb2tlV2lkdGhdPVwic3Ryb2tlV2lkdGhcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiPlxuPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiJdfQ==
|
|
@@ -299,17 +299,17 @@ export class RequestManagerDemoComponent {
|
|
|
299
299
|
onSelectAIType(type) {
|
|
300
300
|
this.AIType = type;
|
|
301
301
|
}
|
|
302
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
303
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RequestManagerDemoComponent, selector: "app-request-manager-demo", viewQueries: [{ propertyName: "failedState", first: true, predicate: ["failedState"], descendants: true, static: true }, { propertyName: "pollingState", first: true, predicate: ["pollingState"], descendants: true, static: true }], ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\" #adapterSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\" #mapperSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; margin-bottom: 2rem;\" *ngIf=\"adapterSelect.value || mapperSelect.value\">\n <div style=\"flex:1\" class=\"box\">\n <h3>Adapter (Incoming)</h3>\n <div *ngIf=\"adapterSelect.value; else NO_ADAPTER\">\n {{ props(adapterSelect.value) | json }}\n </div>\n <ng-template #NO_ADAPTER>No Transformation</ng-template>\n </div>\n <div style=\"flex:1\" class=\"box\">\n <h3>Mapper (Outgoing)</h3>\n <div *ngIf=\"mapperSelect.value; else NO_MAPPER\">\n {{ props(mapperSelect.value) | json }}\n </div>\n <ng-template #NO_MAPPER>No Transformation</ng-template>\n </div>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\" class=\"btn\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"pollingState.checked && !(isPending$ | async)\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(GET$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(POST$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <h3>Include Record ID in the RestPath</h3>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(PUT$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <h3>Include Record ID in the RestPath</h3>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(DELETE$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <!-- <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div> -->\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; padding-top: .5rem;\">AI -<span *ngIf=\"AIType === 1\">STREAMING</span> POST Request</h2>\n <div style=\"display: flex; gap: 1rem;\">\n <button mat-raised-button [matMenuTriggerFor]=\"menu\" style=\"min-width: 120px;\">\n <mat-icon>lan</mat-icon>\n <span *ngIf=\"AIType === 0; else LOCAL\">Server</span>\n <ng-template #LOCAL>\n Local\n </ng-template>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onSelectAIType(0)\">Server</button>\n <button mat-menu-item (click)=\"onSelectAIType(1)\">Local</button>\n </mat-menu>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_AI_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div *ngIf=\"AIType === 1; else ALTERNATIVE\" style=\"color: red;\">\n You must have Ollama active and the 'phi3:latest' model to use this feature.\n </div>\n <ng-template #ALTERNATIVE>\n <span style=\"color: gray;\">\n Define the RestPath to the API endpoint that will handle the AI request.\n Use: 'ai/chat' for server\n </span>\n </ng-template>\n\n <div>\n <div *ngIf=\"(STREAM_AI$ | async) as data\" style=\"margin-top: 1rem; font-size: 1.2rem; border-radius: 1rem; border: black 1px solid; padding: 2rem;\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap; line-height: 1.6rem;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 1.5rem; margin-bottom: 1rem; line-height: 1.5rem;\">\n <mat-divider></mat-divider>\n </div>\n\n <div>\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; margin-bottom: 0; padding-top: .5rem; display: flex;\">\n <div>\n Download File\n </div>\n <div style=\"flex:1; margin-left: 1rem;\">\n <mat-slide-toggle #disable>\n <span *ngIf=\"disable.checked; else DISABLE\">\n Enable\n </span>\n <ng-template #DISABLE>Disable</ng-template>\n </mat-slide-toggle>\n </div>\n </h2>\n <div>\n <app-file-downloader\n [disabled]=\"disable.checked\"\n [delayError]=\"3\"\n [apiRequest]=\"downloadRequest\"\n (completed)=\"onDownloadCompleted()\"\n (failed)=\"onDownloadFailed($event)\"\n ></app-file-downloader>\n </div>\n </div>\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}.box{padding:10px;border:1px solid #ccc}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i10.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i14.FileDownloaderComponent, selector: "app-file-downloader", inputs: ["delayError", "apiRequest", "displayErrorMessage", "saveFileAs", "labels", "disabled"], outputs: ["completed", "failed"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
|
|
302
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RequestManagerDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
303
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RequestManagerDemoComponent, selector: "app-request-manager-demo", viewQueries: [{ propertyName: "failedState", first: true, predicate: ["failedState"], descendants: true, static: true }, { propertyName: "pollingState", first: true, predicate: ["pollingState"], descendants: true, static: true }], ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\" #adapterSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\" #mapperSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; margin-bottom: 2rem;\" *ngIf=\"adapterSelect.value || mapperSelect.value\">\n <div style=\"flex:1\" class=\"box\">\n <h3>Adapter (Incoming)</h3>\n <div *ngIf=\"adapterSelect.value; else NO_ADAPTER\">\n {{ props(adapterSelect.value) | json }}\n </div>\n <ng-template #NO_ADAPTER>No Transformation</ng-template>\n </div>\n <div style=\"flex:1\" class=\"box\">\n <h3>Mapper (Outgoing)</h3>\n <div *ngIf=\"mapperSelect.value; else NO_MAPPER\">\n {{ props(mapperSelect.value) | json }}\n </div>\n <ng-template #NO_MAPPER>No Transformation</ng-template>\n </div>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\" class=\"btn\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"pollingState.checked && !(isPending$ | async)\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(GET$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(POST$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <h3>Include Record ID in the RestPath</h3>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(PUT$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <h3>Include Record ID in the RestPath</h3>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(DELETE$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <!-- <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div> -->\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; padding-top: .5rem;\">AI -<span *ngIf=\"AIType === 1\">STREAMING</span> POST Request</h2>\n <div style=\"display: flex; gap: 1rem;\">\n <button mat-raised-button [matMenuTriggerFor]=\"menu\" style=\"min-width: 120px;\">\n <mat-icon>lan</mat-icon>\n <span *ngIf=\"AIType === 0; else LOCAL\">Server</span>\n <ng-template #LOCAL>\n Local\n </ng-template>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onSelectAIType(0)\">Server</button>\n <button mat-menu-item (click)=\"onSelectAIType(1)\">Local</button>\n </mat-menu>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_AI_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div *ngIf=\"AIType === 1; else ALTERNATIVE\" style=\"color: red;\">\n You must have Ollama active and the 'phi3:latest' model to use this feature.\n </div>\n <ng-template #ALTERNATIVE>\n <span style=\"color: gray;\">\n Define the RestPath to the API endpoint that will handle the AI request.\n Use: 'ai/chat' for server\n </span>\n </ng-template>\n\n <div>\n <div *ngIf=\"(STREAM_AI$ | async) as data\" style=\"margin-top: 1rem; font-size: 1.2rem; border-radius: 1rem; border: black 1px solid; padding: 2rem;\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap; line-height: 1.6rem;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 1.5rem; margin-bottom: 1rem; line-height: 1.5rem;\">\n <mat-divider></mat-divider>\n </div>\n\n <div>\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; margin-bottom: 0; padding-top: .5rem; display: flex;\">\n <div>\n Download File\n </div>\n <div style=\"flex:1; margin-left: 1rem;\">\n <mat-slide-toggle #disable>\n <span *ngIf=\"disable.checked; else DISABLE\">\n Enable\n </span>\n <ng-template #DISABLE>Disable</ng-template>\n </mat-slide-toggle>\n </div>\n </h2>\n <div>\n <app-file-downloader\n [disabled]=\"disable.checked\"\n [delayError]=\"3\"\n [apiRequest]=\"downloadRequest\"\n (completed)=\"onDownloadCompleted()\"\n (failed)=\"onDownloadFailed($event)\"\n ></app-file-downloader>\n </div>\n </div>\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}.box{padding:10px;border:1px solid #ccc}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i10.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i14.FileDownloaderComponent, selector: "app-file-downloader", inputs: ["delayError", "apiRequest", "displayErrorMessage", "saveFileAs", "labels", "disabled"], outputs: ["completed", "failed"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
|
|
304
304
|
}
|
|
305
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
305
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RequestManagerDemoComponent, decorators: [{
|
|
306
306
|
type: Component,
|
|
307
307
|
args: [{ selector: 'app-request-manager-demo', template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\" #adapterSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\" #mapperSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; margin-bottom: 2rem;\" *ngIf=\"adapterSelect.value || mapperSelect.value\">\n <div style=\"flex:1\" class=\"box\">\n <h3>Adapter (Incoming)</h3>\n <div *ngIf=\"adapterSelect.value; else NO_ADAPTER\">\n {{ props(adapterSelect.value) | json }}\n </div>\n <ng-template #NO_ADAPTER>No Transformation</ng-template>\n </div>\n <div style=\"flex:1\" class=\"box\">\n <h3>Mapper (Outgoing)</h3>\n <div *ngIf=\"mapperSelect.value; else NO_MAPPER\">\n {{ props(mapperSelect.value) | json }}\n </div>\n <ng-template #NO_MAPPER>No Transformation</ng-template>\n </div>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\" class=\"btn\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"pollingState.checked && !(isPending$ | async)\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(GET$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(POST$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <h3>Include Record ID in the RestPath</h3>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(PUT$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <h3>Include Record ID in the RestPath</h3>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(DELETE$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <!-- <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div> -->\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; padding-top: .5rem;\">AI -<span *ngIf=\"AIType === 1\">STREAMING</span> POST Request</h2>\n <div style=\"display: flex; gap: 1rem;\">\n <button mat-raised-button [matMenuTriggerFor]=\"menu\" style=\"min-width: 120px;\">\n <mat-icon>lan</mat-icon>\n <span *ngIf=\"AIType === 0; else LOCAL\">Server</span>\n <ng-template #LOCAL>\n Local\n </ng-template>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onSelectAIType(0)\">Server</button>\n <button mat-menu-item (click)=\"onSelectAIType(1)\">Local</button>\n </mat-menu>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_AI_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div *ngIf=\"AIType === 1; else ALTERNATIVE\" style=\"color: red;\">\n You must have Ollama active and the 'phi3:latest' model to use this feature.\n </div>\n <ng-template #ALTERNATIVE>\n <span style=\"color: gray;\">\n Define the RestPath to the API endpoint that will handle the AI request.\n Use: 'ai/chat' for server\n </span>\n </ng-template>\n\n <div>\n <div *ngIf=\"(STREAM_AI$ | async) as data\" style=\"margin-top: 1rem; font-size: 1.2rem; border-radius: 1rem; border: black 1px solid; padding: 2rem;\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap; line-height: 1.6rem;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 1.5rem; margin-bottom: 1rem; line-height: 1.5rem;\">\n <mat-divider></mat-divider>\n </div>\n\n <div>\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; margin-bottom: 0; padding-top: .5rem; display: flex;\">\n <div>\n Download File\n </div>\n <div style=\"flex:1; margin-left: 1rem;\">\n <mat-slide-toggle #disable>\n <span *ngIf=\"disable.checked; else DISABLE\">\n Enable\n </span>\n <ng-template #DISABLE>Disable</ng-template>\n </mat-slide-toggle>\n </div>\n </h2>\n <div>\n <app-file-downloader\n [disabled]=\"disable.checked\"\n [delayError]=\"3\"\n [apiRequest]=\"downloadRequest\"\n (completed)=\"onDownloadCompleted()\"\n (failed)=\"onDownloadFailed($event)\"\n ></app-file-downloader>\n </div>\n </div>\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}.box{padding:10px;border:1px solid #ccc}\n"] }]
|
|
308
|
-
}], ctorParameters:
|
|
308
|
+
}], ctorParameters: () => [], propDecorators: { failedState: [{
|
|
309
309
|
type: ViewChild,
|
|
310
310
|
args: ["failedState", { static: true }]
|
|
311
311
|
}], pollingState: [{
|
|
312
312
|
type: ViewChild,
|
|
313
313
|
args: ["pollingState", { static: true }]
|
|
314
314
|
}] } });
|
|
315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1tYW5hZ2VyLWRlbW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItZGVtby9yZXF1ZXN0LW1hbmFnZXItZGVtby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1kZW1vL3JlcXVlc3QtbWFuYWdlci1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDckUsT0FBTyxFQUFhLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDckUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7OztBQU83RixNQUFN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SSxFQUFFO2dCQUNHLFlBQVk7c0JBQXhELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgRU1QVFksIE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJ1xuXG5pbXBvcnQgeyBDbGllbnRJbmZvIH0gZnJvbSAnLi9tb2RlbHMvc2FtcGxlLWNsaWVudC1pbmZvJ1xuaW1wb3J0IHsgQ2xpZW50SW5mb01hcHBlciB9IGZyb20gJy4vbW9kZWxzL3NhbXBsZS1tYXBwZXItY2xpZW50LWluZm8nXG5pbXBvcnQgeyBBSVByb21wdCB9IGZyb20gJy4vbW9kZWxzL3NhbXBsZS1haS1wcm9tcHQnXG5pbXBvcnQgeyBBcGlSZXF1ZXN0LCBIVFRQTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLidcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IFRvYXN0Q29sb3JzLCBUb2FzdERpc3BsYXksIFRvYXN0TWVzc2FnZURpc3BsYXlTZXJ2aWNlIH0gZnJvbSAndG9hc3QtbWVzc2FnZS1kaXNwbGF5J1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVxdWVzdC1tYW5hZ2VyLWRlbW8nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVxdWVzdC1tYW5hZ2VyLWRlbW8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXF1ZXN0LW1hbmFnZXItZGVtby5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0TWFuYWdlckRlbW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGRpc3BsYXllZENvbHVtbnMgPSBbJ2lkJywnbmFtZScsICdsYXN0TmFtZScsICdhZ2UnXVxuXG4gIHByaXZhdGUgZmIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpXG4gIHByaXZhdGUgdG9hc3RNZXNzYWdlID0gaW5qZWN0KFRvYXN0TWVzc2FnZURpc3BsYXlTZXJ2aWNlKVxuXG4gIGh0dHBNYW5hZ2VyU2VydmljZSA9IGluamVjdChIVFRQTWFuYWdlclNlcnZpY2UpXG5cbiAgaXNQZW5kaW5nJCA9IHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmlzUGVuZGluZyRcbiAgY291bnRkb3duJCA9IHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmNvdW50ZG93biRcblxuICBHRVRfZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBQT1NUX2Vycm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcbiAgUFVUX2Vycm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcbiAgREVMRVRFX2Vycm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcblxuICBTVFJFQU1fZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBTVFJFQU1fQUlfZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuXG4gIEdFVCQ/OiBPYnNlcnZhYmxlPGFueT5cbiAgUE9TVCQ/OiBPYnNlcnZhYmxlPGFueT5cbiAgUFVUJD86IE9ic2VydmFibGU8YW55PlxuICBERUxFVEUkPzogT2JzZXJ2YWJsZTxhbnk+XG5cbiAgU1RSRUFNX0FJJD86IE9ic2VydmFibGU8YW55PlxuICBTVFJFQU0kPzogT2JzZXJ2YWJsZTxhbnk+XG5cbiAgcmVxdWVzdFBhcmFtcyA9IHtcbiAgICBHRVQ6IEFwaVJlcXVlc3QuYWRhcHQoKSxcbiAgICBQT1NUOiBBcGlSZXF1ZXN0LmFkYXB0KCksXG4gICAgUFVUOiBBcGlSZXF1ZXN0LmFkYXB0KCksXG4gICAgREVMRVRFOiBBcGlSZXF1ZXN0LmFkYXB0KCksXG4gICAgU1RSRUFNOiBBcGlSZXF1ZXN0LmFkYXB0KCksXG4gIH1cblxuICBAVmlld0NoaWxkKFwiZmFpbGVkU3RhdGVcIiwgeyBzdGF0aWM6IHRydWUgfSkgZmFpbGVkU3RhdGU6IGFueVxuICBAVmlld0NoaWxkKFwicG9sbGluZ1N0YXRlXCIsIHsgc3RhdGljOiB0cnVlIH0pIHBvbGxpbmdTdGF0ZTogYW55XG5cbiAgcXVlc3Rpb25Db250cm9sID0gdGhpcy5mYi5jb250cm9sKFwiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcblxuICBkb3dubG9hZFJlcXVlc3QgPSBBcGlSZXF1ZXN0LmFkYXB0KHtcbiAgICBzZXJ2ZXI6ICdhc3NldHMvaW1hZ2VzJyxcbiAgICBwYXRoOiBbJ21lLmpwZyddLFxuICAgIC8vIHNhdmVBczogJ2pvaG4uanBnJyAvLyBPcHRpb25hbFxuICB9KVxuXG4gIC8vIGRvd25sb2FkUmVxdWVzdCA9IEFwaVJlcXVlc3QuYWRhcHQoe1xuICAvLyAgIHNlcnZlcjogJ29pZGMvYWkvZmlsZSdcbiAgLy8gfSlcblxuICBzYW1wbGVDbGllbnREYXRhID0ge1xuICAgICAgaWQ6IDAsXG4gICAgICBuYW1lOiBcIk9sZCBTY2hvb2wgRGF0ZXNcIixcbiAgICAgIGRvbWFpbjogXCJvc2QuY29tXCIsXG4gICAgICBzZXJ2aWNlOiBcIm9zZFwiLFxuICAgICAgc3BpZmZlOiBcIm9zZC5jb20vb3NkXCIsXG4gICAgICBzZWNyZXQ6IFwiU01PUEVDWFAtT1M0UC1VU09HLVgySUktM1hNRDFGUURSM0lKWFwiLFxuICAgICAgY3JlYXRlZDogMTY5MzAwMzEzOCxcbiAgICAgIG1vZGlmaWVkOiAxNjkzMDAzMTM4LFxuICAgICAgaWNvbjogXCJcIixcbiAgICAgIGltYWdlRmlsZTogXCJcIixcbiAgICAgIGVtYWlsOiBcIndhdmVjb2RlcnNAZ21haWwuY29tXCJcbiAgfVxuXG4gIHJlcXVlc3RGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgcGF0aDogdGhpcy5mYi5jb250cm9sPHN0cmluZz4oXCJhaS9cIiksXG4gICAgaGVhZGVyczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgYWRhcHRlcjogW251bGxdLFxuICAgIG1hcHBlcjogW251bGxdLFxuICAgIHJldHJ5OiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHRpbWVzOiBbM10sXG4gICAgICBkZWxheTogWzNdLFxuICAgIH0pLFxuICAgIHBvbGxpbmc6IFszXSxcbiAgfSlcblxuICBBSVR5cGUgPSAwXG5cbiAgc2FtcGxlQWRhcHRvcnMgPSBbXG4gICAgeyBsYWJlbDogXCJDbGllbnRJbmZvIEJhc2ljXCIsIHZhbHVlOiBDbGllbnRJbmZvLmFkYXB0IH0sXG4gICAgeyBsYWJlbDogXCJBSSBQcm9tcHRcIiwgdmFsdWU6IEFJUHJvbXB0LmFkYXB0IH0sXG4gIF1cblxuICBzYW1wbGVNYXBwZXJzID0gW1xuICAgIHsgbGFiZWw6IFwiTWFwcGVyIEJhc2ljXCIsIHZhbHVlOiBDbGllbnRJbmZvTWFwcGVyLmFkYXB0IH0sXG4gICAgeyBsYWJlbDogXCJBSSBQcm9tcHRcIiwgdmFsdWU6IEFJUHJvbXB0LmFkYXB0IH0sXG4gIF1cblxuICBnZXQgcmV0cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEZvcm0uZ2V0KCdyZXRyeScpPy52YWx1ZVxuICB9XG5cbiAgZ2V0IGhlYWRlcnMoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Rm9ybS5nZXQoJ2hlYWRlcnMnKSBhcyBGb3JtQXJyYXlcbiAgfVxuXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHRoaXMucmVxdWVzdEZvcm0ubWFya0FsbEFzVG91Y2hlZCgpXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEZvcm0udmFsaWRcbiAgfVxuXG4gIGhhc0lkID0gKGFycjogYW55W10pID0+IHtcbiAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuICFpc05hTihhcnJbYXJyLmxlbmd0aCAtIDFdKVxuICB9XG5cbiAgcHJvcHMgPSAoYWRhcHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIChhZGFwdGVyKSA/IGFkYXB0ZXIoKSA6IG51bGxcbiAgfVxuXG4gIC8vIHNlcnZlciA9IGBodHRwOi8vc2FtcGxlLWVuZHBvaW50L2FzL2F1dGhvcml6YXRpb24ub2F1dGgyYFxuXG4gIGFycmF5T2JqZWN0c1RvT2JqZWN0cyA9IChhcnI6IGFueVtdKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSA/IGFyci5yZWR1Y2UoKG9iaiwgaXRlbSkgPT4gT2JqZWN0LmFzc2lnbihvYmosIHsgW2l0ZW0ua2V5XTogaXRlbS52YWx1ZSB9KSwge30pIDoge31cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICAvLyBjb25zdCByZXFHZXQyID0gQXBpUmVxdWVzdC5hZGFwdCh7XG4gICAgLy8gICBzZXJ2ZXIsXG4gICAgLy8gICBwYXRoOiBbJ2NsaWVudHMnXSxcbiAgICAvLyAgIGhlYWRlcnM6IHsgYXV0aGVudGljYXRpb246IFwiQmVhcmVyIDxLRVk+XCIgfSxcbiAgICAvLyAgIGFkYXB0ZXI6IENsaWVudEluZm8sXG4gICAgLy8gICBkYXRhVHlwZTogRGF0YVR5cGUuT0JKRUNULFxuICAgIC8vICAgLy8gY29uY3VycmVudDogZmFsc2UsXG4gICAgLy8gICAvLyBwb2xsaW5nOiAzLCAvL3NlY29uZHNcbiAgICAvLyB9KVxuXG4gICAgLy8gY29uc3QgcmVxMiA9IFsxMDI0LDEwMjUsMTAyNl0ubWFwKGl0ZW0gPT4ge1xuICAgIC8vICAgcmV0dXJuIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmdldFJlcXVlc3Q8Q2xpZW50SW5mb1tdPihyZXFHZXQyLCBbaXRlbV0pXG4gICAgLy8gICAucGlwZShcbiAgICAvLyAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgLy8gICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGVycm9yLmVycm9yLm1lc3NhZ2UpKVxuICAgIC8vICAgICB9KVxuICAgIC8vICAgKVxuICAgIC8vIH0pXG5cbiAgICAvLyBmb3JrSm9pbihyZXEyKVxuICAgIC8vIC5zdWJzY3JpYmUocmVzID0+IGNvbnNvbGUubG9nKHJlcykpXG5cbiAgfVxuXG4gIGFkZEhlYWRlcigpIHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGtleTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHZhbHVlOiBbJyddXG4gICAgfSlcbiAgICB0aGlzLmhlYWRlcnMucHVzaChoZWFkZXIpXG4gIH1cblxuICByZW1vdmVIZWFkZXIoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuaGVhZGVycy5yZW1vdmVBdChpbmRleClcbiAgfVxuXG4gIGNvbXBpbGVSZXF1ZXN0KCkge1xuXG4gICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IHRoaXMucmVxdWVzdEZvcm0udmFsdWVcblxuICAgIHJlcXVlc3RQYXJhbXMuaGVhZGVycyA9IHRoaXMuYXJyYXlPYmplY3RzVG9PYmplY3RzKFxuICAgICAgcmVxdWVzdFBhcmFtcy5oZWFkZXJzIHx8IFtdXG4gICAgKVxuXG4gICAgY29uc3QgcGF0aFJlcSA9IChyZXF1ZXN0UGFyYW1zLnBhdGggPT09IFwiXCIpID8gW10gOiAocmVxdWVzdFBhcmFtcy5wYXRoIHx8IFwiXCIpLnNwbGl0KFwiL1wiKVxuXG4gICAgaWYgKCF0aGlzLnBvbGxpbmdTdGF0ZS5jaGVja2VkKSByZXF1ZXN0UGFyYW1zLnBvbGxpbmcgPSAwXG5cbiAgICBpZiAoIXRoaXMuZmFpbGVkU3RhdGUuY2hlY2tlZCkge1xuICAgICAgcmVxdWVzdFBhcmFtcy5yZXRyeSA9IHsgdGltZXM6IDAsZGVsYXk6IDAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFwaU9wdGlvbnMgPSBBcGlSZXF1ZXN0LmFkYXB0KHJlcXVlc3RQYXJhbXMpXG4gICAgYXBpT3B0aW9ucy5wYXRoID0gW11cblxuICAgIHJldHVybiB7IGFwaU9wdGlvbnM6IGFwaU9wdGlvbnMsIHBhdGg6IHBhdGhSZXEgfVxuXG4gIH1cblxuICBvbkdldFJlcXVlc3QoKSB7XG5cbiAgICBpZighdGhpcy5pc1ZhbGlkKSByZXR1cm5cblxuICAgIGNvbnN0IHJlcVBhcmFtcyA9IHRoaXMuY29tcGlsZVJlcXVlc3QoKVxuXG4gICAgdGhpcy5yZXF1ZXN0UGFyYW1zLkdFVCA9IHJlcVBhcmFtcy5hcGlPcHRpb25zXG5cbiAgICB0aGlzLkdFVCQgPSBFTVBUWSAvL0NhbmNlbHMgUHJldmlvdXNcbiAgICB0aGlzLkdFVF9lcnJvciQubmV4dCgnJylcblxuICAgIHRoaXMuR0VUJCA9IHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmdldFJlcXVlc3Q8Q2xpZW50SW5mb1tdPihyZXFQYXJhbXMuYXBpT3B0aW9ucywgcmVxUGFyYW1zLnBhdGgpXG4gICAgLnBpcGUoXG4gICAgICAvLyB0YXAoKGRhdGEpID0+IGNvbnNvbGUubG9nKFwiQVBJIEdFVCByZXNwb25zZVwiLCBkYXRhKSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gdGhpcy5lcnJvckhhbmRsaW5nKGVycm9yLCAnR0VUJykpXG4gICAgICB9KVxuICAgIClcblxuICB9XG5cbiAgb25DcmVhdGVSZXF1ZXN0KCkge1xuXG4gICAgaWYoIXRoaXMuaXNWYWxpZCkgcmV0dXJuXG5cbiAgICBjb25zdCByZXFQYXJhbXMgPSB0aGlzLmNvbXBpbGVSZXF1ZXN0KClcbiAgICB0aGlzLnJlcXVlc3RQYXJhbXMuUE9TVCA9IHJlcVBhcmFtcy5hcGlPcHRpb25zXG5cbiAgICB0aGlzLlBPU1QkID0gRU1QVFkgLy9DYW5jZWxzIFByZXZpb3VzXG4gICAgdGhpcy5QT1NUX2Vycm9yJC5uZXh0KCcnKVxuXG4gICAgY29uc29sZS5sb2coXCJQT1NUXCIsIHRoaXMuc2FtcGxlQ2xpZW50RGF0YSlcbiAgICBjb25zb2xlLmxvZyhcIlBPU1RcIiwgcmVxUGFyYW1zLmFwaU9wdGlvbnMpXG4gICAgY29uc29sZS5sb2coXCJQT1NUXCIsIHJlcVBhcmFtcy5wYXRoKVxuXG4gICAgdGhpcy5QT1NUJCA9IHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLnBvc3RSZXF1ZXN0PENsaWVudEluZm8+KHRoaXMuc2FtcGxlQ2xpZW50RGF0YSwgcmVxUGFyYW1zLmFwaU9wdGlvbnMsIHJlcVBhcmFtcy5wYXRoKVxuICAgIC5waXBlKFxuICAgICAgLy8gdGFwKChkYXRhKSA9PiBjb25zb2xlLmxvZyhcIkFQSSBQT1NUIHJlc3BvbnNlXCIsIGRhdGEpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZXJyb3IsICdQT1NUJykpXG4gICAgICB9KVxuICAgIClcblxuICB9XG5cbiAgb25VcGRhdGVSZXF1ZXN0KCkge1xuXG4gICAgaWYoIXRoaXMuaXNWYWxpZCkgcmV0dXJuXG5cbiAgICBjb25zdCByZXFQYXJhbXMgPSB0aGlzLmNvbXBpbGVSZXF1ZXN0KClcblxuICAgIGlmKCF0aGlzLmhhc0lkKHJlcVBhcmFtcy5wYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coXCJNaXNzaW5nIElEXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnNhbXBsZUNsaWVudERhdGEuaWQgPSBwYXJzZUludChyZXFQYXJhbXMucGF0aFtyZXFQYXJhbXMucGF0aC5sZW5ndGgtMV0pXG4gICAgdGhpcy5yZXF1ZXN0UGFyYW1zLlBVVCA9IHJlcVBhcmFtcy5hcGlPcHRpb25zXG5cbiAgICB0aGlzLlBVVCQgPSBFTVBUWSAvL0NhbmNlbHMgUHJldmlvdXNcbiAgICB0aGlzLlBVVF9lcnJvciQubmV4dCgnJylcblxuICAgIHRoaXMuUFVUJCA9IHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLnB1dFJlcXVlc3Q8YW55Pih0aGlzLnNhbXBsZUNsaWVudERhdGEsIHJlcVBhcmFtcy5hcGlPcHRpb25zLCByZXFQYXJhbXMucGF0aClcbiAgICAucGlwZShcbiAgICAgIC8vIHRhcCgoZGF0YSkgPT4gY29uc29sZS5sb2coXCJBUEkgUFVUIHJlc3BvbnNlXCIsIGRhdGEpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZXJyb3IsICdQVVQnKSlcbiAgICAgIH0pXG4gICAgKVxuXG4gIH1cblxuICBvbkRlbGV0ZVJlcXVlc3QoKSB7XG5cbiAgICBpZighdGhpcy5pc1ZhbGlkKSByZXR1cm5cblxuICAgIGNvbnN0IHJlcVBhcmFtcyA9IHRoaXMuY29tcGlsZVJlcXVlc3QoKVxuICAgIHRoaXMucmVxdWVzdFBhcmFtcy5ERUxFVEUgPSByZXFQYXJhbXMuYXBpT3B0aW9uc1xuXG4gICAgaWYoIXRoaXMuaGFzSWQocmVxUGFyYW1zLnBhdGgpKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk1pc3NpbmcgSURcIilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2FtcGxlQ2xpZW50RGF0YS5pZCA9IHBhcnNlSW50KHJlcVBhcmFtcy5wYXRoW3JlcVBhcmFtcy5wYXRoLmxlbmd0aC0xXSlcbiAgICB0aGlzLnJlcXVlc3RQYXJhbXMuREVMRVRFID0gcmVxUGFyYW1zLmFwaU9wdGlvbnNcblxuICAgIHRoaXMuREVMRVRFJCA9IEVNUFRZIC8vQ2FuY2VscyBQcmV2aW91c1xuICAgIHRoaXMuREVMRVRFX2Vycm9yJC5uZXh0KCcnKVxuXG4gICAgdGhpcy5ERUxFVEUkID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuZGVsZXRlUmVxdWVzdDxDbGllbnRJbmZvPihyZXFQYXJhbXMuYXBpT3B0aW9ucywgcmVxUGFyYW1zLnBhdGgpXG4gICAgLnBpcGUoXG4gICAgICAvLyB0YXAoKGRhdGEpID0+IGNvbnNvbGUubG9nKFwiQVBJIERFTEVURSByZXNwb25zZVwiLCBkYXRhKSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gdGhpcy5lcnJvckhhbmRsaW5nKGVycm9yLCAnREVMRVRFJykpXG4gICAgICB9KVxuICAgIClcblxuICB9XG5cbiAgb25TdHJlYW1Qb3N0UmVxdWVzdCgpIHtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm5cblxuICAgIGNvbnN0IHJlcVBhcmFtcyA9IHRoaXMuY29tcGlsZVJlcXVlc3QoKVxuXG4gICAgbGV0IHBheWxvYWQgPSB7fVxuICAgIGxldCBhcGlQYXRoOiBzdHJpbmdbXSA9IHJlcVBhcmFtcy5wYXRoXG4gICAgbGV0IGFwaU9wdGlvbnMgPSByZXFQYXJhbXMuYXBpT3B0aW9uc1xuICAgIGxldCByZXNwb25zZU1hcHBlcjogKGl0ZW1zOiBhbnkpID0+IGFueSA9IChpdGVtcykgPT4gaXRlbXMucmVzcG9uc2VcblxuICAgIGlmICh0aGlzLkFJVHlwZSA9PT0gMCkge1xuXG4gICAgICAvLyBBUEkgcmVxdWVzdFxuICAgICAgcGF5bG9hZCA9IHsgcHJvbXB0OiB0aGlzLnF1ZXN0aW9uQ29udHJvbC52YWx1ZSB9XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICAvLyBMb2NhbCBPbGxhbWEgcmVxdWVzdFxuICAgICAgYXBpT3B0aW9ucy5zZXJ2ZXIgPSBcImFwaVwiXG4gICAgICBhcGlQYXRoID0gW1wiZ2VuZXJhdGVcIl1cbiAgICAgIGFwaU9wdGlvbnMuc3RyZWFtID0gdHJ1ZVxuICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgbW9kZWw6IFwicGhpMzpsYXRlc3RcIixcbiAgICAgICAgcHJvbXB0OiB0aGlzLnF1ZXN0aW9uQ29udHJvbC52YWx1ZSxcbiAgICAgICAgc3RyZWFtOiB0cnVlLFxuICAgICAgfVxuXG4gICAgICByZXNwb25zZU1hcHBlciA9IChpdGVtcykgPT4gaXRlbXMubWFwKCh3b3JkOiBhbnkpID0+IHdvcmQucmVzcG9uc2UpLmZsYXQoKS5qb2luKCcnKVxuXG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0UGFyYW1zLlNUUkVBTSA9IGFwaU9wdGlvbnNcbiAgICB0aGlzLlNUUkVBTV9BSSQgPSBFTVBUWVxuICAgIHRoaXMuU1RSRUFNX0FJX2Vycm9yJC5uZXh0KCcnKVxuXG4gICAgdGhpcy5TVFJFQU1fQUkkID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UucG9zdFJlcXVlc3Q8YW55PihwYXlsb2FkLCBhcGlPcHRpb25zLCBhcGlQYXRoKS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlTWFwcGVyKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnF1ZXN0aW9uQ29udHJvbC5yZXNldCgpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZXJyb3IsICdTVFJFQU0nKSkpXG4gICAgKVxuXG4gIH1cblxuXG4gIG9uU3RyZWFtUmVxdWVzdCgpIHtcblxuICAgIGlmKCF0aGlzLmlzVmFsaWQpIHJldHVyblxuXG4gICAgY29uc3QgcmVxUGFyYW1zID0gdGhpcy5jb21waWxlUmVxdWVzdCgpXG5cbiAgICByZXFQYXJhbXMuYXBpT3B0aW9ucy5zdHJlYW0gPSB0cnVlXG5cbiAgICB0aGlzLnJlcXVlc3RQYXJhbXMuR0VUID0gcmVxUGFyYW1zLmFwaU9wdGlvbnNcbiAgICB0aGlzLlNUUkVBTSQgPSB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5nZXRSZXF1ZXN0PENsaWVudEluZm9bXT4ocmVxUGFyYW1zLmFwaU9wdGlvbnMsIHJlcVBhcmFtcy5wYXRoKVxuICAgICAgICAucGlwZShcbiAgICAgIC8vIHRhcCgoZGF0YSkgPT4gY29uc29sZS5sb2coXCJBUEkgU1RSRUFNIHJlc3BvbnNlXCIsIGRhdGEpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZXJyb3IsICdTVFJFQU0nKSlcbiAgICAgIH0pXG4gICAgKVxuXG4gIH1cblxuICBvbkRvd25sb2FkQ29tcGxldGVkKCkge1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IFwiRG93bmxvYWQgQ29tcGxldGVkXCJcblxuICAgIGNvbnN0IGRpc3BsYXkgPSBUb2FzdERpc3BsYXkuYWRhcHQoe1xuICAgICAgbWVzc2FnZSxcbiAgICAgIGFjdGlvbjogJ09rJyxcbiAgICAgIGNvbG9yOiBUb2FzdENvbG9ycy5TVUNDRVNTLFxuICAgICAgaWNvbjogJ3NlbnRpbWVudF9zYXRpc2ZpZWRfYWx0JyxcbiAgICB9KVxuXG4gICAgdGhpcy50b2FzdE1lc3NhZ2UudG9hc3RNZXNzYWdlKGRpc3BsYXkpXG4gIH1cblxuICBvbkRvd25sb2FkRmFpbGVkKGVycjogc3RyaW5nKSB7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gXCJEb3dubG9hZCBGYWlsZWRcIlxuXG4gICAgY29uc3QgZGlzcGxheSA9IFRvYXN0RGlzcGxheS5hZGFwdCh7XG4gICAgICBtZXNzYWdlLFxuICAgICAgYWN0aW9uOiAnT2snLFxuICAgICAgY29sb3I6IFRvYXN0Q29sb3JzLkVSUk9SLFxuICAgICAgaWNvbjogJ3dhcm5pbmcnLFxuICAgIH0pXG5cbiAgICB0aGlzLnRvYXN0TWVzc2FnZS50b2FzdE1lc3NhZ2UoZGlzcGxheSlcbiAgfVxuXG4gIGVycm9ySGFuZGxpbmcoZXJyOiBhbnksIHR5cGU6IHN0cmluZykge1xuICAgIGlmKHR5cGUgPT09ICdHRVQnKSB0aGlzLkdFVF9lcnJvciQubmV4dChlcnIubWVzc2FnZSlcbiAgICBpZih0eXBlID09PSAnUE9TVCcpIHRoaXMuUE9TVF9lcnJvciQubmV4dChlcnIubWVzc2FnZSlcbiAgICBpZih0eXBlID09PSAnUFVUJykgdGhpcy5QVVRfZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ0RFTEVURScpIHRoaXMuREVMRVRFX2Vycm9yJC5uZXh0KGVyci5tZXNzYWdlKVxuICAgIGlmKHR5cGUgPT09ICdTVFJFQU0nKSB0aGlzLlNUUkVBTV9lcnJvciQubmV4dChlcnIubWVzc2FnZSlcbiAgfVxuXG4gIG9uU2VsZWN0QUlUeXBlKHR5cGU6IG51bWJlcikge1xuICAgIHRoaXMuQUlUeXBlID0gdHlwZVxuICB9XG5cbn1cbiIsIjxkaXYgc3R5bGU9XCJtYXJnaW46IDJyZW07XCI+XG5cbiAgPGgyPlxuICAgIEhUVFAgUmVxdWVzdCBNYW5hZ2VyXG4gIDwvaDI+XG5cbiAgPGRpdiBbZm9ybUdyb3VwXT1cInJlcXVlc3RGb3JtXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtO1wiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IC41cmVtXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5BZGFwdGVyIChNb2RlbCk8L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiYWRhcHRlclwiICNhZGFwdGVyU2VsZWN0PlxuICAgICAgICAgIDxtYXQtb3B0aW9uPk5vbmU8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGFkYXB0ZXIgb2Ygc2FtcGxlQWRhcHRvcnNcIiBbdmFsdWVdPVwiYWRhcHRlci52YWx1ZVwiPlxuICAgICAgICAgICAge3thZGFwdGVyLmxhYmVsfX1cbiAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5NYXBwZXIgKE1vZGVsKTwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtYXBwZXJcIiAjbWFwcGVyU2VsZWN0PlxuICAgICAgICAgIDxtYXQtb3B0aW9uPk5vbmU8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1hcHBlciBvZiBzYW1wbGVNYXBwZXJzXCIgW3ZhbHVlXT1cIm1hcHBlci52YWx1ZVwiPlxuICAgICAgICAgICAge3ttYXBwZXIubGFiZWx9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgbWFyZ2luLWJvdHRvbTogMnJlbTtcIiAqbmdJZj1cImFkYXB0ZXJTZWxlY3QudmFsdWUgfHwgbWFwcGVyU2VsZWN0LnZhbHVlXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxXCIgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgPGgzPkFkYXB0ZXIgKEluY29taW5nKTwvaDM+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJhZGFwdGVyU2VsZWN0LnZhbHVlOyBlbHNlIE5PX0FEQVBURVJcIj5cbiAgICAgICAgICB7eyBwcm9wcyhhZGFwdGVyU2VsZWN0LnZhbHVlKSB8IGpzb24gfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjTk9fQURBUFRFUj5ObyBUcmFuc2Zvcm1hdGlvbjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjFcIiBjbGFzcz1cImJveFwiPlxuICAgICAgICA8aDM+TWFwcGVyIChPdXRnb2luZyk8L2gzPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibWFwcGVyU2VsZWN0LnZhbHVlOyBlbHNlIE5PX01BUFBFUlwiPlxuICAgICAgICAgIHt7IHByb3BzKG1hcHBlclNlbGVjdC52YWx1ZSkgfCBqc29uIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctdGVtcGxhdGUgI05PX01BUFBFUj5ObyBUcmFuc2Zvcm1hdGlvbjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+UmVzdFBhdGggKC8gZGVsaW1pdGVkKTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJjbGllbnRzL2xpc3RcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXRoXCI+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJoZWFkZXJzXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhc2sgb2YgaGVhZGVycy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAuNXJlbVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+S2V5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cImF1dGhlbnRpY2F0aW9uXCIgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCI+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3R5bGU9XCJmbGV4OjFcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJzYW1wbGVcIiBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlbW92ZUhlYWRlcihpKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJhZGRIZWFkZXIoKVwiIGNsYXNzPVwiYnRuXCI+QWRkIEhlYWRlcjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47IGdhcDogMXJlbTtcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNmYWlsZWRTdGF0ZT5SZXRyeSBvbiBGYWlsZWQ8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmYWlsZWRTdGF0ZS5jaGVja2VkXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IC41cmVtOyBtYXJnaW4tdG9wOiAxcmVtO1wiIGZvcm1Hcm91cE5hbWU9XCJyZXRyeVwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD4jb2YgVGltZXM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aW1lc1wiIHZhbHVlPVwiM1wiPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPkRlbGF5IFVudGlsIE5leHQ8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJkZWxheVwiIHZhbHVlPVwiM1wiPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSAjcG9sbGluZ1N0YXRlPlBvbGxpbmc8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJwb2xsaW5nU3RhdGUuY2hlY2tlZFwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbVwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD4jb2YgU2Vjb25kczwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cInBvbGxpbmdcIiB2YWx1ZT1cIjNcIj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMXJlbTsgbWFyZ2luLXRvcDogMnJlbTtcIj5cbiAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAqbmdJZj1cIihpc1BlbmRpbmckIHwgYXN5bmMpXCJcbiAgICA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJkZXRlcm1pbmF0ZVwiXG4gICAgICAqbmdJZj1cInBvbGxpbmdTdGF0ZS5jaGVja2VkICYmICEoaXNQZW5kaW5nJCB8IGFzeW5jKVwiXG4gICAgICBbdmFsdWVdPVwiKHRoaXMuY291bnRkb3duJCB8IGFzeW5jKVwiXG4gICAgPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW1cIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZsZXg6MVwiPkdFVCBSZXF1ZXN0PC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uR2V0UmVxdWVzdCgpXCIgY2xhc3M9XCJidG5cIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIoR0VUX2Vycm9yJCB8IGFzeW5jKSBhcyBnZXRfZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBnZXRfZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiICpuZ0lmPVwiKEdFVCQgfCBhc3luYykgYXMgZGF0YVJlY29yZFwiPlxuICAgICAgPCEtLSA8ZGl2IFtpbm5lckhUTUxdPVwiKEdFVCQgfCBhc3luYykgfCBqc29udlwiPjwvZGl2PiAtLT5cbiAgICAgIHt7IGRhdGFSZWNvcmQgfCBqc29uIH19XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZsZXg6MVwiPlBPU1QgUmVxdWVzdDwvaDI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJvbkNyZWF0ZVJlcXVlc3QoKVwiIGNsYXNzPVwiYnRuXCI+UmVxdWVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKFBPU1RfZXJyb3IkIHwgYXN5bmMpIGFzIHBvc3RfZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBwb3N0X2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIiAqbmdJZj1cIihQT1NUJCB8IGFzeW5jKSBhcyBkYXRhUmVjb3JkXCI+XG4gICAgICA8IS0tIDxkaXYgW2lubmVySFRNTF09XCIoUE9TVCQgfCBhc3luYykgfCBqc29udlwiPjwvZGl2PiAtLT5cbiAgICAgIHt7IGRhdGFSZWNvcmQgfCBqc29uIH19XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZsZXg6MVwiPlBVVCBSZXF1ZXN0PC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uVXBkYXRlUmVxdWVzdCgpXCIgY2xhc3M9XCJidG5cIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIoUFVUX2Vycm9yJCB8IGFzeW5jKSBhcyBwdXRfZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBwdXRfZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L2Rpdj5cblxuICAgIDxoMz5JbmNsdWRlIFJlY29yZCBJRCBpbiB0aGUgUmVzdFBhdGg8L2gzPlxuXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCIgKm5nSWY9XCIoUFVUJCB8IGFzeW5jKSBhcyBkYXRhUmVjb3JkXCI+XG4gICAgICA8IS0tIDxkaXYgW2lubmVySFRNTF09XCIoUFVUJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAgIHt7IGRhdGFSZWNvcmQgfCBqc29uIH19XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZsZXg6MVwiPkRFTEVURSBSZXF1ZXN0PC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uRGVsZXRlUmVxdWVzdCgpXCIgY2xhc3M9XCJidG5cIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxoMz5JbmNsdWRlIFJlY29yZCBJRCBpbiB0aGUgUmVzdFBhdGg8L2gzPlxuXG4gICAgPGRpdiAqbmdJZj1cIihERUxFVEVfZXJyb3IkIHwgYXN5bmMpIGFzIGRlbGV0ZV9lcnJvclwiIHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07XCI+XG4gICAgICA8bWF0LWVycm9yPnt7IGRlbGV0ZV9lcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCIgKm5nSWY9XCIoREVMRVRFJCB8IGFzeW5jKSBhcyBkYXRhUmVjb3JkXCI+XG4gICAgICA8IS0tIDxkaXYgW2lubmVySFRNTF09XCIoREVMRVRFJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAge3sgZGF0YVJlY29yZCB8IGpzb24gfX1cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxXCI+U3RyZWFtaW5nIEdFVCBSZXF1ZXN0PC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uU3RyZWFtUmVxdWVzdCgpXCIgY2xhc3M9XCJidG5cIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gPGRpdiAqbmdJZj1cIihTVFJFQU1fZXJyb3IkIHwgYXN5bmMpIGFzIHN0cmVhbV9lcnJvclwiIHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07XCI+XG4gICAgICA8bWF0LWVycm9yPnt7IHN0cmVhbV9lcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIDwvZGl2PiAtLT5cblxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxuICAgICAgPGRpdiAqbmdJZj1cIihTVFJFQU0kIHwgYXN5bmMpIGFzIGRhdGFcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImlkXCI+XG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBJRCA8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LmlkfX0gPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibmFtZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRmlyc3QgTmFtZSA8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Lm5hbWV9fSA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYXN0TmFtZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gTGFzdCBOYW1lIDwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQubGFzdE5hbWV9fSA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhZ2VcIj5cbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFnZSA8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LmFnZX19IDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxOyBwYWRkaW5nLXRvcDogLjVyZW07XCI+QUkgLTxzcGFuICpuZ0lmPVwiQUlUeXBlID09PSAxXCI+U1RSRUFNSU5HPC9zcGFuPiBQT1NUIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMXJlbTtcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiIHN0eWxlPVwibWluLXdpZHRoOiAxMjBweDtcIj5cbiAgICAgICAgICA8bWF0LWljb24+bGFuPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiQUlUeXBlID09PSAwOyBlbHNlIExPQ0FMXCI+U2VydmVyPC9zcGFuPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNMT0NBTD5cbiAgICAgICAgICAgICAgTG9jYWxcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvblNlbGVjdEFJVHlwZSgwKVwiPlNlcnZlcjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25TZWxlY3RBSVR5cGUoMSlcIj5Mb2NhbDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uU3RyZWFtUG9zdFJlcXVlc3QoKVwiIGNsYXNzPVwiYnRuXCI+QXNrIE1lPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwiZmxleDoxXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+QXNrIG1lIGEgUXVlc3Rpb248L21hdC1sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiV2h5IGlzIHRoZSBza3kgYmx1ZT9cIiBbZm9ybUNvbnRyb2xdPVwicXVlc3Rpb25Db250cm9sXCI+PC90ZXh0YXJlYT5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKFNUUkVBTV9BSV9lcnJvciQgfCBhc3luYykgYXMgc3RyZWFtX2Vycm9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgIDxtYXQtZXJyb3I+e3sgc3RyZWFtX2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiQUlUeXBlID09PSAxOyBlbHNlIEFMVEVSTkFUSVZFXCIgc3R5bGU9XCJjb2xvcjogcmVkO1wiPlxuICAgICAgWW91IG11c3QgaGF2ZSBPbGxhbWEgYWN0aXZlIGFuZCB0aGUgJ3BoaTM6bGF0ZXN0JyBtb2RlbCB0byB1c2UgdGhpcyBmZWF0dXJlLlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjQUxURVJOQVRJVkU+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiBncmF5O1wiPlxuICAgICAgICBEZWZpbmUgdGhlIFJlc3RQYXRoIHRvIHRoZSBBUEkgZW5kcG9pbnQgdGhhdCB3aWxsIGhhbmRsZSB0aGUgQUkgcmVxdWVzdC5cbiAgICAgICAgVXNlOiAnYWkvY2hhdCcgZm9yIHNlcnZlclxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8ZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIihTVFJFQU1fQUkkIHwgYXN5bmMpIGFzIGRhdGFcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07IGZvbnQtc2l6ZTogMS4ycmVtOyBib3JkZXItcmFkaXVzOiAxcmVtOyBib3JkZXI6IGJsYWNrIDFweCBzb2xpZDsgcGFkZGluZzogMnJlbTtcIj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAuNXJlbTsgd2hpdGUtc3BhY2U6cHJlLXdyYXA7IGxpbmUtaGVpZ2h0OiAxLjZyZW07XCI+e3tkYXRhfX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMS41cmVtOyBtYXJnaW4tYm90dG9tOiAxcmVtOyBsaW5lLWhlaWdodDogMS41cmVtO1wiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxOyBtYXJnaW4tYm90dG9tOiAwOyBwYWRkaW5nLXRvcDogLjVyZW07IGRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgRG93bmxvYWQgRmlsZVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MTsgbWFyZ2luLWxlZnQ6IDFyZW07XCI+XG4gICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgI2Rpc2FibGU+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRpc2FibGUuY2hlY2tlZDsgZWxzZSBESVNBQkxFXCI+XG4gICAgICAgICAgICAgIEVuYWJsZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNESVNBQkxFPkRpc2FibGU8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGFwcC1maWxlLWRvd25sb2FkZXJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZS5jaGVja2VkXCJcbiAgICAgICAgICBbZGVsYXlFcnJvcl09XCIzXCJcbiAgICAgICAgICBbYXBpUmVxdWVzdF09XCJkb3dubG9hZFJlcXVlc3RcIlxuICAgICAgICAgIChjb21wbGV0ZWQpPVwib25Eb3dubG9hZENvbXBsZXRlZCgpXCJcbiAgICAgICAgICAoZmFpbGVkKT1cIm9uRG93bmxvYWRGYWlsZWQoJGV2ZW50KVwiXG4gICAgICAgID48L2FwcC1maWxlLWRvd25sb2FkZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuIl19
|
|
315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1tYW5hZ2VyLWRlbW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItZGVtby9yZXF1ZXN0LW1hbmFnZXItZGVtby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1kZW1vL3JlcXVlc3QtbWFuYWdlci1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDckUsT0FBTyxFQUFhLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDckUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7OztBQU83RixNQUFN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QUFXO3NCQUF0RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0csWUFBWTtzQkFBeEQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBFTVBUWSwgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5cbmltcG9ydCB7IENsaWVudEluZm8gfSBmcm9tICcuL21vZGVscy9zYW1wbGUtY2xpZW50LWluZm8nXG5pbXBvcnQgeyBDbGllbnRJbmZvTWFwcGVyIH0gZnJvbSAnLi9tb2RlbHMvc2FtcGxlLW1hcHBlci1jbGllbnQtaW5mbydcbmltcG9ydCB7IEFJUHJvbXB0IH0gZnJvbSAnLi9tb2RlbHMvc2FtcGxlLWFpLXByb21wdCdcbmltcG9ydCB7IEFwaVJlcXVlc3QsIEhUVFBNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uJ1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHsgVG9hc3RDb2xvcnMsIFRvYXN0RGlzcGxheSwgVG9hc3RNZXNzYWdlRGlzcGxheVNlcnZpY2UgfSBmcm9tICd0b2FzdC1tZXNzYWdlLWRpc3BsYXknXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXF1ZXN0LW1hbmFnZXItZGVtbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXF1ZXN0LW1hbmFnZXItZGVtby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlcXVlc3QtbWFuYWdlci1kZW1vLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFJlcXVlc3RNYW5hZ2VyRGVtb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgZGlzcGxheWVkQ29sdW1ucyA9IFsnaWQnLCduYW1lJywgJ2xhc3ROYW1lJywgJ2FnZSddXG5cbiAgcHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcilcbiAgcHJpdmF0ZSB0b2FzdE1lc3NhZ2UgPSBpbmplY3QoVG9hc3RNZXNzYWdlRGlzcGxheVNlcnZpY2UpXG5cbiAgaHR0cE1hbmFnZXJTZXJ2aWNlID0gaW5qZWN0KEhUVFBNYW5hZ2VyU2VydmljZSlcblxuICBpc1BlbmRpbmckID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuaXNQZW5kaW5nJFxuICBjb3VudGRvd24kID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuY291bnRkb3duJFxuXG4gIEdFVF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIFBPU1RfZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBQVVRfZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBERUxFVEVfZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuXG4gIFNUUkVBTV9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIFNUUkVBTV9BSV9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG5cbiAgR0VUJD86IE9ic2VydmFibGU8YW55PlxuICBQT1NUJD86IE9ic2VydmFibGU8YW55PlxuICBQVVQkPzogT2JzZXJ2YWJsZTxhbnk+XG4gIERFTEVURSQ/OiBPYnNlcnZhYmxlPGFueT5cblxuICBTVFJFQU1fQUkkPzogT2JzZXJ2YWJsZTxhbnk+XG4gIFNUUkVBTSQ/OiBPYnNlcnZhYmxlPGFueT5cblxuICByZXF1ZXN0UGFyYW1zID0ge1xuICAgIEdFVDogQXBpUmVxdWVzdC5hZGFwdCgpLFxuICAgIFBPU1Q6IEFwaVJlcXVlc3QuYWRhcHQoKSxcbiAgICBQVVQ6IEFwaVJlcXVlc3QuYWRhcHQoKSxcbiAgICBERUxFVEU6IEFwaVJlcXVlc3QuYWRhcHQoKSxcbiAgICBTVFJFQU06IEFwaVJlcXVlc3QuYWRhcHQoKSxcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoXCJmYWlsZWRTdGF0ZVwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBmYWlsZWRTdGF0ZTogYW55XG4gIEBWaWV3Q2hpbGQoXCJwb2xsaW5nU3RhdGVcIiwgeyBzdGF0aWM6IHRydWUgfSkgcG9sbGluZ1N0YXRlOiBhbnlcblxuICBxdWVzdGlvbkNvbnRyb2wgPSB0aGlzLmZiLmNvbnRyb2woXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuXG4gIGRvd25sb2FkUmVxdWVzdCA9IEFwaVJlcXVlc3QuYWRhcHQoe1xuICAgIHNlcnZlcjogJ2Fzc2V0cy9pbWFnZXMnLFxuICAgIHBhdGg6IFsnbWUuanBnJ10sXG4gICAgLy8gc2F2ZUFzOiAnam9obi5qcGcnIC8vIE9wdGlvbmFsXG4gIH0pXG5cbiAgLy8gZG93bmxvYWRSZXF1ZXN0ID0gQXBpUmVxdWVzdC5hZGFwdCh7XG4gIC8vICAgc2VydmVyOiAnb2lkYy9haS9maWxlJ1xuICAvLyB9KVxuXG4gIHNhbXBsZUNsaWVudERhdGEgPSB7XG4gICAgICBpZDogMCxcbiAgICAgIG5hbWU6IFwiT2xkIFNjaG9vbCBEYXRlc1wiLFxuICAgICAgZG9tYWluOiBcIm9zZC5jb21cIixcbiAgICAgIHNlcnZpY2U6IFwib3NkXCIsXG4gICAgICBzcGlmZmU6IFwib3NkLmNvbS9vc2RcIixcbiAgICAgIHNlY3JldDogXCJTTU9QRUNYUC1PUzRQLVVTT0ctWDJJSS0zWE1EMUZRRFIzSUpYXCIsXG4gICAgICBjcmVhdGVkOiAxNjkzMDAzMTM4LFxuICAgICAgbW9kaWZpZWQ6IDE2OTMwMDMxMzgsXG4gICAgICBpY29uOiBcIlwiLFxuICAgICAgaW1hZ2VGaWxlOiBcIlwiLFxuICAgICAgZW1haWw6IFwid2F2ZWNvZGVyc0BnbWFpbC5jb21cIlxuICB9XG5cbiAgcmVxdWVzdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICBwYXRoOiB0aGlzLmZiLmNvbnRyb2w8c3RyaW5nPihcImFpL1wiKSxcbiAgICBoZWFkZXJzOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICBhZGFwdGVyOiBbbnVsbF0sXG4gICAgbWFwcGVyOiBbbnVsbF0sXG4gICAgcmV0cnk6IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdGltZXM6IFszXSxcbiAgICAgIGRlbGF5OiBbM10sXG4gICAgfSksXG4gICAgcG9sbGluZzogWzNdLFxuICB9KVxuXG4gIEFJVHlwZSA9IDBcblxuICBzYW1wbGVBZGFwdG9ycyA9IFtcbiAgICB7IGxhYmVsOiBcIkNsaWVudEluZm8gQmFzaWNcIiwgdmFsdWU6IENsaWVudEluZm8uYWRhcHQgfSxcbiAgICB7IGxhYmVsOiBcIkFJIFByb21wdFwiLCB2YWx1ZTogQUlQcm9tcHQuYWRhcHQgfSxcbiAgXVxuXG4gIHNhbXBsZU1hcHBlcnMgPSBbXG4gICAgeyBsYWJlbDogXCJNYXBwZXIgQmFzaWNcIiwgdmFsdWU6IENsaWVudEluZm9NYXBwZXIuYWRhcHQgfSxcbiAgICB7IGxhYmVsOiBcIkFJIFByb21wdFwiLCB2YWx1ZTogQUlQcm9tcHQuYWRhcHQgfSxcbiAgXVxuXG4gIGdldCByZXRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Rm9ybS5nZXQoJ3JldHJ5Jyk/LnZhbHVlXG4gIH1cblxuICBnZXQgaGVhZGVycygpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RGb3JtLmdldCgnaGVhZGVycycpIGFzIEZvcm1BcnJheVxuICB9XG5cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgdGhpcy5yZXF1ZXN0Rm9ybS5tYXJrQWxsQXNUb3VjaGVkKClcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Rm9ybS52YWxpZFxuICB9XG5cbiAgaGFzSWQgPSAoYXJyOiBhbnlbXSkgPT4ge1xuICAgIGlmIChhcnIubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gIWlzTmFOKGFyclthcnIubGVuZ3RoIC0gMV0pXG4gIH1cblxuICBwcm9wcyA9IChhZGFwdGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gKGFkYXB0ZXIpID8gYWRhcHRlcigpIDogbnVsbFxuICB9XG5cbiAgLy8gc2VydmVyID0gYGh0dHA6Ly9zYW1wbGUtZW5kcG9pbnQvYXMvYXV0aG9yaXphdGlvbi5vYXV0aDJgXG5cbiAgYXJyYXlPYmplY3RzVG9PYmplY3RzID0gKGFycjogYW55W10pID0+IHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpID8gYXJyLnJlZHVjZSgob2JqLCBpdGVtKSA9PiBPYmplY3QuYXNzaWduKG9iaiwgeyBbaXRlbS5rZXldOiBpdGVtLnZhbHVlIH0pLCB7fSkgOiB7fVxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIC8vIGNvbnN0IHJlcUdldDIgPSBBcGlSZXF1ZXN0LmFkYXB0KHtcbiAgICAvLyAgIHNlcnZlcixcbiAgICAvLyAgIHBhdGg6IFsnY2xpZW50cyddLFxuICAgIC8vICAgaGVhZGVyczogeyBhdXRoZW50aWNhdGlvbjogXCJCZWFyZXIgPEtFWT5cIiB9LFxuICAgIC8vICAgYWRhcHRlcjogQ2xpZW50SW5mbyxcbiAgICAvLyAgIGRhdGFUeXBlOiBEYXRhVHlwZS5PQkpFQ1QsXG4gICAgLy8gICAvLyBjb25jdXJyZW50OiBmYWxzZSxcbiAgICAvLyAgIC8vIHBvbGxpbmc6IDMsIC8vc2Vjb25kc1xuICAgIC8vIH0pXG5cbiAgICAvLyBjb25zdCByZXEyID0gWzEwMjQsMTAyNSwxMDI2XS5tYXAoaXRlbSA9PiB7XG4gICAgLy8gICByZXR1cm4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuZ2V0UmVxdWVzdDxDbGllbnRJbmZvW10+KHJlcUdldDIsIFtpdGVtXSlcbiAgICAvLyAgIC5waXBlKFxuICAgIC8vICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAvLyAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoZXJyb3IuZXJyb3IubWVzc2FnZSkpXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICApXG4gICAgLy8gfSlcblxuICAgIC8vIGZvcmtKb2luKHJlcTIpXG4gICAgLy8gLnN1YnNjcmliZShyZXMgPT4gY29uc29sZS5sb2cocmVzKSlcblxuICB9XG5cbiAgYWRkSGVhZGVyKCkge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAga2V5OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdmFsdWU6IFsnJ11cbiAgICB9KVxuICAgIHRoaXMuaGVhZGVycy5wdXNoKGhlYWRlcilcbiAgfVxuXG4gIHJlbW92ZUhlYWRlcihpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5oZWFkZXJzLnJlbW92ZUF0KGluZGV4KVxuICB9XG5cbiAgY29tcGlsZVJlcXVlc3QoKSB7XG5cbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gdGhpcy5yZXF1ZXN0Rm9ybS52YWx1ZVxuXG4gICAgcmVxdWVzdFBhcmFtcy5oZWFkZXJzID0gdGhpcy5hcnJheU9iamVjdHNUb09iamVjdHMoXG4gICAgICByZXF1ZXN0UGFyYW1zLmhlYWRlcnMgfHwgW11cbiAgICApXG5cbiAgICBjb25zdCBwYXRoUmVxID0gKHJlcXVlc3RQYXJhbXMucGF0aCA9PT0gXCJcIikgPyBbXSA6IChyZXF1ZXN0UGFyYW1zLnBhdGggfHwgXCJcIikuc3BsaXQoXCIvXCIpXG5cbiAgICBpZiAoIXRoaXMucG9sbGluZ1N0YXRlLmNoZWNrZWQpIHJlcXVlc3RQYXJhbXMucG9sbGluZyA9IDBcblxuICAgIGlmICghdGhpcy5mYWlsZWRTdGF0ZS5jaGVja2VkKSB7XG4gICAgICByZXF1ZXN0UGFyYW1zLnJldHJ5ID0geyB0aW1lczogMCxkZWxheTogMCB9XG4gICAgfVxuXG4gICAgY29uc3QgYXBpT3B0aW9ucyA9IEFwaVJlcXVlc3QuYWRhcHQocmVxdWVzdFBhcmFtcylcbiAgICBhcGlPcHRpb25zLnBhdGggPSBbXVxuXG4gICAgcmV0dXJuIHsgYXBpT3B0aW9uczogYXBpT3B0aW9ucywgcGF0aDogcGF0aFJlcSB9XG5cbiAgfVxuXG4gIG9uR2V0UmVxdWVzdCgpIHtcblxuICAgIGlmKCF0aGlzLmlzVmFsaWQpIHJldHVyblxuXG4gICAgY29uc3QgcmVxUGFyYW1zID0gdGhpcy5jb21waWxlUmVxdWVzdCgpXG5cbiAgICB0aGlzLnJlcXVlc3RQYXJhbXMuR0VUID0gcmVxUGFyYW1zLmFwaU9wdGlvbnNcblxuICAgIHRoaXMuR0VUJCA9IEVNUFRZIC8vQ2FuY2VscyBQcmV2aW91c1xuICAgIHRoaXMuR0VUX2Vycm9yJC5uZXh0KCcnKVxuXG4gICAgdGhpcy5HRVQkID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuZ2V0UmVxdWVzdDxDbGllbnRJbmZvW10+KHJlcVBhcmFtcy5hcGlPcHRpb25zLCByZXFQYXJhbXMucGF0aClcbiAgICAucGlwZShcbiAgICAgIC8vIHRhcCgoZGF0YSkgPT4gY29uc29sZS5sb2coXCJBUEkgR0VUIHJlc3BvbnNlXCIsIGRhdGEpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZXJyb3IsICdHRVQnKSlcbiAgICAgIH0pXG4gICAgKVxuXG4gIH1cblxuICBvbkNyZWF0ZVJlcXVlc3QoKSB7XG5cbiAgICBpZighdGhpcy5pc1ZhbGlkKSByZXR1cm5cblxuICAgIGNvbnN0IHJlcVBhcmFtcyA9IHRoaXMuY29tcGlsZVJlcXVlc3QoKVxuICAgIHRoaXMucmVxdWVzdFBhcmFtcy5QT1NUID0gcmVxUGFyYW1zLmFwaU9wdGlvbnNcblxuICAgIHRoaXMuUE9TVCQgPSBFTVBUWSAvL0NhbmNlbHMgUHJldmlvdXNcbiAgICB0aGlzLlBPU1RfZXJyb3IkLm5leHQoJycpXG5cbiAgICBjb25zb2xlLmxvZyhcIlBPU1RcIiwgdGhpcy5zYW1wbGVDbGllbnREYXRhKVxuICAgIGNvbnNvbGUubG9nKFwiUE9TVFwiLCByZXFQYXJhbXMuYXBpT3B0aW9ucylcbiAgICBjb25zb2xlLmxvZyhcIlBPU1RcIiwgcmVxUGFyYW1zLnBhdGgpXG5cbiAgICB0aGlzLlBPU1QkID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UucG9zdFJlcXVlc3Q8Q2xpZW50SW5mbz4odGhpcy5zYW1wbGVDbGllbnREYXRhLCByZXFQYXJhbXMuYXBpT3B0aW9ucywgcmVxUGFyYW1zLnBhdGgpXG4gICAgLnBpcGUoXG4gICAgICAvLyB0YXAoKGRhdGEpID0+IGNvbnNvbGUubG9nKFwiQVBJIFBPU1QgcmVzcG9uc2VcIiwgZGF0YSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuZXJyb3JIYW5kbGluZyhlcnJvciwgJ1BPU1QnKSlcbiAgICAgIH0pXG4gICAgKVxuXG4gIH1cblxuICBvblVwZGF0ZVJlcXVlc3QoKSB7XG5cbiAgICBpZighdGhpcy5pc1ZhbGlkKSByZXR1cm5cblxuICAgIGNvbnN0IHJlcVBhcmFtcyA9IHRoaXMuY29tcGlsZVJlcXVlc3QoKVxuXG4gICAgaWYoIXRoaXMuaGFzSWQocmVxUGFyYW1zLnBhdGgpKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk1pc3NpbmcgSURcIilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2FtcGxlQ2xpZW50RGF0YS5pZCA9IHBhcnNlSW50KHJlcVBhcmFtcy5wYXRoW3JlcVBhcmFtcy5wYXRoLmxlbmd0aC0xXSlcbiAgICB0aGlzLnJlcXVlc3RQYXJhbXMuUFVUID0gcmVxUGFyYW1zLmFwaU9wdGlvbnNcblxuICAgIHRoaXMuUFVUJCA9IEVNUFRZIC8vQ2FuY2VscyBQcmV2aW91c1xuICAgIHRoaXMuUFVUX2Vycm9yJC5uZXh0KCcnKVxuXG4gICAgdGhpcy5QVVQkID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UucHV0UmVxdWVzdDxhbnk+KHRoaXMuc2FtcGxlQ2xpZW50RGF0YSwgcmVxUGFyYW1zLmFwaU9wdGlvbnMsIHJlcVBhcmFtcy5wYXRoKVxuICAgIC5waXBlKFxuICAgICAgLy8gdGFwKChkYXRhKSA9PiBjb25zb2xlLmxvZyhcIkFQSSBQVVQgcmVzcG9uc2VcIiwgZGF0YSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuZXJyb3JIYW5kbGluZyhlcnJvciwgJ1BVVCcpKVxuICAgICAgfSlcbiAgICApXG5cbiAgfVxuXG4gIG9uRGVsZXRlUmVxdWVzdCgpIHtcblxuICAgIGlmKCF0aGlzLmlzVmFsaWQpIHJldHVyblxuXG4gICAgY29uc3QgcmVxUGFyYW1zID0gdGhpcy5jb21waWxlUmVxdWVzdCgpXG4gICAgdGhpcy5yZXF1ZXN0UGFyYW1zLkRFTEVURSA9IHJlcVBhcmFtcy5hcGlPcHRpb25zXG5cbiAgICBpZighdGhpcy5oYXNJZChyZXFQYXJhbXMucGF0aCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiTWlzc2luZyBJRFwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zYW1wbGVDbGllbnREYXRhLmlkID0gcGFyc2VJbnQocmVxUGFyYW1zLnBhdGhbcmVxUGFyYW1zLnBhdGgubGVuZ3RoLTFdKVxuICAgIHRoaXMucmVxdWVzdFBhcmFtcy5ERUxFVEUgPSByZXFQYXJhbXMuYXBpT3B0aW9uc1xuXG4gICAgdGhpcy5ERUxFVEUkID0gRU1QVFkgLy9DYW5jZWxzIFByZXZpb3VzXG4gICAgdGhpcy5ERUxFVEVfZXJyb3IkLm5leHQoJycpXG5cbiAgICB0aGlzLkRFTEVURSQgPSB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5kZWxldGVSZXF1ZXN0PENsaWVudEluZm8+KHJlcVBhcmFtcy5hcGlPcHRpb25zLCByZXFQYXJhbXMucGF0aClcbiAgICAucGlwZShcbiAgICAgIC8vIHRhcCgoZGF0YSkgPT4gY29uc29sZS5sb2coXCJBUEkgREVMRVRFIHJlc3BvbnNlXCIsIGRhdGEpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZXJyb3IsICdERUxFVEUnKSlcbiAgICAgIH0pXG4gICAgKVxuXG4gIH1cblxuICBvblN0cmVhbVBvc3RSZXF1ZXN0KCkge1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVyblxuXG4gICAgY29uc3QgcmVxUGFyYW1zID0gdGhpcy5jb21waWxlUmVxdWVzdCgpXG5cbiAgICBsZXQgcGF5bG9hZCA9IHt9XG4gICAgbGV0IGFwaVBhdGg6IHN0cmluZ1tdID0gcmVxUGFyYW1zLnBhdGhcbiAgICBsZXQgYXBpT3B0aW9ucyA9IHJlcVBhcmFtcy5hcGlPcHRpb25zXG4gICAgbGV0IHJlc3BvbnNlTWFwcGVyOiAoaXRlbXM6IGFueSkgPT4gYW55ID0gKGl0ZW1zKSA9PiBpdGVtcy5yZXNwb25zZVxuXG4gICAgaWYgKHRoaXMuQUlUeXBlID09PSAwKSB7XG5cbiAgICAgIC8vIEFQSSByZXF1ZXN0XG4gICAgICBwYXlsb2FkID0geyBwcm9tcHQ6IHRoaXMucXVlc3Rpb25Db250cm9sLnZhbHVlIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIExvY2FsIE9sbGFtYSByZXF1ZXN0XG4gICAgICBhcGlPcHRpb25zLnNlcnZlciA9IFwiYXBpXCJcbiAgICAgIGFwaVBhdGggPSBbXCJnZW5lcmF0ZVwiXVxuICAgICAgYXBpT3B0aW9ucy5zdHJlYW0gPSB0cnVlXG4gICAgICBwYXlsb2FkID0ge1xuICAgICAgICBtb2RlbDogXCJwaGkzOmxhdGVzdFwiLFxuICAgICAgICBwcm9tcHQ6IHRoaXMucXVlc3Rpb25Db250cm9sLnZhbHVlLFxuICAgICAgICBzdHJlYW06IHRydWUsXG4gICAgICB9XG5cbiAgICAgIHJlc3BvbnNlTWFwcGVyID0gKGl0ZW1zKSA9PiBpdGVtcy5tYXAoKHdvcmQ6IGFueSkgPT4gd29yZC5yZXNwb25zZSkuZmxhdCgpLmpvaW4oJycpXG5cbiAgICB9XG5cbiAgICB0aGlzLnJlcXVlc3RQYXJhbXMuU1RSRUFNID0gYXBpT3B0aW9uc1xuICAgIHRoaXMuU1RSRUFNX0FJJCA9IEVNUFRZXG4gICAgdGhpcy5TVFJFQU1fQUlfZXJyb3IkLm5leHQoJycpXG5cbiAgICB0aGlzLlNUUkVBTV9BSSQgPSB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5wb3N0UmVxdWVzdDxhbnk+KHBheWxvYWQsIGFwaU9wdGlvbnMsIGFwaVBhdGgpLnBpcGUoXG4gICAgICBtYXAocmVzcG9uc2VNYXBwZXIpLFxuICAgICAgdGFwKCgpID0+IHRoaXMucXVlc3Rpb25Db250cm9sLnJlc2V0KCkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuZXJyb3JIYW5kbGluZyhlcnJvciwgJ1NUUkVBTScpKSlcbiAgICApXG5cbiAgfVxuXG5cbiAgb25TdHJlYW1SZXF1ZXN0KCkge1xuXG4gICAgaWYoIXRoaXMuaXNWYWxpZCkgcmV0dXJuXG5cbiAgICBjb25zdCByZXFQYXJhbXMgPSB0aGlzLmNvbXBpbGVSZXF1ZXN0KClcblxuICAgIHJlcVBhcmFtcy5hcGlPcHRpb25zLnN0cmVhbSA9IHRydWVcblxuICAgIHRoaXMucmVxdWVzdFBhcmFtcy5HRVQgPSByZXFQYXJhbXMuYXBpT3B0aW9uc1xuICAgIHRoaXMuU1RSRUFNJCA9IHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmdldFJlcXVlc3Q8Q2xpZW50SW5mb1tdPihyZXFQYXJhbXMuYXBpT3B0aW9ucywgcmVxUGFyYW1zLnBhdGgpXG4gICAgICAgIC5waXBlKFxuICAgICAgLy8gdGFwKChkYXRhKSA9PiBjb25zb2xlLmxvZyhcIkFQSSBTVFJFQU0gcmVzcG9uc2VcIiwgZGF0YSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuZXJyb3JIYW5kbGluZyhlcnJvciwgJ1NUUkVBTScpKVxuICAgICAgfSlcbiAgICApXG5cbiAgfVxuXG4gIG9uRG93bmxvYWRDb21wbGV0ZWQoKSB7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gXCJEb3dubG9hZCBDb21wbGV0ZWRcIlxuXG4gICAgY29uc3QgZGlzcGxheSA9IFRvYXN0RGlzcGxheS5hZGFwdCh7XG4gICAgICBtZXNzYWdlLFxuICAgICAgYWN0aW9uOiAnT2snLFxuICAgICAgY29sb3I6IFRvYXN0Q29sb3JzLlNVQ0NFU1MsXG4gICAgICBpY29uOiAnc2VudGltZW50X3NhdGlzZmllZF9hbHQnLFxuICAgIH0pXG5cbiAgICB0aGlzLnRvYXN0TWVzc2FnZS50b2FzdE1lc3NhZ2UoZGlzcGxheSlcbiAgfVxuXG4gIG9uRG93bmxvYWRGYWlsZWQoZXJyOiBzdHJpbmcpIHtcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBcIkRvd25sb2FkIEZhaWxlZFwiXG5cbiAgICBjb25zdCBkaXNwbGF5ID0gVG9hc3REaXNwbGF5LmFkYXB0KHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBhY3Rpb246ICdPaycsXG4gICAgICBjb2xvcjogVG9hc3RDb2xvcnMuRVJST1IsXG4gICAgICBpY29uOiAnd2FybmluZycsXG4gICAgfSlcblxuICAgIHRoaXMudG9hc3RNZXNzYWdlLnRvYXN0TWVzc2FnZShkaXNwbGF5KVxuICB9XG5cbiAgZXJyb3JIYW5kbGluZyhlcnI6IGFueSwgdHlwZTogc3RyaW5nKSB7XG4gICAgaWYodHlwZSA9PT0gJ0dFVCcpIHRoaXMuR0VUX2Vycm9yJC5uZXh0KGVyci5tZXNzYWdlKVxuICAgIGlmKHR5cGUgPT09ICdQT1NUJykgdGhpcy5QT1NUX2Vycm9yJC5uZXh0KGVyci5tZXNzYWdlKVxuICAgIGlmKHR5cGUgPT09ICdQVVQnKSB0aGlzLlBVVF9lcnJvciQubmV4dChlcnIubWVzc2FnZSlcbiAgICBpZih0eXBlID09PSAnREVMRVRFJykgdGhpcy5ERUxFVEVfZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ1NUUkVBTScpIHRoaXMuU1RSRUFNX2Vycm9yJC5uZXh0KGVyci5tZXNzYWdlKVxuICB9XG5cbiAgb25TZWxlY3RBSVR5cGUodHlwZTogbnVtYmVyKSB7XG4gICAgdGhpcy5BSVR5cGUgPSB0eXBlXG4gIH1cblxufVxuIiwiPGRpdiBzdHlsZT1cIm1hcmdpbjogMnJlbTtcIj5cblxuICA8aDI+XG4gICAgSFRUUCBSZXF1ZXN0IE1hbmFnZXJcbiAgPC9oMj5cblxuICA8ZGl2IFtmb3JtR3JvdXBdPVwicmVxdWVzdEZvcm1cIiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW07XCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogLjVyZW1cIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPkFkYXB0ZXIgKE1vZGVsKTwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJhZGFwdGVyXCIgI2FkYXB0ZXJTZWxlY3Q+XG4gICAgICAgICAgPG1hdC1vcHRpb24+Tm9uZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgYWRhcHRlciBvZiBzYW1wbGVBZGFwdG9yc1wiIFt2YWx1ZV09XCJhZGFwdGVyLnZhbHVlXCI+XG4gICAgICAgICAgICB7e2FkYXB0ZXIubGFiZWx9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPk1hcHBlciAoTW9kZWwpPC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm1hcHBlclwiICNtYXBwZXJTZWxlY3Q+XG4gICAgICAgICAgPG1hdC1vcHRpb24+Tm9uZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbWFwcGVyIG9mIHNhbXBsZU1hcHBlcnNcIiBbdmFsdWVdPVwibWFwcGVyLnZhbHVlXCI+XG4gICAgICAgICAgICB7e21hcHBlci5sYWJlbH19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBtYXJnaW4tYm90dG9tOiAycmVtO1wiICpuZ0lmPVwiYWRhcHRlclNlbGVjdC52YWx1ZSB8fCBtYXBwZXJTZWxlY3QudmFsdWVcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjFcIiBjbGFzcz1cImJveFwiPlxuICAgICAgICA8aDM+QWRhcHRlciAoSW5jb21pbmcpPC9oMz5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFkYXB0ZXJTZWxlY3QudmFsdWU7IGVsc2UgTk9fQURBUFRFUlwiPlxuICAgICAgICAgIHt7IHByb3BzKGFkYXB0ZXJTZWxlY3QudmFsdWUpIHwganNvbiB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNOT19BREFQVEVSPk5vIFRyYW5zZm9ybWF0aW9uPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MVwiIGNsYXNzPVwiYm94XCI+XG4gICAgICAgIDxoMz5NYXBwZXIgKE91dGdvaW5nKTwvaDM+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtYXBwZXJTZWxlY3QudmFsdWU7IGVsc2UgTk9fTUFQUEVSXCI+XG4gICAgICAgICAge3sgcHJvcHMobWFwcGVyU2VsZWN0LnZhbHVlKSB8IGpzb24gfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjTk9fTUFQUEVSPk5vIFRyYW5zZm9ybWF0aW9uPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5SZXN0UGF0aCAoLyBkZWxpbWl0ZWQpPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cImNsaWVudHMvbGlzdFwiIGZvcm1Db250cm9sTmFtZT1cInBhdGhcIj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImhlYWRlcnNcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGFzayBvZiBoZWFkZXJzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IC41cmVtXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5LZXk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiYXV0aGVudGljYXRpb25cIiBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cImZsZXg6MVwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cInNhbXBsZVwiIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCI+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlSGVhZGVyKGkpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImFkZEhlYWRlcigpXCIgY2xhc3M9XCJidG5cIj5BZGQgSGVhZGVyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW07IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsgZ2FwOiAxcmVtO1wiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgI2ZhaWxlZFN0YXRlPlJldHJ5IG9uIEZhaWxlZDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZhaWxlZFN0YXRlLmNoZWNrZWRcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogLjVyZW07IG1hcmdpbi10b3A6IDFyZW07XCIgZm9ybUdyb3VwTmFtZT1cInJldHJ5XCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPiNvZiBUaW1lczwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cInRpbWVzXCIgdmFsdWU9XCIzXCI+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+RGVsYXkgVW50aWwgTmV4dDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cImRlbGF5XCIgdmFsdWU9XCIzXCI+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNwb2xsaW5nU3RhdGU+UG9sbGluZzwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInBvbGxpbmdTdGF0ZS5jaGVja2VkXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPiNvZiBTZWNvbmRzPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwicG9sbGluZ1wiIHZhbHVlPVwiM1wiPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxcmVtOyBtYXJnaW4tdG9wOiAycmVtO1wiPlxuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICAgICpuZ0lmPVwiKGlzUGVuZGluZyQgfCBhc3luYylcIlxuICAgID48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImRldGVybWluYXRlXCJcbiAgICAgICpuZ0lmPVwicG9sbGluZ1N0YXRlLmNoZWNrZWQgJiYgIShpc1BlbmRpbmckIHwgYXN5bmMpXCJcbiAgICAgIFt2YWx1ZV09XCIodGhpcy5jb3VudGRvd24kIHwgYXN5bmMpXCJcbiAgICA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxXCI+R0VUIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25HZXRSZXF1ZXN0KClcIiBjbGFzcz1cImJ0blwiPlJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIihHRVRfZXJyb3IkIHwgYXN5bmMpIGFzIGdldF9lcnJvclwiIHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07XCI+XG4gICAgICA8bWF0LWVycm9yPnt7IGdldF9lcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCIgKm5nSWY9XCIoR0VUJCB8IGFzeW5jKSBhcyBkYXRhUmVjb3JkXCI+XG4gICAgICA8IS0tIDxkaXYgW2lubmVySFRNTF09XCIoR0VUJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAge3sgZGF0YVJlY29yZCB8IGpzb24gfX1cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxXCI+UE9TVCBSZXF1ZXN0PC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uQ3JlYXRlUmVxdWVzdCgpXCIgY2xhc3M9XCJidG5cIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIoUE9TVF9lcnJvciQgfCBhc3luYykgYXMgcG9zdF9lcnJvclwiIHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07XCI+XG4gICAgICA8bWF0LWVycm9yPnt7IHBvc3RfZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiICpuZ0lmPVwiKFBPU1QkIHwgYXN5bmMpIGFzIGRhdGFSZWNvcmRcIj5cbiAgICAgIDwhLS0gPGRpdiBbaW5uZXJIVE1MXT1cIihQT1NUJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAge3sgZGF0YVJlY29yZCB8IGpzb24gfX1cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxXCI+UFVUIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25VcGRhdGVSZXF1ZXN0KClcIiBjbGFzcz1cImJ0blwiPlJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIihQVVRfZXJyb3IkIHwgYXN5bmMpIGFzIHB1dF9lcnJvclwiIHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07XCI+XG4gICAgICA8bWF0LWVycm9yPnt7IHB1dF9lcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGgzPkluY2x1ZGUgUmVjb3JkIElEIGluIHRoZSBSZXN0UGF0aDwvaDM+XG5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIiAqbmdJZj1cIihQVVQkIHwgYXN5bmMpIGFzIGRhdGFSZWNvcmRcIj5cbiAgICAgIDwhLS0gPGRpdiBbaW5uZXJIVE1MXT1cIihQVVQkIHwgYXN5bmMpIHwganNvbnZcIj48L2Rpdj4gLS0+XG4gICAgICAge3sgZGF0YVJlY29yZCB8IGpzb24gfX1cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxXCI+REVMRVRFIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25EZWxldGVSZXF1ZXN0KClcIiBjbGFzcz1cImJ0blwiPlJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGgzPkluY2x1ZGUgUmVjb3JkIElEIGluIHRoZSBSZXN0UGF0aDwvaDM+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKERFTEVURV9lcnJvciQgfCBhc3luYykgYXMgZGVsZXRlX2Vycm9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgIDxtYXQtZXJyb3I+e3sgZGVsZXRlX2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIiAqbmdJZj1cIihERUxFVEUkIHwgYXN5bmMpIGFzIGRhdGFSZWNvcmRcIj5cbiAgICAgIDwhLS0gPGRpdiBbaW5uZXJIVE1MXT1cIihERUxFVEUkIHwgYXN5bmMpIHwganNvbnZcIj48L2Rpdj4gLS0+XG4gICAgICB7eyBkYXRhUmVjb3JkIHwganNvbiB9fVxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5TdHJlYW1pbmcgR0VUIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25TdHJlYW1SZXF1ZXN0KClcIiBjbGFzcz1cImJ0blwiPlJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwiKFNUUkVBTV9lcnJvciQgfCBhc3luYykgYXMgc3RyZWFtX2Vycm9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgIDxtYXQtZXJyb3I+e3sgc3RyZWFtX2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+IC0tPlxuXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiKFNUUkVBTSQgfCBhc3luYykgYXMgZGF0YVwiIGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaWRcIj5cbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IElEIDwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQuaWR9fSA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJuYW1lXCI+XG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBGaXJzdCBOYW1lIDwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQubmFtZX19IDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhc3ROYW1lXCI+XG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBMYXN0IE5hbWUgPC90aD5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudC5sYXN0TmFtZX19IDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFnZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gQWdlIDwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQuYWdlfX0gPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCI+PC90cj5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjE7IHBhZGRpbmctdG9wOiAuNXJlbTtcIj5BSSAtPHNwYW4gKm5nSWY9XCJBSVR5cGUgPT09IDFcIj5TVFJFQU1JTkc8L3NwYW4+IFBPU1QgUmVxdWVzdDwvaDI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtO1wiPlxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgc3R5bGU9XCJtaW4td2lkdGg6IDEyMHB4O1wiPlxuICAgICAgICAgIDxtYXQtaWNvbj5sYW48L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJBSVR5cGUgPT09IDA7IGVsc2UgTE9DQUxcIj5TZXJ2ZXI8L3NwYW4+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI0xPQ0FMPlxuICAgICAgICAgICAgICBMb2NhbFxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uU2VsZWN0QUlUeXBlKDApXCI+U2VydmVyPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvblNlbGVjdEFJVHlwZSgxKVwiPkxvY2FsPC9idXR0b24+XG4gICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25TdHJlYW1Qb3N0UmVxdWVzdCgpXCIgY2xhc3M9XCJidG5cIj5Bc2sgTWU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3R5bGU9XCJmbGV4OjFcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5Bc2sgbWUgYSBRdWVzdGlvbjwvbWF0LWxhYmVsPlxuICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJXaHkgaXMgdGhlIHNreSBibHVlP1wiIFtmb3JtQ29udHJvbF09XCJxdWVzdGlvbkNvbnRyb2xcIj48L3RleHRhcmVhPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIoU1RSRUFNX0FJX2Vycm9yJCB8IGFzeW5jKSBhcyBzdHJlYW1fZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBzdHJlYW1fZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJBSVR5cGUgPT09IDE7IGVsc2UgQUxURVJOQVRJVkVcIiBzdHlsZT1cImNvbG9yOiByZWQ7XCI+XG4gICAgICBZb3UgbXVzdCBoYXZlIE9sbGFtYSBhY3RpdmUgYW5kIHRoZSAncGhpMzpsYXRlc3QnIG1vZGVsIHRvIHVzZSB0aGlzIGZlYXR1cmUuXG4gICAgPC9kaXY+XG4gICAgPG5nLXRlbXBsYXRlICNBTFRFUk5BVElWRT5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IGdyYXk7XCI+XG4gICAgICAgIERlZmluZSB0aGUgUmVzdFBhdGggdG8gdGhlIEFQSSBlbmRwb2ludCB0aGF0IHdpbGwgaGFuZGxlIHRoZSBBSSByZXF1ZXN0LlxuICAgICAgICBVc2U6ICdhaS9jaGF0JyBmb3Igc2VydmVyXG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxkaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiKFNUUkVBTV9BSSQgfCBhc3luYykgYXMgZGF0YVwiIHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTsgZm9udC1zaXplOiAxLjJyZW07IGJvcmRlci1yYWRpdXM6IDFyZW07IGJvcmRlcjogYmxhY2sgMXB4IHNvbGlkOyBwYWRkaW5nOiAycmVtO1wiPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbi1ib3R0b206IC41cmVtOyB3aGl0ZS1zcGFjZTpwcmUtd3JhcDsgbGluZS1oZWlnaHQ6IDEuNnJlbTtcIj57e2RhdGF9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxLjVyZW07IG1hcmdpbi1ib3R0b206IDFyZW07IGxpbmUtaGVpZ2h0OiAxLjVyZW07XCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXY+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjE7IG1hcmdpbi1ib3R0b206IDA7IHBhZGRpbmctdG9wOiAuNXJlbTsgZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICBEb3dubG9hZCBGaWxlXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxOyBtYXJnaW4tbGVmdDogMXJlbTtcIj5cbiAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSAjZGlzYWJsZT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGlzYWJsZS5jaGVja2VkOyBlbHNlIERJU0FCTEVcIj5cbiAgICAgICAgICAgICAgRW5hYmxlXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI0RJU0FCTEU+RGlzYWJsZTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaDI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YXBwLWZpbGUtZG93bmxvYWRlclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlLmNoZWNrZWRcIlxuICAgICAgICAgIFtkZWxheUVycm9yXT1cIjNcIlxuICAgICAgICAgIFthcGlSZXF1ZXN0XT1cImRvd25sb2FkUmVxdWVzdFwiXG4gICAgICAgICAgKGNvbXBsZXRlZCk9XCJvbkRvd25sb2FkQ29tcGxldGVkKClcIlxuICAgICAgICAgIChmYWlsZWQpPVwib25Eb3dubG9hZEZhaWxlZCgkZXZlbnQpXCJcbiAgICAgICAgPjwvYXBwLWZpbGUtZG93bmxvYWRlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuPC9kaXY+XG4iXX0=
|