UNPKG

angular-magic-breadcrumb

Version:

AngularMagicBreadcrumb is a library for self-generated breadcrumb in angular 7

251 lines 23 kB
/** * @fileoverview added by tsickle * Generated from: lib/custom-breadcrumb.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input } from '@angular/core'; import { NavigationEnd, Router } from "@angular/router"; import { AngularMagicBreadcrumbService } from "./angular-magic-breadcrumb.service"; import { filter } from "rxjs/operators"; import { Location } from '@angular/common'; var CustomBreadcrumbComponent = /** @class */ (function () { function CustomBreadcrumbComponent(router, breadcrumbService, location) { this.router = router; this.breadcrumbService = breadcrumbService; this.location = location; // this variable will handle the current url split into a list structure this.currentsplitUrl = []; // this variable will handle the full breadcrumb itself, this variable will be used in the HTML template this.breadcumValue = []; // this variable is a flag that indicates if the Breadcrumb must be shown in a specific view this.showBreadcrum = true; } /** * @return {?} */ CustomBreadcrumbComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.setUrls(); this.getBreadcrum(); }; /** * Checks if the part of the breadcrumb is active or not, and make the redirection to the specific url of the part * @param breadcrum -> part of the full breadcrumb */ /** * Checks if the part of the breadcrumb is active or not, and make the redirection to the specific url of the part * @param {?} breadcrum -> part of the full breadcrumb * @return {?} */ CustomBreadcrumbComponent.prototype.redirectToView = /** * Checks if the part of the breadcrumb is active or not, and make the redirection to the specific url of the part * @param {?} breadcrum -> part of the full breadcrumb * @return {?} */ function (breadcrum) { if (breadcrum.active) { return; } this.router.navigate([breadcrum.url]); }; /** * Make the subscriptions to the two observables, and saves the value of them into a specific variable * saves the breadcrumb and if should be shown or not */ /** * Make the subscriptions to the two observables, and saves the value of them into a specific variable * saves the breadcrumb and if should be shown or not * @return {?} */ CustomBreadcrumbComponent.prototype.getBreadcrum = /** * Make the subscriptions to the two observables, and saves the value of them into a specific variable * saves the breadcrumb and if should be shown or not * @return {?} */ function () { var _this = this; this.breadcrumbService.breadcrumbStructure_.subscribe((/** * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var newBreadcrum = []; value.forEach((/** * @param {?} item * @return {?} */ function (item) { if (item.show == true) { newBreadcrum.push(item); } })); _this.breadcumValue = newBreadcrum; })); this.breadcrumbService.showBreadcrumbStructure_.subscribe((/** * @param {?} value * @return {?} */ function (value) { _this.showBreadcrum = value; })); }; /** * @return {?} */ CustomBreadcrumbComponent.prototype.setUrls = /** * @return {?} */ function () { var _this = this; this._mainRoot = this.mainRoot; this.router.events.pipe( // Just executed when an navigation event ends filter((/** * @param {?} event * @return {?} */ function (event) { return event instanceof NavigationEnd; }))).subscribe((/** * @return {?} */ function () { // returns and save the breadcrumb into a new temporal variable /** @type {?} */ var currentBreadCrumStructure = _this.getBreadcrumbStructure(); // resets the structure of the breadcrumb _this.breadcrumbService.resetBreadcrumbStructure(); // this variable will hold the url to add to the breadcrumb structure /** @type {?} */ var setsUrl = ''; /** @type {?} */ var pathnameUrl = _this.location.path().split('#')[0].split('?')[0]; // this condition is when the breadcrumb is in a platform that has got a route that we don't want to show in the breadcrumb if (pathnameUrl.includes('/' + _this._mainRoot + '/')) { setsUrl = '/' + _this._mainRoot; } if (pathnameUrl != _this.lastPathname) { // the breadcrumb must be shown if the first item change _this.showBreadcrum = true; } // splits the url by the route on the condition above and splits it by the '/' separator // Removes the /plataforma/ and params if the url have one of them /** @type {?} */ var splitUrl = pathnameUrl.split('/' + _this._mainRoot + '/').join('').split('/'); // this line assure us that the url split has no blanks or null or empty elements splitUrl = splitUrl.filter(Boolean); splitUrl.forEach((/** * @param {?} item * @param {?} index * @return {?} */ function (item, index) { setsUrl = setsUrl + '/' + item; // a variable that holds the new part that will be added to the breadcrumb /** @type {?} */ var newBreadcrum = {}; // if one part of the breadcrumb did'nt change, the last known value will be added (remains the same) if (_this.currentsplitUrl[index] === item) { newBreadcrum = currentBreadCrumStructure[index]; } else { // else... a new structure is created newBreadcrum = { value: item, url: setsUrl, active: splitUrl.length - 1 === index, show: true }; } // the new part of the breadcrumb is added to the structure that will be shown _this.setItemBreadcrumbStructure(newBreadcrum, index); if (splitUrl.length - 1 === index) { // in the last item of the route, the current route split is setted into the variable, to use it later when another navigation // event happens _this.currentsplitUrl = splitUrl; } })); _this.lastPathname = pathnameUrl; })); }; /** * @param {?} newBreadcrum * @param {?} index * @return {?} */ CustomBreadcrumbComponent.prototype.setItemBreadcrumbStructure = /** * @param {?} newBreadcrum * @param {?} index * @return {?} */ function (newBreadcrum, index) { this.breadcrumbService.setItemBreadcrumbStructure(newBreadcrum, index); }; /** * @return {?} */ CustomBreadcrumbComponent.prototype.getBreadcrumbStructure = /** * @return {?} */ function () { return this.breadcrumbService.getBreadcrumbStructure(); }; /** * @param {?} value * @return {?} */ CustomBreadcrumbComponent.prototype.changeVisibilityBreadcrumb = /** * @param {?} value * @return {?} */ function (value) { this.breadcrumbService.changeVisibilityBreadcrumb(value); }; CustomBreadcrumbComponent.decorators = [ { type: Component, args: [{ selector: 'lng-self-generated-breadcrumb', template: "<div class=\"dynamic-breadcrumb\">\r\n <nav aria-label=\"breadcrumb\" class=\"navigation\" *ngIf=\"showBreadcrum\">\r\n <ol class=\"breadcrumb\">\r\n <li class=\"breadcrumb-item\" [class.active]=\"breadcrum.active\"\r\n (click)=\"redirectToView(breadcrum)\"\r\n style=\"text-transform: capitalize\"\r\n *ngFor=\"let breadcrum of breadcumValue\">{{breadcrum.value}}</li>\r\n </ol>\r\n </nav>\r\n</div>\r\n", providers: [AngularMagicBreadcrumbService], styles: [".dynamic-breadcrumb{background-color:#fff}.navigation{display:block}.breadcrumb{display:flex;flex-wrap:wrap;list-style:none;border-radius:.25rem;background-color:#fff;font-size:15px;padding:31px 30px 10px;color:#898989;font-weight:300;max-width:1216px;margin:0 auto}.breadcrumb .breadcrumb-item+.breadcrumb-item::before{display:inline-block;color:#6c757d;content:\"/\";padding-right:5px}.breadcrumb .breadcrumb-item{padding-left:5px}.breadcrumb .breadcrumb-item:not(.active){cursor:pointer}.breadcrumb .breadcrumb-item.active{color:#707070;font-weight:400}@media (min-width:768px){.breadcrumb{padding-left:30px;padding-bottom:22px}}@media (min-width:992px){.breadcrumb{padding-left:45px}}@media (min-width:1200px){.breadcrumb{font-size:17px;padding:40px 50px 10px}}"] }] } ]; /** @nocollapse */ CustomBreadcrumbComponent.ctorParameters = function () { return [ { type: Router }, { type: AngularMagicBreadcrumbService }, { type: Location } ]; }; CustomBreadcrumbComponent.propDecorators = { mainRoot: [{ type: Input }] }; return CustomBreadcrumbComponent; }()); export { CustomBreadcrumbComponent }; if (false) { /** @type {?} */ CustomBreadcrumbComponent.prototype.mainRoot; /** @type {?} */ CustomBreadcrumbComponent.prototype._mainRoot; /** @type {?} */ CustomBreadcrumbComponent.prototype.lastPathname; /** @type {?} */ CustomBreadcrumbComponent.prototype.currentsplitUrl; /** @type {?} */ CustomBreadcrumbComponent.prototype.breadcumValue; /** @type {?} */ CustomBreadcrumbComponent.prototype.showBreadcrum; /** * @type {?} * @private */ CustomBreadcrumbComponent.prototype.router; /** @type {?} */ CustomBreadcrumbComponent.prototype.breadcrumbService; /** * @type {?} * @private */ CustomBreadcrumbComponent.prototype.location; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWJyZWFkY3J1bWIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1tYWdpYy1icmVhZGNydW1iLyIsInNvdXJjZXMiOlsibGliL2N1c3RvbS1icmVhZGNydW1iLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDakYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QztJQXFCRSxtQ0FDVSxNQUFjLEVBQ2YsaUJBQWdELEVBQy9DLFFBQWtCO1FBRmxCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZixzQkFBaUIsR0FBakIsaUJBQWlCLENBQStCO1FBQy9DLGFBQVEsR0FBUixRQUFRLENBQVU7O1FBYjVCLG9CQUFlLEdBQUcsRUFBRSxDQUFDOztRQUVyQixrQkFBYSxHQUlQLEVBQUUsQ0FBQzs7UUFFVCxrQkFBYSxHQUFHLElBQUksQ0FBQztJQU1qQixDQUFDOzs7O0lBRUwsNENBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7Ozs7OztJQUNILGtEQUFjOzs7OztJQUFkLFVBQWUsU0FBUztRQUN0QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFD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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge05hdmlnYXRpb25FbmQsIFJvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0FuZ3VsYXJNYWdpY0JyZWFkY3J1bWJTZXJ2aWNlfSBmcm9tIFwiLi9hbmd1bGFyLW1hZ2ljLWJyZWFkY3J1bWIuc2VydmljZVwiO1xyXG5pbXBvcnQge2ZpbHRlcn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7TG9jYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xuZy1zZWxmLWdlbmVyYXRlZC1icmVhZGNydW1iJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY3VzdG9tLWJyZWFkY3J1bWIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS1icmVhZGNydW1iLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbQW5ndWxhck1hZ2ljQnJlYWRjcnVtYlNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21CcmVhZGNydW1iQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBtYWluUm9vdDogU3RyaW5nO1xyXG4gIF9tYWluUm9vdDogU3RyaW5nO1xyXG4gIGxhc3RQYXRobmFtZTogc3RyaW5nO1xyXG4gIC8vIHRoaXMgdmFyaWFibGUgd2lsbCBoYW5kbGUgdGhlIGN1cnJlbnQgdXJsIHNwbGl0IGludG8gYSBsaXN0IHN0cnVjdHVyZVxyXG4gIGN1cnJlbnRzcGxpdFVybCA9IFtdO1xyXG4gIC8vIHRoaXMgdmFyaWFibGUgd2lsbCBoYW5kbGUgdGhlIGZ1bGwgYnJlYWRjcnVtYiBpdHNlbGYsIHRoaXMgdmFyaWFibGUgd2lsbCBiZSB1c2VkIGluIHRoZSBIVE1MIHRlbXBsYXRlXHJcbiAgYnJlYWRjdW1WYWx1ZToge1xyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBhY3RpdmU6IGJvb2xlYW4sXHJcbiAgICB2YWx1ZTogc3RyaW5nXHJcbiAgfVtdID0gW107XHJcbiAgLy8gdGhpcyB2YXJpYWJsZSBpcyBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIEJyZWFkY3J1bWIgbXVzdCBiZSBzaG93biBpbiBhIHNwZWNpZmljIHZpZXdcclxuICBzaG93QnJlYWRjcnVtID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHVibGljIGJyZWFkY3J1bWJTZXJ2aWNlOiBBbmd1bGFyTWFnaWNCcmVhZGNydW1iU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFVybHMoKTtcclxuICAgIHRoaXMuZ2V0QnJlYWRjcnVtKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgdGhlIHBhcnQgb2YgdGhlIGJyZWFkY3J1bWIgaXMgYWN0aXZlIG9yIG5vdCwgYW5kIG1ha2UgdGhlIHJlZGlyZWN0aW9uIHRvIHRoZSBzcGVjaWZpYyB1cmwgb2YgdGhlIHBhcnRcclxuICAgKiBAcGFyYW0gYnJlYWRjcnVtIC0+IHBhcnQgb2YgdGhlIGZ1bGwgYnJlYWRjcnVtYlxyXG4gICAqL1xyXG4gIHJlZGlyZWN0VG9WaWV3KGJyZWFkY3J1bSkge1xyXG4gICAgaWYgKGJyZWFkY3J1bS5hY3RpdmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2JyZWFkY3J1bS51cmxdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2UgdGhlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHR3byBvYnNlcnZhYmxlcywgYW5kIHNhdmVzIHRoZSB2YWx1ZSBvZiB0aGVtIGludG8gYSBzcGVjaWZpYyB2YXJpYWJsZVxyXG4gICAqIHNhdmVzIHRoZSBicmVhZGNydW1iIGFuZCBpZiBzaG91bGQgYmUgc2hvd24gb3Igbm90XHJcbiAgICovXHJcbiAgZ2V0QnJlYWRjcnVtKCkge1xyXG4gICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5icmVhZGNydW1iU3RydWN0dXJlXy5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICBsZXQgbmV3QnJlYWRjcnVtID0gW107XHJcbiAgICAgIHZhbHVlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uc2hvdyA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBuZXdCcmVhZGNydW0ucHVzaChpdGVtKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuYnJlYWRjdW1WYWx1ZSA9IG5ld0JyZWFkY3J1bTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2Uuc2hvd0JyZWFkY3J1bWJTdHJ1Y3R1cmVfLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0JyZWFkY3J1bSA9IHZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRVcmxzKCkge1xyXG4gICAgdGhpcy5fbWFpblJvb3QgPSB0aGlzLm1haW5Sb290O1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXHJcbiAgICAgIC8vIEp1c3QgZXhlY3V0ZWQgd2hlbiBhbiBuYXZpZ2F0aW9uIGV2ZW50IGVuZHNcclxuICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgLy8gcmV0dXJucyBhbmQgc2F2ZSB0aGUgYnJlYWRjcnVtYiBpbnRvIGEgbmV3IHRlbXBvcmFsIHZhcmlhYmxlXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRCcmVhZENydW1TdHJ1Y3R1cmUgPSB0aGlzLmdldEJyZWFkY3J1bWJTdHJ1Y3R1cmUoKTtcclxuICAgICAgLy8gcmVzZXRzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGJyZWFkY3J1bWJcclxuICAgICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5yZXNldEJyZWFkY3J1bWJTdHJ1Y3R1cmUoKTtcclxuICAgICAgLy8gdGhpcyB2YXJpYWJsZSB3aWxsIGhvbGQgdGhlIHVybCB0byBhZGQgdG8gdGhlIGJyZWFkY3J1bWIgc3RydWN0dXJlXHJcbiAgICAgIGxldCBzZXRzVXJsID0gJyc7XHJcbiAgICAgIGNvbnN0IHBhdGhuYW1lVXJsID0gdGhpcy5sb2NhdGlvbi5wYXRoKCkuc3BsaXQoJyMnKVswXS5zcGxpdCgnPycpWzBdO1xyXG4gICAgICAvLyB0aGlzIGNvbmRpdGlvbiBpcyB3aGVuIHRoZSBicmVhZGNydW1iIGlzIGluIGEgcGxhdGZvcm0gdGhhdCBoYXMgZ290IGEgcm91dGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHNob3cgaW4gdGhlIGJyZWFkY3J1bWJcclxuICAgICAgaWYgKHBhdGhuYW1lVXJsLmluY2x1ZGVzKCcvJysgdGhpcy5fbWFpblJvb3QgKycvJykpIHtcclxuICAgICAgICBzZXRzVXJsID0gJy8nKyB0aGlzLl9tYWluUm9vdDtcclxuICAgICAgfVxyXG4gICAgICBpZiAocGF0aG5hbWVVcmwgIT0gdGhpcy5sYXN0UGF0aG5hbWUpIHtcclxuICAgICAgICAvLyB0aGUgYnJlYWRjcnVtYiBtdXN0IGJlIHNob3duIGlmIHRoZSBmaXJzdCBpdGVtIGNoYW5nZVxyXG4gICAgICAgIHRoaXMuc2hvd0JyZWFkY3J1bSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNwbGl0cyB0aGUgdXJsIGJ5IHRoZSByb3V0ZSBvbiB0aGUgY29uZGl0aW9uIGFib3ZlIGFuZCBzcGxpdHMgaXQgYnkgdGhlICcvJyBzZXBhcmF0b3JcclxuICAgICAgLy8gUmVtb3ZlcyB0aGUgL3BsYXRhZm9ybWEvIGFuZCBwYXJhbXMgaWYgdGhlIHVybCBoYXZlIG9uZSBvZiB0aGVtXHJcbiAgICAgIGxldCBzcGxpdFVybCA9IHBhdGhuYW1lVXJsLnNwbGl0KCcvJysgdGhpcy5fbWFpblJvb3QgKycvJykuam9pbignJykuc3BsaXQoJy8nKTtcclxuICAgICAgLy8gdGhpcyBsaW5lIGFzc3VyZSB1cyB0aGF0IHRoZSB1cmwgc3BsaXQgaGFzIG5vIGJsYW5rcyBvciBudWxsIG9yIGVtcHR5IGVsZW1lbnRzXHJcbiAgICAgIHNwbGl0VXJsID0gc3BsaXRVcmwuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgICBzcGxpdFVybC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHNldHNVcmwgPSBzZXRzVXJsICsgJy8nICsgaXRlbTtcclxuICAgICAgICAvLyBhIHZhcmlhYmxlIHRoYXQgaG9sZHMgdGhlIG5ldyBwYXJ0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYnJlYWRjcnVtYlxyXG4gICAgICAgIGxldCBuZXdCcmVhZGNydW0gPSB7fTtcclxuICAgICAgICAvLyBpZiBvbmUgcGFydCBvZiB0aGUgYnJlYWRjcnVtYiBkaWQnbnQgY2hhbmdlLCB0aGUgbGFzdCBrbm93biB2YWx1ZSB3aWxsIGJlIGFkZGVkIChyZW1haW5zIHRoZSBzYW1lKVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRzcGxpdFVybFtpbmRleF0gPT09IGl0ZW0pIHtcclxuICAgICAgICAgIG5ld0JyZWFkY3J1bSA9IGN1cnJlbnRCcmVhZENydW1TdHJ1Y3R1cmVbaW5kZXhdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBlbHNlLi4uIGEgbmV3IHN0cnVjdHVyZSBpcyBjcmVhdGVkXHJcbiAgICAgICAgICBuZXdCcmVhZGNydW0gPSB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxyXG4gICAgICAgICAgICB1cmw6IHNldHNVcmwsXHJcbiAgICAgICAgICAgIGFjdGl2ZTogc3BsaXRVcmwubGVuZ3RoIC0gMSA9PT0gaW5kZXgsXHJcbiAgICAgICAgICAgIHNob3c6IHRydWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoZSBuZXcgcGFydCBvZiB0aGUgYnJlYWRjcnVtYiBpcyBhZGRlZCB0byB0aGUgc3RydWN0dXJlIHRoYXQgd2lsbCBiZSBzaG93blxyXG4gICAgICAgIHRoaXMuc2V0SXRlbUJyZWFkY3J1bWJTdHJ1Y3R1cmUobmV3QnJlYWRjcnVtLCBpbmRleCk7XHJcblxyXG4gICAgICAgIGlmIChzcGxpdFVybC5sZW5ndGggLSAxID09PSBpbmRleCkge1xyXG4gICAgICAgICAgLy8gaW4gdGhlIGxhc3QgaXRlbSBvZiB0aGUgcm91dGUsIHRoZSBjdXJyZW50IHJvdXRlIHNwbGl0IGlzIHNldHRlZCBpbnRvIHRoZSB2YXJpYWJsZSwgdG8gdXNlIGl0IGxhdGVyIHdoZW4gYW5vdGhlciBuYXZpZ2F0aW9uXHJcbiAgICAgICAgICAvLyBldmVudCBoYXBwZW5zXHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRzcGxpdFVybCA9IHNwbGl0VXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmxhc3RQYXRobmFtZSA9IHBhdGhuYW1lVXJsO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRJdGVtQnJlYWRjcnVtYlN0cnVjdHVyZShuZXdCcmVhZGNydW0sIGluZGV4KSB7XHJcbiAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLnNldEl0ZW1CcmVhZGNydW1iU3RydWN0dXJlKG5ld0JyZWFkY3J1bSwgaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QnJlYWRjcnVtYlN0cnVjdHVyZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLmdldEJyZWFkY3J1bWJTdHJ1Y3R1cmUoKVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVmlzaWJpbGl0eUJyZWFkY3J1bWIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2UuY2hhbmdlVmlzaWJpbGl0eUJyZWFkY3J1bWIodmFsdWUpXHJcbiAgfVxyXG5cclxufVxyXG4iXX0=