UNPKG

ngx-jenga-api

Version:

Angular wrapper for Equity's Jenga API. Still in progress

94 lines 25.4 kB
import { Component, Input, ViewChild } from '@angular/core'; import { MatSort } from '@angular/material/sort'; import { MatPaginator } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; import * as i0 from "@angular/core"; import * as i1 from "../../services/api.service"; import * as i2 from "../../services/loader.service"; import * as i3 from "../../services/auth.service"; import * as i4 from "@angular/common"; import * as i5 from "@angular/material/progress-bar"; import * as i6 from "@angular/material/paginator"; import * as i7 from "@angular/material/select"; import * as i8 from "@angular/material/core"; import * as i9 from "@angular/material/table"; import * as i10 from "@angular/material/sort"; export class BillersComponent { constructor(api, loadingService, authenticateEndpoint) { this.api = api; this.loadingService = loadingService; this.authenticateEndpoint = authenticateEndpoint; this.showSearchBar = true; this.tableShadow = true; this.categories = 'utilities'; this.authenticateEndpoint.authenticateMerchant().subscribe({ next: (res) => { localStorage.setItem('jenga-tkn', res.accessToken); }, error: (e) => { throw new Error(e.error.message); } }); } ngAfterViewInit() { this.getBillers(25); } getBillers(per_page) { this.api.getAllBillers(1, per_page, this.categories) .subscribe({ next: (res) => { this.billersList = res.data.billers; this.dataSource = new MatTableDataSource(res.data.billers); this.dataSource.paginator = this.paginator; this.dataSource.sort = this.sort; }, error: (e) => { throw new Error(e.error.message); } }); } updatePageSize(event) { const per_page = event.pageSize; this.getBillers(per_page); } onCategorySelected(event) { console.log('event is: ', event); this.api.getAllBillers(1, 25, event.value).subscribe({ next: (res) => { this.billersList = res.data.billers; this.dataSource = new MatTableDataSource(res.data.billers); this.dataSource.paginator = this.paginator; this.dataSource.sort = this.sort; }, error: (e) => { throw new Error(e.error.message); } }); } applyFilter(event) { const filterValue = event.target.value; this.dataSource.filter = filterValue.trim().toLowerCase(); if (this.dataSource.paginator) { this.dataSource.paginator.firstPage(); } } } BillersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: BillersComponent, deps: [{ token: i1.ApiService }, { token: i2.LoaderService }, { token: i3.AuthService }], target: i0.ɵɵFactoryTarget.Component }); BillersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: BillersComponent, selector: "jenga-all-billers", inputs: { showSearchBar: "showSearchBar", tableShadow: "tableShadow", categories: "categories" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<div class=\"table\">\n <div class=\"searchBar\" *ngIf=\"showSearchBar\">\n <input (keyup)=\"applyFilter($event)\" id=\"searchQueryInput\" type=\"text\" name=\"searchQueryInput\" placeholder=\"Search {{ billersList?.length }} merchants\" />\n <br>\n </div>\n <table mat-table [dataSource]=\"dataSource\" matSort [class.mat-elevation-z8]=\"tableShadow\">\n\n <ng-container [style.width]=\"'170px'\" matColumnDef=\"category\">\n <th [style.width]=\"'170px'\" class=\"table-header\" mat-header-cell *matHeaderCellDef>\n <mat-select (selectionChange)=\"onCategorySelected($event)\" [style.width]=\"'170px'\" [(value)]=\"categories\">\n <mat-option value=\"utilities\">Utilities</mat-option>\n <mat-option value=\"services\">Services</mat-option>\n </mat-select>\n </th>\n <td mat-cell *matCellDef=\"let row\"></td>\n </ng-container>\n\n\n <ng-container matColumnDef=\"name\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by name\">Name</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.name }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"code\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by code\">Code</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.code }} </td>\n </ng-container>\n\n\n <!-- <ng-container matColumnDef=\"outlets\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by tillnumber\">Outlets</th>\n\n <td mat-cell *matCellDef=\"let row\">\n <table mat-table [dataSource]=\"row.outlets\">\n\n <ng-container matColumnDef=\"Oname\">\n <th class=\"sub-table\" mat-header-cell *matHeaderCellDef>Name</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.name }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"Otillnumber\">\n <th class=\"sub-table\" mat-header-cell *matHeaderCellDef>Till Number</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.tillnumber }} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"['Oname', 'Otillnumber']\" RowDef=\"['Oname', 'Otillnumber']\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['Oname', 'Otillnumber'];\"></tr>\n </table>\n </td>\n </ng-container> -->\n\n\n <tr mat-header-row *matHeaderRowDef=\"['category', 'name', 'code']\" RowDef=\"['category', 'name', 'code']\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['category', 'name', 'code'];\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"loadingService.isLoading$ | async\" mode=\"indeterminate\"></mat-progress-bar>\n <mat-paginator #paginator [pageSizeOptions]=\"[25, 50, 100]\" showFirstLastButtons (page)=\"updatePageSize($event)\"></mat-paginator>\n</div>", styles: [".table{width:inherit}.drop-down-header{width:70px}.searchBar{padding-bottom:10px;width:100%;display:flex;flex-direction:row;align-items:center}#searchQueryInput{width:100%;height:2.8rem;background:#f5f5f5;outline:none;border:none;border-radius:1.625rem;padding:0 3.5rem 0 1.5rem;font-size:1rem}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i6.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i9.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: "directive", type: i10.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i10.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: BillersComponent, decorators: [{ type: Component, args: [{ selector: 'jenga-all-billers', template: "<div class=\"table\">\n <div class=\"searchBar\" *ngIf=\"showSearchBar\">\n <input (keyup)=\"applyFilter($event)\" id=\"searchQueryInput\" type=\"text\" name=\"searchQueryInput\" placeholder=\"Search {{ billersList?.length }} merchants\" />\n <br>\n </div>\n <table mat-table [dataSource]=\"dataSource\" matSort [class.mat-elevation-z8]=\"tableShadow\">\n\n <ng-container [style.width]=\"'170px'\" matColumnDef=\"category\">\n <th [style.width]=\"'170px'\" class=\"table-header\" mat-header-cell *matHeaderCellDef>\n <mat-select (selectionChange)=\"onCategorySelected($event)\" [style.width]=\"'170px'\" [(value)]=\"categories\">\n <mat-option value=\"utilities\">Utilities</mat-option>\n <mat-option value=\"services\">Services</mat-option>\n </mat-select>\n </th>\n <td mat-cell *matCellDef=\"let row\"></td>\n </ng-container>\n\n\n <ng-container matColumnDef=\"name\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by name\">Name</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.name }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"code\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by code\">Code</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.code }} </td>\n </ng-container>\n\n\n <!-- <ng-container matColumnDef=\"outlets\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by tillnumber\">Outlets</th>\n\n <td mat-cell *matCellDef=\"let row\">\n <table mat-table [dataSource]=\"row.outlets\">\n\n <ng-container matColumnDef=\"Oname\">\n <th class=\"sub-table\" mat-header-cell *matHeaderCellDef>Name</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.name }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"Otillnumber\">\n <th class=\"sub-table\" mat-header-cell *matHeaderCellDef>Till Number</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.tillnumber }} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"['Oname', 'Otillnumber']\" RowDef=\"['Oname', 'Otillnumber']\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['Oname', 'Otillnumber'];\"></tr>\n </table>\n </td>\n </ng-container> -->\n\n\n <tr mat-header-row *matHeaderRowDef=\"['category', 'name', 'code']\" RowDef=\"['category', 'name', 'code']\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['category', 'name', 'code'];\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"loadingService.isLoading$ | async\" mode=\"indeterminate\"></mat-progress-bar>\n <mat-paginator #paginator [pageSizeOptions]=\"[25, 50, 100]\" showFirstLastButtons (page)=\"updatePageSize($event)\"></mat-paginator>\n</div>", styles: [".table{width:inherit}.drop-down-header{width:70px}.searchBar{padding-bottom:10px;width:100%;display:flex;flex-direction:row;align-items:center}#searchQueryInput{width:100%;height:2.8rem;background:#f5f5f5;outline:none;border:none;border-radius:1.625rem;padding:0 3.5rem 0 1.5rem;font-size:1rem}\n"] }] }], ctorParameters: function () { return [{ type: i1.ApiService }, { type: i2.LoaderService }, { type: i3.AuthService }]; }, propDecorators: { showSearchBar: [{ type: Input }], tableShadow: [{ type: Input }], categories: [{ type: Input }], paginator: [{ type: ViewChild, args: [MatPaginator] }], sort: [{ type: ViewChild, args: [MatSort, { static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtamVuZ2EtYXBpL3NyYy9saWIvY29tcG9uZW50cy9iaWxsZXJzL2JpbGxlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWplbmdhLWFwaS9zcmMvbGliL2NvbXBvbmVudHMvYmlsbGVycy9iaWxsZXJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBVTdELE1BQU0sT0FBTyxnQkFBZ0I7SUFVM0IsWUFDVSxHQUFlLEVBQ2hCLGNBQTZCLEVBQzVCLG9CQUFpQztRQUZqQyxRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQ2hCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzVCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBYTtRQVRsQyxrQkFBYSxHQUFZLElBQUksQ0FBQTtRQUM3QixnQkFBVyxHQUFZLElBQUksQ0FBQTtRQUMzQixlQUFVLEdBQVcsV0FBVyxDQUFBO1FBU3ZDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6RCxJQUFJLEVBQUUsQ0FBQyxHQUFPLEVBQUUsRUFBRTtnQkFDaEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3BELENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxDQUFLLEVB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O2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDbUIsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQUNjLElBQUk7c0JBQXhDLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0U29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJzsgXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9hZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnamVuZ2EtYWxsLWJpbGxlcnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vYmlsbGVycy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2JpbGxlcnMuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIEJpbGxlcnNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblxuICBiaWxsZXJzTGlzdDogYW55XG4gIGRhdGFTb3VyY2UhOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PlxuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZVxuICBASW5wdXQoKSB0YWJsZVNoYWRvdzogYm9vbGVhbiA9IHRydWVcbiAgQElucHV0KCkgY2F0ZWdvcmllczogc3RyaW5nID0gJ3V0aWxpdGllcydcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvclxuICBAVmlld0NoaWxkKE1hdFNvcnQsIHtzdGF0aWM6IGZhbHNlfSkgc29ydCE6IE1hdFNvcnRcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFwaTogQXBpU2VydmljZSxcbiAgICBwdWJsaWMgbG9hZGluZ1NlcnZpY2U6IExvYWRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoZW50aWNhdGVFbmRwb2ludDogQXV0aFNlcnZpY2VcbiAgKXtcbiAgICB0aGlzLmF1dGhlbnRpY2F0ZUVuZHBvaW50LmF1dGhlbnRpY2F0ZU1lcmNoYW50KCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6YW55KSA9PiB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdqZW5nYS10a24nLCByZXMuYWNjZXNzVG9rZW4pXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlOmFueSkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS5lcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRCaWxsZXJzKDI1KVxuICB9XG5cbiAgZ2V0QmlsbGVycyhwZXJfcGFnZTpudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFwaS5nZXRBbGxCaWxsZXJzKDEsIHBlcl9wYWdlLCB0aGlzLmNhdGVnb3JpZXMpXG4gICAgLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOmFueSkgPT4geyBcbiAgICAgICAgdGhpcy5iaWxsZXJzTGlzdCA9IHJlcy5kYXRhLmJpbGxlcnNcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMuZGF0YS5iaWxsZXJzKVxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3JcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnRcbiAgICAgICB9LFxuICAgICAgIGVycm9yOiAoZTphbnkpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUuZXJyb3IubWVzc2FnZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlUGFnZVNpemUoZXZlbnQ6YW55KSB7XG4gICAgY29uc3QgcGVyX3BhZ2UgPSBldmVudC5wYWdlU2l6ZVxuICAgIHRoaXMuZ2V0QmlsbGVycyhwZXJfcGFnZSlcbiAgfVxuXG4gIG9uQ2F0ZWdvcnlTZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ2V2ZW50IGlzOiAnLCBldmVudClcbiAgICB0aGlzLmFwaS5nZXRBbGxCaWxsZXJzKDEsIDI1LCBldmVudC52YWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6YW55KSA9PiB7IFxuICAgICAgICB0aGlzLmJpbGxlcnNMaXN0ID0gcmVzLmRhdGEuYmlsbGVyc1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlcy5kYXRhLmJpbGxlcnMpXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydFxuICAgICAgIH0sXG4gICAgICAgZXJyb3I6IChlOmFueSkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS5lcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhcHBseUZpbHRlcihldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWVcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gZmlsdGVyVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAodGhpcy5kYXRhU291cmNlLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvci5maXJzdFBhZ2UoKVxuICAgIH1cbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwidGFibGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoQmFyXCIgKm5nSWY9XCJzaG93U2VhcmNoQmFyXCI+XG4gICAgICAgIDxpbnB1dCAoa2V5dXApPVwiYXBwbHlGaWx0ZXIoJGV2ZW50KVwiIGlkPVwic2VhcmNoUXVlcnlJbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNlYXJjaFF1ZXJ5SW5wdXRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCB7eyBiaWxsZXJzTGlzdD8ubGVuZ3RoIH19IG1lcmNoYW50c1wiIC8+XG4gICAgICAgIDxicj5cbiAgICA8L2Rpdj5cbiAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBtYXRTb3J0IFtjbGFzcy5tYXQtZWxldmF0aW9uLXo4XT1cInRhYmxlU2hhZG93XCI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbc3R5bGUud2lkdGhdPVwiJzE3MHB4J1wiIG1hdENvbHVtbkRlZj1cImNhdGVnb3J5XCI+XG4gICAgICAgICAgICA8dGggW3N0eWxlLndpZHRoXT1cIicxNzBweCdcIiBjbGFzcz1cInRhYmxlLWhlYWRlclwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uQ2F0ZWdvcnlTZWxlY3RlZCgkZXZlbnQpXCIgW3N0eWxlLndpZHRoXT1cIicxNzBweCdcIiBbKHZhbHVlKV09XCJjYXRlZ29yaWVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwidXRpbGl0aWVzXCI+VXRpbGl0aWVzPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cInNlcnZpY2VzXCI+U2VydmljZXM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj48L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibmFtZVwiPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidGFibGUtaGVhZGVyXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBzb3J0QWN0aW9uRGVzY3JpcHRpb249XCJTb3J0IGJ5IG5hbWVcIj5OYW1lPC90aD5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj4ge3sgcm93Lm5hbWUgfX0gPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJjb2RlXCI+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIHNvcnRBY3Rpb25EZXNjcmlwdGlvbj1cIlNvcnQgYnkgY29kZVwiPkNvZGU8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPiB7eyByb3cuY29kZSB9fSA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJvdXRsZXRzXCI+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIHNvcnRBY3Rpb25EZXNjcmlwdGlvbj1cIlNvcnQgYnkgdGlsbG51bWJlclwiPk91dGxldHM8L3RoPlxuXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyb3cub3V0bGV0c1wiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiT25hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInN1Yi10YWJsZVwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5OYW1lPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj4ge3sgcm93Lm5hbWUgfX0gPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJPdGlsbG51bWJlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic3ViLXRhYmxlXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlRpbGwgTnVtYmVyPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj4ge3sgcm93LnRpbGxudW1iZXIgfX0gPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJbJ09uYW1lJywgJ090aWxsbnVtYmVyJ11cIiBSb3dEZWY9XCJbJ09uYW1lJywgJ090aWxsbnVtYmVyJ11cIj48L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydPbmFtZScsICdPdGlsbG51bWJlciddO1wiPjwvdHI+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cblxuXG4gICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiWydjYXRlZ29yeScsICduYW1lJywgJ2NvZGUnXVwiIFJvd0RlZj1cIlsnY2F0ZWdvcnknLCAnbmFtZScsICdjb2RlJ11cIj48L3RyPlxuICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydjYXRlZ29yeScsICduYW1lJywgJ2NvZGUnXTtcIj48L3RyPlxuICAgIDwvdGFibGU+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgKm5nSWY9XCJsb2FkaW5nU2VydmljZS5pc0xvYWRpbmckIHwgYXN5bmNcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICA8bWF0LXBhZ2luYXRvciAjcGFnaW5hdG9yIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzI1LCA1MCwgMTAwXVwiIHNob3dGaXJzdExhc3RCdXR0b25zIChwYWdlKT1cInVwZGF0ZVBhZ2VTaXplKCRldmVudClcIj48L21hdC1wYWdpbmF0b3I+XG48L2Rpdj4iXX0=