fmode-ng 0.0.41 → 0.0.43

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.
Files changed (102) hide show
  1. package/LICENSE.md +8 -0
  2. package/esm2022/fmode-ng.mjs +10 -5
  3. package/esm2022/lib/aigc/agent/agent.prompt.mjs +10 -122
  4. package/esm2022/lib/aigc/agent/index.mjs +10 -2
  5. package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
  6. package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
  7. package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
  8. package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
  9. package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
  10. package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -97
  11. package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -104
  12. package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -111
  13. package/esm2022/lib/aigc/avatar/index.mjs +10 -8
  14. package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
  15. package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -166
  16. package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -36
  17. package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
  18. package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -141
  19. package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
  20. package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
  21. package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
  22. package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -92
  23. package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -2
  24. package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -2
  25. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -207
  26. package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -236
  27. package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +10 -137
  28. package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -69
  29. package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
  30. package/esm2022/lib/aigc/chat/index.mjs +10 -8
  31. package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
  32. package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -269
  33. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
  34. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
  35. package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -94
  36. package/esm2022/lib/aigc/index.mjs +10 -13
  37. package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
  38. package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +8 -736
  39. package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -181
  40. package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
  41. package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
  42. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
  43. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
  44. package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
  45. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -229
  46. package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -2
  47. package/esm2022/lib/aigc/voice/audio.player.mjs +10 -52
  48. package/esm2022/lib/aigc/voice/class-asr.mjs +8 -79
  49. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +8 -501
  50. package/esm2022/lib/aigc/voice/index.mjs +10 -3
  51. package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
  52. package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
  53. package/esm2022/lib/aigc/voice/stream.player.mjs +10 -0
  54. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +8 -233
  55. package/esm2022/lib/aigc/voice/tts/index.mjs +10 -2
  56. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -190
  57. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
  58. package/esm2022/lib/map/index.mjs +10 -4
  59. package/esm2022/lib/map/map.module.mjs +10 -61
  60. package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -110
  61. package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -98
  62. package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -100
  63. package/esm2022/lib/nova-cloud/index.mjs +10 -2
  64. package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -148
  65. package/esm2022/lib/platform/cross.service.mjs +10 -63
  66. package/esm2022/lib/platform/index.mjs +10 -2
  67. package/esm2022/lib/social/index.mjs +10 -2
  68. package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -236
  69. package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
  70. package/esm2022/lib/storage/index.mjs +10 -5
  71. package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -130
  72. package/esm2022/lib/storage/service-upload/index.mjs +10 -2
  73. package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -462
  74. package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
  75. package/esm2022/lib/storage/storage.module.mjs +10 -41
  76. package/esm2022/lib/user/account/account.service.mjs +10 -221
  77. package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
  78. package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -62
  79. package/esm2022/lib/user/index.mjs +10 -17
  80. package/esm2022/lib/user/login/auth.guard.mjs +10 -28
  81. package/esm2022/lib/user/login/auth.service.mjs +8 -373
  82. package/esm2022/lib/user/login/login.component.mjs +10 -913
  83. package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -273
  84. package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
  85. package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
  86. package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -115
  87. package/esm2022/lib/user/profile/profile.module.mjs +10 -57
  88. package/esm2022/lib/user/staff/index.mjs +10 -4
  89. package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
  90. package/esm2022/lib/user/staff/staff.module.mjs +10 -18
  91. package/esm2022/lib/user/staff/staff.service.mjs +10 -85
  92. package/esm2022/lib/user/user-name.pipe.mjs +10 -29
  93. package/esm2022/lib/user/user.module.mjs +10 -106
  94. package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
  95. package/esm2022/lib/video/index.mjs +10 -2
  96. package/esm2022/public-api.mjs +10 -13
  97. package/fesm2022/fmode-ng.mjs +7 -8895
  98. package/fesm2022/fmode-ng.mjs.map +1 -1
  99. package/lib/aigc/voice/fmode-voice.service.d.ts +18 -1
  100. package/lib/aigc/voice/stream.player.d.ts +10 -0
  101. package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
  102. package/package.json +1 -1
