exceladdincbms-v2 5.12.0 → 17.0.0
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/exceladdincbms.mjs +5 -0
- package/esm2022/lib/auth.service.mjs +56 -61
- package/esm2022/lib/base-app.service.mjs +41 -41
- package/esm2022/lib/bulk-tool.component.mjs +19 -19
- package/esm2022/lib/bulk-tool.module.mjs +51 -52
- package/esm2022/lib/constant.enum.mjs +5 -5
- package/esm2022/lib/environmentsModel.info.mjs +3 -2
- package/esm2022/lib/http-interceptor.mjs +25 -25
- package/esm2022/lib/login/login.component.mjs +111 -158
- package/esm2022/lib/materils/materils.module.mjs +177 -178
- package/esm2022/lib/menu/menu.component.mjs +187 -293
- package/esm2022/public_api.mjs +9 -9
- package/fesm2022/exceladdincbms.mjs +646 -0
- package/fesm2022/exceladdincbms.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/auth.service.d.ts +18 -20
- package/lib/base-app.service.d.ts +16 -16
- package/lib/bulk-tool.component.d.ts +8 -8
- package/lib/bulk-tool.module.d.ts +17 -17
- package/lib/constant.enum.d.ts +5 -5
- package/lib/environmentsModel.info.d.ts +9 -5
- package/lib/http-interceptor.d.ts +8 -8
- package/lib/login/login.component.d.ts +32 -32
- package/lib/materils/materils.module.d.ts +46 -46
- package/lib/menu/menu.component.d.ts +49 -51
- package/package.json +7 -7
- package/public_api.d.ts +6 -6
- package/src/styles.css +44 -0
- package/esm2022/exceladdincbms-v1.mjs +0 -5
- package/fesm2022/exceladdincbms-v1.mjs +0 -806
- package/fesm2022/exceladdincbms-v1.mjs.map +0 -1
|
@@ -1,158 +1,111 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import { Location } from "@angular/common";
|
|
3
|
-
import { Router, ActivatedRoute } from '@angular/router';
|
|
4
|
-
import { FormBuilder, Validators } from '@angular/forms';
|
|
5
|
-
import { first } from 'rxjs/operators';
|
|
6
|
-
import { Constant } from '../constant.enum';
|
|
7
|
-
import { AuthService } from '../auth.service';
|
|
8
|
-
import { BaseAppService } from '../base-app.service';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/forms";
|
|
11
|
-
import * as i2 from "@angular/router";
|
|
12
|
-
import * as i3 from "@angular/common";
|
|
13
|
-
import * as i4 from "../auth.service";
|
|
14
|
-
import * as i5 from "../base-app.service";
|
|
15
|
-
import * as i6 from "@angular/material/button";
|
|
16
|
-
import * as i7 from "@angular/material/icon";
|
|
17
|
-
import * as i8 from "@angular/material/
|
|
18
|
-
import * as i9 from "@angular/material/
|
|
19
|
-
import * as i10 from "@angular/material/progress-spinner";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
this.isLoading = false;
|
|
112
|
-
this.router.navigate([this.returnUrl]);
|
|
113
|
-
}
|
|
114
|
-
}, error => {
|
|
115
|
-
this.isLoading = false;
|
|
116
|
-
this.error = Constant.INVALID;
|
|
117
|
-
this.router.navigate(["/login"]);
|
|
118
|
-
//this.submitClick = true;
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
/** @nocollapse */ static ɵfac = function LoginComponent_Factory(t) { return new (t || LoginComponent)(i0.ɵɵdirectiveInject(i1.FormBuilder), i0.ɵɵdirectiveInject(i2.ActivatedRoute), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i3.Location), i0.ɵɵdirectiveInject(i4.AuthService), i0.ɵɵdirectiveInject(i5.BaseAppService)); };
|
|
122
|
-
/** @nocollapse */ static ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: LoginComponent, selectors: [["lib-login"]], inputs: { routeUrl: "routeUrl" }, decls: 22, vars: 3, consts: [[1, "container"], [1, "loginForm"], [1, "example-sidenav-content"], [1, "loginWidget"], [3, "formGroup"], [1, "form-group"], ["color", "primary", 1, "example-full-width"], ["formControlName", "username", "type", "text", "matInput", "", "placeholder", "Enter Username ", 1, "toolbar-search"], ["matSuffix", "", 2, "font-size", "1.2em"], ["formControlName", "password", "type", "password", "matInput", "", "placeholder", "Enter Password ", 1, "toolbar-search"], ["mat-button", "", 1, "!loginForm.valid", "btn", "btn-primary", 2, "background-color", "#0888CA", "color", "#fff", 3, "click"], ["class", "alert alert-danger", 4, "ngIf"], ["class", "loade", 4, "ngIf"], [1, "alert", "alert-danger"], [1, "loade"], ["color", "black", 3, "diameter"]], template: function LoginComponent_Template(rf, ctx) { if (rf & 1) {
|
|
123
|
-
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3)(4, "form", 4)(5, "h2");
|
|
124
|
-
i0.ɵɵtext(6, "Login");
|
|
125
|
-
i0.ɵɵelementEnd();
|
|
126
|
-
i0.ɵɵelementStart(7, "div");
|
|
127
|
-
i0.ɵɵtext(8, "\u00A0");
|
|
128
|
-
i0.ɵɵelementEnd();
|
|
129
|
-
i0.ɵɵelementStart(9, "div", 5)(10, "mat-form-field", 6);
|
|
130
|
-
i0.ɵɵelement(11, "input", 7)(12, "mat-icon", 8);
|
|
131
|
-
i0.ɵɵelementEnd()();
|
|
132
|
-
i0.ɵɵelementStart(13, "div", 5)(14, "mat-form-field", 6);
|
|
133
|
-
i0.ɵɵelement(15, "input", 9)(16, "mat-icon", 8);
|
|
134
|
-
i0.ɵɵelementEnd()();
|
|
135
|
-
i0.ɵɵelementStart(17, "div", 5)(18, "button", 10);
|
|
136
|
-
i0.ɵɵlistener("click", function LoginComponent_Template_button_click_18_listener() { return ctx.onLogin(); });
|
|
137
|
-
i0.ɵɵtext(19, "Login");
|
|
138
|
-
i0.ɵɵelementEnd()();
|
|
139
|
-
i0.ɵɵtemplate(20, LoginComponent_div_20_Template, 2, 1, "div", 11);
|
|
140
|
-
i0.ɵɵelementEnd()();
|
|
141
|
-
i0.ɵɵtemplate(21, LoginComponent_section_21_Template, 4, 1, "section", 12);
|
|
142
|
-
i0.ɵɵelementEnd()()();
|
|
143
|
-
} if (rf & 2) {
|
|
144
|
-
i0.ɵɵadvance(4);
|
|
145
|
-
i0.ɵɵproperty("formGroup", ctx.loginForm);
|
|
146
|
-
i0.ɵɵadvance(16);
|
|
147
|
-
i0.ɵɵproperty("ngIf", !ctx.isvalidUser);
|
|
148
|
-
i0.ɵɵadvance(1);
|
|
149
|
-
i0.ɵɵproperty("ngIf", ctx.isLoading);
|
|
150
|
-
} }, dependencies: [i6.MatButton, i7.MatIcon, i8.MatFormField, i8.MatSuffix, i9.MatInput, i10.MatSpinner, i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i3.NgIf, i1.FormGroupDirective, i1.FormControlName], styles: ["body[_ngcontent-%COMP%]{background:#f4fafd}.loginForm[_ngcontent-%COMP%]{border-radius:0;background:#fff;width:90%;max-width:450px;padding:15px;text-align:left;margin:60px auto;border:#f4f4f4 solid 1px;box-shadow:4px 2px 5px -2px #c2b3c2} .mat-button, .mat-flat-button[_ngcontent-%COMP%], .mat-icon-button[_ngcontent-%COMP%], .mat-stroked-button[_ngcontent-%COMP%]{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:28px!important;padding:0 16px;border-radius:4px;overflow:visible}.nb-spinner[_ngcontent-%COMP%]{width:75pxx;height:75px;margin:0;background:transparent;border-top:4px solid #03A9F4;border-right:4px solid transparent;border-radius:50%;animation:1s spin linear infinite}.loade[_ngcontent-%COMP%]{background:rgba(255,255,255,.5);width:100%;height:100%;overflow:hidden;padding-left:67px;position:absolute;z-index:1;opacity:50;top:0;padding-top:135px}.square-spinner[_ngcontent-%COMP%]{width:55px;display:block;background-color:#03a9f4;height:55px;animation:3s flip ease-in-out infinite} .mat-spinner circle{stroke:green;stroke-width:10%}mat-form-field[_ngcontent-%COMP%]{width:100%}"] });
|
|
151
|
-
}
|
|
152
|
-
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LoginComponent, [{
|
|
153
|
-
type: Component,
|
|
154
|
-
args: [{ selector: 'lib-login', template: "\r\n<div class=\"container\">\r\n <div class=\"loginForm\">\r\n <div class=\"example-sidenav-content\">\r\n <div class=\"loginWidget\">\r\n <form [formGroup]=\"loginForm\" >\r\n <h2>Login</h2>\r\n <div> </div>\r\n <div class=\"form-group\">\r\n <!-- <label for=\"username\">Username</label> -->\r\n <!-- <input type=\"text\" formControlName=\"username\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': submitted && formsData.username.errors }\" /> -->\r\n <mat-form-field class=\"example-full-width\"\r\n color=\"primary\">\r\n <input class=\"toolbar-search\" formControlName=\"username\" type=\"text\" matInput placeholder=\"Enter Username \">\r\n <mat-icon matSuffix style=\"font-size: 1.2em\"></mat-icon>\r\n </mat-form-field>\r\n <!-- <div *ngIf=\"submitted && formsData.username.errors\" class=\"invalid-feedback\">\r\n <div *ngIf=\"formsData.username.errors.required\">Username is required</div>\r\n </div> -->\r\n </div>\r\n <div class=\"form-group\">\r\n <!-- <label for=\"password\">Password</label> -->\r\n <!-- <input type=\"password\" formControlName=\"password\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': submitted && formsData.password.errors }\" /> -->\r\n <mat-form-field class=\"example-full-width\"\r\n color=\"primary\">\r\n <input class=\"toolbar-search\" formControlName=\"password\" type=\"password\" matInput placeholder=\"Enter Password \">\r\n <mat-icon matSuffix style=\"font-size: 1.2em\"></mat-icon>\r\n </mat-form-field>\r\n <!-- <div *ngIf=\"submitted && formsData.password.errors\" class=\"invalid-feedback\">\r\n <div *ngIf=\"formsData.password.errors.required\">Password is required</div>\r\n </div> -->\r\n </div>\r\n <div class=\"form-group\">\r\n <!-- <button [disabled]=\"submitClick\" class=\"btn btn-primary\">Login</button> -->\r\n <button style=\"background-color: #0888CA;color: #fff;\" mat-button class=\"!loginForm.valid btn btn-primary\" (click)=\"onLogin()\">Login</button>\r\n </div>\r\n <div *ngIf =\"!isvalidUser\" class=\"alert alert-danger\">{{error}}</div>\r\n </form>\r\n </div>\r\n\r\n <section class=\"loade\" *ngIf=\"isLoading\">\r\n <mat-spinner color=\"black\" [diameter]=60 ></mat-spinner>\r\n <span>\r\n Logging...\r\n </span>\r\n </section>\r\n\r\n \r\n <!-- <button type=\"button\" mat-button (click)=\"drawer.toggle()\">\r\n Toggle sidenav\r\n</button> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n", styles: ["body{background:#f4fafd}.loginForm{border-radius:0;background:#fff;width:90%;max-width:450px;padding:15px;text-align:left;margin:60px auto;border:#f4f4f4 solid 1px;box-shadow:4px 2px 5px -2px #c2b3c2}::ng-deep .mat-button,.mat-flat-button,.mat-icon-button,.mat-stroked-button{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:28px!important;padding:0 16px;border-radius:4px;overflow:visible}.nb-spinner{width:75pxx;height:75px;margin:0;background:transparent;border-top:4px solid #03A9F4;border-right:4px solid transparent;border-radius:50%;animation:1s spin linear infinite}.loade{background:rgba(255,255,255,.5);width:100%;height:100%;overflow:hidden;padding-left:67px;position:absolute;z-index:1;opacity:50;top:0;padding-top:135px}.square-spinner{width:55px;display:block;background-color:#03a9f4;height:55px;animation:3s flip ease-in-out infinite}::ng-deep .mat-spinner circle{stroke:green;stroke-width:10%}mat-form-field{width:100%}\n"] }]
|
|
155
|
-
}], function () { return [{ type: i1.FormBuilder }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.Location }, { type: i4.AuthService }, { type: i5.BaseAppService }]; }, { routeUrl: [{
|
|
156
|
-
type: Input
|
|
157
|
-
}] }); })();
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnVsay10b29sL3NyYy9saWIvbG9naW4vbG9naW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnVsay10b29sL3NyYy9saWIvbG9naW4vbG9naW4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTs7Ozs7Ozs7Ozs7OztJQzhCMUMsK0JBQXNEO0lBQUEsWUFBUztJQUFBLGlCQUFNOzs7SUFBZixlQUFTO0lBQVQsa0NBQVM7OztJQUluRSxtQ0FBeUM7SUFDdkMsa0NBQXdEO0lBQ3hELDRCQUFNO0lBQ1IsNEJBQ0E7SUFBQSxpQkFBTyxFQUFBOztJQUhzQixlQUFhO0lBQWIsNkJBQWE7O0FEdEI5QyxNQUFNLE9BQU8sY0FBYztJQVNmO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWJILFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDekIsUUFBUSxDQUFTO0lBQzFCLFNBQVMsQ0FBWTtJQUNyQixTQUFTLEdBQUcsS0FBSyxDQUFD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VSxjQUFjOzRGQUFkLGNBQWM7WUNwQjNCLDhCQUF1QixhQUFBLGFBQUEsYUFBQSxjQUFBLFNBQUE7WUFLWCxxQkFBSztZQUFBLGlCQUFLO1lBQ2QsMkJBQUs7WUFBQSxzQkFBTTtZQUFBLGlCQUFNO1lBQ2pCLDhCQUF3Qix5QkFBQTtZQU1kLDRCQUE0RyxtQkFBQTtZQUVqSCxpQkFBaUIsRUFBQTtZQUt0QiwrQkFBd0IseUJBQUE7WUFNZCw0QkFBZ0gsbUJBQUE7WUFFeEgsaUJBQWlCLEVBQUE7WUFLbkIsK0JBQXdCLGtCQUFBO1lBRXVGLDRGQUFTLGFBQVMsSUFBQztZQUFDLHNCQUFLO1lBQUEsaUJBQVMsRUFBQTtZQUVqSixrRUFBcUU7WUFDdkUsaUJBQU8sRUFBQTtZQUdULDBFQUtVO1lBTVosaUJBQU0sRUFBQSxFQUFBOztZQWhESSxlQUF1QjtZQUF2Qix5Q0FBdUI7WUFpQ3JCLGdCQUFtQjtZQUFuQix1Q0FBbUI7WUFJTCxlQUFlO1lBQWYsb0NBQWU7Ozt1RkRyQjlCLGNBQWM7Y0FOMUIsU0FBUzsyQkFDRSxXQUFXOzhMQU9aLFFBQVE7a0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb25zdGFudCB9IGZyb20gJy4uL2NvbnN0YW50LmVudW0nO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7QmFzZUFwcFNlcnZpY2V9IGZyb20gJy4uL2Jhc2UtYXBwLnNlcnZpY2UnXHJcbi8vaW1wb3J0IHsgdXJsIH0gZnJvbSAnaW5zcGVjdG9yJztcclxuZXhwb3J0IGludGVyZmFjZSBMb2dpblxyXG57XHJcbiAgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWxvZ2luJyxcclxuICB0ZW1wbGF0ZVVybDogJ2xvZ2luLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9sb2dpbi5jb21wb25lbnQuY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dpbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcHVibGljIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHJvdXRlVXJsOiBzdHJpbmc7XHJcbiAgbG9naW5Gb3JtOiBGb3JtR3JvdXA7XHJcbiAgc3VibWl0dGVkID0gZmFsc2U7XHJcbiAgcmV0dXJuVXJsOiBzdHJpbmc7XHJcbiAgZXJyb3IgPSAnJztcclxuICB1c2VySW5mbzphbnk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgcHJpdmF0ZSBhdXRoZW50aWNhdGlvblNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBiYXNlQXBwU2VydmljZTpCYXNlQXBwU2VydmljZSkgeyAgXHJcbiAgICBsZXQgdXNlck9iamVjdD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJJbmZvXCIpXHJcbiAgICB0aGlzLnVzZXJJbmZvPUpTT04ucGFyc2UodXNlck9iamVjdCk7XHJcbiAgICB0aGlzLmJhc2VBcHBTZXJ2aWNlLnNldFVzZXJJbmZvKHRoaXMudXNlckluZm8pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGlzdmFsaWRVc2VyOmJvb2xlYW4gPSB0cnVlO1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5sb2dpbkZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgdXNlcm5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHBhc3N3b3JkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICB9KTtcclxuICAgIHRoaXMucmV0dXJuVXJsID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1sncmV0dXJuVXJsJ10gfHwgdGhpcy5yb3V0ZVVybDtcclxuICAgIC8vQ2hlY2tpbmcgVXNlciBhbHJlYWR5IGxvZ2dlZCBpbiBvciBub3RcclxuICAgIGxldCBpc05hdmlnYXRlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiSXNOYXZpZ2F0ZVwiKTtcclxuICAgIGlmICh0aGlzLmxvY2F0aW9uLnBhdGgoKSAhPT0gJycgJiYgdGhpcy5sb2NhdGlvbi5wYXRoKCkuaW5kZXhPZignVXNlcklkJykgIT09IC0xKSB7XHJcbiAgICAgIGxldCB1c2VySWQ9dGhpcy5sb2NhdGlvbi5wYXRoKCkuc3BsaXQoJz8nKVsxXS5zcGxpdCgnVXNlcklkPScpWzFdXHJcbiAgICAgIGlmKHVzZXJJZD09dGhpcy51c2VySW5mby51c2VySW5mb0lkKXtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5yZXR1cm5VcmxdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYoSlNPTi5wYXJzZShpc05hdmlnYXRlKT09dHJ1ZSl7XHJcbiAgICAgICAgaWYodGhpcy51c2VySW5mbyl7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJMb2dpbiBBZnRlciBuYXZpYWd0aW9uLVwiLHRoaXMucmV0dXJuVXJsKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcIklzTmF2aWdhdGVcIik7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMucmV0dXJuVXJsXSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIGdldCBmb3Jtc0RhdGEoKTpMb2dpbiB7IHJldHVybiB0aGlzLmxvZ2luRm9ybS5jb250cm9sczsgfVxyXG5cclxuICBvbkxvZ2luKCkge1xyXG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgLy8gc3RvcCBoZXJlIGlmIGZvcm0gaXMgaW52YWxpZFxyXG4gICAgaWYgKHRoaXMubG9naW5Gb3JtLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy90aGlzLnN1Ym1pdENsaWNrID0gdHJ1ZTtcclxuICAgIHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLmxvZ2luKHRoaXMuZm9ybXNEYXRhLnVzZXJuYW1lLnZhbHVlLCB0aGlzLmZvcm1zRGF0YS5wYXNzd29yZC52YWx1ZSlcclxuICAgICAgLnBpcGUoZmlyc3QoKSlcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICBkYXRhID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEuc3RhdHVzKTtcclxuICAgICAgICAgIGlmKGRhdGEuc3RhdHVzPT09XCJJblZhbGlkXCIpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgdGhpcy5pc3ZhbGlkVXNlcj1mYWxzZTtcclxuICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBDb25zdGFudC5JTlZBTElEO1xyXG4gICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL2xvZ2luXCJdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJMb2dpbiBTdWNjZXNzLVwiLHRoaXMucmV0dXJuVXJsKTtcclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMucmV0dXJuVXJsXSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZXJyb3IgPSBDb25zdGFudC5JTlZBTElEO1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL2xvZ2luXCJdKTtcclxuICAgICAgICAgIC8vdGhpcy5zdWJtaXRDbGljayA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIlxyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImxvZ2luRm9ybVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJleGFtcGxlLXNpZGVuYXYtY29udGVudFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImxvZ2luV2lkZ2V0XCI+XHJcbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwibG9naW5Gb3JtXCIgPlxyXG4gICAgICAgIDxoMj5Mb2dpbjwvaDI+XHJcbiAgICAgICAgPGRpdj4mbmJzcDs8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgPCEtLSA8bGFiZWwgZm9yPVwidXNlcm5hbWVcIj5Vc2VybmFtZTwvbGFiZWw+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ1c2VybmFtZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmb3Jtc0RhdGEudXNlcm5hbWUuZXJyb3JzIH1cIiAvPiAtLT5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCJcclxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInRvb2xiYXItc2VhcmNoXCIgZm9ybUNvbnRyb2xOYW1lPVwidXNlcm5hbWVcIiB0eXBlPVwidGV4dFwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiRW50ZXIgVXNlcm5hbWUgXCI+XHJcbiAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4IHN0eWxlPVwiZm9udC1zaXplOiAxLjJlbVwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwic3VibWl0dGVkICYmIGZvcm1zRGF0YS51c2VybmFtZS5lcnJvcnNcIiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1zRGF0YS51c2VybmFtZS5lcnJvcnMucmVxdWlyZWRcIj5Vc2VybmFtZSBpcyByZXF1aXJlZDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICA8IS0tIDxsYWJlbCBmb3I9XCJwYXNzd29yZFwiPlBhc3N3b3JkPC9sYWJlbD4gLS0+XHJcbiAgICAgICAgICA8IS0tIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmb3Jtc0RhdGEucGFzc3dvcmQuZXJyb3JzIH1cIiAvPiAtLT5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCJcclxuICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidG9vbGJhci1zZWFyY2hcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXNzd29yZFwiIHR5cGU9XCJwYXNzd29yZFwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiRW50ZXIgUGFzc3dvcmQgXCI+XHJcbiAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4IHN0eWxlPVwiZm9udC1zaXplOiAxLjJlbVwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwic3VibWl0dGVkICYmIGZvcm1zRGF0YS5wYXNzd29yZC5lcnJvcnNcIiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1zRGF0YS5wYXNzd29yZC5lcnJvcnMucmVxdWlyZWRcIj5QYXNzd29yZCBpcyByZXF1aXJlZDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICA8IS0tIDxidXR0b24gW2Rpc2FibGVkXT1cInN1Ym1pdENsaWNrXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj5Mb2dpbjwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgIDxidXR0b24gIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogIzA4ODhDQTtjb2xvcjogI2ZmZjtcIiBtYXQtYnV0dG9uICBjbGFzcz1cIiFsb2dpbkZvcm0udmFsaWQgYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9uTG9naW4oKVwiPkxvZ2luPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZiA9XCIhaXN2YWxpZFVzZXJcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPnt7ZXJyb3J9fTwvZGl2PlxyXG4gICAgICA8L2Zvcm0+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImxvYWRlXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICAgICAgPG1hdC1zcGlubmVyIGNvbG9yPVwiYmxhY2tcIiBbZGlhbWV0ZXJdPTYwID48L21hdC1zcGlubmVyPlxyXG4gICAgICA8c3Bhbj5cclxuICAgIExvZ2dpbmcuLi5cclxuICAgIDwvc3Bhbj5cclxuICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICBcclxuICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWJ1dHRvbiAoY2xpY2spPVwiZHJhd2VyLnRvZ2dsZSgpXCI+XHJcbiAgVG9nZ2xlIHNpZGVuYXZcclxuPC9idXR0b24+IC0tPlxyXG4gIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuXHJcblxyXG4iXX0=
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { Location } from "@angular/common";
|
|
3
|
+
import { Router, ActivatedRoute } from '@angular/router';
|
|
4
|
+
import { FormBuilder, Validators } from '@angular/forms';
|
|
5
|
+
import { first } from 'rxjs/operators';
|
|
6
|
+
import { Constant } from '../constant.enum';
|
|
7
|
+
import { AuthService } from '../auth.service';
|
|
8
|
+
import { BaseAppService } from '../base-app.service';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/forms";
|
|
11
|
+
import * as i2 from "@angular/router";
|
|
12
|
+
import * as i3 from "@angular/common";
|
|
13
|
+
import * as i4 from "../auth.service";
|
|
14
|
+
import * as i5 from "../base-app.service";
|
|
15
|
+
import * as i6 from "@angular/material/button";
|
|
16
|
+
import * as i7 from "@angular/material/icon";
|
|
17
|
+
import * as i8 from "@angular/material/input";
|
|
18
|
+
import * as i9 from "@angular/material/form-field";
|
|
19
|
+
import * as i10 from "@angular/material/progress-spinner";
|
|
20
|
+
export class LoginComponent {
|
|
21
|
+
formBuilder;
|
|
22
|
+
route;
|
|
23
|
+
router;
|
|
24
|
+
location;
|
|
25
|
+
authenticationService;
|
|
26
|
+
baseAppService;
|
|
27
|
+
isLoading = false;
|
|
28
|
+
routeUrl;
|
|
29
|
+
loginForm;
|
|
30
|
+
submitted = false;
|
|
31
|
+
returnUrl;
|
|
32
|
+
error = '';
|
|
33
|
+
userInfo;
|
|
34
|
+
constructor(formBuilder, route, router, location, authenticationService, baseAppService) {
|
|
35
|
+
this.formBuilder = formBuilder;
|
|
36
|
+
this.route = route;
|
|
37
|
+
this.router = router;
|
|
38
|
+
this.location = location;
|
|
39
|
+
this.authenticationService = authenticationService;
|
|
40
|
+
this.baseAppService = baseAppService;
|
|
41
|
+
let userObject = localStorage.getItem("UserInfo");
|
|
42
|
+
this.userInfo = JSON.parse(userObject);
|
|
43
|
+
this.baseAppService.setUserInfo(this.userInfo);
|
|
44
|
+
}
|
|
45
|
+
isvalidUser = true;
|
|
46
|
+
ngOnInit() {
|
|
47
|
+
this.loginForm = this.formBuilder.group({
|
|
48
|
+
username: ['', Validators.required],
|
|
49
|
+
password: ['', Validators.required]
|
|
50
|
+
});
|
|
51
|
+
this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || this.routeUrl;
|
|
52
|
+
//Checking User already logged in or not
|
|
53
|
+
let isNavigate = localStorage.getItem("IsNavigate");
|
|
54
|
+
if (this.location.path() !== '' && this.location.path().indexOf('UserId') !== -1) {
|
|
55
|
+
let userId = this.location.path().split('?')[1].split('UserId=')[1];
|
|
56
|
+
if (userId == this.userInfo.userInfoId) {
|
|
57
|
+
this.router.navigate([this.returnUrl]);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (JSON.parse(isNavigate) == true) {
|
|
62
|
+
if (this.userInfo) {
|
|
63
|
+
console.log("Login After naviagtion-", this.returnUrl);
|
|
64
|
+
localStorage.removeItem("IsNavigate");
|
|
65
|
+
this.router.navigate([this.returnUrl]);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
get formsData() { return this.loginForm.controls; }
|
|
71
|
+
onLogin() {
|
|
72
|
+
this.submitted = true;
|
|
73
|
+
this.isLoading = true;
|
|
74
|
+
// stop here if form is invalid
|
|
75
|
+
if (this.loginForm.invalid) {
|
|
76
|
+
this.isLoading = false;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
//this.submitClick = true;
|
|
80
|
+
this.authenticationService.login(this.formsData.username.value, this.formsData.password.value)
|
|
81
|
+
.pipe(first())
|
|
82
|
+
.subscribe(data => {
|
|
83
|
+
console.log(data.status);
|
|
84
|
+
if (data.status === "InValid") {
|
|
85
|
+
this.isLoading = false;
|
|
86
|
+
this.isvalidUser = false;
|
|
87
|
+
this.error = Constant.INVALID;
|
|
88
|
+
this.router.navigate(["/login"]);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.log("Login Success-", this.returnUrl);
|
|
92
|
+
this.isLoading = false;
|
|
93
|
+
this.router.navigate([this.returnUrl]);
|
|
94
|
+
}
|
|
95
|
+
}, error => {
|
|
96
|
+
this.isLoading = false;
|
|
97
|
+
this.error = Constant.INVALID;
|
|
98
|
+
this.router.navigate(["/login"]);
|
|
99
|
+
//this.submitClick = true;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.Location }, { token: i4.AuthService }, { token: i5.BaseAppService }], target: i0.ɵɵFactoryTarget.Component });
|
|
103
|
+
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LoginComponent, selector: "lib-login", inputs: { routeUrl: "routeUrl" }, ngImport: i0, template: "\r\n<div class=\"container\">\r\n <div class=\"loginForm\">\r\n <div class=\"example-sidenav-content\">\r\n <div class=\"loginWidget\">\r\n <form [formGroup]=\"loginForm\" >\r\n <h2>Login</h2>\r\n <div> </div>\r\n <div class=\"form-group\">\r\n <!-- <label for=\"username\">Username</label> -->\r\n <!-- <input type=\"text\" formControlName=\"username\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': submitted && formsData.username.errors }\" /> -->\r\n <mat-form-field class=\"example-full-width\" color=\"primary\">\r\n <mat-label>Enter Username</mat-label>\r\n <input class=\"toolbar-search bxForm\" formControlName=\"username\" type=\"text\" matInput >\r\n <!-- <mat-icon matSuffix style=\"font-size: 1.2em\"></mat-icon> -->\r\n </mat-form-field>\r\n <!-- <div *ngIf=\"submitted && formsData.username.errors\" class=\"invalid-feedback\">\r\n <div *ngIf=\"formsData.username.errors.required\">Username is required</div>\r\n </div> -->\r\n </div>\r\n <div class=\"form-group\">\r\n <!-- <label for=\"password\">Password</label> -->\r\n <!-- <input type=\"password\" formControlName=\"password\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': submitted && formsData.password.errors }\" /> -->\r\n <mat-form-field class=\"example-full-width\" color=\"primary\">\r\n <mat-label>Enter Password</mat-label>\r\n <input class=\"toolbar-search\" formControlName=\"password\" type=\"password\" matInput >\r\n <mat-icon matSuffix style=\"font-size:12px\"></mat-icon>\r\n </mat-form-field>\r\n <!-- <div *ngIf=\"submitted && formsData.password.errors\" class=\"invalid-feedback\">\r\n <div *ngIf=\"formsData.password.errors.required\">Password is required</div>\r\n </div> -->\r\n </div>\r\n <div class=\"form-group\">\r\n <!-- <button [disabled]=\"submitClick\" class=\"btn btn-primary\">Login</button> -->\r\n <button style=\"background-color: #0888CA; color: #fff;line-height: 21px; padding: 4px 10px !important;\" mat-button class=\"!loginForm.valid btn btn-primary\" (click)=\"onLogin()\">Login</button>\r\n </div>\r\n <div *ngIf =\"!isvalidUser\" class=\"alert alert-danger\">{{error}}</div>\r\n </form>\r\n </div>\r\n\r\n <section class=\"loade\" *ngIf=\"isLoading\">\r\n <mat-spinner color=\"black\" [diameter]=60 ></mat-spinner>\r\n <span>\r\n Logging...\r\n </span>\r\n </section>\r\n\r\n \r\n <!-- <button type=\"button\" mat-button (click)=\"drawer.toggle()\">\r\n Toggle sidenav\r\n</button> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n", styles: ["body{background:#f4fafd}.loginForm{border-radius:0;background:#fff;width:90%;max-width:450px;padding:15px;text-align:left;margin:60px auto;border:#f4f4f4 solid 1px;-webkit-box-shadow:4px 2px 5px -2px rgba(194,179,194,1);-moz-box-shadow:4px 2px 5px -2px rgba(194,179,194,1);box-shadow:4px 2px 5px -2px #c2b3c2}::ng-deep .mat-button,.mat-flat-button,.mat-icon-button,.mat-stroked-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:top;text-align:center;margin:0;min-width:64px;line-height:28px!important;padding:0 16px;border-radius:4px;overflow:visible}.nb-spinner{width:75pxx;height:75px;margin:0;background:transparent;border-top:4px solid #03A9F4;border-right:4px solid transparent;border-radius:50%;-webkit-animation:1s spin linear infinite;animation:1s spin linear infinite}.loade{background:#ffffff80;width:100%;height:100%;overflow:hidden;padding-left:67px;position:absolute;z-index:1;opacity:50;top:0;padding-top:135px}.square-spinner{width:55px;display:block;background-color:#03a9f4;height:55px;-webkit-animation:3s rotate2 ease-in-out infinite;animation:3s flip ease-in-out infinite}::ng-deep .mat-spinner circle{stroke:green;stroke-width:10%}mat-form-field{width:100%}.mat-mdc-input-element{font-size:16px!important;margin:0!important;padding:5px 0 8px!important;line-height:16px!important;vertical-align:text-bottom}::ng-deep .mat-mdc-form-field-required-marker{display:none!important}::ng-deep .mdc-floating-label--required:after{content:none!important}\n"], dependencies: [{ kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.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: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
|
|
104
|
+
}
|
|
105
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, decorators: [{
|
|
106
|
+
type: Component,
|
|
107
|
+
args: [{ selector: 'lib-login', template: "\r\n<div class=\"container\">\r\n <div class=\"loginForm\">\r\n <div class=\"example-sidenav-content\">\r\n <div class=\"loginWidget\">\r\n <form [formGroup]=\"loginForm\" >\r\n <h2>Login</h2>\r\n <div> </div>\r\n <div class=\"form-group\">\r\n <!-- <label for=\"username\">Username</label> -->\r\n <!-- <input type=\"text\" formControlName=\"username\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': submitted && formsData.username.errors }\" /> -->\r\n <mat-form-field class=\"example-full-width\" color=\"primary\">\r\n <mat-label>Enter Username</mat-label>\r\n <input class=\"toolbar-search bxForm\" formControlName=\"username\" type=\"text\" matInput >\r\n <!-- <mat-icon matSuffix style=\"font-size: 1.2em\"></mat-icon> -->\r\n </mat-form-field>\r\n <!-- <div *ngIf=\"submitted && formsData.username.errors\" class=\"invalid-feedback\">\r\n <div *ngIf=\"formsData.username.errors.required\">Username is required</div>\r\n </div> -->\r\n </div>\r\n <div class=\"form-group\">\r\n <!-- <label for=\"password\">Password</label> -->\r\n <!-- <input type=\"password\" formControlName=\"password\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': submitted && formsData.password.errors }\" /> -->\r\n <mat-form-field class=\"example-full-width\" color=\"primary\">\r\n <mat-label>Enter Password</mat-label>\r\n <input class=\"toolbar-search\" formControlName=\"password\" type=\"password\" matInput >\r\n <mat-icon matSuffix style=\"font-size:12px\"></mat-icon>\r\n </mat-form-field>\r\n <!-- <div *ngIf=\"submitted && formsData.password.errors\" class=\"invalid-feedback\">\r\n <div *ngIf=\"formsData.password.errors.required\">Password is required</div>\r\n </div> -->\r\n </div>\r\n <div class=\"form-group\">\r\n <!-- <button [disabled]=\"submitClick\" class=\"btn btn-primary\">Login</button> -->\r\n <button style=\"background-color: #0888CA; color: #fff;line-height: 21px; padding: 4px 10px !important;\" mat-button class=\"!loginForm.valid btn btn-primary\" (click)=\"onLogin()\">Login</button>\r\n </div>\r\n <div *ngIf =\"!isvalidUser\" class=\"alert alert-danger\">{{error}}</div>\r\n </form>\r\n </div>\r\n\r\n <section class=\"loade\" *ngIf=\"isLoading\">\r\n <mat-spinner color=\"black\" [diameter]=60 ></mat-spinner>\r\n <span>\r\n Logging...\r\n </span>\r\n </section>\r\n\r\n \r\n <!-- <button type=\"button\" mat-button (click)=\"drawer.toggle()\">\r\n Toggle sidenav\r\n</button> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n", styles: ["body{background:#f4fafd}.loginForm{border-radius:0;background:#fff;width:90%;max-width:450px;padding:15px;text-align:left;margin:60px auto;border:#f4f4f4 solid 1px;-webkit-box-shadow:4px 2px 5px -2px rgba(194,179,194,1);-moz-box-shadow:4px 2px 5px -2px rgba(194,179,194,1);box-shadow:4px 2px 5px -2px #c2b3c2}::ng-deep .mat-button,.mat-flat-button,.mat-icon-button,.mat-stroked-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:top;text-align:center;margin:0;min-width:64px;line-height:28px!important;padding:0 16px;border-radius:4px;overflow:visible}.nb-spinner{width:75pxx;height:75px;margin:0;background:transparent;border-top:4px solid #03A9F4;border-right:4px solid transparent;border-radius:50%;-webkit-animation:1s spin linear infinite;animation:1s spin linear infinite}.loade{background:#ffffff80;width:100%;height:100%;overflow:hidden;padding-left:67px;position:absolute;z-index:1;opacity:50;top:0;padding-top:135px}.square-spinner{width:55px;display:block;background-color:#03a9f4;height:55px;-webkit-animation:3s rotate2 ease-in-out infinite;animation:3s flip ease-in-out infinite}::ng-deep .mat-spinner circle{stroke:green;stroke-width:10%}mat-form-field{width:100%}.mat-mdc-input-element{font-size:16px!important;margin:0!important;padding:5px 0 8px!important;line-height:16px!important;vertical-align:text-bottom}::ng-deep .mat-mdc-form-field-required-marker{display:none!important}::ng-deep .mdc-floating-label--required:after{content:none!important}\n"] }]
|
|
108
|
+
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.Location }, { type: i4.AuthService }, { type: i5.BaseAppService }], propDecorators: { routeUrl: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}] } });
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnVsay10b29sL3NyYy9saWIvbG9naW4vbG9naW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnVsay10b29sL3NyYy9saWIvbG9naW4vbG9naW4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTs7Ozs7Ozs7Ozs7O0FBYWxELE1BQU0sT0FBTyxjQUFjO0lBU2Y7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBYkgsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUN6QixRQUFRLENBQVM7SUFDMUIsU0FBUyxDQUFZO0lBQ3JCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsU0FBUyxDQUFTO0lBQ2xCLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxRQUFRLENBQUs7SUFDYixZQUNVLFdBQXdCLEVBQ3hCLEtBQXFCLEVBQ3JCLE1BQWMsRUFDZCxRQUFrQixFQUNsQixxQkFBa0MsRUFDbEMsY0FBNkI7UUFMN0IsZ0JBQVcsR0FBWCxX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c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb25zdGFudCB9IGZyb20gJy4uL2NvbnN0YW50LmVudW0nO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7QmFzZUFwcFNlcnZpY2V9IGZyb20gJy4uL2Jhc2UtYXBwLnNlcnZpY2UnXHJcbi8vaW1wb3J0IHsgdXJsIH0gZnJvbSAnaW5zcGVjdG9yJztcclxuZXhwb3J0IGludGVyZmFjZSBMb2dpblxyXG57XHJcbiAgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWxvZ2luJyxcclxuICB0ZW1wbGF0ZVVybDogJ2xvZ2luLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9sb2dpbi5jb21wb25lbnQuY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dpbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcHVibGljIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHJvdXRlVXJsOiBzdHJpbmc7XHJcbiAgbG9naW5Gb3JtOiBGb3JtR3JvdXA7XHJcbiAgc3VibWl0dGVkID0gZmFsc2U7XHJcbiAgcmV0dXJuVXJsOiBzdHJpbmc7XHJcbiAgZXJyb3IgPSAnJztcclxuICB1c2VySW5mbzphbnk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgcHJpdmF0ZSBhdXRoZW50aWNhdGlvblNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBiYXNlQXBwU2VydmljZTpCYXNlQXBwU2VydmljZSkgeyAgXHJcbiAgICBsZXQgdXNlck9iamVjdD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJJbmZvXCIpXHJcbiAgICB0aGlzLnVzZXJJbmZvPUpTT04ucGFyc2UodXNlck9iamVjdCk7XHJcbiAgICB0aGlzLmJhc2VBcHBTZXJ2aWNlLnNldFVzZXJJbmZvKHRoaXMudXNlckluZm8pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGlzdmFsaWRVc2VyOmJvb2xlYW4gPSB0cnVlO1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5sb2dpbkZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgdXNlcm5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHBhc3N3b3JkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICB9KTtcclxuICAgIHRoaXMucmV0dXJuVXJsID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1sncmV0dXJuVXJsJ10gfHwgdGhpcy5yb3V0ZVVybDtcclxuICAgIC8vQ2hlY2tpbmcgVXNlciBhbHJlYWR5IGxvZ2dlZCBpbiBvciBub3RcclxuICAgIGxldCBpc05hdmlnYXRlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiSXNOYXZpZ2F0ZVwiKTtcclxuICAgIGlmICh0aGlzLmxvY2F0aW9uLnBhdGgoKSAhPT0gJycgJiYgdGhpcy5sb2NhdGlvbi5wYXRoKCkuaW5kZXhPZignVXNlcklkJykgIT09IC0xKSB7XHJcbiAgICAgIGxldCB1c2VySWQ9dGhpcy5sb2NhdGlvbi5wYXRoKCkuc3BsaXQoJz8nKVsxXS5zcGxpdCgnVXNlcklkPScpWzFdXHJcbiAgICAgIGlmKHVzZXJJZD09dGhpcy51c2VySW5mby51c2VySW5mb0lkKXtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5yZXR1cm5VcmxdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYoSlNPTi5wYXJzZShpc05hdmlnYXRlKT09dHJ1ZSl7XHJcbiAgICAgICAgaWYodGhpcy51c2VySW5mbyl7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJMb2dpbiBBZnRlciBuYXZpYWd0aW9uLVwiLHRoaXMucmV0dXJuVXJsKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcIklzTmF2aWdhdGVcIik7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMucmV0dXJuVXJsXSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIGdldCBmb3Jtc0RhdGEoKTpMb2dpbiB7IHJldHVybiB0aGlzLmxvZ2luRm9ybS5jb250cm9sczsgfVxyXG5cclxuICBvbkxvZ2luKCkge1xyXG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgLy8gc3RvcCBoZXJlIGlmIGZvcm0gaXMgaW52YWxpZFxyXG4gICAgaWYgKHRoaXMubG9naW5Gb3JtLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy90aGlzLnN1Ym1pdENsaWNrID0gdHJ1ZTtcclxuICAgIHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLmxvZ2luKHRoaXMuZm9ybXNEYXRhLnVzZXJuYW1lLnZhbHVlLCB0aGlzLmZvcm1zRGF0YS5wYXNzd29yZC52YWx1ZSlcclxuICAgICAgLnBpcGUoZmlyc3QoKSlcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICBkYXRhID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEuc3RhdHVzKTtcclxuICAgICAgICAgIGlmKGRhdGEuc3RhdHVzPT09XCJJblZhbGlkXCIpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgdGhpcy5pc3ZhbGlkVXNlcj1mYWxzZTtcclxuICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBDb25zdGFudC5JTlZBTElEO1xyXG4gICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL2xvZ2luXCJdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJMb2dpbiBTdWNjZXNzLVwiLHRoaXMucmV0dXJuVXJsKTtcclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMucmV0dXJuVXJsXSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZXJyb3IgPSBDb25zdGFudC5JTlZBTElEO1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL2xvZ2luXCJdKTtcclxuICAgICAgICAgIC8vdGhpcy5zdWJtaXRDbGljayA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIlxyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImxvZ2luRm9ybVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJleGFtcGxlLXNpZGVuYXYtY29udGVudFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImxvZ2luV2lkZ2V0XCI+XHJcbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwibG9naW5Gb3JtXCIgPlxyXG4gICAgICAgIDxoMj5Mb2dpbjwvaDI+XHJcbiAgICAgICAgPGRpdj4mbmJzcDs8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgPCEtLSA8bGFiZWwgZm9yPVwidXNlcm5hbWVcIj5Vc2VybmFtZTwvbGFiZWw+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8aW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ1c2VybmFtZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmb3Jtc0RhdGEudXNlcm5hbWUuZXJyb3JzIH1cIiAvPiAtLT5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCIgY29sb3I9XCJwcmltYXJ5XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5FbnRlciBVc2VybmFtZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0b29sYmFyLXNlYXJjaCBieEZvcm1cIiBmb3JtQ29udHJvbE5hbWU9XCJ1c2VybmFtZVwiIHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgPlxyXG4gICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWljb24gbWF0U3VmZml4IHN0eWxlPVwiZm9udC1zaXplOiAxLjJlbVwiPjwvbWF0LWljb24+IC0tPlxyXG4gICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInN1Ym1pdHRlZCAmJiBmb3Jtc0RhdGEudXNlcm5hbWUuZXJyb3JzXCIgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3Jtc0RhdGEudXNlcm5hbWUuZXJyb3JzLnJlcXVpcmVkXCI+VXNlcm5hbWUgaXMgcmVxdWlyZWQ8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgPCEtLSA8bGFiZWwgZm9yPVwicGFzc3dvcmRcIj5QYXNzd29yZDwvbGFiZWw+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZm9ybXNEYXRhLnBhc3N3b3JkLmVycm9ycyB9XCIgLz4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RW50ZXIgUGFzc3dvcmQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidG9vbGJhci1zZWFyY2hcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXNzd29yZFwiIHR5cGU9XCJwYXNzd29yZFwiIG1hdElucHV0ID5cclxuICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggc3R5bGU9XCJmb250LXNpemU6MTJweFwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwic3VibWl0dGVkICYmIGZvcm1zRGF0YS5wYXNzd29yZC5lcnJvcnNcIiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1zRGF0YS5wYXNzd29yZC5lcnJvcnMucmVxdWlyZWRcIj5QYXNzd29yZCBpcyByZXF1aXJlZDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICA8IS0tIDxidXR0b24gW2Rpc2FibGVkXT1cInN1Ym1pdENsaWNrXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj5Mb2dpbjwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgIDxidXR0b24gIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogIzA4ODhDQTsgY29sb3I6ICNmZmY7bGluZS1oZWlnaHQ6IDIxcHg7IHBhZGRpbmc6IDRweCAxMHB4ICFpbXBvcnRhbnQ7XCIgbWF0LWJ1dHRvbiAgY2xhc3M9XCIhbG9naW5Gb3JtLnZhbGlkIGJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJvbkxvZ2luKClcIj5Mb2dpbjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWYgPVwiIWlzdmFsaWRVc2VyXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj57e2Vycm9yfX08L2Rpdj5cclxuICAgICAgPC9mb3JtPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJsb2FkZVwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XHJcbiAgICAgIDxtYXQtc3Bpbm5lciBjb2xvcj1cImJsYWNrXCIgW2RpYW1ldGVyXT02MCA+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgPHNwYW4+XHJcbiAgICBMb2dnaW5nLi4uXHJcbiAgICA8L3NwYW4+XHJcbiAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgXHJcbiAgICA8IS0tIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gKGNsaWNrKT1cImRyYXdlci50b2dnbGUoKVwiPlxyXG4gIFRvZ2dsZSBzaWRlbmF2XHJcbjwvYnV0dG9uPiAtLT5cclxuICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcblxyXG5cclxuIl19
|