@@ -1,913 +1,10 @@
1
- import { Component } from '@angular/core';
2
- import { FormBuilder, Validators, } from '@angular/forms';
3
- import { Observable } from 'rxjs';
4
- import { NzMessageService } from 'ng-zorro-antd/message';
5
- import { AuthService } from './auth.service';
6
- import Parse from "parse";
7
- import { Router, ActivatedRoute } from '@angular/router';
8
- import { HttpClient } from "@angular/common/http";
9
- import { NovaCloudService } from '../../nova-cloud/nova-cloud.service';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./auth.service";
12
- import * as i2 from "../../nova-cloud/nova-cloud.service";
13
- import * as i3 from "@angular/forms";
14
- import * as i4 from "ng-zorro-antd/message";
15
- import * as i5 from "@angular/router";
16
- import * as i6 from "@angular/common/http";
17
- import * as i7 from "@angular/common";
18
- import * as i8 from "ng-zorro-antd/input";
19
- import * as i9 from "ng-zorro-antd/button";
20
- import * as i10 from "ng-zorro-antd/core/transition-patch";
21
- import * as i11 from "ng-zorro-antd/core/wave";
22
- import * as i12 from "ng-zorro-antd/modal";
23
- import * as i13 from "ng-zorro-antd/spin";
24
- import * as i14 from "ng-zorro-antd/tabs";
25
- import * as i15 from "ng-zorro-antd/grid";
26
- import * as i16 from "ng-zorro-antd/form";
27
- export class LoginComponent {
28
- // 绘制验证码
29
- drawCode(str) {
30
- // this.resetCode()
31
- this.canvas = document.getElementById("verifyCanvas"); //获取HTML端画布
32
- var context = this.canvas.getContext("2d"); //获取画布2D上下文
33
- context.fillStyle = "white"; //画布填充色
34
- context.fillRect(0, 0, this.canvas.width, this.canvas.height); //清空画布
35
- context.fillStyle = "cornflowerblue"; //设置字体颜色
36
- context.font = "25px Arial"; //设置字体
37
- var rand = new Array();
38
- var x = new Array();
39
- var y = new Array();
40
- for (var i = 0; i < 4; i++) {
41
- rand.push(rand[i]);
42
- rand[i] = this.nums[i];
43
- x[i] = i * 20 + 10;
44
- y[i] = Math.random() * 20 + 20;
45
- context.fillText(rand[i], x[i], y[i]);
46
- }
47
- str = rand.join('').toUpperCase();
48
- //画3条随机线
49
- for (var i = 0; i < 3; i++) {
50
- this.drawline(this.canvas, context);
51
- }
52
- // 画30个随机点
53
- for (var i = 0; i < 30; i++) {
54
- this.drawDot(this.canvas, context);
55
- }
56
- this.convertCanvasToImage(this.canvas);
57
- return str;
58
- }
59
- // 随机线
60
- drawline(canvas, context) {
61
- context.moveTo(Math.floor(Math.random() * canvas.width), Math.floor(Math.random() * canvas.height)); //随机线的起点x坐标是画布x坐标0位置,y坐标是画布高度的随机数
62
- context.lineTo(Math.floor(Math.random() * canvas.width), Math.floor(Math.random() * canvas.height)); //随机线的终点x坐标是画布宽度,y坐标是画布高度的随机数
63
- context.lineWidth = 0.5; //随机线宽
64
- context.strokeStyle = 'rgba(50,50,50,0.3)'; //随机线描边属性
65
- context.stroke(); //描边,即起点描到终点
66
- }
67
- // 随机点(所谓画点其实就是画1px像素的线,方法不再赘述)
68
- drawDot(canvas, context) {
69
- var px = Math.floor(Math.random() * canvas.width);
70
- var py = Math.floor(Math.random() * canvas.height);
71
- context.moveTo(px, py);
72
- context.lineTo(px + 1, py + 1);
73
- context.lineWidth = 0.2;
74
- context.stroke();
75
- }
76
- // 绘制图片
77
- convertCanvasToImage(canvas) {
78
- document.getElementById("verifyCanvas").style.display = "none";
79
- this.image = document.getElementById("code_img");
80
- this.image.src = canvas.toDataURL("image/png");
81
- return this.image;
82
- }
83
- sendSMSCode() {
84
- if (!this.codeVerified) {
85
- this.message.create("error", "请先核对验证码");
86
- return;
87
- }
88
- let mobile = this.validateSMSForm.value?.mobile;
89
- console.log(this.validateSMSForm.value);
90
- if (mobile) {
91
- let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
92
- apigURL = decodeURIComponent(atob(apigURL));
93
- let url = apigURL + "message";
94
- this.http.post(url, { company: this.companyId, mobile: mobile, action: 'login' }).subscribe((res) => {
95
- this.countDownSMS();
96
- this.message.info(`已发送,请查收验证码`);
97
- }, error => {
98
- this.message.error(error?.error?.mess || `系统繁忙中,请稍后重试`);
99
- });
100
- }
101
- else {
102
- this.message.error("请正确输入手机号");
103
- }
104
- }
105
- countDownSMS() {
106
- this.isSended = true;
107
- this.isSending = true;
108
- this.smsTimeCount = 60;
109
- let interval = setInterval(() => {
110
- this.smsTimeCount--;
111
- }, 1000);
112
- setTimeout(() => {
113
- clearInterval(interval);
114
- this.isSending = false;
115
- }, 60 * 1000);
116
- }
117
- // 点击登录按钮
118
- submitFormMobileSMS(value) {
119
- // localStorage.removeItem("user")
120
- for (const key in this.validateSMSForm.controls) {
121
- this.validateSMSForm.controls[key].markAsDirty();
122
- this.validateSMSForm.controls[key].updateValueAndValidity();
123
- }
124
- console.log(value);
125
- this.username = value.mobile;
126
- this.smsCode = value.smsCode;
127
- console.log("smslogin");
128
- // return
129
- this.loginSMS();
130
- }
131
- // 点击登录按钮
132
- submitFormMobilePassword(value) {
133
- // localStorage.removeItem("user")
134
- for (const key in this.validateForm.controls) {
135
- this.validateForm.controls[key].markAsDirty();
136
- this.validateForm.controls[key].updateValueAndValidity();
137
- }
138
- this.username = value.mobile || value.username;
139
- this.password = value.password;
140
- let checkCode = value.checkCode;
141
- let c = this.code.toLowerCase();
142
- let vc = checkCode.toLowerCase();
143
- console.log(c, vc);
144
- if (c != vc) {
145
- console.log(c, vc);
146
- this.message.create("error", "验证码错误");
147
- }
148
- else {
149
- this.loginMobilePassword();
150
- }
151
- }
152
- // 点击登录按钮
153
- submitFormUserPassword(value) {
154
- // localStorage.removeItem("user")
155
- for (const key in this.validateForm.controls) {
156
- this.validateForm.controls[key].markAsDirty();
157
- this.validateForm.controls[key].updateValueAndValidity();
158
- }
159
- this.username = value.mobile || value.username;
160
- this.password = value.password;
161
- let checkCode = value.checkCode;
162
- let c = this.code.toLowerCase();
163
- let vc = checkCode.toLowerCase();
164
- console.log(c, vc);
165
- if (c != vc) {
166
- console.log(c, vc);
167
- this.message.create("error", "验证码错误");
168
- }
169
- else {
170
- this.authServ
171
- .login(this.username, this.password)
172
- .then(async (data) => {
173
- }).catch(err => {
174
- console.log(err);
175
- this.message.create("error", "错误的用户名或密码");
176
- });
177
- }
178
- }
179
- // 点击重置密码
180
- async forgetFormFun(value) {
181
- for (const key in this.forgetForm.controls) {
182
- this.forgetForm.controls[key].markAsDirty();
183
- this.forgetForm.controls[key].updateValueAndValidity();
184
- }
185
- console.log(value.forgetusername, value.forgetPassword, value.forgetConfirmpassword);
186
- if (value.forgetPassword != value.forgetConfirmpassword) {
187
- this.message.create("error", "两次密码不一致");
188
- return;
189
- }
190
- if (!value.forgerphoneCode) {
191
- this.message.create("error", "请输入验证码");
192
- return;
193
- }
194
- let host = Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/";
195
- let url = host + "api/auth/reset_password";
196
- this.http.post(url, { company: this.companyId, mobile: value.forgetusername, code: value.forgerphoneCode, password: value.forgetConfirmpassword }).subscribe((res) => {
197
- if (res.code == 200) {
198
- this.message.create("success", res.msg);
199
- this.type = 'login';
200
- }
201
- else {
202
- this.message.create("error", "验证码错误");
203
- }
204
- }, error => {
205
- console.log(error.error);
206
- this.message.create('error', error.error.mess);
207
- });
208
- }
209
- async registSubmitForm(value) {
210
- for (const key in this.registForm.controls) {
211
- this.registForm.controls[key].markAsDirty();
212
- this.registForm.controls[key].updateValueAndValidity();
213
- }
214
- this.registName = value.registName;
215
- this.registIdcard = value.registIdcard;
216
- this.registPhone = value.registPhone;
217
- this.phoneCode = value.phoneCode;
218
- this.regpassword = value.regpassword;
219
- this.confirmPassword = value.confirmPassword;
220
- let checkInfo = await this.verifyCode(this.registPhone, this.phoneCode);
221
- if (checkInfo && checkInfo.code != 200) {
222
- this.message.create("error", checkInfo.mess);
223
- return;
224
- }
225
- this.queryUser();
226
- }
227
- getSelectEducation() {
228
- this.loginMobilePassword();
229
- this.iseducation = false;
230
- }
231
- loginSMS() {
232
- // 验证码登录
233
- let host = Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/";
234
- let url = host + `api/auth/mobile?company=${this.companyId}&mobile=${this.username}&code=${this.smsCode}`;
235
- this.http.get(url).subscribe((res) => {
236
- console.log(res);
237
- if (res.code == 200) {
238
- this.message.create("success", "登录成功");
239
- let token = res.data.token;
240
- Parse.User.become(token).then(user => {
241
- this.router.navigate([decodeURIComponent(this.rootPage)]);
242
- });
243
- }
244
- else {
245
- this.message.create("error", "验证码错误");
246
- }
247
- }, error => {
248
- console.log(error.error);
249
- this.message.create('error', error.error.mess);
250
- });
251
- }
252
- async loginMobilePassword() {
253
- let profile;
254
- let education;
255
- let currentUser;
256
- let username = await this.getMobileUser(this.username);
257
- if (!username) {
258
- this.message.create("error", "用户不存在,请尝试其他登录方式");
259
- return;
260
- }
261
- this.authServ
262
- .login(username, this.password)
263
- .then(async (data) => {
264
- }).catch(err => {
265
- console.log(err);
266
- this.message.create("error", "错误的用户名或密码");
267
- });
268
- }
269
- async queryUser() {
270
- // 查找这个用户存不存在,存在直接绑定登录,不存在注册
271
- let queryUser = new Parse.Query('_User');
272
- queryUser.contains("username", this.registPhone);
273
- queryUser.equalTo("company", this.companyId);
274
- let user = await queryUser.first();
275
- if (user?.id) {
276
- this.message.info(`该账户已激活,使用手机号密码直接登录`);
277
- return;
278
- }
279
- // 核验手机号
280
- Parse.User.signUp(this.companyId + "-" + this.registPhone, this.regpassword, "").then(async (res) => {
281
- if (res.id) {
282
- console.log(res);
283
- res.set("company", {
284
- __type: "Pointer",
285
- className: "Company",
286
- objectId: this.companyId
287
- });
288
- res.set("mobile", this.registPhone);
289
- res.set("type", "user");
290
- res.save();
291
- // 开通账号辅助填写账号密码
292
- this.username = this.registPhone;
293
- this.password = this.regpassword;
294
- }
295
- });
296
- }
297
- async getMobileUser(mobile) {
298
- if (this.mobileUserMap[mobile])
299
- return this.mobileUserMap[mobile];
300
- let result = await this.novaCloud.api("/auth/getusername", {
301
- company: this.companyId,
302
- mobile: mobile
303
- });
304
- console.log(result);
305
- if (result?.username) {
306
- this.mobileUserMap[mobile] = result?.username;
307
- }
308
- return this.mobileUserMap[mobile];
309
- }
310
- forget() {
311
- this.type = 'forget';
312
- }
313
- backLogin() {
314
- this.type = 'login';
315
- }
316
- handleCancel() {
317
- this.isVisible = false;
318
- }
319
- handleOk() {
320
- Parse.User.signUp(this.registPhone, this.regpassword, "").then(async (res) => {
321
- if (res.id) {
322
- console.log(res);
323
- res.set("company", {
324
- __type: "Pointer",
325
- className: "Company",
326
- objectId: this.companyId
327
- });
328
- res.save();
329
- this.username = this.registPhone;
330
- this.password = this.regpassword;
331
- }
332
- });
333
- }
334
- async getCode() {
335
- if (this.registPhone == undefined || this.registPhone.trim() == "") {
336
- this.message.info(`请输入注册手机号`);
337
- return;
338
- }
339
- let a = /^1[3456789]\d{9}$/;
340
- if (!this.registPhone.match(a)) {
341
- this.message.info(`请输入正确的手机号`);
342
- return;
343
- }
344
- let User = new Parse.Query('User');
345
- User.equalTo('username', this.registPhone);
346
- User.equalTo('company', this.companyId);
347
- let user = await User.first();
348
- if (user && user.id) {
349
- this.message.info(`该手机号已注册,请使用账号密码登录`);
350
- return;
351
- }
352
- // 本地测试
353
- let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
354
- apigURL = decodeURIComponent(atob(apigURL));
355
- let url = apigURL + "message";
356
- this.http.post(url, { company: this.companyId, mobile: this.registPhone, action: 'regist' }).subscribe((res) => {
357
- this.vCode = res.data.code;
358
- this.countDownFun();
359
- }, error => {
360
- this.message.info(`系统繁忙中,请稍后重试`);
361
- console.log(error);
362
- });
363
- }
364
- async getCode2() {
365
- if (this.forgetusername == undefined || this.forgetusername.trim() == "") {
366
- this.message.info(`请输入账号`);
367
- return;
368
- }
369
- let a = /^1[3456789]\d{9}$/;
370
- if (!this.forgetusername.match(a)) {
371
- this.message.info(`请输入正确的手机号`);
372
- return;
373
- }
374
- console.log(this.forgetusername);
375
- let User = new Parse.Query('User');
376
- User.equalTo('username', this.companyId + "-" + this.forgetusername);
377
- User.equalTo('company', this.companyId);
378
- let user = await User.first();
379
- if (!user) {
380
- this.message.info(`账号不存在`);
381
- return;
382
- }
383
- let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
384
- apigURL = decodeURIComponent(atob(apigURL));
385
- let url = apigURL + "message";
386
- this.http.post(url, { company: this.companyId, mobile: this.forgetusername, action: 'resetPassword' }).subscribe((res) => {
387
- console.log(res);
388
- this.vCode = res.data.code;
389
- this.countDownFun();
390
- }, error => {
391
- this.message.info(`系统繁忙中,请稍后重试`);
392
- console.log(error);
393
- });
394
- }
395
- async verifyCode(mobile, code) {
396
- let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
397
- apigURL = decodeURIComponent(atob(apigURL));
398
- let url = apigURL + "verifyCode";
399
- return new Promise(async (resolve, reject) => {
400
- this.http.post(url, { mobile: mobile, code: code }).subscribe((res) => {
401
- resolve(res);
402
- }, error => {
403
- console.log(error);
404
- resolve(error.error);
405
- });
406
- });
407
- }
408
- // 倒计时
409
- countDownFun() {
410
- this.isCountDown = true;
411
- if (this.countDown == 0) {
412
- return;
413
- }
414
- let timer = setInterval(() => {
415
- this.countDown = this.countDown - 1;
416
- if (this.countDown == 0) {
417
- clearInterval(timer);
418
- this.countDown = 60;
419
- this.isCountDown = false;
420
- }
421
- }, 1000);
422
- }
423
- constructor(authServ, novaCloud, fb, message, router, route, activatedRoute, http) {
424
- this.authServ = authServ;
425
- this.novaCloud = novaCloud;
426
- this.fb = fb;
427
- this.message = message;
428
- this.router = router;
429
- this.route = route;
430
- this.activatedRoute = activatedRoute;
431
- this.http = http;
432
- this.nums = ['C', '6', 'Z', 't'];
433
- this.str = '';
434
- this.tabIndex = 0;
435
- this.codeVerified = false;
436
- this.passwordVisible = false;
437
- this.passwordVisible2 = false;
438
- this.passwordVisible3 = false;
439
- // 是否有多个层次
440
- this.iseducation = false;
441
- this.redirectUrl = localStorage.getItem("redirectUrl");
442
- // 手机验证码
443
- this.isSended = false;
444
- this.isSending = false;
445
- this.smsTimeCount = 60;
446
- this.loading = true;
447
- this.Lesson = [];
448
- this.myDate = new Date();
449
- // 查询该学生信息是否存在
450
- this.isVisible = false;
451
- this.type = 'login';
452
- this.mobileUserMap = {};
453
- this.isOkLoading = false;
454
- this.countDown = 60;
455
- this.isCountDown = false;
456
- // 页面显示素材
457
- this.mobileLogin = false;
458
- this.logo = 'https://www.fmode.cn/images/ewm1.png';
459
- this.qrcode = 'https://www.fmode.cn/images/logo_main.png';
460
- // 登录 用户名(手机号码)验证
461
- this.userNameAsyncValidator = (control) => new Observable((observer) => {
462
- let reg = /^1[3456789]\d{9}$/;
463
- // let reg2 = /^\d{17}(\d|X|x)$/;
464
- let username = control.value;
465
- setTimeout(() => {
466
- if (username == undefined || username.trim() == "") {
467
- this.userErrorTip = "请输入登录账号";
468
- observer.next({ error: true, duplicated: true });
469
- observer.complete();
470
- return;
471
- }
472
- if (!username.match(reg)) {
473
- this.userErrorTip = "请输入正确的登录账号";
474
- observer.next({ error: true, duplicated: true });
475
- observer.complete();
476
- return;
477
- }
478
- // if(username.length > 11){
479
- // if (!username.match(reg2) ) {
480
- // this.userErrorTip = "请输入正确的登录账号";
481
- // observer.next({ error: true, duplicated: true });
482
- // observer.complete();
483
- // return;
484
- // }
485
- // }else {
486
- // }
487
- observer.next(null);
488
- observer.complete();
489
- }, 1000);
490
- });
491
- // 登录 短信验证码验证
492
- this.smsAsyncValidator = (control) => new Observable((observer) => {
493
- setTimeout(() => {
494
- let smsCode = control.value;
495
- if (smsCode == undefined || smsCode.trim() == "") {
496
- this.smsCodeErrorTip = "请输入短信验证码";
497
- observer.next({ error: true, duplicated: true });
498
- observer.complete();
499
- return;
500
- }
501
- observer.next(null);
502
- observer.complete();
503
- }, 1000);
504
- });
505
- // 登录 密码验证
506
- this.passwordAsyncValidator = (control) => new Observable((observer) => {
507
- setTimeout(() => {
508
- let password = control.value;
509
- if (password == undefined || password.trim() == "") {
510
- this.passwordErrorTip = "请输入密码";
511
- observer.next({ error: true, duplicated: true });
512
- observer.complete();
513
- return;
514
- }
515
- if (password.length < 6) {
516
- this.passwordErrorTip = "密码长度不得小于6位";
517
- observer.next({ error: true, duplicated: true });
518
- observer.complete();
519
- return;
520
- }
521
- observer.next(null);
522
- observer.complete();
523
- }, 1000);
524
- });
525
- this.codeAsyncValidator = (control) => new Observable((observer) => {
526
- setTimeout(() => {
527
- let checkCode = control.value;
528
- if (checkCode == undefined || checkCode.trim() == "") {
529
- this.codeVerified = false;
530
- this.codeErrorTip = "请输入验证码";
531
- observer.next({ error: true, duplicated: true });
532
- observer.complete();
533
- return;
534
- }
535
- if (checkCode.length < 4) {
536
- this.codeVerified = false;
537
- this.codeErrorTip = "验证码长度不得小于4位";
538
- observer.next({ error: true, duplicated: true });
539
- observer.complete();
540
- return;
541
- }
542
- let c = this.code.toLowerCase();
543
- let vc = checkCode.toLowerCase();
544
- if (c != vc) {
545
- this.codeVerified = false;
546
- this.codeErrorTip = "验证码输入错误";
547
- observer.next({ error: true, duplicated: true });
548
- observer.complete();
549
- return;
550
- }
551
- this.codeVerified = true;
552
- observer.next(null);
553
- observer.complete();
554
- }, 1000);
555
- });
556
- // 注册 身份证号码验证
557
- this.registIdcardAsyncValidator = (control) => new Observable((observer) => {
558
- let registIdcard = control.value;
559
- setTimeout(() => {
560
- if (registIdcard == undefined || registIdcard.trim() == "") {
561
- this.registIdcardErrorTip = "请输入正确的身份证号码";
562
- observer.next({ error: true, duplicated: true });
563
- observer.complete();
564
- return;
565
- }
566
- if (/^\d{17}(\d|X|x)$/.test(registIdcard) === false) {
567
- this.registIdcardErrorTip = "请输入正确的身份证号码";
568
- observer.next({ error: true, duplicated: true });
569
- observer.complete();
570
- return;
571
- }
572
- observer.next(null);
573
- observer.complete();
574
- }, 1000);
575
- });
576
- // 忘记密码 验证
577
- this.forgetNameAsyncValidator = (control) => new Observable((observer) => {
578
- setTimeout(() => {
579
- let forgetName = control.value;
580
- if (forgetName == undefined || forgetName.trim() == "") {
581
- this.registNameErrorTip = "请输入账户账号或者手机号";
582
- observer.next({ error: true, duplicated: true });
583
- observer.complete();
584
- return;
585
- }
586
- this.forgetusername = forgetName;
587
- observer.next(null);
588
- observer.complete();
589
- }, 1000);
590
- });
591
- this.forgetPasswordAsyncValidator = (control) => new Observable((observer) => {
592
- setTimeout(() => {
593
- let forgetPassword = control.value;
594
- if (forgetPassword == undefined || forgetPassword.trim() == "") {
595
- this.passwordErrorTip = "请输入新密码";
596
- observer.next({ error: true, duplicated: true });
597
- observer.complete();
598
- return;
599
- }
600
- if (forgetPassword.length < 6) {
601
- this.passwordErrorTip = "密码长度不得小于6位";
602
- observer.next({ error: true, duplicated: true });
603
- observer.complete();
604
- return;
605
- }
606
- this.forgetPassword = forgetPassword;
607
- observer.next(null);
608
- observer.complete();
609
- }, 1000);
610
- });
611
- this.forgetConfirmPasswordAsyncValidator = (control) => new Observable((observer) => {
612
- setTimeout(() => {
613
- let forgetConfirmpassword = control.value;
614
- if (forgetConfirmpassword == undefined || forgetConfirmpassword.trim() == "") {
615
- this.forgetphoneCodesErrorTip = "请确认新密码";
616
- observer.next({ error: true, duplicated: true });
617
- observer.complete();
618
- return;
619
- }
620
- if (forgetConfirmpassword.length < 6) {
621
- this.forgetphoneCodesErrorTip = "密码长度不得小于6位";
622
- observer.next({ error: true, duplicated: true });
623
- observer.complete();
624
- return;
625
- }
626
- this.forgetConfirmpassword = forgetConfirmpassword;
627
- observer.next(null);
628
- observer.complete();
629
- }, 1000);
630
- });
631
- this.forgetCodeAsyncValidator = (control) => new Observable((observer) => {
632
- setTimeout(() => {
633
- let forgerphoneCode = control.value;
634
- if (forgerphoneCode == undefined || forgerphoneCode.trim() == "") {
635
- this.phoneCodesErrorTip = "请输入新密码";
636
- observer.next({ error: true, duplicated: true });
637
- observer.complete();
638
- return;
639
- }
640
- this.forgerphoneCode = forgerphoneCode;
641
- observer.next(null);
642
- observer.complete();
643
- }, 1000);
644
- });
645
- // 注册 姓名验证
646
- this.registNameAsyncValidator = (control) => new Observable((observer) => {
647
- setTimeout(() => {
648
- let registName = control.value;
649
- if (registName == undefined || registName.trim() == "") {
650
- this.registNameErrorTip = "请输入姓名";
651
- observer.next({ error: true, duplicated: true });
652
- observer.complete();
653
- return;
654
- }
655
- this.registName = registName;
656
- observer.next(null);
657
- observer.complete();
658
- }, 1000);
659
- });
660
- // 注册手机号验证
661
- this.registPhoneAsyncValidator = (control) => new Observable((observer) => {
662
- let registPhone = control.value;
663
- setTimeout(() => {
664
- if (registPhone == undefined || registPhone.trim() == "") {
665
- this.registIdcardErrorTip = "请输入正确的身份证号码";
666
- observer.next({ error: true, duplicated: true });
667
- observer.complete();
668
- return;
669
- }
670
- if (/^1[3456789]\d{9}$/.test(registPhone) === false) {
671
- this.phoneErrorTip = "请输入正确的手机号";
672
- observer.next({ error: true, duplicated: true });
673
- observer.complete();
674
- return;
675
- }
676
- observer.next(null);
677
- observer.complete();
678
- }, 1000);
679
- });
680
- this.registCodeAsyncValidator = (control) => new Observable((observer) => {
681
- setTimeout(() => {
682
- let registCode = control.value;
683
- if (registCode == undefined || registCode.trim() == "") {
684
- this.phoneCodesErrorTip = "请输入验证码";
685
- observer.next({ error: true, duplicated: true });
686
- observer.complete();
687
- return;
688
- }
689
- observer.next(null);
690
- observer.complete();
691
- }, 1000);
692
- });
693
- // 注册密码验证
694
- this.regpasswordAsyncValidator = (control) => new Observable((observer) => {
695
- setTimeout(() => {
696
- let regpassword = control.value;
697
- if (regpassword == undefined || regpassword.trim() == "") {
698
- this.regpasswordErrorTip = "请输入密码";
699
- observer.next({ error: true, duplicated: true });
700
- observer.complete();
701
- return;
702
- }
703
- if (regpassword.length < 6) {
704
- this.regpasswordErrorTip = "密码长度不得小于6位";
705
- observer.next({ error: true, duplicated: true });
706
- observer.complete();
707
- return;
708
- }
709
- if (regpassword.length > 12) {
710
- this.regpasswordErrorTip = "密码长度不得大于12位";
711
- observer.next({ error: true, duplicated: true });
712
- observer.complete();
713
- return;
714
- }
715
- this.regpassword = regpassword;
716
- observer.next(null);
717
- observer.complete();
718
- }, 1000);
719
- });
720
- // 注册 确认密码验证
721
- this.confirmPasswordAsyncValidator = (control) => new Observable((observer) => {
722
- setTimeout(() => {
723
- let confirmPassword = control.value;
724
- if (confirmPassword == undefined || confirmPassword.trim() == "") {
725
- this.confirmPasswordErrorTip = "请确认密码";
726
- observer.next({ error: true, duplicated: true });
727
- observer.complete();
728
- return;
729
- }
730
- if (confirmPassword != this.regpassword) {
731
- this.confirmPasswordErrorTip = "两次输入密码不一致,请重新输入";
732
- observer.next({ error: true, duplicated: true });
733
- observer.complete();
734
- return;
735
- }
736
- this.confirmPassword = confirmPassword;
737
- observer.next(null);
738
- observer.complete();
739
- }, 1000);
740
- });
741
- this.code = '';
742
- this.initLoginForm();
743
- this.route.paramMap.subscribe(async (params) => {
744
- console.log(params);
745
- this.appId = params.get("appId");
746
- if (!await this.initAppConfig()) {
747
- this.companyId = params.get("companyId");
748
- if (!this.companyId) {
749
- this.companyId = localStorage.getItem("company") || "Q0DryNYA8g";
750
- }
751
- await this.initCompanyConfig();
752
- }
753
- });
754
- }
755
- async initCompanyConfig() {
756
- if (!this.companyId)
757
- return;
758
- let query = new Parse.Query("Company");
759
- this.company = await query.get(this.companyId);
760
- // 设置页面
761
- this.logo = this.company?.get("logo") || this.logo;
762
- this.qrcode = this.company?.get("qrcode") || this.qrcode;
763
- this.mobileLogin = this.company?.get('jpush')?.appkey || false;
764
- this.rootPage = this.company?.get('rootPage');
765
- }
766
- async initAppConfig() {
767
- if (!this.appId)
768
- return false;
769
- let query = new Parse.Query("App");
770
- query.include("company");
771
- this.app = await query.get(this.appId);
772
- // 设置页面
773
- console.log(this.app);
774
- this.logo = this.app?.get("logo") || this.logo;
775
- this.qrcode = this.app?.get("qrcode") || this.qrcode;
776
- this.mobileLogin = this.app?.get('jpush')?.appkey || false;
777
- this.companyId = this.app?.get("company").id;
778
- this.rootPage = this.app?.get('rootPage');
779
- return true;
780
- }
781
- initLoginForm() {
782
- this.validateForm = this.fb.group({
783
- // 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
784
- mobile: ["", [Validators.required], [this.userNameAsyncValidator]],
785
- password: ["", [Validators.required], [this.passwordAsyncValidator]],
786
- // initCode: [this.code ],
787
- checkCode: ["", [Validators.required], [this.codeAsyncValidator]]
788
- });
789
- this.validateUserForm = this.fb.group({
790
- // 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
791
- username: ["", [Validators.required], []],
792
- password: ["", [Validators.required], [this.passwordAsyncValidator]],
793
- // initCode: [this.code ],
794
- checkCode: ["", [Validators.required], [this.codeAsyncValidator]]
795
- });
796
- this.validateSMSForm = this.fb.group({
797
- // 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
798
- mobile: ["", [Validators.required], [this.userNameAsyncValidator]],
799
- password: [""],
800
- smsCode: ["", [Validators.required], [this.smsAsyncValidator]],
801
- // initCode: [this.code ],
802
- checkCode: ["", [Validators.required], [this.codeAsyncValidator]]
803
- });
804
- this.registForm = this.fb.group({
805
- // 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
806
- registName: ["", [Validators.required], [this.registNameAsyncValidator]],
807
- registIdcard: ["", [Validators.required], [this.registIdcardAsyncValidator]],
808
- registPhone: ["", [Validators.required], [this.registPhoneAsyncValidator]],
809
- phoneCode: ["", [Validators.required], [this.registCodeAsyncValidator]],
810
- regpassword: ["", [Validators.required], [this.regpasswordAsyncValidator]],
811
- confirmPassword: ["", [Validators.required], [this.confirmPasswordAsyncValidator]]
812
- });
813
- this.forgetForm = this.fb.group({
814
- forgetusername: ["", [Validators.required], [this.forgetNameAsyncValidator]],
815
- forgetPassword: ["", [Validators.required], [this.forgetPasswordAsyncValidator]],
816
- forgetConfirmpassword: ["", [Validators.required], [this.forgetConfirmPasswordAsyncValidator]],
817
- forgerphoneCode: ["", [Validators.required], [this.registCodeAsyncValidator]],
818
- });
819
- }
820
- ngOnInit() {
821
- // localStorage.removeItem('company')
822
- // localStorage.removeItem('pid')
823
- // localStorage.clear();
824
- this.activatedRoute.paramMap.subscribe(params => {
825
- if (params.get('p')) {
826
- localStorage.setItem('pid', params.get('p'));
827
- }
828
- else {
829
- localStorage.setItem('company', this.companyId);
830
- }
831
- });
832
- this.creatCode();
833
- }
834
- creatCode() {
835
- this.code = '';
836
- let codeLength = 4; //验证码的长度
837
- let codeChars = [
838
- 0,
839
- 1,
840
- 2,
841
- 3,
842
- 4,
843
- 5,
844
- 6,
845
- 7,
846
- 8,
847
- 9,
848
- "a",
849
- "b",
850
- "c",
851
- "d",
852
- "e",
853
- "f",
854
- "g",
855
- "h",
856
- "i",
857
- "j",
858
- "k",
859
- "l",
860
- "m",
861
- "n",
862
- "o",
863
- "p",
864
- "q",
865
- "r",
866
- "s",
867
- "t",
868
- "u",
869
- "v",
870
- "w",
871
- "x",
872
- "y",
873
- "z",
874
- "A",
875
- "B",
876
- "C",
877
- "D",
878
- "E",
879
- "F",
880
- "G",
881
- "H",
882
- "I",
883
- "J",
884
- "K",
885
- "L",
886
- "M",
887
- "N",
888
- "O",
889
- "P",
890
- "Q",
891
- "R",
892
- "S",
893
- "T",
894
- "U",
895
- "V",
896
- "W",
897
- "X",
898
- "Y",
899
- "Z"
900
- ];
901
- for (let i = 0; i < codeLength; i++) {
902
- let charNum = Math.floor(Math.random() * 52);
903
- this.code += codeChars[charNum];
904
- }
905
- }
906
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, deps: [{ token: i1.AuthService }, { token: i2.NovaCloudService }, { token: i3.FormBuilder }, { token: i4.NzMessageService }, { token: i5.Router }, { token: i5.ActivatedRoute }, { token: i5.ActivatedRoute }, { token: i6.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
907
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LoginComponent, selector: "app-pcuser-login", ngImport: i0, template: "<div class=\"student-login-layout\">\n <div class=\"nav_center\">\n <img [src]=\"logo\" alt=\"\" class=\"login_img\">\n <div class=\"nav_login\">\n <nz-tabset [nzSelectedIndex]=\"tabIndex\" [nzTabPosition]=\"'top'\">\n\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u5BC6\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u624B\u673A\u5BC6\u7801\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateForm\" (ngSubmit)=\"submitFormMobilePassword(validateForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B\u673A\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateForm.valid\">\u767B\u5F55</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"forget()\">\u5FD8\u8BB0\u5BC6\u7801</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf=\"type == 'forget'\">\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"forget_contain\">\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n <!-- \u767B\u5F55\uFF1A\u5E10\u53F7+\u5BC6\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u5E10\u53F7\u5BC6\u7801\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateUserForm\" (ngSubmit)=\"submitFormUserPassword(validateUserForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5E10 \u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"username\" placeholder=\"\u8BF7\u8F93\u5165\u5E10\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateUserForm.valid\">\u767B\u5F55</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf=\"type == 'forget'\">\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"forget_contain\">\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u9A8C\u8BC1\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u77ED\u4FE1\u9A8C\u8BC1\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateSMSForm\" (ngSubmit)=\"submitFormMobileSMS(validateSMSForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B \u673A \u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u77ED\u4FE1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"10\" nzErrorTip=\"{{smsCodeErrorTip}}\">\n <nz-input-group>\n <input nz-input [type]=\"'text'\" [disabled]=\"!isSended || !codeVerified\" formControlName=\"smsCode\" placeholder=\"\u8BF7\u8F93\u5165\u77ED\u4FE1\u9A8C\u8BC1\u7801\" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div *ngIf=\"!isSending\" (click)=\"sendSMSCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isSending\"\n style=\"background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;\">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateSMSForm.valid\">\u767B\u5F55</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n <!-- \u6CE8\u518C\uFF1A\u4F01\u4E1A\u7528\u6237Profile\u5F00\u901A -->\n <nz-tab *ngIf=\"mobileLogin\" nzTitle=\"\u5F00\u901A\" style=\"color: #000000;\" class=\"activation\">\n <form nz-form [formGroup]=\"registForm\" (ngSubmit)=\"registSubmitForm(registForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u8BC1\u4EF6</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzValidatingTip=\"\u9A8C\u8BC1\u4E2D...\"\n nzErrorTip=\"{{registIdcardErrorTip}}\">\n <input title=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" nz-input formControlName=\"registIdcard\" placeholder=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u59D3\u540D</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{registNameErrorTip}}\">\n <input nz-input type=\"text\" formControlName=\"registName\" placeholder=\"\u8BF7\u8F93\u5165\u59D3\u540D\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u7ED1\u5B9A\u624B\u673A\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{phoneErrorTip}}\">\n <input [(ngModel)]=\"registPhone\" nz-input style=\"font-size: 18px;\" type=\"text\"\n formControlName=\"registPhone\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"verifyCode\">\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u624B\u673A\u9A8C\u8BC1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"6\" class=\"code_input\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"phoneCode\" placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"codeContain\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode()\"\n class=\"get_code\"\n style=\"background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{regpasswordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate2\">\n <input nz-input [type]=\"passwordVisible2 ? 'text' : 'password'\" formControlName=\"regpassword\"\n placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]=\"passwordVisible2 ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible2 = !passwordVisible2\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{confirmPasswordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate3\">\n <input nz-input [type]=\"passwordVisible3 ? 'text' : 'password'\" formControlName=\"confirmPassword\"\n placeholder=\"\u8BF7\u786E\u8BA4\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]=\"passwordVisible3 ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible3 = !passwordVisible3\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [disabled]=\"!registForm.valid\">\u7533\u8BF7\u5F00\u901A</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class=\"nav_login_right\">\n <p class=\"login_right_title\">\u4E8C\u7EF4\u7801</p>\n <img [src]=\"qrcode\" alt=\"\u516C\u4F17\u53F7\u4E8C\u7EF4\u7801\">\n <p>\u626B\u7801\u8FDB\u5165\u5FAE\u4FE1\u7AEF</p>\n <!-- <p class=\"login_right_bottom\">\u9996\u6B21\u767B\u5F55\u6709\u60CA\u559C</p> -->\n </div>\n </div>\n\n <div class=\"loadWrap\" style=\"display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;\"\n *ngIf=\"loading2\">\n <nz-spin nzTip=\"\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\">\n <nz-alert nzType=\"info\" nzMessage=\"\u8BFE\u7A0B\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\"></nz-alert>\n </nz-spin>\n </div>\n\n <!-- \u6CE8\u9500 -->\n <nz-modal [(nzVisible)]=\"isVisible\" nzTitle=\"\u624B\u673A\u53F7\u9519\u8BEF\" (nzOnCancel)=\"handleCancel()\" (nzOnOk)=\"handleOk()\">\n <ng-container *nzModalContent>\n <p>\u624B\u673A\u53F7\u9519\u8BEF, \u8054\u7CFB\u7BA1\u7406\u5458\u6838\u5BF9\u4FE1\u606F</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n", styles: [".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i8.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i8.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i8.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "component", type: i9.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i10.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i11.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i12.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i12.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "component", type: i13.NzSpinComponent, selector: "nz-spin", inputs: ["nzIndicator", "nzSize", "nzTip", "nzDelay", "nzSimple", "nzSpinning"], exportAs: ["nzSpin"] }, { kind: "component", type: i14.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i14.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "directive", type: i15.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i15.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i16.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "component", type: i16.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i16.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i16.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }] }); }
908
- }
909
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, decorators: [{
910
- type: Component,
911
- args: [{ selector: "app-pcuser-login", template: "<div class=\"student-login-layout\">\n <div class=\"nav_center\">\n <img [src]=\"logo\" alt=\"\" class=\"login_img\">\n <div class=\"nav_login\">\n <nz-tabset [nzSelectedIndex]=\"tabIndex\" [nzTabPosition]=\"'top'\">\n\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u5BC6\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u624B\u673A\u5BC6\u7801\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateForm\" (ngSubmit)=\"submitFormMobilePassword(validateForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B\u673A\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateForm.valid\">\u767B\u5F55</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"forget()\">\u5FD8\u8BB0\u5BC6\u7801</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf=\"type == 'forget'\">\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"forget_contain\">\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n <!-- \u767B\u5F55\uFF1A\u5E10\u53F7+\u5BC6\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u5E10\u53F7\u5BC6\u7801\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateUserForm\" (ngSubmit)=\"submitFormUserPassword(validateUserForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5E10 \u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"username\" placeholder=\"\u8BF7\u8F93\u5165\u5E10\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateUserForm.valid\">\u767B\u5F55</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf=\"type == 'forget'\">\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"forget_contain\">\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u9A8C\u8BC1\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u77ED\u4FE1\u9A8C\u8BC1\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateSMSForm\" (ngSubmit)=\"submitFormMobileSMS(validateSMSForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B \u673A \u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u77ED\u4FE1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"10\" nzErrorTip=\"{{smsCodeErrorTip}}\">\n <nz-input-group>\n <input nz-input [type]=\"'text'\" [disabled]=\"!isSended || !codeVerified\" formControlName=\"smsCode\" placeholder=\"\u8BF7\u8F93\u5165\u77ED\u4FE1\u9A8C\u8BC1\u7801\" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div *ngIf=\"!isSending\" (click)=\"sendSMSCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isSending\"\n style=\"background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;\">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateSMSForm.valid\">\u767B\u5F55</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n <!-- \u6CE8\u518C\uFF1A\u4F01\u4E1A\u7528\u6237Profile\u5F00\u901A -->\n <nz-tab *ngIf=\"mobileLogin\" nzTitle=\"\u5F00\u901A\" style=\"color: #000000;\" class=\"activation\">\n <form nz-form [formGroup]=\"registForm\" (ngSubmit)=\"registSubmitForm(registForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u8BC1\u4EF6</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzValidatingTip=\"\u9A8C\u8BC1\u4E2D...\"\n nzErrorTip=\"{{registIdcardErrorTip}}\">\n <input title=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" nz-input formControlName=\"registIdcard\" placeholder=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u59D3\u540D</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{registNameErrorTip}}\">\n <input nz-input type=\"text\" formControlName=\"registName\" placeholder=\"\u8BF7\u8F93\u5165\u59D3\u540D\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u7ED1\u5B9A\u624B\u673A\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{phoneErrorTip}}\">\n <input [(ngModel)]=\"registPhone\" nz-input style=\"font-size: 18px;\" type=\"text\"\n formControlName=\"registPhone\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"verifyCode\">\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u624B\u673A\u9A8C\u8BC1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"6\" class=\"code_input\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"phoneCode\" placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"codeContain\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode()\"\n class=\"get_code\"\n style=\"background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{regpasswordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate2\">\n <input nz-input [type]=\"passwordVisible2 ? 'text' : 'password'\" formControlName=\"regpassword\"\n placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]=\"passwordVisible2 ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible2 = !passwordVisible2\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{confirmPasswordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate3\">\n <input nz-input [type]=\"passwordVisible3 ? 'text' : 'password'\" formControlName=\"confirmPassword\"\n placeholder=\"\u8BF7\u786E\u8BA4\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]=\"passwordVisible3 ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible3 = !passwordVisible3\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [disabled]=\"!registForm.valid\">\u7533\u8BF7\u5F00\u901A</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class=\"nav_login_right\">\n <p class=\"login_right_title\">\u4E8C\u7EF4\u7801</p>\n <img [src]=\"qrcode\" alt=\"\u516C\u4F17\u53F7\u4E8C\u7EF4\u7801\">\n <p>\u626B\u7801\u8FDB\u5165\u5FAE\u4FE1\u7AEF</p>\n <!-- <p class=\"login_right_bottom\">\u9996\u6B21\u767B\u5F55\u6709\u60CA\u559C</p> -->\n </div>\n </div>\n\n <div class=\"loadWrap\" style=\"display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;\"\n *ngIf=\"loading2\">\n <nz-spin nzTip=\"\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\">\n <nz-alert nzType=\"info\" nzMessage=\"\u8BFE\u7A0B\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\"></nz-alert>\n </nz-spin>\n </div>\n\n <!-- \u6CE8\u9500 -->\n <nz-modal [(nzVisible)]=\"isVisible\" nzTitle=\"\u624B\u673A\u53F7\u9519\u8BEF\" (nzOnCancel)=\"handleCancel()\" (nzOnOk)=\"handleOk()\">\n <ng-container *nzModalContent>\n <p>\u624B\u673A\u53F7\u9519\u8BEF, \u8054\u7CFB\u7BA1\u7406\u5458\u6838\u5BF9\u4FE1\u606F</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n", styles: [".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"] }]
912
- }], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.NovaCloudService }, { type: i3.FormBuilder }, { type: i4.NzMessageService }, { type: i5.Router }, { type: i5.ActivatedRoute }, { type: i5.ActivatedRoute }, { type: i6.HttpClient }] });
913
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi91c2VyL2xvZ2luL2xvZ2luLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvdXNlci9sb2dpbi9sb2dpbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBbUIsV0FBVyxFQUF5RCxVQUFVLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsSSxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU92RSxNQUFNLE9BQU8sY0FBYztJQU16QixRQUFRO0lBQ1IsUUFBUSxDQUFDLEdBQUc7UUFDVixtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsV0FBVztRQUNsRSxJQUFJLE9BQU8sR0FBNkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXO1FBQ2pGLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsT0FBTztRQUNwQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU07UUFDckUsT0FBTyxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVE7UUFDOUMsT0FBTyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxNQUFNO1FBQ25DLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsQyxRQUFRO1FBQ1IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsVUFBVTtRQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTTtJQUNOLFFBQVEsQ0FBQyxNQUFNLEVBQUUsT0FBTztRQUN0QixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztRQUN0SSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLDZCQUE2QjtRQUNsSSxPQUFPLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU07UUFDL0IsT0FBTyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLFNBQVM7UUFDckQsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsWUFBWTtJQUNoQyxDQUFDO0lBQ0QsK0JBQStCO0lBQy9CLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTztRQUNyQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDeEIsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPO0lBQ1Asb0JBQW9CLENBQUMsTUFBTTtRQUN6QixRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQy9ELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBb0VELFdBQVc7UUFDVCxJQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUN2QyxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdkMsSUFBRyxNQUFNLEVBQUMsQ0FBQztZQUNULElBQUksT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtZQUM1RCxPQUFPLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxHQUFDLFNBQVMsQ0FBQTtZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUN2RyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7Z0JBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2xDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksSUFBRSxhQUFhLENBQUMsQ0FBQztZQUN4RCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7YUFBSSxDQUFDO1lBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxZQUFZO1FBRVYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsWUFBWSxFQUFHLENBQUE7UUFDdEIsQ0FBQyxFQUFDLElBQUksQ0FBQyxDQUFBO1FBRVAsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN6QixDQUFDLEVBQUUsRUFBRSxHQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUNELFNBQVM7SUFDVCxtQkFBbUIsQ0FBQyxLQUE2RDtRQUMvRSxrQ0FBa0M7UUFDbEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3ZCLFNBQVM7UUFDVCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNELFNBQVM7SUFDVCx3QkFBd0IsQ0FBQyxLQUFnRjtRQUN2RyxrQ0FBa0M7UUFDbEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDM0QsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDL0IsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRW5CLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTO0lBQ1Qsc0JBQXNCLENBQUMsS0FBZ0Y7UUFDckcsa0NBQWtDO1FBQ2xDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQy9CLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVuQixJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRW5CLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRO2lCQUNaLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7aUJBQ25DLElBQUksQ0FBQyxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7WUFDbkIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUztJQUNULEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBaUg7UUFDbkksS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDekQsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQ3BGLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEMsT0FBTTtRQUNSLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2QyxPQUFNO1FBQ1IsQ0FBQztRQUNELElBQUksSUFBSSxHQUFJLEtBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksMEJBQTBCLENBQUE7UUFFdEYsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLHlCQUF5QixDQUFBO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3hLLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUE7WUFDckIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBSUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQXlJO1FBRTlKLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pELENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUM3QyxJQUFJLFNBQVMsR0FBUSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDNUUsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLE9BQU07UUFDUixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNELFFBQVE7UUFDTixRQUFRO1FBQ1IsSUFBSSxJQUFJLEdBQUksS0FBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSwwQkFBMEIsQ0FBQTtRQUV0RixJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsMkJBQTJCLElBQUksQ0FBQyxTQUFTLFdBQVcsSUFBSSxDQUFDLFFBQVEsU0FBUyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDekcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUEsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUMzRCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELEtBQUssQ0FBQyxtQkFBbUI7UUFDdkIsSUFBSSxPQUFZLENBQUM7UUFDakIsSUFBSSxTQUFjLENBQUM7UUFDbkIsSUFBSSxXQUFnQixDQUFDO1FBQ3JCLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEQsSUFBRyxDQUFDLFFBQVEsRUFBQyxDQUFDO1lBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDaEQsT0FBTTtRQUNSLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUTthQUNWLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUM5QixJQUFJLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFO1FBQ25CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQVlELEtBQUssQ0FBQyxTQUFTO1FBQ1QsNEJBQTRCO1FBQzVCLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN4QyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzVDLElBQUksSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2xDLElBQUcsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDO1lBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN4QyxPQUFNO1FBQ1IsQ0FBQztRQUNELFFBQVE7UUFFUixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDZixJQUFJLENBQUMsU0FBUyxHQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUNyQyxJQUFJLENBQUMsV0FBVyxFQUNoQixFQUFFLENBQ0gsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFDLEdBQUcsRUFBQyxFQUFFO1lBQ2pCLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO29CQUNqQixNQUFNLEVBQUUsU0FBUztvQkFDakIsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDekIsQ0FBQyxDQUFDO2dCQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDcEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDWCxlQUFlO2dCQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNULENBQUM7SUFJRCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU07UUFDeEIsSUFBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNoRSxJQUFJLE1BQU0sR0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFDO1lBQzVELE9BQU8sRUFBQyxJQUFJLENBQUMsU0FBUztZQUN0QixNQUFNLEVBQUMsTUFBTTtTQUNkLENBQUMsQ0FBQTtRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDbkIsSUFBRyxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsUUFBUSxDQUFBO1FBQy9DLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQTtJQUN0QixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFBO0lBQ3JCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7SUFDeEIsQ0FBQztJQUVELFFBQVE7UUFDTixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDZixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLENBQUMsV0FBVyxFQUNoQixFQUFFLENBQ0gsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFDLEdBQUcsRUFBQyxFQUFFO1lBQ2pCLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO29CQUNqQixNQUFNLEVBQUUsU0FBUztvQkFDakIsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDekIsQ0FBQyxDQUFDO2dCQUNILEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUE7Z0JBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0QsS0FBSyxDQUFDLE9BQU87UUFDWCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3ZDLElBQUksSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzdCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU87UUFDVCxDQUFDO1FBQ0QsT0FBTztRQUNQLElBQUksT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUMxRCxPQUFPLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxHQUFDLFNBQVMsQ0FBQTtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNsSCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO1lBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNyQixDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNoQyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ25FLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2QyxJQUFJLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUM3QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUMxRCxPQUFPLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxHQUFDLFNBQVMsQ0FBQTtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUM1SCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUE7WUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ3JCLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNULElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDcEIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSTtRQUMzQixJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDMUQsT0FBTyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksR0FBRyxHQUFHLE9BQU8sR0FBQyxZQUFZLENBQUE7UUFDMUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ3pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNkLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3RCLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBS0QsTUFBTTtJQUNOLFlBQVk7UUFDVixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtRQUN2QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEIsT0FBTTtRQUNSLENBQUM7UUFDRCxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUE7WUFDbkMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN4QixhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO2dCQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTtZQUMxQixDQUFDO1FBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQWFELFlBQ1MsUUFBcUIsRUFDcEIsU0FBMkIsRUFDM0IsRUFBZSxFQUNmLE9BQXlCLEVBQzFCLE1BQWMsRUFDYixLQUFvQixFQUNwQixjQUE4QixFQUM5QixJQUFnQjtRQVBqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUMxQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2IsVUFBSyxHQUFMLEtBQUssQ0FBZTtRQUNwQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQXRoQjFCLFNBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLFFBQUcsR0FBRyxFQUFFLENBQUM7UUFHVCxhQUFRLEdBQVUsQ0FBQyxDQUFDO1FBMEVwQixpQkFBWSxHQUFXLEtBQUssQ0FBQztRQXFDN0Isb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixVQUFVO1FBQ1YsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFHN0IsZ0JBQVcsR0FBUSxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXZELFFBQVE7UUFFUixhQUFRLEdBQVcsS0FBSyxDQUFDO1FBQ3pCLGNBQVMsR0FBVyxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBVyxFQUFFLENBQUM7UUF1TTFCLFlBQU8sR0FBWSxJQUFJLENBQUE7UUFHdkIsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUNqQixXQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUdwQixjQUFjO1FBQ2QsY0FBUyxHQUFZLEtBQUssQ0FBQTtRQW1DMUIsU0FBSSxHQUFXLE9BQU8sQ0FBQTtRQUV0QixrQkFBYSxHQUFHLEVBQUUsQ0FBQTtRQTZDbEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFnRnBCLGNBQVMsR0FBVyxFQUFFLENBQUE7UUFDdEIsZ0JBQVcsR0FBWSxLQUFLLENBQUE7UUFpQjVCLFNBQVM7UUFDVCxnQkFBVyxHQUFXLEtBQUssQ0FBQTtRQUUzQixTQUFJLEdBQVUsc0NBQXNDLENBQUM7UUFDckQsV0FBTSxHQUFVLDJDQUEyQyxDQUFDO1FBMEc1RCxpQkFBaUI7UUFDakIsMkJBQXNCLEdBQUcsQ0FBQyxPQUFvQixFQUFFLEVBQUUsQ0FDaEQsSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUEyQyxFQUFFLEVBQUU7WUFDN0QsSUFBSSxHQUFHLEdBQUcsbUJBQW1CLENBQUM7WUFDOUIsaUNBQWlDO1lBQ2pDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNuRCxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztvQkFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO29CQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsNEJBQTRCO2dCQUM1QixrQ0FBa0M7Z0JBQ2xDLHdDQUF3QztnQkFDeEMsd0RBQXdEO2dCQUN4RCwyQkFBMkI7Z0JBQzNCLGNBQWM7Z0JBQ2QsTUFBTTtnQkFDTixVQUFVO2dCQUNWLElBQUk7Z0JBRUosUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ0gsYUFBYTtRQUNiLHNCQUFpQixHQUFHLENBQUMsT0FBbUIsRUFBQyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUEyQyxFQUFFLEVBQUU7WUFDekcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUM1QixJQUFJLE9BQU8sSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNqRCxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQztvQkFDbEMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztRQUNMLFVBQVU7UUFDViwyQkFBc0IsR0FBRyxDQUFDLE9BQW9CLEVBQUUsRUFBRSxDQUNoRCxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQTJDLEVBQUUsRUFBRTtZQUM3RCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQzdCLElBQUksUUFBUSxJQUFJLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7b0JBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBRXBCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7b0JBQ3JDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3BCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFFTCx1QkFBa0IsR0FBRyxDQUFDLE9BQW9CLEVBQUUsRUFBRSxDQUM1QyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQTJDLEVBQUUsRUFBRTtZQUM3RCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQzlCLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFBO29CQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztvQkFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUE7b0JBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO29CQUNsQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtnQkFDL0IsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFBO2dCQUNoQyxJQUFHLENBQUMsSUFBRSxFQUFFLEVBQUMsQ0FBQztvQkFDUixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQTtvQkFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7b0JBQzlCLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3BCLE9BQU07Z0JBQ1IsQ0FBQztnQkFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtnQkFDeEIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBSUwsYUFBYTtRQUNiLCtCQUEwQixHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFLENBQ3BELElBQUksVUFBVSxDQUFDLENBQUMsUUFBMkMsRUFBRSxFQUFFO1lBQzdELElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFFakMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLFlBQVksSUFBSSxTQUFTLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUMzRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO29CQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ3BELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUM7b0JBQzFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3BCLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDTCxVQUFVO1FBQ1YsNkJBQXdCLEdBQUcsQ0FBQyxPQUFvQixFQUFFLEVBQUUsQ0FDbEQsSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUEyQyxFQUFFLEVBQUU7WUFDN0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUMvQixJQUFJLFVBQVUsSUFBSSxTQUFTLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUN2RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsY0FBYyxDQUFDO29CQUN6QyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7Z0JBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztRQUVMLGlDQUE0QixHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFLENBQ3RELElBQUksVUFBVSxDQUFDLENBQUMsUUFBMkMsRUFBRSxFQUFFO1lBQzdELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxjQUFjLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDbkMsSUFBSSxjQUFjLElBQUksU0FBUyxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDL0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztvQkFDakMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQVksQ0FBQztvQkFDckMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO2dCQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFFTCx3Q0FBbUMsR0FBRyxDQUFDLE9BQW9CLEVBQUUsRUFBRSxDQUM3RCxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQTJDLEVBQUUsRUFBRTtZQUM3RCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUkscUJBQXFCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDMUMsSUFBSSxxQkFBcUIsSUFBSSxTQUFTLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQzdFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxRQUFRLENBQUM7b0JBQ3pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3BCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDckMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFlBQVksQ0FBQztvQkFDN0MsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztnQkFDbkQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBRUwsNkJBQXdCLEdBQUcsQ0FBQyxPQUFvQixFQUFFLEVBQUUsQ0FDbEQsSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUEyQyxFQUFFLEVBQUU7WUFDN0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLGVBQWUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUNwQyxJQUFJLGVBQWUsSUFBSSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNqRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO29CQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztRQUtMLFVBQVU7UUFDViw2QkFBd0IsR0FBRyxDQUFDLE9BQW9CLEVBQUUsRUFBRSxDQUNsRCxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQTJDLEVBQUUsRUFBRTtZQUM3RCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQy9CLElBQUksVUFBVSxJQUFJLFNBQVMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3ZELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUM7b0JBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3BCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztnQkFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBR0wsVUFBVTtRQUNWLDhCQUF5QixHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFLENBQ25ELElBQUksVUFBVSxDQUFDLENBQUMsUUFBMkMsRUFBRSxFQUFFO1lBQzdELElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLFdBQVcsSUFBSSxTQUFTLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUN6RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO29CQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBRUQsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO29CQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBR0wsNkJBQXdCLEdBQUcsQ0FBQyxPQUFvQixFQUFFLEVBQUUsQ0FDbEQsSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUEyQyxFQUFFLEVBQUU7WUFDN0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUMvQixJQUFJLFVBQVUsSUFBSSxTQUFTLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUN2RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO29CQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ0wsU0FBUztRQUNULDhCQUF5QixHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFLENBQ25ELElBQUksVUFBVSxDQUFDLENBQUMsUUFBMkMsRUFBRSxFQUFFO1lBQzdELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDaEMsSUFBSSxXQUFXLElBQUksU0FBUyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDekQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztvQkFDbkMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFlBQVksQ0FBQztvQkFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGFBQWEsQ0FBQztvQkFDekMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO2dCQUM5QixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDTCxZQUFZO1FBQ1osa0NBQTZCLEdBQUcsQ0FBQyxPQUFvQixFQUFFLEVBQUUsQ0FDdkQsSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUEyQyxFQUFFLEVBQUU7WUFDN0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLGVBQWUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUNwQyxJQUFJLGVBQWUsSUFBSSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNqRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsT0FBTyxDQUFDO29CQUN2QyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDakQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN4QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3BCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztnQkFFdkMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBRUwsU0FBSSxHQUFRLEVBQUUsQ0FBQTtRQXRaWixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBQyxNQUFNLEVBQUEsRUFBRTtZQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBRW5CLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxJQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN6QyxJQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxDQUFDO29CQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFBO2dCQUNsRSxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7WUFFaEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBRUosQ0FBQztJQUNELEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsSUFBRyxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTTtRQUMxQixJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQTtRQUM5RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYTtRQUNqQixJQUFHLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUM1QixJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsT0FBTztRQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztRQUMvQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFBO1FBQzFELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDekMsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsYUFBYTtRQUVYLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsK0JBQStCO1lBQy9CLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ2xFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3BFLDBCQUEwQjtZQUMxQixTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUNsRSxDQUFDLENBQUM7UUFHSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDcEMsK0JBQStCO1lBQy9CLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDcEUsMEJBQTBCO1lBQzFCLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2xFLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkMsK0JBQStCO1lBQy9CLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ2xFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNkLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzlELDBCQUEwQjtZQUMxQixTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUNsRSxDQUFDLENBQUM7UUFHSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzlCLCtCQUErQjtZQUMvQixVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUN4RSxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUM1RSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUMxRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUN2RSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUMxRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNuRixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBRTlCLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzVFLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ2hGLHFCQUFxQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDOUYsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDOUUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQWdVRCxRQUFRO1FBRU4scUNBQXFDO1FBQ3JDLGlDQUFpQztRQUNqQyx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQixZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDOUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUNqRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUNELFNBQVM7UUFDUCxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUNkLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFFLFFBQVE7UUFDN0IsSUFBSSxTQUFTLEdBQUc7WUFDZCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztTQUNKLENBQUM7UUFDRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFDNUMsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7K0dBcmdDVSxjQUFjO21HQUFkLGNBQWMsd0RDakIzQiwwMnNCQWlYQTs7NEZEaFdhLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0Usa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2FpdEZvckFzeW5jIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJ2pzY2hhcnRpbmcnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzLCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9tZXNzYWdlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IFBhcnNlIGZyb20gXCJwYXJzZVwiO1xuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1NYXAgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgTm92YUNsb3VkU2VydmljZSB9IGZyb20gJy4uLy4uL25vdmEtY2xvdWQvbm92YS1jbG91ZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1wY3VzZXItbG9naW5cIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9sb2dpbi5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vbG9naW4uY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBudW1zID0gWydDJywgJzYnLCAnWicsICd0J107XG4gIHN0ciA9ICcnO1xuICBjYW52YXM6IGFueTtcbiAgaW1hZ2U6IGFueTtcbiAgdGFiSW5kZXg6bnVtYmVyID0gMDtcbiAgLy8g57uY5Yi26aqM6K+B56CBXG4gIGRyYXdDb2RlKHN0cikge1xuICAgIC8vIHRoaXMucmVzZXRDb2RlKClcbiAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidmVyaWZ5Q2FudmFzXCIpOyAvL+iOt+WPlkhUTUznq6/nlLvluINcbiAgICB2YXIgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpOyAvL+iOt+WPlueUu+W4gzJE5LiK5LiL5paHXG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBcIndoaXRlXCI7IC8v55S75biD5aGr5YWF6ImyXG4gICAgY29udGV4dC5maWxsUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTsgLy/muIXnqbrnlLvluINcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFwiY29ybmZsb3dlcmJsdWVcIjsgLy/orr7nva7lrZfkvZPpopzoibJcbiAgICBjb250ZXh0LmZvbnQgPSBcIjI1cHggQXJpYWxcIjsgLy/orr7nva7lrZfkvZNcbiAgICB2YXIgcmFuZCA9IG5ldyBBcnJheSgpO1xuICAgIHZhciB4ID0gbmV3IEFycmF5KCk7XG4gICAgdmFyIHkgPSBuZXcgQXJyYXkoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgcmFuZC5wdXNoKHJhbmRbaV0pO1xuICAgICAgcmFuZFtpXSA9IHRoaXMubnVtc1tpXVxuICAgICAgeFtpXSA9IGkgKiAyMCArIDEwO1xuICAgICAgeVtpXSA9IE1hdGgucmFuZG9tKCkgKiAyMCArIDIwO1xuICAgICAgY29udGV4dC5maWxsVGV4dChyYW5kW2ldLCB4W2ldLCB5W2ldKTtcbiAgICB9XG4gICAgc3RyID0gcmFuZC5qb2luKCcnKS50b1VwcGVyQ2FzZSgpO1xuICAgIC8v55S7M+adoemaj+acuue6v1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICB0aGlzLmRyYXdsaW5lKHRoaXMuY2FudmFzLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyDnlLszMOS4qumaj+acuueCuVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzA7IGkrKykge1xuICAgICAgdGhpcy5kcmF3RG90KHRoaXMuY2FudmFzLCBjb250ZXh0KTtcbiAgICB9XG4gICAgdGhpcy5jb252ZXJ0Q2FudmFzVG9JbWFnZSh0aGlzLmNhbnZhcyk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIC8vIOmaj+acuue6v1xuICBkcmF3bGluZShjYW52YXMsIGNvbnRleHQpIHtcbiAgICBjb250ZXh0Lm1vdmVUbyhNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW52YXMud2lkdGgpLCBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW52YXMuaGVpZ2h0KSk7IC8v6ZqP5py657q/55qE6LW354K5eOWdkOagh+aYr+eUu+W4g3jlnZDmoIcw5L2N572u77yMeeWdkOagh+aYr+eUu+W4g+mrmOW6pueahOmaj+acuuaVsFxuICAgIGNvbnRleHQubGluZVRvKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbnZhcy53aWR0aCksIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbnZhcy5oZWlnaHQpKTsgLy/pmo/mnLrnur/nmoTnu4jngrl45Z2Q5qCH5piv55S75biD5a695bqm77yMeeWdkOagh+aYr+eUu+W4g+mrmOW6pueahOmaj+acuuaVsFxuICAgIGNvbnRleHQubGluZVdpZHRoID0gMC41OyAvL+maj+acuue6v+WuvVxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSg1MCw1MCw1MCwwLjMpJzsgLy/pmo/mnLrnur/mj4/ovrnlsZ7mgKdcbiAgICBjb250ZXh0LnN0cm9rZSgpOyAvL+aPj+i+ue+8jOWNs+i1t+eCueaPj+WIsOe7iOeCuVxuICB9XG4gIC8vIOmaj+acuueCuSjmiYDosJPnlLvngrnlhbblrp7lsLHmmK/nlLsxcHjlg4/ntKDnmoTnur/vvIzmlrnms5XkuI3lho3otZjov7ApXG4gIGRyYXdEb3QoY2FudmFzLCBjb250ZXh0KSB7XG4gICAgdmFyIHB4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FudmFzLndpZHRoKTtcbiAgICB2YXIgcHkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW52YXMuaGVpZ2h0KTtcbiAgICBjb250ZXh0Lm1vdmVUbyhweCwgcHkpO1xuICAgIGNvbnRleHQubGluZVRvKHB4ICsgMSwgcHkgKyAxKTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDAuMjtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9XG4gIC8vIOe7mOWItuWbvueJh1xuICBjb252ZXJ0Q2FudmFzVG9JbWFnZShjYW52YXMpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInZlcmlmeUNhbnZhc1wiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgdGhpcy5pbWFnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29kZV9pbWdcIik7XG4gICAgdGhpcy5pbWFnZS5zcmMgPSBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpO1xuICAgIHJldHVybiB0aGlzLmltYWdlO1xuICB9XG4gIC8vIOeZu+W9lVxuICAvLyAgIOmqjOivgeeggVxuICB2Q29kZTogc3RyaW5nO1xuICAvLyDnmbvlvZXpqozor4HooajljZXlr7nosaFcbiAgdmFsaWRhdGVGb3JtITogRm9ybUdyb3VwO1xuICAvLyDluJDlj7flr4bnoIHooajljZXlr7nosaFcbiAgdmFsaWRhdGVVc2VyRm9ybSE6IEZvcm1Hcm91cDtcbiAgLy8g5omL5py66aqM6K+B56CB6KGo5Y2VXG4gIHZhbGlkYXRlU01TRm9ybSE6Rm9ybUdyb3VwO1xuICBzbXNDb2RlRXJyb3JUaXA6c3RyaW5nO1xuICAvLyDnlKjmiLflkI3plJnor6/mj5DnpLpcbiAgdXNlckVycm9yVGlwOiBhbnk7XG4gIC8vIOWvhueggemUmeivr+aPkOekulxuICBwYXNzd29yZEVycm9yVGlwOiBhbnk7XG4gIGZvcmdldHBob25lQ29kZXNFcnJvclRpcDogYW55O1xuICBwaG9uZUVycm9yVGlwOiBhbnk7XG4gIGNvZGVWZXJpZmllZDpib29sZWFuID0gZmFsc2U7XG4gIGNvZGVFcnJvclRpcDogYW55XG4gIC8vIOeUqOaIt+WQje+8iOaJi+acuuWPt+egge+8iVxuICB1c2VybmFtZTogYW55O1xuICAvLyAgIGZvcmdldHVzZXJuYW1lXG4gIGZvcmdldHVzZXJuYW1lOiBzdHJpbmc7XG4gIGZvcmdldFBhc3N3b3JkOiBzdHJpbmc7XG4gIGZvcmdldENvbmZpcm1wYXNzd29yZDogc3RyaW5nO1xuICBmb3JnZXJwaG9uZUNvZGU6IHN0cmluZztcbiAgc21zQ29kZTpzdHJpbmdcbiAgLy8g5a+G56CBXG4gIHBob25lQ29kZTogYW55O1xuICAvLyBjb2RlOiAnNjdkZSdcbiAgLy/miYDmnInlgJnpgInnu4TmiJDpqozor4HnoIHnmoTlrZfnrKbvvIzlvZPnhLbkuZ/lj6/ku6XnlKjkuK3mlofnmoRcbiAgLy8g5qOA5rWL5piv5ZCm5Li65a2m5qCh5a2m55SfXG5cbiAgLy8gLy/nu5HlrprlrabnsY3pqozor4HooajljZXlr7nosaFcbiAgLy8gcHJvZmlsZUZvcm0hOiBGb3JtR3JvdXA7XG4gIC8vIC8vIOWnk+WQjemUmeivr+aPkOekulxuICAvLyBuYW1lRXJyb3JUaXA6IGFueTtcbiAgLy8gLy8g6Lqr5Lu96K+B5Y+356CB6ZSZ6K+v5o+Q56S6XG4gIC8vIGlkY2FyZEVycm9yVGlwOiBhbnk7XG5cbiAgLy8g5rOo5YaMXG4gIHJlZ2lzdEZvcm0hOiBGb3JtR3JvdXA7XG4gIC8vIOW/mOiusOWvhueggVxuICBmb3JnZXRGb3JtITogRm9ybUdyb3VwO1xuICAvLyDms6jlhozlp5PlkI3plJnor6/mj5DnpLpcbiAgcmVnaXN0TmFtZUVycm9yVGlwOiBhbnk7XG4gIC8vIOWvhueggemUmeivr+aPkOekulxuICByZWdpc3RJZGNhcmRFcnJvclRpcDogYW55O1xuICAvLyDms6jlhozlp5PlkI1cbiAgcmVnaXN0TmFtZTogYW55O1xuICBwaG9uZUNvZGVzOiBhbnk7XG4gIHJlZ2lzdFBob25lOiBhbnk7XG4gIC8vIOazqOWGjOi6q+S7veivgeWPt+eggVxuICByZWdpc3RJZGNhcmQ6IGFueTtcbiAgcGFzc3dvcmRWaXNpYmxlID0gZmFsc2U7XG4gIHBhc3N3b3JkVmlzaWJsZTIgPSBmYWxzZTtcbiAgcGFzc3dvcmRWaXNpYmxlMyA9IGZhbHNlO1xuICAvLyDmmK/lkKbmnInlpJrkuKrlsYLmrKFcbiAgaXNlZHVjYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8g5bGC5qyhXG4gIHNlbGVjdEVkdWNhdGlvbjogYW55O1xuICByZWRpcmVjdFVybDogYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJyZWRpcmVjdFVybFwiKTtcblxuICAvLyDmiYvmnLrpqozor4HnoIFcblxuICBpc1NlbmRlZDpib29sZWFuID0gZmFsc2U7XG4gIGlzU2VuZGluZzpib29sZWFuID0gZmFsc2U7XG4gIHNtc1RpbWVDb3VudDogbnVtYmVyID0gNjA7XG4gIHNlbmRTTVNDb2RlKCl7XG4gICAgaWYoIXRoaXMuY29kZVZlcmlmaWVkKXtcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBcIuivt+WFiOaguOWvuemqjOivgeeggVwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IG1vYmlsZSA9IHRoaXMudmFsaWRhdGVTTVNGb3JtLnZhbHVlPy5tb2JpbGU7XG4gICAgY29uc29sZS5sb2codGhpcy52YWxpZGF0ZVNNU0Zvcm0udmFsdWUpXG4gICAgaWYobW9iaWxlKXtcbiAgICAgIGxldCBhcGlnVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJOT1ZBX0FQSUdfU0VSVkVSXCIpXG5hcGlnVVJMID0gZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IoYXBpZ1VSTCkpO1xubGV0IHVybCA9IGFwaWdVUkwrXCJtZXNzYWdlXCJcbiAgICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgeyBjb21wYW55OiB0aGlzLmNvbXBhbnlJZCwgbW9iaWxlOiBtb2JpbGUsIGFjdGlvbjogJ2xvZ2luJyB9KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY291bnREb3duU01TKClcbiAgICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOW3suWPkemAge+8jOivt+afpeaUtumqjOivgeeggWApO1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2UuZXJyb3IoZXJyb3I/LmVycm9yPy5tZXNzfHxg57O757uf57mB5b+Z5Lit77yM6K+356iN5ZCO6YeN6K+VYCk7XG4gICAgICB9KVxuICAgIH1lbHNle1xuICAgICAgdGhpcy5tZXNzYWdlLmVycm9yKFwi6K+35q2j56Gu6L6T5YWl5omL5py65Y+3XCIpXG4gICAgfVxuICB9XG4gIGNvdW50RG93blNNUygpe1xuXG4gICAgdGhpcy5pc1NlbmRlZCA9IHRydWU7XG4gICAgdGhpcy5pc1NlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc21zVGltZUNvdW50ID0gNjA7XG4gICAgbGV0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCk9PntcbiAgICAgIHRoaXMuc21zVGltZUNvdW50IC0tXG4gICAgfSwxMDAwKVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgIHRoaXMuaXNTZW5kaW5nID0gZmFsc2U7XG4gICAgfSwgNjAqMTAwMCk7XG4gIH1cbiAgLy8g54K55Ye755m75b2V5oyJ6ZKuXG4gIHN1Ym1pdEZvcm1Nb2JpbGVTTVModmFsdWU6IHsgbW9iaWxlOiBzdHJpbmc7IHNtc0NvZGU6IHN0cmluZzsgY2hlY2tDb2RlOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwidXNlclwiKVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudmFsaWRhdGVTTVNGb3JtLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlU01TRm9ybS5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLnZhbGlkYXRlU01TRm9ybS5jb250cm9sc1trZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2codmFsdWUpXG4gICAgdGhpcy51c2VybmFtZSA9IHZhbHVlLm1vYmlsZTtcbiAgICB0aGlzLnNtc0NvZGUgPSB2YWx1ZS5zbXNDb2RlO1xuICAgIGNvbnNvbGUubG9nKFwic21zbG9naW5cIilcbiAgICAvLyByZXR1cm5cbiAgICB0aGlzLmxvZ2luU01TKCk7XG4gIH1cbiAgLy8g54K55Ye755m75b2V5oyJ6ZKuXG4gIHN1Ym1pdEZvcm1Nb2JpbGVQYXNzd29yZCh2YWx1ZTogeyBtb2JpbGU6IHN0cmluZzsgdXNlcm5hbWU/OnN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZzsgY2hlY2tDb2RlOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwidXNlclwiKVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybS5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybS5jb250cm9sc1trZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gICAgdGhpcy51c2VybmFtZSA9IHZhbHVlLm1vYmlsZSB8fCB2YWx1ZS51c2VybmFtZTtcbiAgICB0aGlzLnBhc3N3b3JkID0gdmFsdWUucGFzc3dvcmQ7XG4gICAgbGV0IGNoZWNrQ29kZSA9IHZhbHVlLmNoZWNrQ29kZTtcbiAgICBsZXQgYyA9IHRoaXMuY29kZS50b0xvd2VyQ2FzZSgpXG4gICAgbGV0IHZjID0gY2hlY2tDb2RlLnRvTG93ZXJDYXNlKClcbiAgICBjb25zb2xlLmxvZyhjLCB2Yyk7XG5cbiAgICBpZiAoYyAhPSB2Yykge1xuICAgICAgY29uc29sZS5sb2coYywgdmMpO1xuXG4gICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLpqozor4HnoIHplJnor69cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9naW5Nb2JpbGVQYXNzd29yZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOeCueWHu+eZu+W9leaMiemSrlxuICBzdWJtaXRGb3JtVXNlclBhc3N3b3JkKHZhbHVlOiB7IG1vYmlsZTogc3RyaW5nOyB1c2VybmFtZT86c3RyaW5nOyBwYXNzd29yZDogc3RyaW5nOyBjaGVja0NvZGU6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJ1c2VyXCIpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2tleV0ubWFya0FzRGlydHkoKTtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2tleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJuYW1lID0gdmFsdWUubW9iaWxlIHx8IHZhbHVlLnVzZXJuYW1lO1xuICAgIHRoaXMucGFzc3dvcmQgPSB2YWx1ZS5wYXNzd29yZDtcbiAgICBsZXQgY2hlY2tDb2RlID0gdmFsdWUuY2hlY2tDb2RlO1xuICAgIGxldCBjID0gdGhpcy5jb2RlLnRvTG93ZXJDYXNlKClcbiAgICBsZXQgdmMgPSBjaGVja0NvZGUudG9Mb3dlckNhc2UoKVxuICAgIGNvbnNvbGUubG9nKGMsIHZjKTtcblxuICAgIGlmIChjICE9IHZjKSB7XG4gICAgICBjb25zb2xlLmxvZyhjLCB2Yyk7XG5cbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBcIumqjOivgeeggemUmeivr1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hdXRoU2VydlxuICAgICAgLmxvZ2luKHRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpXG4gICAgICAudGhlbihhc3luYyBkYXRhID0+IHtcbiAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcImVycm9yXCIsIFwi6ZSZ6K+v55qE55So5oi35ZCN5oiW5a+G56CBXCIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8g54K55Ye76YeN572u5a+G56CBXG4gIGFzeW5jIGZvcmdldEZvcm1GdW4odmFsdWU6IHsgZm9yZ2V0dXNlcm5hbWU6IHN0cmluZzsgZm9yZ2V0UGFzc3dvcmQ6IHN0cmluZzsgZm9yZ2V0Q29uZmlybXBhc3N3b3JkOiBzdHJpbmc7IGZvcmdlcnBob25lQ29kZTogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmZvcmdldEZvcm0uY29udHJvbHMpIHtcbiAgICAgIHRoaXMuZm9yZ2V0Rm9ybS5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLmZvcmdldEZvcm0uY29udHJvbHNba2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKHZhbHVlLmZvcmdldHVzZXJuYW1lLCB2YWx1ZS5mb3JnZXRQYXNzd29yZCwgdmFsdWUuZm9yZ2V0Q29uZmlybXBhc3N3b3JkKVxuICAgIGlmICh2YWx1ZS5mb3JnZXRQYXNzd29yZCAhPSB2YWx1ZS5mb3JnZXRDb25maXJtcGFzc3dvcmQpIHtcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBcIuS4pOasoeWvhueggeS4jeS4gOiHtFwiKTtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXZhbHVlLmZvcmdlcnBob25lQ29kZSkge1xuICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcImVycm9yXCIsIFwi6K+36L6T5YWl6aqM6K+B56CBXCIpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxldCBob3N0ID0gKFBhcnNlIGFzIGFueSkuc2VydmVyVVJMPy5zcGxpdChcInBhcnNlXCIpPy5bMF0gfHwgXCJodHRwczovL3NlcnZlci5mbW9kZS5jbi9cIlxuXG4gICAgbGV0IHVybCA9IGhvc3QgKyBcImFwaS9hdXRoL3Jlc2V0X3Bhc3N3b3JkXCJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIHsgY29tcGFueTogdGhpcy5jb21wYW55SWQsIG1vYmlsZTogdmFsdWUuZm9yZ2V0dXNlcm5hbWUsIGNvZGU6IHZhbHVlLmZvcmdlcnBob25lQ29kZSwgcGFzc3dvcmQ6IHZhbHVlLmZvcmdldENvbmZpcm1wYXNzd29yZCB9KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICBpZiAocmVzLmNvZGUgPT0gMjAwKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJzdWNjZXNzXCIsIHJlcy5tc2cpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnbG9naW4nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLpqozor4HnoIHplJnor69cIik7XG4gICAgICB9XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IuZXJyb3IpXG4gICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKCdlcnJvcicsIGVycm9yLmVycm9yLm1lc3MpO1xuICAgIH0pXG4gIH1cbiAgLy8g54K55Ye75rOo5YaM5oyJ6ZKuXG4gIHJlZ3Bhc3N3b3JkOiBhbnk7XG4gIGNvbmZpcm1QYXNzd29yZDogYW55O1xuICBhc3luYyByZWdpc3RTdWJtaXRGb3JtKHZhbHVlOiB7IHJlZ2lzdE5hbWU6IHN0cmluZzsgcmVnaXN0SWRjYXJkOiBzdHJpbmcsIHJlZ3Bhc3N3b3JkOiBzdHJpbmc7IGNvbmZpcm1QYXNzd29yZDogc3RyaW5nOyBwaG9uZUNvZGU6IHN0cmluZzsgcmVnaXN0UGhvbmU6IHN0cmluZyB9KSB7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnJlZ2lzdEZvcm0uY29udHJvbHMpIHtcbiAgICAgIHRoaXMucmVnaXN0Rm9ybS5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLnJlZ2lzdEZvcm0uY29udHJvbHNba2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0TmFtZSA9IHZhbHVlLnJlZ2lzdE5hbWU7XG4gICAgdGhpcy5yZWdpc3RJZGNhcmQgPSB2YWx1ZS5yZWdpc3RJZGNhcmQ7XG4gICAgdGhpcy5yZWdpc3RQaG9uZSA9IHZhbHVlLnJlZ2lzdFBob25lO1xuICAgIHRoaXMucGhvbmVDb2RlID0gdmFsdWUucGhvbmVDb2RlO1xuICAgIHRoaXMucmVncGFzc3dvcmQgPSB2YWx1ZS5yZWdwYXNzd29yZDtcbiAgICB0aGlzLmNvbmZpcm1QYXNzd29yZCA9IHZhbHVlLmNvbmZpcm1QYXNzd29yZDtcbiAgICBsZXQgY2hlY2tJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLnZlcmlmeUNvZGUodGhpcy5yZWdpc3RQaG9uZSwgdGhpcy5waG9uZUNvZGUpXG4gICAgaWYgKGNoZWNrSW5mbyAmJiBjaGVja0luZm8uY29kZSAhPSAyMDApIHtcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBjaGVja0luZm8ubWVzcyk7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5xdWVyeVVzZXIoKTtcbiAgfVxuICBcbiAgZ2V0U2VsZWN0RWR1Y2F0aW9uKCkge1xuICAgIHRoaXMubG9naW5Nb2JpbGVQYXNzd29yZCgpXG4gICAgdGhpcy5pc2VkdWNhdGlvbiA9IGZhbHNlO1xuICB9XG4gIGxvZ2luU01TKCl7XG4gICAgLy8g6aqM6K+B56CB55m75b2VXG4gICAgbGV0IGhvc3QgPSAoUGFyc2UgYXMgYW55KS5zZXJ2ZXJVUkw/LnNwbGl0KFwicGFyc2VcIik/LlswXSB8fCBcImh0dHBzOi8vc2VydmVyLmZtb2RlLmNuL1wiXG5cbiAgICBsZXQgdXJsID0gaG9zdCArIGBhcGkvYXV0aC9tb2JpbGU/Y29tcGFueT0ke3RoaXMuY29tcGFueUlkfSZtb2JpbGU9JHt0aGlzLnVzZXJuYW1lfSZjb2RlPSR7dGhpcy5zbXNDb2RlfWBcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgIGlmIChyZXMuY29kZSA9PSAyMDApIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcInN1Y2Nlc3NcIiwgXCLnmbvlvZXmiJDlip9cIik7XG4gICAgICAgIGxldCB0b2tlbiA9IHJlcy5kYXRhLnRva2VuO1xuICAgICAgICBQYXJzZS5Vc2VyLmJlY29tZSh0b2tlbikudGhlbih1c2VyPT57XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2RlY29kZVVSSUNvbXBvbmVudCh0aGlzLnJvb3RQYWdlKV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLpqozor4HnoIHplJnor69cIik7XG4gICAgICB9XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IuZXJyb3IpXG4gICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKCdlcnJvcicsIGVycm9yLmVycm9yLm1lc3MpO1xuICAgIH0pXG4gIH1cbiAgYXN5bmMgbG9naW5Nb2JpbGVQYXNzd29yZCgpIHtcbiAgICBsZXQgcHJvZmlsZTogYW55O1xuICAgIGxldCBlZHVjYXRpb246IGFueTtcbiAgICBsZXQgY3VycmVudFVzZXI6IGFueTtcbiAgICBsZXQgdXNlcm5hbWUgPSBhd2FpdCB0aGlzLmdldE1vYmlsZVVzZXIodGhpcy51c2VybmFtZSlcbiAgICBpZighdXNlcm5hbWUpe1xuICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcImVycm9yXCIsIFwi55So5oi35LiN5a2Y5Zyo77yM6K+35bCd6K+V5YW25LuW55m75b2V5pa55byPXCIpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuYXV0aFNlcnZcbiAgICAgIC5sb2dpbih1c2VybmFtZSwgdGhpcy5wYXNzd29yZClcbiAgICAgIC50aGVuKGFzeW5jIGRhdGEgPT4ge1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKVxuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLplJnor6/nmoTnlKjmiLflkI3miJblr4bnoIFcIik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlXG4gIGxvYWRpbmcyOiBib29sZWFuIFxuICBQcm9maWxlOiBhbnlcbiAgTGVzc29uOiBhbnkgPSBbXTtcbiAgbXlEYXRlID0gbmV3IERhdGUoKTtcblxuIFxuICAvLyDmn6Xor6Lor6XlrabnlJ/kv6Hmga/mmK/lkKblrZjlnKhcbiAgaXNWaXNpYmxlOiBib29sZWFuID0gZmFsc2VcbiAgcHJvZmlsZTogYW55XG4gIGFzeW5jIHF1ZXJ5VXNlcigpIHtcbiAgICAgICAgLy8g5p+l5om+6L+Z5Liq55So5oi35a2Y5LiN5a2Y5Zyo77yM5a2Y5Zyo55u05o6l57uR5a6a55m75b2V77yM5LiN5a2Y5Zyo5rOo5YaMXG4gICAgICAgIGxldCBxdWVyeVVzZXIgPSBuZXcgUGFyc2UuUXVlcnkoJ19Vc2VyJylcbiAgICAgICAgcXVlcnlVc2VyLmNvbnRhaW5zKFwidXNlcm5hbWVcIiwgdGhpcy5yZWdpc3RQaG9uZSk7XG4gICAgICAgIHF1ZXJ5VXNlci5lcXVhbFRvKFwiY29tcGFueVwiLCB0aGlzLmNvbXBhbnlJZClcbiAgICAgICAgbGV0IHVzZXIgPSBhd2FpdCBxdWVyeVVzZXIuZmlyc3QoKVxuICAgICAgICBpZih1c2VyPy5pZCl7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivpei0puaIt+W3sua/gOa0u++8jOS9v+eUqOaJi+acuuWPt+WvhueggeebtOaOpeeZu+W9lWApO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIOaguOmqjOaJi+acuuWPt1xuICAgXG4gICAgICAgIFBhcnNlLlVzZXIuc2lnblVwKFxuICAgICAgICAgIHRoaXMuY29tcGFueUlkK1wiLVwiICsgdGhpcy5yZWdpc3RQaG9uZSxcbiAgICAgICAgICB0aGlzLnJlZ3Bhc3N3b3JkLFxuICAgICAgICAgIFwiXCJcbiAgICAgICAgKS50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5pZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKVxuICAgICAgICAgICAgcmVzLnNldChcImNvbXBhbnlcIiwge1xuICAgICAgICAgICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQ29tcGFueVwiLFxuICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5jb21wYW55SWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLnNldChcIm1vYmlsZVwiLCB0aGlzLnJlZ2lzdFBob25lKTtcbiAgICAgICAgICAgIHJlcy5zZXQoXCJ0eXBlXCIsXCJ1c2VyXCIpO1xuICAgICAgICAgICAgcmVzLnNhdmUoKTtcbiAgICAgICAgICAgIC8vIOW8gOmAmui0puWPt+i+heWKqeWhq+WGmei0puWPt+WvhueggVxuICAgICAgICAgICAgdGhpcy51c2VybmFtZSA9IHRoaXMucmVnaXN0UGhvbmU7XG4gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gdGhpcy5yZWdwYXNzd29yZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICB9XG4gIHR5cGU6IHN0cmluZyA9ICdsb2dpbidcblxuICBtb2JpbGVVc2VyTWFwID0ge31cbiAgYXN5bmMgZ2V0TW9iaWxlVXNlcihtb2JpbGUpe1xuICAgIGlmKHRoaXMubW9iaWxlVXNlck1hcFttb2JpbGVdKSByZXR1cm4gdGhpcy5tb2JpbGVVc2VyTWFwW21vYmlsZV1cbiAgICBsZXQgcmVzdWx0OmFueSA9IGF3YWl0IHRoaXMubm92YUNsb3VkLmFwaShcIi9hdXRoL2dldHVzZXJuYW1lXCIse1xuICAgICAgY29tcGFueTp0aGlzLmNvbXBhbnlJZCxcbiAgICAgIG1vYmlsZTptb2JpbGVcbiAgICB9KVxuICAgIGNvbnNvbGUubG9nKHJlc3VsdClcbiAgICBpZihyZXN1bHQ/LnVzZXJuYW1lKXtcbiAgICAgIHRoaXMubW9iaWxlVXNlck1hcFttb2JpbGVdID0gcmVzdWx0Py51c2VybmFtZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb2JpbGVVc2VyTWFwW21vYmlsZV1cbiAgfVxuXG4gIGZvcmdldCgpIHtcbiAgICB0aGlzLnR5cGUgPSAnZm9yZ2V0J1xuICB9XG5cbiAgYmFja0xvZ2luKCkge1xuICAgIHRoaXMudHlwZSA9ICdsb2dpbidcbiAgfVxuIFxuICBoYW5kbGVDYW5jZWwoKSB7XG4gICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZVxuICB9XG4gIHBhc3N3b3JkOiBhbnk7XG4gIGhhbmRsZU9rKCkge1xuICAgIFBhcnNlLlVzZXIuc2lnblVwKFxuICAgICAgdGhpcy5yZWdpc3RQaG9uZSxcbiAgICAgIHRoaXMucmVncGFzc3dvcmQsXG4gICAgICBcIlwiXG4gICAgKS50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICBpZiAocmVzLmlkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICAgICAgcmVzLnNldChcImNvbXBhbnlcIiwge1xuICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbXBhbnlcIixcbiAgICAgICAgICBvYmplY3RJZDogdGhpcy5jb21wYW55SWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5zYXZlKCk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSB0aGlzLnJlZ2lzdFBob25lXG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB0aGlzLnJlZ3Bhc3N3b3JkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlzT2tMb2FkaW5nID0gZmFsc2U7XG5cbiAgYXN5bmMgZ2V0Q29kZSgpIHtcbiAgICBpZiAodGhpcy5yZWdpc3RQaG9uZSA9PSB1bmRlZmluZWQgfHwgdGhpcy5yZWdpc3RQaG9uZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivt+i+k+WFpeazqOWGjOaJi+acuuWPt2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYSA9IC9eMVszNDU2Nzg5XVxcZHs5fSQvO1xuICAgIGlmICghdGhpcy5yZWdpc3RQaG9uZS5tYXRjaChhKSkge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivt+i+k+WFpeato+ehrueahOaJi+acuuWPt2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgVXNlciA9IG5ldyBQYXJzZS5RdWVyeSgnVXNlcicpXG4gICAgVXNlci5lcXVhbFRvKCd1c2VybmFtZScsIHRoaXMucmVnaXN0UGhvbmUpXG4gICAgVXNlci5lcXVhbFRvKCdjb21wYW55JywgdGhpcy5jb21wYW55SWQpXG4gICAgbGV0IHVzZXIgPSBhd2FpdCBVc2VyLmZpcnN0KClcbiAgICBpZiAodXNlciAmJiB1c2VyLmlkKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UuaW5mbyhg6K+l5omL5py65Y+35bey5rOo5YaM77yM6K+35L2/55So6LSm5Y+35a+G56CB55m75b2VYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOacrOWcsOa1i+ivlVxuICAgIGxldCBhcGlnVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJOT1ZBX0FQSUdfU0VSVkVSXCIpXG5hcGlnVVJMID0gZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IoYXBpZ1VSTCkpO1xubGV0IHVybCA9IGFwaWdVUkwrXCJtZXNzYWdlXCJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIHsgY29tcGFueTogdGhpcy5jb21wYW55SWQsIG1vYmlsZTogdGhpcy5yZWdpc3RQaG9uZSwgYWN0aW9uOiAncmVnaXN0JyB9KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLnZDb2RlID0gcmVzLmRhdGEuY29kZVxuICAgICAgdGhpcy5jb3VudERvd25GdW4oKVxuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZS5pbmZvKGDns7vnu5/nuYHlv5nkuK3vvIzor7fnqI3lkI7ph43or5VgKTtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBnZXRDb2RlMigpIHtcbiAgICBpZiAodGhpcy5mb3JnZXR1c2VybmFtZSA9PSB1bmRlZmluZWQgfHwgdGhpcy5mb3JnZXR1c2VybmFtZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivt+i+k+WFpei0puWPt2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYSA9IC9eMVszNDU2Nzg5XVxcZHs5fSQvO1xuICAgIGlmICghdGhpcy5mb3JnZXR1c2VybmFtZS5tYXRjaChhKSkge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivt+i+k+WFpeato+ehrueahOaJi+acuuWPt2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyh0aGlzLmZvcmdldHVzZXJuYW1lKVxuICAgIGxldCBVc2VyID0gbmV3IFBhcnNlLlF1ZXJ5KCdVc2VyJylcbiAgICBVc2VyLmVxdWFsVG8oJ3VzZXJuYW1lJyx0aGlzLmNvbXBhbnlJZCArIFwiLVwiICsgdGhpcy5mb3JnZXR1c2VybmFtZSlcbiAgICBVc2VyLmVxdWFsVG8oJ2NvbXBhbnknLCB0aGlzLmNvbXBhbnlJZClcbiAgICBsZXQgdXNlciA9IGF3YWl0IFVzZXIuZmlyc3QoKVxuICAgIGlmICghdXNlcikge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOi0puWPt+S4jeWtmOWcqGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYXBpZ1VSTCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiTk9WQV9BUElHX1NFUlZFUlwiKVxuYXBpZ1VSTCA9IGRlY29kZVVSSUNvbXBvbmVudChhdG9iKGFwaWdVUkwpKTtcbmxldCB1cmwgPSBhcGlnVVJMK1wibWVzc2FnZVwiXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCB7IGNvbXBhbnk6IHRoaXMuY29tcGFueUlkLCBtb2JpbGU6IHRoaXMuZm9yZ2V0dXNlcm5hbWUsIGFjdGlvbjogJ3Jlc2V0UGFzc3dvcmQnIH0pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICAgIHRoaXMudkNvZGUgPSByZXMuZGF0YS5jb2RlXG4gICAgICB0aGlzLmNvdW50RG93bkZ1bigpXG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOezu+e7n+e5geW/meS4re+8jOivt+eojeWQjumHjeivlWApO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeUNvZGUobW9iaWxlLCBjb2RlKSB7XG4gICAgbGV0IGFwaWdVUkwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIk5PVkFfQVBJR19TRVJWRVJcIilcbmFwaWdVUkwgPSBkZWNvZGVVUklDb21wb25lbnQoYXRvYihhcGlnVVJMKSk7XG5sZXQgdXJsID0gYXBpZ1VSTCtcInZlcmlmeUNvZGVcIlxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmh0dHAucG9zdCh1cmwsIHsgbW9iaWxlOiBtb2JpbGUsIGNvZGU6IGNvZGUgfSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICByZXNvbHZlKHJlcylcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgICAgIHJlc29sdmUoZXJyb3IuZXJyb3IpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuXG4gIGNvdW50RG93bjogbnVtYmVyID0gNjBcbiAgaXNDb3VudERvd246IGJvb2xlYW4gPSBmYWxzZVxuICAvLyDlgJLorqHml7ZcbiAgY291bnREb3duRnVuKCkge1xuICAgIHRoaXMuaXNDb3VudERvd24gPSB0cnVlXG4gICAgaWYgKHRoaXMuY291bnREb3duID09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmNvdW50RG93biA9IHRoaXMuY291bnREb3duIC0gMVxuICAgICAgaWYgKHRoaXMuY291bnREb3duID09IDApIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcilcbiAgICAgICAgdGhpcy5jb3VudERvd24gPSA2MFxuICAgICAgICB0aGlzLmlzQ291bnREb3duID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LCAxMDAwKVxuICB9XG5cbiAgLy8g6aG16Z2i5pi+56S657Sg5p2QXG4gIG1vYmlsZUxvZ2luOmJvb2xlYW4gPSBmYWxzZVxuICByb290UGFnZTpzdHJpbmdcbiAgbG9nbzpzdHJpbmcgPSAnaHR0cHM6Ly93d3cuZm1vZGUuY24vaW1hZ2VzL2V3bTEucG5nJztcbiAgcXJjb2RlOnN0cmluZyA9ICdodHRwczovL3d3dy5mbW9kZS5jbi9pbWFnZXMvbG9nb19tYWluLnBuZyc7XG4gIC8vIOWFrOWPuOW4kOWPt+Wll+aAu+WQjuWPsOeZu+W9lVxuICBjb21wYW55OlBhcnNlLk9iamVjdFxuICBjb21wYW55SWQ6c3RyaW5nXG4gIC8vIOeuoeeQhuerr+WumuWItkFQUOWQjuWPsOeZu+W9lVxuICBhcHA6UGFyc2UuT2JqZWN0XG4gIGFwcElkOnN0cmluZ1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYXV0aFNlcnY6IEF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgbm92YUNsb3VkOiBOb3ZhQ2xvdWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgbWVzc2FnZTogTnpNZXNzYWdlU2VydmljZSxcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTpBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnRcbiAgKSB7XG4gICAgdGhpcy5pbml0TG9naW5Gb3JtKClcblxuICAgIHRoaXMucm91dGUucGFyYW1NYXAuc3Vic2NyaWJlKGFzeW5jIHBhcmFtcz0+e1xuICAgICAgY29uc29sZS5sb2cocGFyYW1zKVxuICBcbiAgICAgIHRoaXMuYXBwSWQgPSBwYXJhbXMuZ2V0KFwiYXBwSWRcIik7XG4gICAgICBpZighYXdhaXQgdGhpcy5pbml0QXBwQ29uZmlnKCkpe1xuICAgICAgICB0aGlzLmNvbXBhbnlJZCA9IHBhcmFtcy5nZXQoXCJjb21wYW55SWRcIik7XG4gICAgICAgIGlmKCF0aGlzLmNvbXBhbnlJZCl7XG4gICAgICAgICAgdGhpcy5jb21wYW55SWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNvbXBhbnlcIikgfHwgXCJRMERyeU5ZQThnXCJcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXRDb21wYW55Q29uZmlnKClcbiAgXG4gICAgICB9XG4gICAgfSlcblxuICB9XG4gIGFzeW5jIGluaXRDb21wYW55Q29uZmlnKCl7XG4gICAgaWYoIXRoaXMuY29tcGFueUlkKSByZXR1cm5cbiAgICBsZXQgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJDb21wYW55XCIpXG4gICAgdGhpcy5jb21wYW55ID0gYXdhaXQgcXVlcnkuZ2V0KHRoaXMuY29tcGFueUlkKTtcbiAgICAvLyDorr7nva7pobXpnaJcbiAgICB0aGlzLmxvZ28gPSB0aGlzLmNvbXBhbnk/LmdldChcImxvZ29cIikgfHwgdGhpcy5sb2dvO1xuICAgIHRoaXMucXJjb2RlID0gdGhpcy5jb21wYW55Py5nZXQoXCJxcmNvZGVcIikgfHwgdGhpcy5xcmNvZGU7XG4gICAgdGhpcy5tb2JpbGVMb2dpbiA9IHRoaXMuY29tcGFueT8uZ2V0KCdqcHVzaCcpPy5hcHBrZXkgfHwgZmFsc2VcbiAgICB0aGlzLnJvb3RQYWdlID0gdGhpcy5jb21wYW55Py5nZXQoJ3Jvb3RQYWdlJylcbiAgfVxuXG4gIGFzeW5jIGluaXRBcHBDb25maWcoKXtcbiAgICBpZighdGhpcy5hcHBJZCkgcmV0dXJuIGZhbHNlXG4gICAgbGV0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiQXBwXCIpO1xuICAgIHF1ZXJ5LmluY2x1ZGUoXCJjb21wYW55XCIpO1xuICAgIHRoaXMuYXBwID0gYXdhaXQgcXVlcnkuZ2V0KHRoaXMuYXBwSWQpO1xuICAgIC8vIOiuvue9rumhtemdolxuICAgIGNvbnNvbGUubG9nKHRoaXMuYXBwKVxuICAgIHRoaXMubG9nbyA9IHRoaXMuYXBwPy5nZXQoXCJsb2dvXCIpIHx8IHRoaXMubG9nbztcbiAgICB0aGlzLnFyY29kZSA9IHRoaXMuYXBwPy5nZXQoXCJxcmNvZGVcIikgfHwgdGhpcy5xcmNvZGU7XG4gICAgdGhpcy5tb2JpbGVMb2dpbiA9IHRoaXMuYXBwPy5nZXQoJ2pwdXNoJyk/LmFwcGtleSB8fCBmYWxzZVxuICAgIHRoaXMuY29tcGFueUlkID0gdGhpcy5hcHA/LmdldChcImNvbXBhbnlcIikuaWQ7XG4gICAgdGhpcy5yb290UGFnZSA9IHRoaXMuYXBwPy5nZXQoJ3Jvb3RQYWdlJylcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGluaXRMb2dpbkZvcm0oKXtcblxuICAgIHRoaXMudmFsaWRhdGVGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAvLyDliqDlhaXpqozor4HnmoTooajljZXpobkg77yaIOWIneWni+WAvOOAgSDmmK/lkKbpqozor4Eg6LCD55So55qE6aqM6K+B5pa55rOVXG4gICAgICBtb2JpbGU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnVzZXJOYW1lQXN5bmNWYWxpZGF0b3JdXSxcbiAgICAgIHBhc3N3b3JkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5wYXNzd29yZEFzeW5jVmFsaWRhdG9yXV0sXG4gICAgICAvLyBpbml0Q29kZTogW3RoaXMuY29kZSBdLFxuICAgICAgY2hlY2tDb2RlOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5jb2RlQXN5bmNWYWxpZGF0b3JdXVxuICAgIH0pO1xuXG5cbiAgICB0aGlzLnZhbGlkYXRlVXNlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8vIOWKoOWFpemqjOivgeeahOihqOWNlemhuSDvvJog5Yid5aeL5YC844CBIOaYr+WQpumqjOivgSDosIPnlKjnmoTpqozor4Hmlrnms5VcbiAgICAgIHVzZXJuYW1lOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbXV0sXG4gICAgICBwYXNzd29yZDogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMucGFzc3dvcmRBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgLy8gaW5pdENvZGU6IFt0aGlzLmNvZGUgXSxcbiAgICAgIGNoZWNrQ29kZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMuY29kZUFzeW5jVmFsaWRhdG9yXV1cbiAgICB9KVxuXG4gICAgdGhpcy52YWxpZGF0ZVNNU0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8vIOWKoOWFpemqjOivgeeahOihqOWNlemhuSDvvJog5Yid5aeL5YC844CBIOaYr+WQpumqjOivgSDosIPnlKjnmoTpqozor4Hmlrnms5VcbiAgICAgIG1vYmlsZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMudXNlck5hbWVBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgcGFzc3dvcmQ6IFtcIlwiXSxcbiAgICAgIHNtc0NvZGU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnNtc0FzeW5jVmFsaWRhdG9yXV0sXG4gICAgICAvLyBpbml0Q29kZTogW3RoaXMuY29kZSBdLFxuICAgICAgY2hlY2tDb2RlOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5jb2RlQXN5bmNWYWxpZGF0b3JdXVxuICAgIH0pO1xuXG5cbiAgICB0aGlzLnJlZ2lzdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8vIOWKoOWFpemqjOivgeeahOihqOWNlemhuSDvvJog5Yid5aeL5YC844CBIOaYr+WQpumqjOivgSDosIPnlKjnmoTpqozor4Hmlrnms5VcbiAgICAgIHJlZ2lzdE5hbWU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnJlZ2lzdE5hbWVBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgcmVnaXN0SWRjYXJkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5yZWdpc3RJZGNhcmRBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgcmVnaXN0UGhvbmU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnJlZ2lzdFBob25lQXN5bmNWYWxpZGF0b3JdXSxcbiAgICAgIHBob25lQ29kZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMucmVnaXN0Q29kZUFzeW5jVmFsaWRhdG9yXV0sXG4gICAgICByZWdwYXNzd29yZDogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMucmVncGFzc3dvcmRBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgY29uZmlybVBhc3N3b3JkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5jb25maXJtUGFzc3dvcmRBc3luY1ZhbGlkYXRvcl1dXG4gICAgfSk7XG4gICAgdGhpcy5mb3JnZXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG5cbiAgICAgIGZvcmdldHVzZXJuYW1lOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5mb3JnZXROYW1lQXN5bmNWYWxpZGF0b3JdXSxcbiAgICAgIGZvcmdldFBhc3N3b3JkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5mb3JnZXRQYXNzd29yZEFzeW5jVmFsaWRhdG9yXV0sXG4gICAgICBmb3JnZXRDb25maXJtcGFzc3dvcmQ6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLmZvcmdldENvbmZpcm1QYXNzd29yZEFzeW5jVmFsaWRhdG9yXV0sXG4gICAgICBmb3JnZXJwaG9uZUNvZGU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnJlZ2lzdENvZGVBc3luY1ZhbGlkYXRvcl1dLFxuICAgIH0pXG4gIH1cblxuICAvLyDnmbvlvZUg55So5oi35ZCN77yI5omL5py65Y+356CB77yJ6aqM6K+BXG4gIHVzZXJOYW1lQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIGxldCByZWcgPSAvXjFbMzQ1Njc4OV1cXGR7OX0kLztcbiAgICAgIC8vIGxldCByZWcyID0gL15cXGR7MTd9KFxcZHxYfHgpJC87XG4gICAgICBsZXQgdXNlcm5hbWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh1c2VybmFtZSA9PSB1bmRlZmluZWQgfHwgdXNlcm5hbWUudHJpbSgpID09IFwiXCIpIHtcbiAgICAgICAgICB0aGlzLnVzZXJFcnJvclRpcCA9IFwi6K+36L6T5YWl55m75b2V6LSm5Y+3XCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdXNlcm5hbWUubWF0Y2gocmVnKSkge1xuICAgICAgICAgIHRoaXMudXNlckVycm9yVGlwID0gXCLor7fovpPlhaXmraPnoa7nmoTnmbvlvZXotKblj7dcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYodXNlcm5hbWUubGVuZ3RoID4gMTEpe1xuICAgICAgICAvLyAgIGlmICghdXNlcm5hbWUubWF0Y2gocmVnMikgKSB7XG4gICAgICAgIC8vICAgICB0aGlzLnVzZXJFcnJvclRpcCA9IFwi6K+36L6T5YWl5q2j56Gu55qE55m75b2V6LSm5Y+3XCI7XG4gICAgICAgIC8vICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgIC8vICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfWVsc2Uge1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuICAgIC8vIOeZu+W9lSDnn63kv6Hpqozor4HnoIHpqozor4FcbiAgICBzbXNBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOkZvcm1Db250cm9sKT0+IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IHNtc0NvZGUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAoc21zQ29kZSA9PSB1bmRlZmluZWQgfHwgc21zQ29kZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMuc21zQ29kZUVycm9yVGlwID0gXCLor7fovpPlhaXnn63kv6Hpqozor4HnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuICAvLyDnmbvlvZUg5a+G56CB6aqM6K+BXG4gIHBhc3N3b3JkQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgcGFzc3dvcmQgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAocGFzc3dvcmQgPT0gdW5kZWZpbmVkIHx8IHBhc3N3b3JkLnRyaW0oKSA9PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5wYXNzd29yZEVycm9yVGlwID0gXCLor7fovpPlhaXlr4bnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc3dvcmQubGVuZ3RoIDwgNikge1xuICAgICAgICAgIHRoaXMucGFzc3dvcmRFcnJvclRpcCA9IFwi5a+G56CB6ZW/5bqm5LiN5b6X5bCP5LqONuS9jVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSk7XG5cbiAgY29kZUFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGNoZWNrQ29kZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmIChjaGVja0NvZGUgPT0gdW5kZWZpbmVkIHx8IGNoZWNrQ29kZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMuY29kZVZlcmlmaWVkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLmNvZGVFcnJvclRpcCA9IFwi6K+36L6T5YWl6aqM6K+B56CBXCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0NvZGUubGVuZ3RoIDwgNCkge1xuICAgICAgICAgIHRoaXMuY29kZVZlcmlmaWVkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLmNvZGVFcnJvclRpcCA9IFwi6aqM6K+B56CB6ZW/5bqm5LiN5b6X5bCP5LqONOS9jVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYyA9IHRoaXMuY29kZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxldCB2YyA9IGNoZWNrQ29kZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGlmKGMhPXZjKXtcbiAgICAgICAgICB0aGlzLmNvZGVWZXJpZmllZCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5jb2RlRXJyb3JUaXAgPSBcIumqjOivgeeggei+k+WFpemUmeivr1wiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29kZVZlcmlmaWVkID0gdHJ1ZVxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSk7XG4gIGNvbmZpcm1QYXNzd29yZEVycm9yVGlwOiBhbnk7XG4gIHJlZ3Bhc3N3b3JkRXJyb3JUaXA6IGFueTtcbiAgcGhvbmVDb2Rlc0Vycm9yVGlwOiBhbnlcbiAgLy8g5rOo5YaMIOi6q+S7veivgeWPt+eggemqjOivgVxuICByZWdpc3RJZGNhcmRBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT5cbiAgICBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xuICAgICAgbGV0IHJlZ2lzdElkY2FyZCA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAocmVnaXN0SWRjYXJkID09IHVuZGVmaW5lZCB8fCByZWdpc3RJZGNhcmQudHJpbSgpID09IFwiXCIpIHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdElkY2FyZEVycm9yVGlwID0gXCLor7fovpPlhaXmraPnoa7nmoTouqvku73or4Hlj7fnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9eXFxkezE3fShcXGR8WHx4KSQvLnRlc3QocmVnaXN0SWRjYXJkKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdElkY2FyZEVycm9yVGlwID0gXCLor7fovpPlhaXmraPnoa7nmoTouqvku73or4Hlj7fnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSk7XG4gIC8vIOW/mOiusOWvhueggSDpqozor4FcbiAgZm9yZ2V0TmFtZUFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGZvcmdldE5hbWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAoZm9yZ2V0TmFtZSA9PSB1bmRlZmluZWQgfHwgZm9yZ2V0TmFtZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMucmVnaXN0TmFtZUVycm9yVGlwID0gXCLor7fovpPlhaXotKbmiLfotKblj7fmiJbogIXmiYvmnLrlj7dcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JnZXR1c2VybmFtZSA9IGZvcmdldE5hbWU7XG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcblxuICBmb3JnZXRQYXNzd29yZEFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGZvcmdldFBhc3N3b3JkID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgaWYgKGZvcmdldFBhc3N3b3JkID09IHVuZGVmaW5lZCB8fCBmb3JnZXRQYXNzd29yZC50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMucGFzc3dvcmRFcnJvclRpcCA9IFwi6K+36L6T5YWl5paw5a+G56CBXCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JnZXRQYXNzd29yZC5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgdGhpcy5wYXNzd29yZEVycm9yVGlwID0gXCLlr4bnoIHplb/luqbkuI3lvpflsI/kuo425L2NXCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9yZ2V0UGFzc3dvcmQgPSBmb3JnZXRQYXNzd29yZDtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuXG4gIGZvcmdldENvbmZpcm1QYXNzd29yZEFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGZvcmdldENvbmZpcm1wYXNzd29yZCA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmIChmb3JnZXRDb25maXJtcGFzc3dvcmQgPT0gdW5kZWZpbmVkIHx8IGZvcmdldENvbmZpcm1wYXNzd29yZC50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMuZm9yZ2V0cGhvbmVDb2Rlc0Vycm9yVGlwID0gXCLor7fnoa7orqTmlrDlr4bnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcmdldENvbmZpcm1wYXNzd29yZC5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgdGhpcy5mb3JnZXRwaG9uZUNvZGVzRXJyb3JUaXAgPSBcIuWvhueggemVv+W6puS4jeW+l+Wwj+S6jjbkvY1cIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JnZXRDb25maXJtcGFzc3dvcmQgPSBmb3JnZXRDb25maXJtcGFzc3dvcmQ7XG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcblxuICBmb3JnZXRDb2RlQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgZm9yZ2VycGhvbmVDb2RlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgaWYgKGZvcmdlcnBob25lQ29kZSA9PSB1bmRlZmluZWQgfHwgZm9yZ2VycGhvbmVDb2RlLnRyaW0oKSA9PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5waG9uZUNvZGVzRXJyb3JUaXAgPSBcIuivt+i+k+WFpeaWsOWvhueggVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcmdlcnBob25lQ29kZSA9IGZvcmdlcnBob25lQ29kZTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuXG5cblxuXG4gIC8vIOazqOWGjCDlp5PlkI3pqozor4FcbiAgcmVnaXN0TmFtZUFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IHJlZ2lzdE5hbWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAocmVnaXN0TmFtZSA9PSB1bmRlZmluZWQgfHwgcmVnaXN0TmFtZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMucmVnaXN0TmFtZUVycm9yVGlwID0gXCLor7fovpPlhaXlp5PlkI1cIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3ROYW1lID0gcmVnaXN0TmFtZTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuXG5cbiAgLy8g5rOo5YaM5omL5py65Y+36aqM6K+BXG4gIHJlZ2lzdFBob25lQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIGxldCByZWdpc3RQaG9uZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHJlZ2lzdFBob25lID09IHVuZGVmaW5lZCB8fCByZWdpc3RQaG9uZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMucmVnaXN0SWRjYXJkRXJyb3JUaXAgPSBcIuivt+i+k+WFpeato+ehrueahOi6q+S7veivgeWPt+eggVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgvXjFbMzQ1Njc4OV1cXGR7OX0kLy50ZXN0KHJlZ2lzdFBob25lKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLnBob25lRXJyb3JUaXAgPSBcIuivt+i+k+WFpeato+ehrueahOaJi+acuuWPt1wiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcblxuXG4gIHJlZ2lzdENvZGVBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT5cbiAgICBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxldCByZWdpc3RDb2RlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgaWYgKHJlZ2lzdENvZGUgPT0gdW5kZWZpbmVkIHx8IHJlZ2lzdENvZGUudHJpbSgpID09IFwiXCIpIHtcbiAgICAgICAgICB0aGlzLnBob25lQ29kZXNFcnJvclRpcCA9IFwi6K+36L6T5YWl6aqM6K+B56CBXCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcbiAgLy8g5rOo5YaM5a+G56CB6aqM6K+BXG4gIHJlZ3Bhc3N3b3JkQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgcmVncGFzc3dvcmQgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAocmVncGFzc3dvcmQgPT0gdW5kZWZpbmVkIHx8IHJlZ3Bhc3N3b3JkLnRyaW0oKSA9PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5yZWdwYXNzd29yZEVycm9yVGlwID0gXCLor7fovpPlhaXlr4bnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZ3Bhc3N3b3JkLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgICB0aGlzLnJlZ3Bhc3N3b3JkRXJyb3JUaXAgPSBcIuWvhueggemVv+W6puS4jeW+l+Wwj+S6jjbkvY1cIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZ3Bhc3N3b3JkLmxlbmd0aCA+IDEyKSB7XG4gICAgICAgICAgdGhpcy5yZWdwYXNzd29yZEVycm9yVGlwID0gXCLlr4bnoIHplb/luqbkuI3lvpflpKfkuo4xMuS9jVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZ3Bhc3N3b3JkID0gcmVncGFzc3dvcmRcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuICAvLyDms6jlhowg56Gu6K6k5a+G56CB6aqM6K+BXG4gIGNvbmZpcm1QYXNzd29yZEFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGNvbmZpcm1QYXNzd29yZCA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmIChjb25maXJtUGFzc3dvcmQgPT0gdW5kZWZpbmVkIHx8IGNvbmZpcm1QYXNzd29yZC50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMuY29uZmlybVBhc3N3b3JkRXJyb3JUaXAgPSBcIuivt+ehruiupOWvhueggVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlybVBhc3N3b3JkICE9IHRoaXMucmVncGFzc3dvcmQpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpcm1QYXNzd29yZEVycm9yVGlwID0gXCLkuKTmrKHovpPlhaXlr4bnoIHkuI3kuIDoh7TvvIzor7fph43mlrDovpPlhaVcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maXJtUGFzc3dvcmQgPSBjb25maXJtUGFzc3dvcmQ7XG5cbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuXG4gIGNvZGU6IGFueSA9ICcnXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIFxuICAgIC8vIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjb21wYW55JylcbiAgICAvLyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncGlkJylcbiAgICAvLyBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnBhcmFtTWFwLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgaWYgKHBhcmFtcy5nZXQoJ3AnKSkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGlkJywgcGFyYW1zLmdldCgncCcpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NvbXBhbnknLCB0aGlzLmNvbXBhbnlJZClcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuY3JlYXRDb2RlKCk7XG4gIH1cbiAgY3JlYXRDb2RlKCkge1xuICAgIHRoaXMuY29kZSA9ICcnXG4gICAgbGV0IGNvZGVMZW5ndGggPSA0OyAgLy/pqozor4HnoIHnmoTplb/luqZcbiAgICBsZXQgY29kZUNoYXJzID0gW1xuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAyLFxuICAgICAgMyxcbiAgICAgIDQsXG4gICAgICA1LFxuICAgICAgNixcbiAgICAgIDcsXG4gICAgICA4LFxuICAgICAgOSxcbiAgICAgIFwiYVwiLFxuICAgICAgXCJiXCIsXG4gICAgICBcImNcIixcbiAgICAgIFwiZFwiLFxuICAgICAgXCJlXCIsXG4gICAgICBcImZcIixcbiAgICAgIFwiZ1wiLFxuICAgICAgXCJoXCIsXG4gICAgICBcImlcIixcbiAgICAgIFwialwiLFxuICAgICAgXCJrXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibVwiLFxuICAgICAgXCJuXCIsXG4gICAgICBcIm9cIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJxXCIsXG4gICAgICBcInJcIixcbiAgICAgIFwic1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInVcIixcbiAgICAgIFwidlwiLFxuICAgICAgXCJ3XCIsXG4gICAgICBcInhcIixcbiAgICAgIFwieVwiLFxuICAgICAgXCJ6XCIsXG4gICAgICBcIkFcIixcbiAgICAgIFwiQlwiLFxuICAgICAgXCJDXCIsXG4gICAgICBcIkRcIixcbiAgICAgIFwiRVwiLFxuICAgICAgXCJGXCIsXG4gICAgICBcIkdcIixcbiAgICAgIFwiSFwiLFxuICAgICAgXCJJXCIsXG4gICAgICBcIkpcIixcbiAgICAgIFwiS1wiLFxuICAgICAgXCJMXCIsXG4gICAgICBcIk1cIixcbiAgICAgIFwiTlwiLFxuICAgICAgXCJPXCIsXG4gICAgICBcIlBcIixcbiAgICAgIFwiUVwiLFxuICAgICAgXCJSXCIsXG4gICAgICBcIlNcIixcbiAgICAgIFwiVFwiLFxuICAgICAgXCJVXCIsXG4gICAgICBcIlZcIixcbiAgICAgIFwiV1wiLFxuICAgICAgXCJYXCIsXG4gICAgICBcIllcIixcbiAgICAgIFwiWlwiXG4gICAgXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVMZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNoYXJOdW0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1MilcbiAgICAgIHRoaXMuY29kZSArPSBjb2RlQ2hhcnNbY2hhck51bV07XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJzdHVkZW50LWxvZ2luLWxheW91dFwiPlxuICA8ZGl2IGNsYXNzPVwibmF2X2NlbnRlclwiPlxuICAgIDxpbWcgW3NyY109XCJsb2dvXCIgYWx0PVwiXCIgY2xhc3M9XCJsb2dpbl9pbWdcIj5cbiAgICA8ZGl2IGNsYXNzPVwibmF2X2xvZ2luXCI+XG4gICAgICA8bnotdGFic2V0IFtuelNlbGVjdGVkSW5kZXhdPVwidGFiSW5kZXhcIiBbbnpUYWJQb3NpdGlvbl09XCIndG9wJ1wiPlxuXG4gICAgICAgIDwhLS0g55m75b2V77ya5omL5py65Y+3K+WvhueggeeZu+WFpSAtLT5cbiAgICAgICAgPG56LXRhYiBuelRpdGxlPVwi5omL5py65a+G56CBXCIgc3R5bGU9XCJjb2xvcjogIzAwMDAwMDtcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PSAnbG9naW4nXCI+XG4gICAgICAgICAgICA8Zm9ybSBuei1mb3JtIFtmb3JtR3JvdXBdPVwidmFsaWRhdGVGb3JtXCIgKG5nU3VibWl0KT1cInN1Ym1pdEZvcm1Nb2JpbGVQYXNzd29yZCh2YWxpZGF0ZUZvcm0udmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7miYvmnLrlj7c8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7dXNlckVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJtb2JpbGVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeaJi+acuuWPt1wiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+5a+GIOeggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3twYXNzd29yZEVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiAgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICdleWUtaW52aXNpYmxlJyA6ICdleWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlID0gIXBhc3N3b3JkVmlzaWJsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtIGNsYXNzPVwiZm9ybS1jb250cm9sLWNvbnRhaW5cIj5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBjbGFzcz1cImNvbnRhaW5feWFuem1cIiBuelJlcXVpcmVkID7pqozor4HnoIEgPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgbnpFcnJvclRpcD1cInt7Y29kZUVycm9yVGlwfX1cIiBjbGFzcz1cImNvbnRhaW5faW5wdXRfeWFuem1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCIgdGl0bGU9XCLor7fovpPlhaXpqozor4HnoIFcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5Yy65YiG5aSn5bCP5YaZXCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwiY29kZVRleHRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIgaGVpZ2h0OiAxMDAlOyBtYXJnaW46IDAgNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxldHRlci1zcGFjaW5nOiAycHg7XCI+e3tjb2RlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwic3dpdGNoXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjcmVhdENvZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgIOaNouS4gOS4qlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9naW5fYnRuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiIFtkaXNhYmxlZF09XCIhdmFsaWRhdGVGb3JtLnZhbGlkXCI+55m75b2VPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9yZ2V0XCI+XG4gICAgICAgICAgICAgICAgPGg2IChjbGljayk9XCJmb3JnZXQoKVwiPuW/mOiusOWvhueggTwvaDY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09ICdmb3JnZXQnXCI+XG4gICAgICAgICAgICA8Zm9ybSBuei1mb3JtIFtmb3JtR3JvdXBdPVwiZm9yZ2V0Rm9ybVwiIChuZ1N1Ym1pdCk9XCJmb3JnZXRGb3JtRnVuKGZvcmdldEZvcm0udmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7nmbvlvZXotKblj7c8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7dXNlckVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXR1c2VybmFtZVwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5omL5py65Y+3XCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7mlrAg5a+GIOeggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3twYXNzd29yZEVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXRQYXNzd29yZFwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5a+G56CBXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvbnotaW5wdXQtZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3N1ZmZpeFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXNzd29yZFZpc2libGUgPSAhcGFzc3dvcmRWaXNpYmxlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG5cbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBuelJlcXVpcmVkPuehruiupOWvhueggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3tmb3JnZXRwaG9uZUNvZGVzRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgICAgPG56LWlucHV0LWdyb3VwIFtuelN1ZmZpeF09XCJzdWZmaXhUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgW3R5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiICBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXRDb25maXJtcGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIuivt+WGjeasoei+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICdleWUtaW52aXNpYmxlJyA6ICdleWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlID0gIXBhc3N3b3JkVmlzaWJsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0gY2xhc3M9XCJmb3JnZXRfY29udGFpblwiPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQgPumqjCDor4Eg56CBPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI4XCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3twaG9uZUNvZGVzRXJyb3JUaXB9fVwiIGNsYXNzPVwiY29kZUlucHV0XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJmb250LXNpemU6IDE4cHg7XCIgbnotaW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXJwaG9uZUNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuaJi+acuumqjOivgeeggVwiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjZcIiBjbGFzcz1cImdldENvZGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb3VudERvd25cIiAoY2xpY2spPVwiZ2V0Q29kZTIoKVwiICBjbGFzcz1cImdldF9jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiM0MGE5ZmY7Y3Vyc29yOiBwb2ludGVyOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMThweDtcIj5cbiAgICAgICAgICAgICAgICAgICAg6I635Y+W6aqM6K+B56CBXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvdW50RG93blwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMThweDtcIj5cbiAgICAgICAgICAgICAgICAgICAge3tjb3VudERvd259fS/np5JcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ2luX2J0blwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gc3R5bGU9XCJ3aWR0aDogMzQ4cHg7XCIgbnotYnV0dG9uIG56VHlwZT1cInByaW1hcnlcIiBbbnpTaXplXT1cIidsYXJnZSdcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmb3JnZXRGb3JtLnZhbGlkXCI+6YeN572u5a+G56CBPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9yZ2V0XCI+XG4gICAgICAgICAgICAgICAgPGg2IChjbGljayk9XCJiYWNrTG9naW4oKVwiPui/lOWbnueZu+W9lTwvaDY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvbnotdGFiPlxuXG4gICAgICAgIDwhLS0g55m75b2V77ya5biQ5Y+3K+WvhueggeeZu+WFpSAtLT5cbiAgICAgICAgPG56LXRhYiBuelRpdGxlPVwi5biQ5Y+35a+G56CBXCIgc3R5bGU9XCJjb2xvcjogIzAwMDAwMDtcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PSAnbG9naW4nXCI+XG4gICAgICAgICAgICA8Zm9ybSBuei1mb3JtIFtmb3JtR3JvdXBdPVwidmFsaWRhdGVVc2VyRm9ybVwiIChuZ1N1Ym1pdCk9XCJzdWJtaXRGb3JtVXNlclBhc3N3b3JkKHZhbGlkYXRlVXNlckZvcm0udmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7luJAg5Y+3PC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCIxNFwiIG56RXJyb3JUaXA9XCJ7e3VzZXJFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeW4kOWPt1wiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+5a+GIOeggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3twYXNzd29yZEVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiAgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICdleWUtaW52aXNpYmxlJyA6ICdleWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlID0gIXBhc3N3b3JkVmlzaWJsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtIGNsYXNzPVwiZm9ybS1jb250cm9sLWNvbnRhaW5cIj5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBjbGFzcz1cImNvbnRhaW5feWFuem1cIiBuelJlcXVpcmVkID7pqozor4HnoIEgPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgbnpFcnJvclRpcD1cInt7Y29kZUVycm9yVGlwfX1cIiBjbGFzcz1cImNvbnRhaW5faW5wdXRfeWFuem1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCIgdGl0bGU9XCLor7fovpPlhaXpqozor4HnoIFcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5Yy65YiG5aSn5bCP5YaZXCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwiY29kZVRleHRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIgaGVpZ2h0OiAxMDAlOyBtYXJnaW46IDAgNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxldHRlci1zcGFjaW5nOiAycHg7XCI+e3tjb2RlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwic3dpdGNoXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjcmVhdENvZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgIOaNouS4gOS4qlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9naW5fYnRuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiIFtkaXNhYmxlZF09XCIhdmFsaWRhdGVVc2VyRm9ybS52YWxpZFwiPueZu+W9lTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PSAnZm9yZ2V0J1wiPlxuICAgICAgICAgICAgPGZvcm0gbnotZm9ybSBbZm9ybUdyb3VwXT1cImZvcmdldEZvcm1cIiAobmdTdWJtaXQpPVwiZm9yZ2V0Rm9ybUZ1bihmb3JnZXRGb3JtLnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+55m75b2V6LSm5Y+3PC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCIxNFwiIG56RXJyb3JUaXA9XCJ7e3VzZXJFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2V0dXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeaJi+acuuWPt1wiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+5pawIOWvhiDnoIE8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7cGFzc3dvcmRFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCJwYXNzd29yZFZpc2libGUgPyAndGV4dCcgOiAncGFzc3dvcmQnXCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2V0UGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICdleWUtaW52aXNpYmxlJyA6ICdleWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlID0gIXBhc3N3b3JkVmlzaWJsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7noa7orqTlr4bnoIE8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7Zm9yZ2V0cGhvbmVDb2Rlc0Vycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiAgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2V0Q29uZmlybXBhc3N3b3JkXCIgcGxhY2Vob2xkZXI9XCLor7flho3mrKHovpPlhaXlr4bnoIFcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VmZml4VGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gW256VHlwZV09XCJwYXNzd29yZFZpc2libGUgPyAnZXllLWludmlzaWJsZScgOiAnZXllJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhc3N3b3JkVmlzaWJsZSA9ICFwYXNzd29yZFZpc2libGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cblxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtIGNsYXNzPVwiZm9yZ2V0X2NvbnRhaW5cIj5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBuelJlcXVpcmVkID7pqowg6K+BIOeggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiOFwiIG56SGFzRmVlZGJhY2sgbnpFcnJvclRpcD1cInt7cGhvbmVDb2Rlc0Vycm9yVGlwfX1cIiBjbGFzcz1cImNvZGVJbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiZm9udC1zaXplOiAxOHB4O1wiIG56LWlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2VycGhvbmVDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLmiYvmnLrpqozor4HnoIFcIiAvPlxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgY2xhc3M9XCJnZXRDb2RlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQ291bnREb3duXCIgKGNsaWNrKT1cImdldENvZGUyKClcIiAgY2xhc3M9XCJnZXRfY29kZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmO2N1cnNvcjogcG9pbnRlcjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE4cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIOiOt+WPlumqjOivgeeggVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb3VudERvd25cIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IzQwYTlmZjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE4cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7Y291bnREb3dufX0v56eSXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dpbl9idG5cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHN0eWxlPVwid2lkdGg6IDM0OHB4O1wiIG56LWJ1dHRvbiBuelR5cGU9XCJwcmltYXJ5XCIgW256U2l6ZV09XCInbGFyZ2UnXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZm9yZ2V0Rm9ybS52YWxpZFwiPumHjee9ruWvhueggTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcmdldFwiPlxuICAgICAgICAgICAgICAgIDxoNiAoY2xpY2spPVwiYmFja0xvZ2luKClcIj7ov5Tlm57nmbvlvZU8L2g2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8L256LXRhYj5cbiAgICAgICAgPCEtLSDnmbvlvZXvvJrmiYvmnLrlj7cr6aqM6K+B56CB55m75YWlIC0tPlxuICAgICAgICA8bnotdGFiIG56VGl0bGU9XCLnn63kv6Hpqozor4FcIiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09ICdsb2dpbidcIj5cbiAgICAgICAgICAgIDxmb3JtIG56LWZvcm0gW2Zvcm1Hcm91cF09XCJ2YWxpZGF0ZVNNU0Zvcm1cIiAobmdTdWJtaXQpPVwic3VibWl0Rm9ybU1vYmlsZVNNUyh2YWxpZGF0ZVNNU0Zvcm0udmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7miYsg5py6IOWPtzwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3t1c2VyRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IGZvcm1Db250cm9sTmFtZT1cIm1vYmlsZVwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5omL5py65Y+3XCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG5cbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbSBjbGFzcz1cImZvcm0tY29udHJvbC1jb250YWluXCI+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgY2xhc3M9XCJjb250YWluX3lhbnptXCIgbnpSZXF1aXJlZCA+6aqM6K+B56CBPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgbnpFcnJvclRpcD1cInt7Y29kZUVycm9yVGlwfX1cIiBjbGFzcz1cImNvbnRhaW5faW5wdXRfeWFuem1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCIgdGl0bGU9XCLor7fovpPlhaXpqozor4HnoIFcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5Yy65YiG5aSn5bCP5YaZXCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwiY29kZVRleHRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIgaGVpZ2h0OiAxMDAlOyBtYXJnaW46IDAgNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxldHRlci1zcGFjaW5nOiAycHg7XCI+e3tjb2RlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwic3dpdGNoXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjcmVhdENvZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgIOaNouS4gOS4qlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7nn63kv6HnoIE8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEwXCIgbnpFcnJvclRpcD1cInt7c21zQ29kZUVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cIid0ZXh0J1wiIFtkaXNhYmxlZF09XCIhaXNTZW5kZWQgfHwgIWNvZGVWZXJpZmllZFwiIGZvcm1Db250cm9sTmFtZT1cInNtc0NvZGVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeefreS/oemqjOivgeeggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI0XCIgY2xhc3M9XCJzd2l0Y2hcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNTZW5kaW5nXCIgKGNsaWNrKT1cInNlbmRTTVNDb2RlKClcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IzQwYTlmZjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgICAgICDojrflj5bpqozor4HnoIFcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzU2VuZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiNlZmY1Zjk7IGNvbG9yOiByZ2IoMTE4LCAxMTcsIDExNyk7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgICAgICB7e3Ntc1RpbWVDb3VudH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9naW5fYnRuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiIFtkaXNhYmxlZF09XCIhdmFsaWRhdGVTTVNGb3JtLnZhbGlkXCI+55m75b2VPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L256LXRhYj5cblxuICAgICAgICA8IS0tIOazqOWGjO+8muS8geS4mueUqOaIt1Byb2ZpbGXlvIDpgJogLS0+XG4gICAgICAgIDxuei10YWIgKm5nSWY9XCJtb2JpbGVMb2dpblwiIG56VGl0bGU9XCLlvIDpgJpcIiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwO1wiIGNsYXNzPVwiYWN0aXZhdGlvblwiPlxuICAgICAgICAgIDxmb3JtIG56LWZvcm0gW2Zvcm1Hcm91cF09XCJyZWdpc3RGb3JtXCIgKG5nU3VibWl0KT1cInJlZ2lzdFN1Ym1pdEZvcm0ocmVnaXN0Rm9ybS52YWx1ZSlcIj5cbiAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiN1wiIG56UmVxdWlyZWQ+5byA6YCa6K+B5Lu2PC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuekhhc0ZlZWRiYWNrIG56VmFsaWRhdGluZ1RpcD1cIumqjOivgeS4rS4uLlwiXG4gICAgICAgICAgICAgICAgbnpFcnJvclRpcD1cInt7cmVnaXN0SWRjYXJkRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0aXRsZT1cIuivt+i+k+WFpei6q+S7veivgeWPt+eggVwiIG56LWlucHV0IGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdElkY2FyZFwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl6Lqr5Lu96K+B5Y+356CBXCIgLz5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiN1wiIG56UmVxdWlyZWQ+5byA6YCa5aeT5ZCNPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuekhhc0ZlZWRiYWNrIG56RXJyb3JUaXA9XCJ7e3JlZ2lzdE5hbWVFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicmVnaXN0TmFtZVwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5aeT5ZCNXCIgLz5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiN1wiIG56UmVxdWlyZWQ+57uR5a6a5omL5py65Y+3PC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuekhhc0ZlZWRiYWNrIG56RXJyb3JUaXA9XCJ7e3Bob25lRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInJlZ2lzdFBob25lXCIgbnotaW5wdXQgIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4O1wiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdFBob25lXCIgcGxhY2Vob2xkZXI9XCLor7fovpPlhaXmiYvmnLrlj7dcIiAvPlxuICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgPG56LWZvcm0taXRlbSBjbGFzcz1cInZlcmlmeUNvZGVcIj5cbiAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI3XCIgbnpSZXF1aXJlZD7miYvmnLrpqozor4HnoIE8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgY2xhc3M9XCJjb2RlX2lucHV0XCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3twaG9uZUNvZGVzRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInBob25lQ29kZVwiIHBsYWNlaG9sZGVyPVwi5omL5py66aqM6K+B56CBXCIgLz5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgY2xhc3M9XCJjb2RlQ29udGFpblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb3VudERvd25cIiAoY2xpY2spPVwiZ2V0Q29kZSgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdldF9jb2RlXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiAjZmZmOyBwYWRkaW5nOiA1cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxOHB4O1wiPlxuICAgICAgICAgICAgICAgICAg6I636aqM6K+B56CBXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ291bnREb3duXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMThweDtcIj5cbiAgICAgICAgICAgICAgICAgIHt7Y291bnREb3dufX0v56eSXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjdcIiBuelJlcXVpcmVkPuW8gOmAmuWvhueggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEyXCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3tyZWdwYXNzd29yZEVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeFRlbXBsYXRlMlwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZTIgPyAndGV4dCcgOiAncGFzc3dvcmQnXCIgZm9ybUNvbnRyb2xOYW1lPVwicmVncGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3N1ZmZpeFRlbXBsYXRlMj5cbiAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gW256VHlwZV09XCJwYXNzd29yZFZpc2libGUyID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlMiA9ICFwYXNzd29yZFZpc2libGUyXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjdcIiBuelJlcXVpcmVkPuehruiupOWvhueggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEyXCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3tjb25maXJtUGFzc3dvcmRFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgPG56LWlucHV0LWdyb3VwIFtuelN1ZmZpeF09XCJzdWZmaXhUZW1wbGF0ZTNcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCJwYXNzd29yZFZpc2libGUzID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiIGZvcm1Db250cm9sTmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi6K+356Gu6K6k5a+G56CBXCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VmZml4VGVtcGxhdGUzPlxuICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZTMgPyAnZXllLWludmlzaWJsZScgOiAnZXllJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXNzd29yZFZpc2libGUzID0gIXBhc3N3b3JkVmlzaWJsZTNcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dpbl9idG5cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhcmVnaXN0Rm9ybS52YWxpZFwiPueUs+ivt+W8gOmAmjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L256LXRhYj5cbiAgICAgIDwvbnotdGFic2V0PlxuICAgICAgPGRpdiBjbGFzcz1cIm5hdl9sb2dpbl9yaWdodFwiPlxuICAgICAgICA8cCBjbGFzcz1cImxvZ2luX3JpZ2h0X3RpdGxlXCI+5LqM57u056CBPC9wPlxuICAgICAgICA8aW1nIFtzcmNdPVwicXJjb2RlXCIgYWx0PVwi5YWs5LyX5Y+35LqM57u056CBXCI+XG4gICAgICAgIDxwPuaJq+eggei/m+WFpeW+ruS/oeerrzwvcD5cbiAgICAgICAgPCEtLSA8cCBjbGFzcz1cImxvZ2luX3JpZ2h0X2JvdHRvbVwiPummluasoeeZu+W9leacieaDiuWWnDwvcD4gLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJsb2FkV3JhcFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogY2VudGVyO3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTtcIlxuICAgICAgKm5nSWY9XCJsb2FkaW5nMlwiPlxuICAgICAgPG56LXNwaW4gbnpUaXA9XCLliqDovb3kuK3vvIzor7fnqI3lkI4uLi5cIj5cbiAgICAgICAgPG56LWFsZXJ0IG56VHlwZT1cImluZm9cIiBuek1lc3NhZ2U9XCLor77nqIvliqDovb3kuK3vvIzor7fnqI3lkI4uLi5cIj48L256LWFsZXJ0PlxuICAgICAgPC9uei1zcGluPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSDms6jplIAgLS0+XG4gICAgPG56LW1vZGFsIFsobnpWaXNpYmxlKV09XCJpc1Zpc2libGVcIiBuelRpdGxlPVwi5omL5py65Y+36ZSZ6K+vXCIgKG56T25DYW5jZWwpPVwiaGFuZGxlQ2FuY2VsKClcIiAobnpPbk9rKT1cImhhbmRsZU9rKClcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm56TW9kYWxDb250ZW50PlxuICAgICAgICA8cD7miYvmnLrlj7fplJnor68sIOiBlOezu+euoeeQhuWRmOaguOWvueS/oeaBrzwvcD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbnotbW9kYWw+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/user/login/login.component.mjs
7
+ */
8
+ import{Component}from"@angular/core";import{FormBuilder,Validators}from"@angular/forms";import{Observable}from"rxjs";import{NzMessageService}from"ng-zorro-antd/message";import{AuthService}from"./auth.service";import Parse from"parse";import{Router,ActivatedRoute}from"@angular/router";import{HttpClient}from"@angular/common/http";import{NovaCloudService}from"../../nova-cloud/nova-cloud.service";import*as i0 from"@angular/core";import*as i1 from"./auth.service";import*as i2 from"../../nova-cloud/nova-cloud.service";import*as i3 from"@angular/forms";import*as i4 from"ng-zorro-antd/message";import*as i5 from"@angular/router";import*as i6 from"@angular/common/http";import*as i7 from"@angular/common";import*as i8 from"ng-zorro-antd/input";import*as i9 from"ng-zorro-antd/button";import*as i10 from"ng-zorro-antd/core/transition-patch";import*as i11 from"ng-zorro-antd/core/wave";import*as i12 from"ng-zorro-antd/modal";import*as i13 from"ng-zorro-antd/spin";import*as i14 from"ng-zorro-antd/tabs";import*as i15 from"ng-zorro-antd/grid";import*as i16 from"ng-zorro-antd/form";export class LoginComponent{drawCode(n){this.canvas=document.getElementById("verifyCanvas");var e=this.canvas.getContext("2d");e.fillStyle="white",e.fillRect(0,0,this.canvas.width,this.canvas.height),e.fillStyle="cornflowerblue",e.font="25px Arial";for(var o=new Array,t=new Array,r=new Array,i=0;i<4;i++)o.push(o[i]),o[i]=this.nums[i],t[i]=20*i+10,r[i]=20*Math.random()+20,e.fillText(o[i],t[i],r[i]);n=o.join("").toUpperCase();for(i=0;i<3;i++)this.drawline(this.canvas,e);for(i=0;i<30;i++)this.drawDot(this.canvas,e);return this.convertCanvasToImage(this.canvas),n}drawline(n,e){e.moveTo(Math.floor(Math.random()*n.width),Math.floor(Math.random()*n.height)),e.lineTo(Math.floor(Math.random()*n.width),Math.floor(Math.random()*n.height)),e.lineWidth=.5,e.strokeStyle="rgba(50,50,50,0.3)",e.stroke()}drawDot(n,e){var o=Math.floor(Math.random()*n.width),t=Math.floor(Math.random()*n.height);e.moveTo(o,t),e.lineTo(o+1,t+1),e.lineWidth=.2,e.stroke()}convertCanvasToImage(n){return document.getElementById("verifyCanvas").style.display="none",this.image=document.getElementById("code_img"),this.image.src=n.toDataURL("image/png"),this.image}sendSMSCode(){if(!this.codeVerified)return void this.message.create("error","请先核对验证码");let n=this.validateSMSForm.value?.mobile;if(console.log(this.validateSMSForm.value),n){let e=localStorage.getItem("NOVA_APIG_SERVER");e=decodeURIComponent(atob(e));let o=e+"message";this.http.post(o,{company:this.companyId,mobile:n,action:"login"}).subscribe((n=>{this.countDownSMS(),this.message.info("已发送,请查收验证码")}),(n=>{this.message.error(n?.error?.mess||"系统繁忙中,请稍后重试")}))}else this.message.error("请正确输入手机号")}countDownSMS(){this.isSended=!0,this.isSending=!0,this.smsTimeCount=60;let n=setInterval((()=>{this.smsTimeCount--}),1e3);setTimeout((()=>{clearInterval(n),this.isSending=!1}),6e4)}submitFormMobileSMS(n){for(const n in this.validateSMSForm.controls)this.validateSMSForm.controls[n].markAsDirty(),this.validateSMSForm.controls[n].updateValueAndValidity();console.log(n),this.username=n.mobile,this.smsCode=n.smsCode,console.log("smslogin"),this.loginSMS()}submitFormMobilePassword(n){for(const n in this.validateForm.controls)this.validateForm.controls[n].markAsDirty(),this.validateForm.controls[n].updateValueAndValidity();this.username=n.mobile||n.username,this.password=n.password;let e=n.checkCode,o=this.code.toLowerCase(),t=e.toLowerCase();console.log(o,t),o!=t?(console.log(o,t),this.message.create("error","验证码错误")):this.loginMobilePassword()}submitFormUserPassword(n){for(const n in this.validateForm.controls)this.validateForm.controls[n].markAsDirty(),this.validateForm.controls[n].updateValueAndValidity();this.username=n.mobile||n.username,this.password=n.password;let e=n.checkCode,o=this.code.toLowerCase(),t=e.toLowerCase();console.log(o,t),o!=t?(console.log(o,t),this.message.create("error","验证码错误")):this.authServ.login(this.username,this.password).then((async n=>{})).catch((n=>{console.log(n),this.message.create("error","错误的用户名或密码")}))}async forgetFormFun(n){for(const n in this.forgetForm.controls)this.forgetForm.controls[n].markAsDirty(),this.forgetForm.controls[n].updateValueAndValidity();if(console.log(n.forgetusername,n.forgetPassword,n.forgetConfirmpassword),n.forgetPassword!=n.forgetConfirmpassword)return void this.message.create("error","两次密码不一致");if(!n.forgerphoneCode)return void this.message.create("error","请输入验证码");let e=(Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/")+"api/auth/reset_password";this.http.post(e,{company:this.companyId,mobile:n.forgetusername,code:n.forgerphoneCode,password:n.forgetConfirmpassword}).subscribe((n=>{200==n.code?(this.message.create("success",n.msg),this.type="login"):this.message.create("error","验证码错误")}),(n=>{console.log(n.error),this.message.create("error",n.error.mess)}))}async registSubmitForm(n){for(const n in this.registForm.controls)this.registForm.controls[n].markAsDirty(),this.registForm.controls[n].updateValueAndValidity();this.registName=n.registName,this.registIdcard=n.registIdcard,this.registPhone=n.registPhone,this.phoneCode=n.phoneCode,this.regpassword=n.regpassword,this.confirmPassword=n.confirmPassword;let e=await this.verifyCode(this.registPhone,this.phoneCode);e&&200!=e.code?this.message.create("error",e.mess):this.queryUser()}getSelectEducation(){this.loginMobilePassword(),this.iseducation=!1}loginSMS(){let n=(Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/")+`api/auth/mobile?company=${this.companyId}&mobile=${this.username}&code=${this.smsCode}`;this.http.get(n).subscribe((n=>{if(console.log(n),200==n.code){this.message.create("success","登录成功");let e=n.data.token;Parse.User.become(e).then((n=>{this.router.navigate([decodeURIComponent(this.rootPage)])}))}else this.message.create("error","验证码错误")}),(n=>{console.log(n.error),this.message.create("error",n.error.mess)}))}async loginMobilePassword(){let n=await this.getMobileUser(this.username);n?this.authServ.login(n,this.password).then((async n=>{})).catch((n=>{console.log(n),this.message.create("error","错误的用户名或密码")})):this.message.create("error","用户不存在,请尝试其他登录方式")}async queryUser(){let n=new Parse.Query("_User");n.contains("username",this.registPhone),n.equalTo("company",this.companyId);let e=await n.first();e?.id?this.message.info("该账户已激活,使用手机号密码直接登录"):Parse.User.signUp(this.companyId+"-"+this.registPhone,this.regpassword,"").then((async n=>{n.id&&(console.log(n),n.set("company",{__type:"Pointer",className:"Company",objectId:this.companyId}),n.set("mobile",this.registPhone),n.set("type","user"),n.save(),this.username=this.registPhone,this.password=this.regpassword)}))}async getMobileUser(n){if(this.mobileUserMap[n])return this.mobileUserMap[n];let e=await this.novaCloud.api("/auth/getusername",{company:this.companyId,mobile:n});return console.log(e),e?.username&&(this.mobileUserMap[n]=e?.username),this.mobileUserMap[n]}forget(){this.type="forget"}backLogin(){this.type="login"}handleCancel(){this.isVisible=!1}handleOk(){Parse.User.signUp(this.registPhone,this.regpassword,"").then((async n=>{n.id&&(console.log(n),n.set("company",{__type:"Pointer",className:"Company",objectId:this.companyId}),n.save(),this.username=this.registPhone,this.password=this.regpassword)}))}async getCode(){if(null==this.registPhone||""==this.registPhone.trim())return void this.message.info("请输入注册手机号");if(!this.registPhone.match(/^1[3456789]\d{9}$/))return void this.message.info("请输入正确的手机号");let n=new Parse.Query("User");n.equalTo("username",this.registPhone),n.equalTo("company",this.companyId);let e=await n.first();if(e&&e.id)return void this.message.info("该手机号已注册,请使用账号密码登录");let o=localStorage.getItem("NOVA_APIG_SERVER");o=decodeURIComponent(atob(o));let t=o+"message";this.http.post(t,{company:this.companyId,mobile:this.registPhone,action:"regist"}).subscribe((n=>{this.vCode=n.data.code,this.countDownFun()}),(n=>{this.message.info("系统繁忙中,请稍后重试"),console.log(n)}))}async getCode2(){if(null==this.forgetusername||""==this.forgetusername.trim())return void this.message.info("请输入账号");if(!this.forgetusername.match(/^1[3456789]\d{9}$/))return void this.message.info("请输入正确的手机号");console.log(this.forgetusername);let n=new Parse.Query("User");if(n.equalTo("username",this.companyId+"-"+this.forgetusername),n.equalTo("company",this.companyId),!await n.first())return void this.message.info("账号不存在");let e=localStorage.getItem("NOVA_APIG_SERVER");e=decodeURIComponent(atob(e));let o=e+"message";this.http.post(o,{company:this.companyId,mobile:this.forgetusername,action:"resetPassword"}).subscribe((n=>{console.log(n),this.vCode=n.data.code,this.countDownFun()}),(n=>{this.message.info("系统繁忙中,请稍后重试"),console.log(n)}))}async verifyCode(n,e){let o=localStorage.getItem("NOVA_APIG_SERVER");o=decodeURIComponent(atob(o));let t=o+"verifyCode";return new Promise((async(o,r)=>{this.http.post(t,{mobile:n,code:e}).subscribe((n=>{o(n)}),(n=>{console.log(n),o(n.error)}))}))}countDownFun(){if(this.isCountDown=!0,0==this.countDown)return;let n=setInterval((()=>{this.countDown=this.countDown-1,0==this.countDown&&(clearInterval(n),this.countDown=60,this.isCountDown=!1)}),1e3)}constructor(n,e,o,t,r,i,a,s){this.authServ=n,this.novaCloud=e,this.fb=o,this.message=t,this.router=r,this.route=i,this.activatedRoute=a,this.http=s,this.nums=["C","6","Z","t"],this.str="",this.tabIndex=0,this.codeVerified=!1,this.passwordVisible=!1,this.passwordVisible2=!1,this.passwordVisible3=!1,this.iseducation=!1,this.redirectUrl=localStorage.getItem("redirectUrl"),this.isSended=!1,this.isSending=!1,this.smsTimeCount=60,this.loading=!0,this.Lesson=[],this.myDate=new Date,this.isVisible=!1,this.type="login",this.mobileUserMap={},this.isOkLoading=!1,this.countDown=60,this.isCountDown=!1,this.mobileLogin=!1,this.logo="https://www.fmode.cn/images/ewm1.png",this.qrcode="https://www.fmode.cn/images/logo_main.png",this.userNameAsyncValidator=n=>new Observable((e=>{let o=/^1[3456789]\d{9}$/,t=n.value;setTimeout((()=>null==t||""==t.trim()?(this.userErrorTip="请输入登录账号",e.next({error:!0,duplicated:!0}),void e.complete()):t.match(o)?(e.next(null),void e.complete()):(this.userErrorTip="请输入正确的登录账号",e.next({error:!0,duplicated:!0}),void e.complete())),1e3)})),this.smsAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.smsCodeErrorTip="请输入短信验证码",e.next({error:!0,duplicated:!0}),void e.complete();e.next(null),e.complete()}),1e3)})),this.passwordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.passwordErrorTip="请输入密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.passwordErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):(e.next(null),void e.complete())}),1e3)})),this.codeAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.codeVerified=!1,this.codeErrorTip="请输入验证码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<4?(this.codeVerified=!1,this.codeErrorTip="验证码长度不得小于4位",e.next({error:!0,duplicated:!0}),void e.complete()):this.code.toLowerCase()!=o.toLowerCase()?(this.codeVerified=!1,this.codeErrorTip="验证码输入错误",e.next({error:!0,duplicated:!0}),void e.complete()):(this.codeVerified=!0,e.next(null),void e.complete())}),1e3)})),this.registIdcardAsyncValidator=n=>new Observable((e=>{let o=n.value;setTimeout((()=>null==o||""==o.trim()||!1===/^\d{17}(\d|X|x)$/.test(o)?(this.registIdcardErrorTip="请输入正确的身份证号码",e.next({error:!0,duplicated:!0}),void e.complete()):(e.next(null),void e.complete())),1e3)})),this.forgetNameAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.registNameErrorTip="请输入账户账号或者手机号",e.next({error:!0,duplicated:!0}),void e.complete();this.forgetusername=o,e.next(null),e.complete()}),1e3)})),this.forgetPasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.passwordErrorTip="请输入新密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.passwordErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):(this.forgetPassword=o,e.next(null),void e.complete())}),1e3)})),this.forgetConfirmPasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.forgetphoneCodesErrorTip="请确认新密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.forgetphoneCodesErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):(this.forgetConfirmpassword=o,e.next(null),void e.complete())}),1e3)})),this.forgetCodeAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.phoneCodesErrorTip="请输入新密码",e.next({error:!0,duplicated:!0}),void e.complete();this.forgerphoneCode=o,e.next(null),e.complete()}),1e3)})),this.registNameAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.registNameErrorTip="请输入姓名",e.next({error:!0,duplicated:!0}),void e.complete();this.registName=o,e.next(null),e.complete()}),1e3)})),this.registPhoneAsyncValidator=n=>new Observable((e=>{let o=n.value;setTimeout((()=>null==o||""==o.trim()?(this.registIdcardErrorTip="请输入正确的身份证号码",e.next({error:!0,duplicated:!0}),void e.complete()):!1===/^1[3456789]\d{9}$/.test(o)?(this.phoneErrorTip="请输入正确的手机号",e.next({error:!0,duplicated:!0}),void e.complete()):(e.next(null),void e.complete())),1e3)})),this.registCodeAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.phoneCodesErrorTip="请输入验证码",e.next({error:!0,duplicated:!0}),void e.complete();e.next(null),e.complete()}),1e3)})),this.regpasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.regpasswordErrorTip="请输入密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.regpasswordErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):o.length>12?(this.regpasswordErrorTip="密码长度不得大于12位",e.next({error:!0,duplicated:!0}),void e.complete()):(this.regpassword=o,e.next(null),void e.complete())}),1e3)})),this.confirmPasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.confirmPasswordErrorTip="请确认密码",e.next({error:!0,duplicated:!0}),void e.complete()):o!=this.regpassword?(this.confirmPasswordErrorTip="两次输入密码不一致,请重新输入",e.next({error:!0,duplicated:!0}),void e.complete()):(this.confirmPassword=o,e.next(null),void e.complete())}),1e3)})),this.code="",this.initLoginForm(),this.route.paramMap.subscribe((async n=>{console.log(n),this.appId=n.get("appId"),await this.initAppConfig()||(this.companyId=n.get("companyId"),this.companyId||(this.companyId=localStorage.getItem("company")||"Q0DryNYA8g"),await this.initCompanyConfig())}))}async initCompanyConfig(){if(!this.companyId)return;let n=new Parse.Query("Company");this.company=await n.get(this.companyId),this.logo=this.company?.get("logo")||this.logo,this.qrcode=this.company?.get("qrcode")||this.qrcode,this.mobileLogin=this.company?.get("jpush")?.appkey||!1,this.rootPage=this.company?.get("rootPage")}async initAppConfig(){if(!this.appId)return!1;let n=new Parse.Query("App");return n.include("company"),this.app=await n.get(this.appId),console.log(this.app),this.logo=this.app?.get("logo")||this.logo,this.qrcode=this.app?.get("qrcode")||this.qrcode,this.mobileLogin=this.app?.get("jpush")?.appkey||!1,this.companyId=this.app?.get("company").id,this.rootPage=this.app?.get("rootPage"),!0}initLoginForm(){this.validateForm=this.fb.group({mobile:["",[Validators.required],[this.userNameAsyncValidator]],password:["",[Validators.required],[this.passwordAsyncValidator]],checkCode:["",[Validators.required],[this.codeAsyncValidator]]}),this.validateUserForm=this.fb.group({username:["",[Validators.required],[]],password:["",[Validators.required],[this.passwordAsyncValidator]],checkCode:["",[Validators.required],[this.codeAsyncValidator]]}),this.validateSMSForm=this.fb.group({mobile:["",[Validators.required],[this.userNameAsyncValidator]],password:[""],smsCode:["",[Validators.required],[this.smsAsyncValidator]],checkCode:["",[Validators.required],[this.codeAsyncValidator]]}),this.registForm=this.fb.group({registName:["",[Validators.required],[this.registNameAsyncValidator]],registIdcard:["",[Validators.required],[this.registIdcardAsyncValidator]],registPhone:["",[Validators.required],[this.registPhoneAsyncValidator]],phoneCode:["",[Validators.required],[this.registCodeAsyncValidator]],regpassword:["",[Validators.required],[this.regpasswordAsyncValidator]],confirmPassword:["",[Validators.required],[this.confirmPasswordAsyncValidator]]}),this.forgetForm=this.fb.group({forgetusername:["",[Validators.required],[this.forgetNameAsyncValidator]],forgetPassword:["",[Validators.required],[this.forgetPasswordAsyncValidator]],forgetConfirmpassword:["",[Validators.required],[this.forgetConfirmPasswordAsyncValidator]],forgerphoneCode:["",[Validators.required],[this.registCodeAsyncValidator]]})}ngOnInit(){this.activatedRoute.paramMap.subscribe((n=>{n.get("p")?localStorage.setItem("pid",n.get("p")):localStorage.setItem("company",this.companyId)})),this.creatCode()}creatCode(){this.code="";let n=[0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];for(let e=0;e<4;e++){let e=Math.floor(52*Math.random());this.code+=n[e]}}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:LoginComponent,deps:[{token:i1.AuthService},{token:i2.NovaCloudService},{token:i3.FormBuilder},{token:i4.NzMessageService},{token:i5.Router},{token:i5.ActivatedRoute},{token:i5.ActivatedRoute},{token:i6.HttpClient}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:LoginComponent,selector:"app-pcuser-login",ngImport:i0,template:'<div class="student-login-layout">\n <div class="nav_center">\n <img [src]="logo" alt="" class="login_img">\n <div class="nav_login">\n <nz-tabset [nzSelectedIndex]="tabIndex" [nzTabPosition]="\'top\'">\n\n \x3c!-- 登录:手机号+密码登入 --\x3e\n <nz-tab nzTitle="手机密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateForm" (ngSubmit)="submitFormMobilePassword(validateForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手机号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateForm.valid">登录</button>\n </div>\n <div class="forget">\n <h6 (click)="forget()">忘记密码</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n \x3c!-- 登录:帐号+密码登入 --\x3e\n <nz-tab nzTitle="帐号密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateUserForm" (ngSubmit)="submitFormUserPassword(validateUserForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>帐 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="username" placeholder="请输入帐号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateUserForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n \x3c!-- 登录:手机号+验证码登入 --\x3e\n <nz-tab nzTitle="短信验证" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateSMSForm" (ngSubmit)="submitFormMobileSMS(validateSMSForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手 机 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>短信码</nz-form-label>\n <nz-form-control [nzSpan]="10" nzErrorTip="{{smsCodeErrorTip}}">\n <nz-input-group>\n <input nz-input [type]="\'text\'" [disabled]="!isSended || !codeVerified" formControlName="smsCode" placeholder="请输入短信验证码" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div *ngIf="!isSending" (click)="sendSMSCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 获取验证码\n </div>\n <div *ngIf="isSending"\n style="background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateSMSForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n \x3c!-- 注册:企业用户Profile开通 --\x3e\n <nz-tab *ngIf="mobileLogin" nzTitle="开通" style="color: #000000;" class="activation">\n <form nz-form [formGroup]="registForm" (ngSubmit)="registSubmitForm(registForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通证件</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzValidatingTip="验证中..."\n nzErrorTip="{{registIdcardErrorTip}}">\n <input title="请输入身份证号码" nz-input formControlName="registIdcard" placeholder="请输入身份证号码" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通姓名</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{registNameErrorTip}}">\n <input nz-input type="text" formControlName="registName" placeholder="请输入姓名" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>绑定手机号</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{phoneErrorTip}}">\n <input [(ngModel)]="registPhone" nz-input style="font-size: 18px;" type="text"\n formControlName="registPhone" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="verifyCode">\n <nz-form-label [nzSpan]="7" nzRequired>手机验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" class="code_input" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}">\n <input style="font-size: 18px;" nz-input type="text" formControlName="phoneCode" placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="codeContain">\n <div *ngIf="!isCountDown" (click)="getCode()"\n class="get_code"\n style="background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{regpasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate2">\n <input nz-input [type]="passwordVisible2 ? \'text\' : \'password\'" formControlName="regpassword"\n placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]="passwordVisible2 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible2 = !passwordVisible2"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{confirmPasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate3">\n <input nz-input [type]="passwordVisible3 ? \'text\' : \'password\'" formControlName="confirmPassword"\n placeholder="请确认密码" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]="passwordVisible3 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible3 = !passwordVisible3"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [disabled]="!registForm.valid">申请开通</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class="nav_login_right">\n <p class="login_right_title">二维码</p>\n <img [src]="qrcode" alt="公众号二维码">\n <p>扫码进入微信端</p>\n \x3c!-- <p class="login_right_bottom">首次登录有惊喜</p> --\x3e\n </div>\n </div>\n\n <div class="loadWrap" style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;"\n *ngIf="loading2">\n <nz-spin nzTip="加载中,请稍后...">\n <nz-alert nzType="info" nzMessage="课程加载中,请稍后..."></nz-alert>\n </nz-spin>\n </div>\n\n \x3c!-- 注销 --\x3e\n <nz-modal [(nzVisible)]="isVisible" nzTitle="手机号错误" (nzOnCancel)="handleCancel()" (nzOnOk)="handleOk()">\n <ng-container *nzModalContent>\n <p>手机号错误, 联系管理员核对信息</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n',styles:[".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"],dependencies:[{kind:"directive",type:i7.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:i3.ɵNgNoValidate,selector:"form:not([ngNoForm]):not([ngNativeValidate])"},{kind:"directive",type:i3.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:i3.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i3.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i3.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i3.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:i8.NzInputDirective,selector:"input[nz-input],textarea[nz-input]",inputs:["nzBorderless","nzSize","nzStepperless","nzStatus","disabled"],exportAs:["nzInput"]},{kind:"component",type:i8.NzInputGroupComponent,selector:"nz-input-group",inputs:["nzAddOnBeforeIcon","nzAddOnAfterIcon","nzPrefixIcon","nzSuffixIcon","nzAddOnBefore","nzAddOnAfter","nzPrefix","nzStatus","nzSuffix","nzSize","nzSearch","nzCompact"],exportAs:["nzInputGroup"]},{kind:"directive",type:i8.NzInputGroupWhitSuffixOrPrefixDirective,selector:"nz-input-group[nzSuffix], nz-input-group[nzPrefix]"},{kind:"component",type:i9.NzButtonComponent,selector:"button[nz-button], a[nz-button]",inputs:["nzBlock","nzGhost","nzSearch","nzLoading","nzDanger","disabled","tabIndex","nzType","nzShape","nzSize"],exportAs:["nzButton"]},{kind:"directive",type:i10.ɵNzTransitionPatchDirective,selector:"[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group",inputs:["hidden"]},{kind:"directive",type:i11.NzWaveDirective,selector:'[nz-wave],button[nz-button]:not([nzType="link"]):not([nzType="text"])',inputs:["nzWaveExtraNode"],exportAs:["nzWave"]},{kind:"component",type:i12.NzModalComponent,selector:"nz-modal",inputs:["nzMask","nzMaskClosable","nzCloseOnNavigation","nzVisible","nzClosable","nzOkLoading","nzOkDisabled","nzCancelDisabled","nzCancelLoading","nzKeyboard","nzNoAnimation","nzCentered","nzDraggable","nzContent","nzFooter","nzZIndex","nzWidth","nzWrapClassName","nzClassName","nzStyle","nzTitle","nzCloseIcon","nzMaskStyle","nzBodyStyle","nzOkText","nzCancelText","nzOkType","nzOkDanger","nzIconType","nzModalType","nzAutofocus","nzOnOk","nzOnCancel"],outputs:["nzOnOk","nzOnCancel","nzAfterOpen","nzAfterClose","nzVisibleChange"],exportAs:["nzModal"]},{kind:"directive",type:i12.NzModalContentDirective,selector:"[nzModalContent]",exportAs:["nzModalContent"]},{kind:"component",type:i13.NzSpinComponent,selector:"nz-spin",inputs:["nzIndicator","nzSize","nzTip","nzDelay","nzSimple","nzSpinning"],exportAs:["nzSpin"]},{kind:"component",type:i14.NzTabSetComponent,selector:"nz-tabset",inputs:["nzSelectedIndex","nzTabPosition","nzTabBarExtraContent","nzCanDeactivate","nzAddIcon","nzTabBarStyle","nzType","nzSize","nzAnimated","nzTabBarGutter","nzHideAdd","nzCentered","nzHideAll","nzLinkRouter","nzLinkExact"],outputs:["nzSelectChange","nzSelectedIndexChange","nzTabListScroll","nzClose","nzAdd"],exportAs:["nzTabset"]},{kind:"component",type:i14.NzTabComponent,selector:"nz-tab",inputs:["nzTitle","nzClosable","nzCloseIcon","nzDisabled","nzForceRender"],outputs:["nzSelect","nzDeselect","nzClick","nzContextmenu"],exportAs:["nzTab"]},{kind:"directive",type:i15.NzColDirective,selector:"[nz-col],nz-col,nz-form-control,nz-form-label",inputs:["nzFlex","nzSpan","nzOrder","nzOffset","nzPush","nzPull","nzXs","nzSm","nzMd","nzLg","nzXl","nzXXl"],exportAs:["nzCol"]},{kind:"directive",type:i15.NzRowDirective,selector:"[nz-row],nz-row,nz-form-item",inputs:["nzAlign","nzJustify","nzGutter"],exportAs:["nzRow"]},{kind:"directive",type:i16.NzFormDirective,selector:"[nz-form]",inputs:["nzLayout","nzNoColon","nzAutoTips","nzDisableAutoTips","nzTooltipIcon","nzLabelAlign","nzLabelWrap"],exportAs:["nzForm"]},{kind:"component",type:i16.NzFormItemComponent,selector:"nz-form-item",exportAs:["nzFormItem"]},{kind:"component",type:i16.NzFormLabelComponent,selector:"nz-form-label",inputs:["nzFor","nzRequired","nzNoColon","nzTooltipTitle","nzTooltipIcon","nzLabelAlign","nzLabelWrap"],exportAs:["nzFormLabel"]},{kind:"component",type:i16.NzFormControlComponent,selector:"nz-form-control",inputs:["nzSuccessTip","nzWarningTip","nzErrorTip","nzValidatingTip","nzExtra","nzAutoTips","nzDisableAutoTips","nzHasFeedback","nzValidateStatus"],exportAs:["nzFormControl"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:LoginComponent,decorators:[{type:Component,args:[{selector:"app-pcuser-login",template:'<div class="student-login-layout">\n <div class="nav_center">\n <img [src]="logo" alt="" class="login_img">\n <div class="nav_login">\n <nz-tabset [nzSelectedIndex]="tabIndex" [nzTabPosition]="\'top\'">\n\n \x3c!-- 登录:手机号+密码登入 --\x3e\n <nz-tab nzTitle="手机密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateForm" (ngSubmit)="submitFormMobilePassword(validateForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手机号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateForm.valid">登录</button>\n </div>\n <div class="forget">\n <h6 (click)="forget()">忘记密码</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n \x3c!-- 登录:帐号+密码登入 --\x3e\n <nz-tab nzTitle="帐号密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateUserForm" (ngSubmit)="submitFormUserPassword(validateUserForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>帐 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="username" placeholder="请输入帐号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateUserForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n \x3c!-- 登录:手机号+验证码登入 --\x3e\n <nz-tab nzTitle="短信验证" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateSMSForm" (ngSubmit)="submitFormMobileSMS(validateSMSForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手 机 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>短信码</nz-form-label>\n <nz-form-control [nzSpan]="10" nzErrorTip="{{smsCodeErrorTip}}">\n <nz-input-group>\n <input nz-input [type]="\'text\'" [disabled]="!isSended || !codeVerified" formControlName="smsCode" placeholder="请输入短信验证码" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div *ngIf="!isSending" (click)="sendSMSCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 获取验证码\n </div>\n <div *ngIf="isSending"\n style="background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateSMSForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n \x3c!-- 注册:企业用户Profile开通 --\x3e\n <nz-tab *ngIf="mobileLogin" nzTitle="开通" style="color: #000000;" class="activation">\n <form nz-form [formGroup]="registForm" (ngSubmit)="registSubmitForm(registForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通证件</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzValidatingTip="验证中..."\n nzErrorTip="{{registIdcardErrorTip}}">\n <input title="请输入身份证号码" nz-input formControlName="registIdcard" placeholder="请输入身份证号码" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通姓名</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{registNameErrorTip}}">\n <input nz-input type="text" formControlName="registName" placeholder="请输入姓名" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>绑定手机号</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{phoneErrorTip}}">\n <input [(ngModel)]="registPhone" nz-input style="font-size: 18px;" type="text"\n formControlName="registPhone" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="verifyCode">\n <nz-form-label [nzSpan]="7" nzRequired>手机验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" class="code_input" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}">\n <input style="font-size: 18px;" nz-input type="text" formControlName="phoneCode" placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="codeContain">\n <div *ngIf="!isCountDown" (click)="getCode()"\n class="get_code"\n style="background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{regpasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate2">\n <input nz-input [type]="passwordVisible2 ? \'text\' : \'password\'" formControlName="regpassword"\n placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]="passwordVisible2 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible2 = !passwordVisible2"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{confirmPasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate3">\n <input nz-input [type]="passwordVisible3 ? \'text\' : \'password\'" formControlName="confirmPassword"\n placeholder="请确认密码" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]="passwordVisible3 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible3 = !passwordVisible3"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [disabled]="!registForm.valid">申请开通</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class="nav_login_right">\n <p class="login_right_title">二维码</p>\n <img [src]="qrcode" alt="公众号二维码">\n <p>扫码进入微信端</p>\n \x3c!-- <p class="login_right_bottom">首次登录有惊喜</p> --\x3e\n </div>\n </div>\n\n <div class="loadWrap" style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;"\n *ngIf="loading2">\n <nz-spin nzTip="加载中,请稍后...">\n <nz-alert nzType="info" nzMessage="课程加载中,请稍后..."></nz-alert>\n </nz-spin>\n </div>\n\n \x3c!-- 注销 --\x3e\n <nz-modal [(nzVisible)]="isVisible" nzTitle="手机号错误" (nzOnCancel)="handleCancel()" (nzOnOk)="handleOk()">\n <ng-container *nzModalContent>\n <p>手机号错误, 联系管理员核对信息</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n',styles:[".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"]}]}],ctorParameters:()=>[{type:i1.AuthService},{type:i2.NovaCloudService},{type:i3.FormBuilder},{type:i4.NzMessageService},{type:i5.Router},{type:i5.ActivatedRoute},{type:i5.ActivatedRoute},{type:i6.HttpClient}]});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi91c2VyL2xvZ2luL2xvZ2luLmNvbXBvbmVudC5tanM=`
10
+