@gsp-svc/formdoc-upload 1.1.0 → 1.1.1

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 (127) hide show
  1. package/bundles/gsp-svc-formdoc-upload.umd.js +2743 -2721
  2. package/bundles/gsp-svc-formdoc-upload.umd.js.map +1 -1
  3. package/bundles/gsp-svc-formdoc-upload.umd.min.js +1 -1
  4. package/bundles/gsp-svc-formdoc-upload.umd.min.js.map +1 -1
  5. package/esm2015/gsp-svc-formdoc-upload.js +9 -9
  6. package/esm2015/lib/formdoc-upload.component.js +21 -21
  7. package/esm2015/lib/formdoc-upload.module.js +23 -23
  8. package/esm2015/lib/formdoc-upload.service.js +17 -17
  9. package/esm2015/lib/i18n/language.resource.js +156 -148
  10. package/esm2015/lib/local.pipe.js +48 -48
  11. package/esm2015/lib/upload/download.service.js +153 -153
  12. package/esm2015/lib/upload/entity/changeinstancerequest.js +13 -13
  13. package/esm2015/lib/upload/entity/completemultiuploadrequest.js +21 -21
  14. package/esm2015/lib/upload/entity/copyfilerequest.js +15 -15
  15. package/esm2015/lib/upload/entity/doctype.js +25 -25
  16. package/esm2015/lib/upload/entity/droplistentity.js +13 -13
  17. package/esm2015/lib/upload/entity/expropertyrequest.js +15 -15
  18. package/esm2015/lib/upload/entity/extensionstoragefileinfo.js +13 -13
  19. package/esm2015/lib/upload/entity/fileinfo.js +49 -49
  20. package/esm2015/lib/upload/entity/filestate.js +13 -13
  21. package/esm2015/lib/upload/entity/gspdocmetaproperty.js +19 -19
  22. package/esm2015/lib/upload/entity/gspdocsecuritybaseinfo.js +15 -15
  23. package/esm2015/lib/upload/entity/gspformdocinfo.js +25 -25
  24. package/esm2015/lib/upload/entity/gspformdocoperateentity.js +13 -13
  25. package/esm2015/lib/upload/entity/gspformremovelistentity.js +15 -15
  26. package/esm2015/lib/upload/entity/gspformstreamentity.js +25 -25
  27. package/esm2015/lib/upload/entity/gspformuploadentity.js +17 -17
  28. package/esm2015/lib/upload/entity/gspformuploadlistentity.js +17 -17
  29. package/esm2015/lib/upload/entity/initmultiuploadrequest.js +19 -19
  30. package/esm2015/lib/upload/entity/multiuploadrequest.js +21 -21
  31. package/esm2015/lib/upload/entity/multiuploadresult.js +13 -13
  32. package/esm2015/lib/upload/entity/operatingmodes.js +13 -13
  33. package/esm2015/lib/upload/entity/securityentity.js +17 -17
  34. package/esm2015/lib/upload/entity/storageextension.js +17 -17
  35. package/esm2015/lib/upload/entity/uploadfileinfo.js +21 -21
  36. package/esm2015/lib/upload/entity/uploadlimit.js +23 -23
  37. package/esm2015/lib/upload/file-upload/file-upload.component.js +1508 -1491
  38. package/esm2015/lib/upload/upload.module.js +50 -48
  39. package/esm2015/lib/upload/upload.service.js +341 -341
  40. package/esm2015/lib/uploaddialog/uploaddialog/uploaddialog.component.js +82 -82
  41. package/esm2015/lib/uploaddialog/uploaddialog.module.js +35 -35
  42. package/esm2015/lib/uploaddialog.service.js +207 -207
  43. package/esm2015/public-api.js +32 -32
  44. package/esm5/gsp-svc-formdoc-upload.js +9 -9
  45. package/esm5/lib/formdoc-upload.component.js +27 -27
  46. package/esm5/lib/formdoc-upload.module.js +27 -27
  47. package/esm5/lib/formdoc-upload.service.js +20 -20
  48. package/esm5/lib/i18n/language.resource.js +156 -148
  49. package/esm5/lib/local.pipe.js +51 -51
  50. package/esm5/lib/upload/download.service.js +202 -202
  51. package/esm5/lib/upload/entity/changeinstancerequest.js +17 -17
  52. package/esm5/lib/upload/entity/completemultiuploadrequest.js +25 -25
  53. package/esm5/lib/upload/entity/copyfilerequest.js +19 -19
  54. package/esm5/lib/upload/entity/doctype.js +25 -25
  55. package/esm5/lib/upload/entity/droplistentity.js +17 -17
  56. package/esm5/lib/upload/entity/expropertyrequest.js +19 -19
  57. package/esm5/lib/upload/entity/extensionstoragefileinfo.js +17 -17
  58. package/esm5/lib/upload/entity/fileinfo.js +53 -53
  59. package/esm5/lib/upload/entity/filestate.js +13 -13
  60. package/esm5/lib/upload/entity/gspdocmetaproperty.js +23 -23
  61. package/esm5/lib/upload/entity/gspdocsecuritybaseinfo.js +19 -19
  62. package/esm5/lib/upload/entity/gspformdocinfo.js +29 -29
  63. package/esm5/lib/upload/entity/gspformdocoperateentity.js +17 -17
  64. package/esm5/lib/upload/entity/gspformremovelistentity.js +19 -19
  65. package/esm5/lib/upload/entity/gspformstreamentity.js +29 -29
  66. package/esm5/lib/upload/entity/gspformuploadentity.js +21 -21
  67. package/esm5/lib/upload/entity/gspformuploadlistentity.js +21 -21
  68. package/esm5/lib/upload/entity/initmultiuploadrequest.js +23 -23
  69. package/esm5/lib/upload/entity/multiuploadrequest.js +25 -25
  70. package/esm5/lib/upload/entity/multiuploadresult.js +17 -17
  71. package/esm5/lib/upload/entity/operatingmodes.js +13 -13
  72. package/esm5/lib/upload/entity/securityentity.js +21 -21
  73. package/esm5/lib/upload/entity/storageextension.js +21 -21
  74. package/esm5/lib/upload/entity/uploadfileinfo.js +25 -25
  75. package/esm5/lib/upload/entity/uploadlimit.js +25 -25
  76. package/esm5/lib/upload/file-upload/file-upload.component.js +1657 -1640
  77. package/esm5/lib/upload/upload.module.js +54 -52
  78. package/esm5/lib/upload/upload.service.js +404 -404
  79. package/esm5/lib/uploaddialog/uploaddialog/uploaddialog.component.js +88 -88
  80. package/esm5/lib/uploaddialog/uploaddialog.module.js +39 -39
  81. package/esm5/lib/uploaddialog.service.js +226 -226
  82. package/esm5/public-api.js +32 -32
  83. package/fesm2015/gsp-svc-formdoc-upload.js +2470 -2443
  84. package/fesm2015/gsp-svc-formdoc-upload.js.map +1 -1
  85. package/fesm5/gsp-svc-formdoc-upload.js +2820 -2793
  86. package/fesm5/gsp-svc-formdoc-upload.js.map +1 -1
  87. package/gsp-svc-formdoc-upload.d.ts +5 -5
  88. package/gsp-svc-formdoc-upload.metadata.json +1 -1
  89. package/lib/formdoc-upload.component.d.ts +5 -5
  90. package/lib/formdoc-upload.module.d.ts +2 -2
  91. package/lib/formdoc-upload.service.d.ts +3 -3
  92. package/lib/i18n/language.resource.d.ts +150 -142
  93. package/lib/local.pipe.d.ts +8 -8
  94. package/lib/upload/download.service.d.ts +11 -11
  95. package/lib/upload/entity/changeinstancerequest.d.ts +5 -5
  96. package/lib/upload/entity/completemultiuploadrequest.d.ts +9 -9
  97. package/lib/upload/entity/copyfilerequest.d.ts +5 -5
  98. package/lib/upload/entity/doctype.d.ts +10 -10
  99. package/lib/upload/entity/droplistentity.d.ts +4 -4
  100. package/lib/upload/entity/expropertyrequest.d.ts +5 -5
  101. package/lib/upload/entity/extensionstoragefileinfo.d.ts +4 -4
  102. package/lib/upload/entity/fileinfo.d.ts +23 -23
  103. package/lib/upload/entity/filestate.d.ts +4 -4
  104. package/lib/upload/entity/gspdocmetaproperty.d.ts +7 -7
  105. package/lib/upload/entity/gspdocsecuritybaseinfo.d.ts +5 -5
  106. package/lib/upload/entity/gspformdocinfo.d.ts +11 -11
  107. package/lib/upload/entity/gspformdocoperateentity.d.ts +4 -4
  108. package/lib/upload/entity/gspformremovelistentity.d.ts +6 -6
  109. package/lib/upload/entity/gspformstreamentity.d.ts +12 -12
  110. package/lib/upload/entity/gspformuploadentity.d.ts +8 -8
  111. package/lib/upload/entity/gspformuploadlistentity.d.ts +8 -8
  112. package/lib/upload/entity/initmultiuploadrequest.d.ts +7 -7
  113. package/lib/upload/entity/multiuploadrequest.d.ts +8 -8
  114. package/lib/upload/entity/multiuploadresult.d.ts +4 -4
  115. package/lib/upload/entity/operatingmodes.d.ts +4 -4
  116. package/lib/upload/entity/securityentity.d.ts +6 -6
  117. package/lib/upload/entity/storageextension.d.ts +6 -6
  118. package/lib/upload/entity/uploadfileinfo.d.ts +10 -10
  119. package/lib/upload/entity/uploadlimit.d.ts +7 -7
  120. package/lib/upload/file-upload/file-upload.component.d.ts +133 -133
  121. package/lib/upload/upload.module.d.ts +3 -3
  122. package/lib/upload/upload.service.d.ts +27 -27
  123. package/lib/uploaddialog/uploaddialog/uploaddialog.component.d.ts +13 -13
  124. package/lib/uploaddialog/uploaddialog.module.d.ts +2 -2
  125. package/lib/uploaddialog.service.d.ts +18 -18
  126. package/package.json +1 -1
  127. package/public-api.d.ts +25 -25
@@ -1,1491 +1,1508 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Component, Input, ViewChild, TemplateRef, Injector, LOCALE_ID } from '@angular/core';
6
- import { DocType } from '../entity/doctype';
7
- import { OperatingModes } from '../entity/operatingmodes';
8
- import { UploadService } from '../upload.service';
9
- import { UploadFileInfo } from '../entity/uploadfileinfo';
10
- import { MessagerService } from '@farris/ui-messager';
11
- import { catchError, map, tap } from 'rxjs/operators';
12
- import { of } from 'rxjs';
13
- import { UUID } from 'angular2-uuid';
14
- import { ExStorageFileInfo } from '../entity/extensionstoragefileinfo';
15
- import { LoadingService } from '@farris/ui-loading';
16
- import { DomSanitizer } from '@angular/platform-browser';
17
- import { FileState } from '../entity/filestate';
18
- import { LocalLangPipe } from '../../local.pipe';
19
- import { GspDocSecurityBaseInfo } from '../entity/gspdocsecuritybaseinfo';
20
- import { HttpClient } from '@angular/common/http';
21
- import { InitMultiUploadRequest } from '../entity/initmultiuploadrequest';
22
- import { CompleteMultiUploadRequest } from '../entity/completemultiuploadrequest';
23
- import { GspFormStreamEntity } from '../entity/gspformstreamentity';
24
- import { MultiUploadRequest } from '../entity/multiuploadrequest';
25
- import { BasePathService } from '@farris/rtf';
26
- export class FileUploadComponent {
27
- /**
28
- * @param {?} msgService
29
- * @param {?} uploadService
30
- * @param {?} loadService
31
- * @param {?=} injector
32
- */
33
- constructor(msgService, uploadService, loadService, injector) {
34
- this.msgService = msgService;
35
- this.uploadService = uploadService;
36
- this.loadService = loadService;
37
- this.injector = injector;
38
- this.files = [];
39
- this.metadataIdList = [];
40
- this.uploadFileInfoList = [];
41
- this.errFileList = [];
42
- this.errTypeList = [];
43
- this.nullFileList = [];
44
- this.beyondFileList = [];
45
- this.fileNameOversizeList = [];
46
- this.invalidCharactersFileList = [];
47
- this.invalidExtNamesFileList = [];
48
- this.unrecognizedTypeFileList = [];
49
- this.invalidCharacters = '';
50
- this.invalidExtNames = '';
51
- this.showType = 0;
52
- this.mouseOn = false;
53
- this.isWhiteList = false;
54
- this.bufferSize = 5 * 1024 * 1024;
55
- this.selectedFileCount = 0;
56
- this.uploadBtnDisabled = false;
57
- this.uploadIconAddress = this.createBaseUrl('/platform/runtime/dfs/images/upload.svg');
58
- this.uploadLittleIconAddress = this.createBaseUrl('/platform/runtime/dfs/images/uploadIcon.svg');
59
- this.hasSelectedFile = false;
60
- this.fileAllSelected = false;
61
- this.uploadProcess = { width: '0%' };
62
- this.fileTotalChunk = {};
63
- this.requestArray = new Array;
64
- this.requestBodyArray = new Array;
65
- this.uploadedChunk = {};
66
- this.uploadedProcess = {};
67
- this.defaultPropertyName = "";
68
- this.propertiesNames = [];
69
- this.securityInfoList = [];
70
- this.queueListStyle = { width: '480px' };
71
- this.dropListValue = "";
72
- this.uploadedFileTotal = 0;
73
- this.haveExtensionProperty = false;
74
- this.haveSecurityInfo = false;
75
- this.uploadedFileInfoList = [];
76
- this.oldUploadedFileList = [];
77
- //uploadedNameList = [];
78
- this.uploadInfoErrorMessage = "";
79
- this.sameNameAllowed = true;
80
- this.maxFileSize = 0;
81
- this.checkboxPos = { top: '0px' };
82
- this.fileType = "*";
83
- this.fileCount = 0;
84
- this.oldIdList = [];
85
- this.securityInfo = null;
86
- this.fileNameLength = 0;
87
- this.totalLoad = null;
88
- this.exStorageFileList = [];
89
- if (this.injector) {
90
- this.httpclient = this.injector.get(HttpClient);
91
- this.localeid = localStorage.getItem("languageCode") || this.injector.get(LOCALE_ID);
92
- this.localepipe = new LocalLangPipe(this.localeid);
93
- }
94
- }
95
- ;
96
- /**
97
- * @return {?}
98
- */
99
- ngOnInit() {
100
- if (navigator.userAgent.indexOf('Firefox') >= 0)
101
- this.checkboxPos.top = '14px';
102
- //if (this.storageService != null) {
103
- if (this.securityInfo != null) {
104
- this.uploadService.getSecurityInfoList(this.securityInfo).subscribe((/**
105
- * @param {?} res
106
- * @return {?}
107
- */
108
- res => {
109
- this.haveSecurityInfo = true;
110
- /** @type {?} */
111
- let i = 0;
112
- res.forEach((/**
113
- * @param {?} element
114
- * @return {?}
115
- */
116
- element => {
117
- this.securityInfoList.push({ id: i.toString(), securityId: element.securityId, securityLevel: element.securityLevel, name: element.name });
118
- i++;
119
- }));
120
- }));
121
- }
122
- this.uploadService.getStorageExtensionInfo().subscribe((/**
123
- * @param {?} res
124
- * @return {?}
125
- */
126
- res => {
127
- if (res != null && res.error == null) {
128
- this.storageExtension = res;
129
- this.defaultPropertyName = this.storageExtension.defaultPropertyName;
130
- this.propertiesNames.push({ id: "0", name: this.storageExtension.defaultPropertyName });
131
- /** @type {?} */
132
- let i = 0;
133
- // this.propertiesNames.push(...(this.storageExtension.extensionPropertyNameList));
134
- this.storageExtension.extensionPropertyNameList.forEach((/**
135
- * @param {?} element
136
- * @return {?}
137
- */
138
- element => {
139
- this.propertiesNames.push({ id: (++i).toString(), name: element });
140
- }));
141
- this.queueListStyle.width = '380px';
142
- this.haveExtensionProperty = true;
143
- }
144
- }));
145
- this.uploadService.getUploadInfo(this.rootId).subscribe((/**
146
- * @param {?} res
147
- * @return {?}
148
- */
149
- res => {
150
- if (res.error != null) {
151
- this.uploadInfoErrorMessage = res.error.Message;
152
- // console.log('获取上传信息报错,错误信息为:',errMsg);
153
- return;
154
- }
155
- else {
156
- this.uploadBtnDisabled = false;
157
- this.sameNameAllowed = res.sameNameAllowed;
158
- this.maxFileSize = parseInt(JSON.parse(res.validateConfiguration).maxFileSize);
159
- this.isWhiteList = JSON.parse(res.validateConfiguration).whiteList;
160
- this.invalidCharacters = JSON.parse(res.validateConfiguration).invalidCharacters;
161
- this.invalidExtNames = JSON.parse(res.validateConfiguration).invalidExtNames.toLowerCase();
162
- this.allowedMultiUpload = res.allowedMultiUpload;
163
- if (!this.sameNameAllowed) {
164
- this.uploadService.getUploadedFileInfoList(this.formId, this.rootId).subscribe((/**
165
- * @param {?} res
166
- * @return {?}
167
- */
168
- res => {
169
- if (res != null && res.error == null) {
170
- this.uploadedFileInfoList = res;
171
- this.oldUploadedFileList = JSON.parse(JSON.stringify(res));
172
- ;
173
- }
174
- }));
175
- }
176
- }
177
- }));
178
- if (this.oldIdList != null && this.oldIdList.length > 0) {
179
- // this.uploadService.cancel(this.oldIdList, this.rootId).subscribe();
180
- }
181
- this.radioButtonGroupValue = 'showByGroup';
182
- }
183
- /**
184
- * @return {?}
185
- */
186
- showLoading() {
187
- this.hasSelectedFile = true;
188
- // if (this.totalLoad == null)
189
- // this.totalLoad = this.loadService.show({
190
- // message: this.localepipe.transform('uploading')
191
- // });
192
- }
193
- /**
194
- * @return {?}
195
- */
196
- getRightClass() {
197
- if (this.uploadBtnDisabled) {
198
- return 'btn btn-primary btn-lg disabled';
199
- }
200
- else {
201
- return 'btn btn-primary btn-lg';
202
- }
203
- }
204
- /**
205
- * @param {?} name
206
- * @return {?}
207
- */
208
- findInvalidCharacter(name) {
209
- /** @type {?} */
210
- let charList = [];
211
- this.invalidCharacters.split('|').forEach((/**
212
- * @param {?} element
213
- * @return {?}
214
- */
215
- element => {
216
- if (name.indexOf(element) >= 0)
217
- charList.push(element);
218
- }));
219
- return charList;
220
- }
221
- /**
222
- * @param {?} file
223
- * @return {?}
224
- */
225
- hasFileType(file) {
226
- return file.name.includes('.');
227
- }
228
- /**
229
- * @param {?} $event
230
- * @return {?}
231
- */
232
- fileSelected($event) {
233
- if (this.uploadInfoErrorMessage) {
234
- this.msgService.error(this.uploadInfoErrorMessage);
235
- this.uploadBtnDisabled = true;
236
- return;
237
- }
238
- this.hasSelectedFile = true;
239
- this.selectedFiles = document.querySelector('#file');
240
- if (this.fileCount > 0) {
241
- if (this.selectedFiles.files.length + this.files.length > this.fileCount) {
242
- /** @type {?} */
243
- let selectedNum = ((/** @type {?} */ (this.selectedFiles.files.length))) + this.files.length;
244
- this.msgService.warning(this.localepipe.transform('selectedCount') + selectedNum + this.localepipe.transform('limitCount') + this.fileCount + this.localepipe.transform('rechooseFile'));
245
- return;
246
- }
247
- }
248
- //this.flag = 0;
249
- for (let i = 0; i < this.selectedFiles.files.length; i++) {
250
- /** @type {?} */
251
- let selectedFile = this.selectedFiles.files[i];
252
- selectedFile.isAllowedUpload = true;
253
- //selectedFile.slice
254
- /** @type {?} */
255
- let uuid = UUID.UUID();
256
- if (selectedFile.size == 0) {
257
- this.nullFileList.push(selectedFile.name);
258
- continue;
259
- }
260
- if (this.fileNameLength > 0 && selectedFile.name.length > this.fileNameLength) {
261
- this.fileNameOversizeList.push(selectedFile.name);
262
- continue;
263
- }
264
- if (this.maxFileSize != null && this.maxFileSize > 0) {
265
- if (selectedFile.size > this.maxFileSize * 1000) {
266
- this.beyondFileList.push(selectedFile.name);
267
- continue;
268
- }
269
- }
270
- /** @type {?} */
271
- const invalidCharList = this.findInvalidCharacter(selectedFile.name);
272
- /** @type {?} */
273
- let invalidCharListFilter = invalidCharList.filter((/**
274
- * @param {?} s
275
- * @return {?}
276
- */
277
- (s) => {
278
- return s && s.trim();
279
- }));
280
- /** @type {?} */
281
- let errorMessage = "";
282
- if (invalidCharListFilter.length > 0) {
283
- invalidCharListFilter.forEach((/**
284
- * @param {?} element
285
- * @param {?} index
286
- * @return {?}
287
- */
288
- (element, index) => {
289
- errorMessage += "\"";
290
- errorMessage += element;
291
- errorMessage += "\"";
292
- errorMessage += (index === invalidCharListFilter.length - 1) ? "" : ",";
293
- }));
294
- if (this.selectedFiles.files.length === 1) {
295
- selectedFile.isAllowedUpload = false;
296
- this.msgService.warning(this.localepipe.transform('invalidCharacters') + errorMessage + this.localepipe.transform('rechooseFile'));
297
- return;
298
- }
299
- if (this.selectedFiles.files.length > 1) {
300
- selectedFile.isAllowedUpload = false;
301
- this.invalidCharactersFileList.push(selectedFile.name);
302
- continue;
303
- }
304
- }
305
- if (!this.hasFileType(selectedFile)) {
306
- if (this.selectedFiles.files.length === 1) {
307
- selectedFile.isAllowedUpload = false;
308
- this.msgService.warning(selectedFile.name + this.localepipe.transform('UnrecognizedFileType') + this.localepipe.transform('rechooseFile'));
309
- return;
310
- }
311
- if (this.selectedFiles.files.length > 1) {
312
- selectedFile.isAllowedUpload = false;
313
- this.unrecognizedTypeFileList.push(selectedFile.name);
314
- continue;
315
- }
316
- }
317
- // let curFileSuffix = selectedFile.name.split('.')[1];
318
- /** @type {?} */
319
- let curFileSuffix = selectedFile.name.substr(selectedFile.name.lastIndexOf('.') + 1).toLowerCase();
320
- /** @type {?} */
321
- const extNames = this.listToString(this.invalidExtNames.split('|'));
322
- /** @type {?} */
323
- const extNamesAry = this.invalidExtNames.split('|');
324
- if (!this.isWhiteList && extNamesAry.includes(curFileSuffix)) {
325
- if (this.selectedFiles.files.length === 1) {
326
- selectedFile.isAllowedUpload = false;
327
- this.msgService.warning(selectedFile.name + this.localepipe.transform('invalidExtNames') + this.localepipe.transform('blackExtNames') + extNames + this.localepipe.transform('rechooseFile'));
328
- return;
329
- }
330
- if (this.selectedFiles.files.length > 1) {
331
- selectedFile.isAllowedUpload = false;
332
- this.invalidExtNamesFileList.push(selectedFile.name);
333
- continue;
334
- }
335
- }
336
- if (this.isWhiteList && !extNamesAry.includes(curFileSuffix)) {
337
- if (this.selectedFiles.files.length === 1) {
338
- selectedFile.isAllowedUpload = false;
339
- this.msgService.warning(selectedFile.name + this.localepipe.transform('invalidExtNames') + this.localepipe.transform('whiteExtNames') + extNames + this.localepipe.transform('rechooseFile'));
340
- return;
341
- }
342
- if (this.selectedFiles.files.length > 1) {
343
- selectedFile.isAllowedUpload = false;
344
- this.invalidExtNamesFileList.push(selectedFile.name);
345
- continue;
346
- }
347
- }
348
- if (!this.sameNameAllowed) {
349
- if (this.uploadedFileInfoList.find((/**
350
- * @param {?} x
351
- * @return {?}
352
- */
353
- x => x.fileName == selectedFile.name)) != null) {
354
- /** @type {?} */
355
- const msg = this.msgService.show('warning', this.localepipe.transform('haveSameName') + selectedFile.name, {
356
- initialState: {
357
- buttons: [
358
- {
359
- text: this.localepipe.transform('rename'),
360
- cls: 'btn btn-secondary',
361
- handle: (/**
362
- * @return {?}
363
- */
364
- () => {
365
- /** @type {?} */
366
- let oldName = selectedFile.name;
367
- /** @type {?} */
368
- let newName;
369
- /** @type {?} */
370
- let flag = true;
371
- /** @type {?} */
372
- let i = 1;
373
- while (flag) {
374
- newName = oldName.substring(0, oldName.lastIndexOf('.')) + '(' + i + ')' + oldName.substring(oldName.lastIndexOf('.'));
375
- if (this.uploadedFileInfoList.find((/**
376
- * @param {?} x
377
- * @return {?}
378
- */
379
- x => x.fileName == newName)) != null) {
380
- i++;
381
- }
382
- else
383
- flag = false;
384
- }
385
- this.uploadFile(uuid, selectedFile, newName);
386
- msg.close();
387
- })
388
- },
389
- {
390
- text: this.localepipe.transform('replace'),
391
- cls: 'btn btn-secondary',
392
- handle: (/**
393
- * @return {?}
394
- */
395
- () => {
396
- uuid = this.uploadedFileInfoList.find((/**
397
- * @param {?} x
398
- * @return {?}
399
- */
400
- x => x.fileName == selectedFile.name)).metadataId;
401
- this.uploadFile(uuid, selectedFile, selectedFile.name, FileState.Update);
402
- this.uploadedFileTotal--;
403
- if (this.oldUploadedFileList.find((/**
404
- * @param {?} x
405
- * @return {?}
406
- */
407
- x => x.fileName == selectedFile.name))) {
408
- this.uploadedFileTotal++;
409
- this.uploadedFileInfoList.splice(this.uploadedFileInfoList.indexOf(this.uploadedFileInfoList.filter((/**
410
- * @param {?} x
411
- * @return {?}
412
- */
413
- x => x.fileName == selectedFile.name))[0]), 1);
414
- }
415
- msg.close();
416
- })
417
- },
418
- {
419
- text: this.localepipe.transform('cancel'),
420
- cls: 'btn btn-secondary',
421
- handle: (/**
422
- * @return {?}
423
- */
424
- () => {
425
- msg.close();
426
- })
427
- }
428
- ]
429
- }
430
- });
431
- continue;
432
- }
433
- }
434
- if (selectedFile.isAllowedUpload === true) {
435
- this.uploadFile(uuid, selectedFile, selectedFile.name);
436
- }
437
- }
438
- if (this.errFileList.length > 0) {
439
- /** @type {?} */
440
- let name = this.listToString(this.errFileList);
441
- this.msgService.warning(this.localepipe.transform('haveSameName') + name + this.localepipe.transform('rechooseFile'));
442
- this.errFileList = [];
443
- }
444
- if (this.nullFileList.length > 0) {
445
- /** @type {?} */
446
- let name = this.listToString(this.nullFileList);
447
- this.msgService.warning(name + this.localepipe.transform('sizeZero') + this.localepipe.transform('rechooseFile'));
448
- this.nullFileList = [];
449
- }
450
- if (this.fileNameOversizeList.length > 0) {
451
- /** @type {?} */
452
- let name = this.listToString(this.fileNameOversizeList);
453
- this.msgService.warning(name + this.localepipe.transform('fileNameOverSize') + this.fileNameLength + this.localepipe.transform('rechooseFile'));
454
- this.fileNameOversizeList = [];
455
- }
456
- if (this.beyondFileList.length > 0) {
457
- /** @type {?} */
458
- let name = this.listToString(this.beyondFileList);
459
- this.msgService.warning(name + this.localepipe.transform('sizeMax') + this.maxFileSize + "KB" + this.localepipe.transform('rechooseFile'));
460
- this.beyondFileList = [];
461
- }
462
- if (this.invalidCharactersFileList.length > 0) {
463
- /** @type {?} */
464
- let name = this.listToString(this.invalidCharactersFileList);
465
- this.msgService.warning(name + this.localepipe.transform('invalidCharacters') + this.localepipe.transform('rechooseFile'));
466
- this.invalidCharactersFileList = [];
467
- }
468
- if (this.invalidExtNamesFileList.length > 0) {
469
- /** @type {?} */
470
- let name = this.listToString(this.invalidExtNamesFileList);
471
- this.msgService.warning(name + this.localepipe.transform('invalidExtNames') + this.localepipe.transform('rechooseFile'));
472
- this.invalidExtNamesFileList = [];
473
- }
474
- if (this.unrecognizedTypeFileList.length > 0) {
475
- /** @type {?} */
476
- let name = this.listToString(this.unrecognizedTypeFileList);
477
- this.msgService.warning(name + this.localepipe.transform('UnrecognizedFileType') + this.localepipe.transform('rechooseFile'));
478
- this.unrecognizedTypeFileList = [];
479
- }
480
- this.files = this.files.slice();
481
- this.fileAllSelected = false;
482
- $event.target.value = '';
483
- // loading.close();
484
- }
485
- /**
486
- * @param {?} file
487
- * @return {?}
488
- */
489
- showErrorMessage(file) {
490
- this.msgService.error(this.localepipe.transform('uploadFailure') + file.errorMessage);
491
- }
492
- /**
493
- * @param {?} uuid
494
- * @param {?} selectedFile
495
- * @param {?} fileName
496
- * @return {?}
497
- */
498
- handleFileInfo(uuid, selectedFile, fileName) {
499
- /** @type {?} */
500
- let fileInfo;
501
- fileInfo = {
502
- id: uuid,
503
- name: fileName,
504
- type: selectedFile.type,
505
- source: "",
506
- size: this.getFileSize(selectedFile.size),
507
- fileSize: selectedFile.size,
508
- picListDisplayName: this.getPicListDisplayName(fileName),
509
- queueListDisplayName: this.getQueueDisplayName(fileName),
510
- //content: reader.result.toString(),
511
- hasUploaded: false,
512
- mouseOn: false,
513
- selectd: false,
514
- isUploading: true,
515
- uploadResult: false,
516
- uploadProcess: 0,
517
- errorMessage: "",
518
- extensionDropListId: 0,
519
- extensionName: "",
520
- securityDropListId: 0,
521
- securityInfo: this.securityInfoList[0],
522
- style: {}
523
- };
524
- if (this.storageExtension != null)
525
- fileInfo.extensionName = this.defaultPropertyName;
526
- /** @type {?} */
527
- let type = selectedFile.type;
528
- if (type.includes("tiff")) {
529
- this.addDocInfo(selectedFile, fileInfo, DocType.Other);
530
- }
531
- else if (type.includes("image")) {
532
- this.addDocInfo(selectedFile, fileInfo, DocType.Image);
533
- }
534
- else if (type.includes("word")) {
535
- this.addDocInfo(selectedFile, fileInfo, DocType.Word);
536
- }
537
- else if (type.includes("pdf")) {
538
- this.addDocInfo(selectedFile, fileInfo, DocType.Pdf);
539
- }
540
- else if (type.includes("plain")) {
541
- this.addDocInfo(selectedFile, fileInfo, DocType.Txt);
542
- }
543
- else if (type.includes("sheet") || type.includes("excel")) {
544
- this.addDocInfo(selectedFile, fileInfo, DocType.Excel);
545
- }
546
- else if (type.includes("powerpoint") || type.includes("presentation")) {
547
- this.addDocInfo(selectedFile, fileInfo, DocType.Powerpoint);
548
- }
549
- else if (type.includes("zip") || selectedFile.name.includes(".rar")) {
550
- this.addDocInfo(selectedFile, fileInfo, DocType.Zip);
551
- }
552
- else {
553
- this.addDocInfo(selectedFile, fileInfo, DocType.Other);
554
- // let name: string = selectedFile.name;
555
- // let errType = name.substring(selectedFile.name.lastIndexOf('.'));
556
- // this.errTypeList.push(errType);
557
- }
558
- return fileInfo;
559
- }
560
- /**
561
- * @param {?} uuid
562
- * @param {?} selectedFile
563
- * @param {?} fileName
564
- * @param {?=} state
565
- * @return {?}
566
- */
567
- uploadFile(uuid, selectedFile, fileName, state = FileState.New) {
568
- /** @type {?} */
569
- let fileInfo = this.handleFileInfo(uuid, selectedFile, fileName);
570
- /** @type {?} */
571
- let uploadFileInfo = new UploadFileInfo();
572
- uploadFileInfo.metadataId = uuid;
573
- uploadFileInfo.fileName = fileInfo.name;
574
- uploadFileInfo.fileSize = fileInfo.size;
575
- uploadFileInfo.originalSize = fileInfo.fileSize;
576
- uploadFileInfo.state = state;
577
- uploadFileInfo.securityInfo = this.securityInfoList[0];
578
- //判断是否支持分片上传
579
- if (this.allowedMultiUpload) {
580
- //支持分片上传
581
- /** @type {?} */
582
- let initRequest = new InitMultiUploadRequest;
583
- initRequest.path = this.formId;
584
- initRequest.metadataId = uuid;
585
- initRequest.rootId = this.rootId;
586
- initRequest.size = fileInfo.fileSize;
587
- initRequest.fileName = fileName;
588
- //初始化分片
589
- this.initMultiUpload(initRequest).subscribe((/**
590
- * @param {?} res
591
- * @return {?}
592
- */
593
- res => {
594
- if (res.error != null) {
595
- this.files[this.files.indexOf(fileInfo)].uploadResult = false;
596
- this.files[this.files.indexOf(fileInfo)].isUploading = false;
597
- this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
598
- }
599
- else {
600
- /** @type {?} */
601
- let uploadId = res.uploadId;
602
- /** @type {?} */
603
- let chunkTotal = Math.ceil(selectedFile.size / this.bufferSize);
604
- /** @type {?} */
605
- let chunkIndex = 0;
606
- /** @type {?} */
607
- let multiResultList = [];
608
- this.fileTotalChunk[uuid] = chunkTotal;
609
- this.uploadedChunk[uuid] = 0;
610
- while (chunkIndex < chunkTotal) {
611
- /** @type {?} */
612
- let nextSize = Math.min((chunkIndex + 1) * this.bufferSize, selectedFile.size);
613
- /** @type {?} */
614
- let fileData = selectedFile.slice(chunkIndex * this.bufferSize, nextSize);
615
- /** @type {?} */
616
- let multiRequest = new MultiUploadRequest;
617
- multiRequest.metadataId = uuid;
618
- multiRequest.rootId = this.rootId;
619
- multiRequest.uploadId = uploadId;
620
- multiRequest.index = chunkIndex;
621
- multiRequest.total = chunkTotal;
622
- multiRequest.size = fileData.size;
623
- /** @type {?} */
624
- let formData = new FormData();
625
- formData.append('multiRequest', JSON.stringify(multiRequest));
626
- formData.append('file', fileData);
627
- this.multiUpload(formData).subscribe((/**
628
- * @param {?} res
629
- * @return {?}
630
- */
631
- res => {
632
- if (res.error != null) {
633
- this.files[this.files.indexOf(fileInfo)].uploadResult = false;
634
- this.files[this.files.indexOf(fileInfo)].isUploading = false;
635
- this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
636
- }
637
- else {
638
- multiResultList.push(res.result);
639
- this.uploadedChunk[uuid]++;
640
- this.files[this.files.indexOf(fileInfo)].uploadProcess = Number.parseInt((this.uploadedChunk[uuid] / this.fileTotalChunk[uuid] * 100).toFixed(0));
641
- if (this.uploadedChunk[uuid] == this.fileTotalChunk[uuid]) {
642
- if (multiResultList.length == this.fileTotalChunk[uuid]) {
643
- /** @type {?} */
644
- let completeMultiUploadRequest = new CompleteMultiUploadRequest;
645
- completeMultiUploadRequest.metadataId = uuid;
646
- completeMultiUploadRequest.partList = multiResultList;
647
- completeMultiUploadRequest.rootId = this.rootId;
648
- completeMultiUploadRequest.uploadId = uploadId;
649
- completeMultiUploadRequest.size = fileInfo.fileSize;
650
- if (this.haveExtensionProperty)
651
- completeMultiUploadRequest.exPropertyName = this.defaultPropertyName;
652
- this.completeMultiUpload(completeMultiUploadRequest).subscribe((/**
653
- * @param {?} res
654
- * @return {?}
655
- */
656
- res => {
657
- if (res.status != 200) {
658
- this.files[this.files.indexOf(fileInfo)].uploadResult = false;
659
- this.files[this.files.indexOf(fileInfo)].isUploading = false;
660
- this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
661
- }
662
- else {
663
- this.files[this.files.indexOf(fileInfo)].uploadResult = true;
664
- this.files[this.files.indexOf(fileInfo)].isUploading = false;
665
- this.uploadFileInfoList = this.uploadFileInfoList.concat(uploadFileInfo);
666
- this.uploadedFileInfoList = this.uploadedFileInfoList.concat(uploadFileInfo);
667
- this.uploadedFileTotal++;
668
- }
669
- }));
670
- //后台异步拼接文档
671
- }
672
- else {
673
- this.files[this.files.indexOf(fileInfo)].uploadResult = false;
674
- this.files[this.files.indexOf(fileInfo)].isUploading = false;
675
- this.files[this.files.indexOf(fileInfo)].errorMessage = this.localepipe.transform('mismatchChunkSize');
676
- }
677
- }
678
- }
679
- }));
680
- chunkIndex = chunkIndex + 1;
681
- }
682
- }
683
- }));
684
- }
685
- else {
686
- /** @type {?} */
687
- let entity = new GspFormStreamEntity;
688
- entity.formId = this.formId;
689
- entity.metadataId = uuid;
690
- entity.mode = OperatingModes.Temp;
691
- entity.rootId = this.rootId;
692
- entity.size = selectedFile.size;
693
- entity.fileName = fileName;
694
- if (this.haveExtensionProperty)
695
- entity.exPropertyName = this.defaultPropertyName;
696
- /** @type {?} */
697
- let formData = new FormData();
698
- formData.append('uploadEntity', JSON.stringify(entity));
699
- formData.append('file', selectedFile);
700
- /** @type {?} */
701
- let intervalId;
702
- this.uploadSingleFile(formData).subscribe((/**
703
- * @param {?} res
704
- * @return {?}
705
- */
706
- res => {
707
- if (res != null) {
708
- this.files[this.files.indexOf(fileInfo)].uploadResult = false;
709
- this.files[this.files.indexOf(fileInfo)].isUploading = false;
710
- this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
711
- }
712
- else {
713
- this.files[this.files.indexOf(fileInfo)].uploadResult = true;
714
- this.files[this.files.indexOf(fileInfo)].isUploading = false;
715
- this.uploadFileInfoList = this.uploadFileInfoList.concat(uploadFileInfo);
716
- this.uploadedFileInfoList = this.uploadedFileInfoList.concat(uploadFileInfo);
717
- this.uploadedFileTotal++;
718
- }
719
- clearInterval(intervalId);
720
- }));
721
- /** @type {?} */
722
- let index = -1;
723
- this.files.forEach((/**
724
- * @param {?} x
725
- * @return {?}
726
- */
727
- x => {
728
- if (x.name == fileInfo.name) {
729
- if (index == -1)
730
- index = this.files.indexOf(x);
731
- }
732
- }));
733
- if (index != -1 && index != this.files.length - 1) {
734
- this.files.splice(index, 1);
735
- this.uploadFileInfoList.splice(index, 1);
736
- this.uploadedFileInfoList.splice(index, 1);
737
- this.uploadedFileTotal--;
738
- }
739
- intervalId = setInterval((/**
740
- * @return {?}
741
- */
742
- () => {
743
- this.getUploadProcess(entity.metadataId).subscribe((/**
744
- * @param {?} res
745
- * @return {?}
746
- */
747
- res => {
748
- if (res.error != null)
749
- this.files[this.files.indexOf(fileInfo)].uploadProcess = 10;
750
- else {
751
- if (res < 10)
752
- res = 10;
753
- if (res > 90)
754
- res = 90;
755
- this.files[this.files.indexOf(fileInfo)].uploadProcess = res;
756
- }
757
- }));
758
- }), 200);
759
- }
760
- }
761
- /**
762
- * @param {?} metadataId
763
- * @return {?}
764
- */
765
- getUploadProcess(metadataId) {
766
- /** @type {?} */
767
- let url = "/api/runtime/dfs/v1.0/formdoc/upload/process?metadataid=" + metadataId;
768
- return this.httpclient.get(url).pipe(tap((/**
769
- * @param {?} res
770
- * @return {?}
771
- */
772
- res => { })), catchError((/**
773
- * @param {?} error
774
- * @return {?}
775
- */
776
- (error) => {
777
- return of(error);
778
- })));
779
- }
780
- /**
781
- * @param {?} formdata
782
- * @return {?}
783
- */
784
- uploadSingleFile(formdata) {
785
- /** @type {?} */
786
- let url = "/api/runtime/dfs/v1.0/formdoc/single";
787
- /** @type {?} */
788
- const baseUrl = BasePathService.convertPath(url);
789
- return this.httpclient.post(baseUrl, formdata).pipe(tap((/**
790
- * @param {?} res
791
- * @return {?}
792
- */
793
- res => { })), catchError((/**
794
- * @param {?} error
795
- * @return {?}
796
- */
797
- (error) => {
798
- return of(error);
799
- })));
800
- }
801
- /**
802
- * @param {?} formdata
803
- * @return {?}
804
- */
805
- uploadSliceFile(formdata) {
806
- /** @type {?} */
807
- let url = "/api/runtime/dfs/v1.0/formdoc/slice";
808
- /** @type {?} */
809
- const baseUrl = BasePathService.convertPath(url);
810
- return this.httpclient.post(baseUrl, formdata).pipe(tap((/**
811
- * @param {?} res
812
- * @return {?}
813
- */
814
- res => { })), catchError((/**
815
- * @param {?} error
816
- * @return {?}
817
- */
818
- (error) => {
819
- return of(error);
820
- })));
821
- }
822
- /**
823
- * @param {?} request
824
- * @return {?}
825
- */
826
- initMultiUpload(request) {
827
- /** @type {?} */
828
- let url = "/api/runtime/dfs/v1.0/formdoc/multi/init";
829
- /** @type {?} */
830
- const baseUrl = BasePathService.convertPath(url);
831
- return this.httpclient.post(baseUrl, request).pipe(tap((/**
832
- * @param {?} res
833
- * @return {?}
834
- */
835
- res => { })), catchError((/**
836
- * @param {?} error
837
- * @return {?}
838
- */
839
- (error) => {
840
- return of(error);
841
- })));
842
- }
843
- /**
844
- * @param {?} formdata
845
- * @return {?}
846
- */
847
- multiUpload(formdata) {
848
- /** @type {?} */
849
- let url = "/api/runtime/dfs/v1.0/formdoc/multi/upload";
850
- /** @type {?} */
851
- const baseUrl = BasePathService.convertPath(url);
852
- return this.httpclient.post(baseUrl, formdata).pipe(tap((/**
853
- * @param {?} res
854
- * @return {?}
855
- */
856
- res => { })), catchError((/**
857
- * @param {?} error
858
- * @return {?}
859
- */
860
- (error) => {
861
- return of(error);
862
- })));
863
- }
864
- /**
865
- * @param {?} request
866
- * @return {?}
867
- */
868
- completeMultiUpload(request) {
869
- /** @type {?} */
870
- let url = "/api/runtime/dfs/v1.0/formdoc/multi/complete";
871
- /** @type {?} */
872
- const baseUrl = BasePathService.convertPath(url);
873
- return this.httpclient.post(baseUrl, request).pipe(tap((/**
874
- * @param {?} res
875
- * @return {?}
876
- */
877
- res => { })), catchError((/**
878
- * @param {?} error
879
- * @return {?}
880
- */
881
- (error) => {
882
- return of(error);
883
- })));
884
- }
885
- /**
886
- * @return {?}
887
- */
888
- selectAllFile() {
889
- if (!this.fileAllSelected) {
890
- this.files.forEach((/**
891
- * @param {?} element
892
- * @return {?}
893
- */
894
- element => {
895
- element.selectd = true;
896
- }));
897
- this.fileAllSelected = true;
898
- this.selectedFileCount = this.files.length;
899
- }
900
- else {
901
- this.files.forEach((/**
902
- * @param {?} element
903
- * @return {?}
904
- */
905
- element => {
906
- element.selectd = false;
907
- }));
908
- this.fileAllSelected = false;
909
- this.selectedFileCount = 0;
910
- }
911
- }
912
- /**
913
- * @param {?} file
914
- * @return {?}
915
- */
916
- checkoutSelectFile(file) {
917
- // let obj: any = document.getElementById(fileName);
918
- file.selectd = !file.selectd;
919
- if (file.selectd)
920
- this.selectedFileCount++;
921
- else
922
- this.selectedFileCount--;
923
- if (this.selectedFileCount == this.files.length) {
924
- this.fileAllSelected = true;
925
- //this.isFileAllSelected();
926
- }
927
- else {
928
- this.fileAllSelected = false;
929
- //this.isFileAllSelected();
930
- }
931
- }
932
- /**
933
- * @param {?} fileInfo
934
- * @return {?}
935
- */
936
- listDeleteFile(fileInfo) {
937
- if (fileInfo.selectd)
938
- this.selectedFileCount--;
939
- //console.log(fileName);
940
- this.files.splice(this.files.indexOf(fileInfo), 1);
941
- if (fileInfo.uploadResult) {
942
- /** @type {?} */
943
- let idList = [];
944
- idList.push(fileInfo.id);
945
- this.uploadService.cancel(idList, this.rootId).subscribe();
946
- this.uploadFileInfoList.splice(this.uploadFileInfoList.indexOf(this.uploadFileInfoList.filter((/**
947
- * @param {?} x
948
- * @return {?}
949
- */
950
- x => x.fileName == fileInfo.name))[0]), 1);
951
- this.uploadedFileInfoList.splice(this.uploadedFileInfoList.indexOf(this.uploadedFileInfoList.filter((/**
952
- * @param {?} x
953
- * @return {?}
954
- */
955
- x => x.fileName == fileInfo.name))[0]), 1);
956
- this.uploadedFileTotal--;
957
- }
958
- if (this.selectedFileCount == 0)
959
- this.fileAllSelected = false;
960
- }
961
- /**
962
- * @return {?}
963
- */
964
- listMultipleDeleteFile() {
965
- /** @type {?} */
966
- let selectedFile = [];
967
- this.files.forEach((/**
968
- * @param {?} element
969
- * @return {?}
970
- */
971
- element => {
972
- /** @type {?} */
973
- let obj = document.getElementById(element.name);
974
- if (obj.checked)
975
- selectedFile.push(element);
976
- }));
977
- /** @type {?} */
978
- let metadataList = [];
979
- selectedFile.forEach((/**
980
- * @param {?} element
981
- * @return {?}
982
- */
983
- element => {
984
- metadataList.push(element.id);
985
- this.files.splice(this.files.indexOf(element), 1);
986
- if (element.uploadResult) {
987
- this.uploadFileInfoList.splice(this.uploadFileInfoList.indexOf(this.uploadFileInfoList.filter((/**
988
- * @param {?} x
989
- * @return {?}
990
- */
991
- x => x.fileName == element.name))[0]), 1);
992
- this.uploadedFileInfoList.splice(this.uploadedFileInfoList.indexOf(this.uploadedFileInfoList.filter((/**
993
- * @param {?} x
994
- * @return {?}
995
- */
996
- x => x.fileName == element.name))[0]), 1);
997
- this.uploadedFileTotal--;
998
- }
999
- }));
1000
- this.uploadService.cancel(metadataList, this.rootId).subscribe();
1001
- /** @type {?} */
1002
- let allBox = document.getElementById("allCheckBox");
1003
- if (allBox != null)
1004
- allBox.checked = false;
1005
- this.selectedFileCount = 0;
1006
- this.fileAllSelected = false;
1007
- }
1008
- /**
1009
- * @param {?} fileName
1010
- * @return {?}
1011
- */
1012
- getPicListDisplayName(fileName) {
1013
- if (fileName.length <= 10)
1014
- return fileName;
1015
- else {
1016
- /** @type {?} */
1017
- let headContent = fileName.substring(0, 2);
1018
- /** @type {?} */
1019
- let tailContent = fileName.substring(fileName.lastIndexOf('.') - 2);
1020
- return headContent + "…" + tailContent;
1021
- }
1022
- }
1023
- /**
1024
- * @param {?} fileName
1025
- * @return {?}
1026
- */
1027
- getQueueDisplayName(fileName) {
1028
- return fileName;
1029
- }
1030
- /**
1031
- * @param {?} selectdFile
1032
- * @param {?} fileInfo
1033
- * @param {?} docType
1034
- * @return {?}
1035
- */
1036
- addDocInfo(selectdFile, fileInfo, docType) {
1037
- switch (docType) {
1038
- case DocType.Word: {
1039
- fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/word.png");
1040
- this.files.push(fileInfo);
1041
- break;
1042
- }
1043
- case DocType.Pdf: {
1044
- fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/pdf.png");
1045
- this.files.push(fileInfo);
1046
- break;
1047
- }
1048
- case DocType.Excel: {
1049
- fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/excel.png");
1050
- this.files.push(fileInfo);
1051
- break;
1052
- }
1053
- case DocType.Txt: {
1054
- fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/txt.png");
1055
- this.files.push(fileInfo);
1056
- break;
1057
- }
1058
- case DocType.Zip: {
1059
- fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/zip.png");
1060
- this.files.push(fileInfo);
1061
- break;
1062
- }
1063
- case DocType.Powerpoint: {
1064
- fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/ppt.png");
1065
- this.files.push(fileInfo);
1066
- break;
1067
- }
1068
- case DocType.Other: {
1069
- fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/file.png");
1070
- this.files.push(fileInfo);
1071
- break;
1072
- }
1073
- case DocType.Image: {
1074
- /** @type {?} */
1075
- let reader = new FileReader();
1076
- reader.readAsDataURL(selectdFile);
1077
- reader.onload = (/**
1078
- * @param {?} _event
1079
- * @return {?}
1080
- */
1081
- (_event) => {
1082
- /** @type {?} */
1083
- let imgUrl = reader.result;
1084
- if (this.injector != null) {
1085
- /** @type {?} */
1086
- let sanitizer = this.injector.get(DomSanitizer);
1087
- imgUrl = sanitizer.bypassSecurityTrustResourceUrl(imgUrl);
1088
- }
1089
- fileInfo.source = imgUrl;
1090
- fileInfo.style = { "max-width": "120px", "max-height": "118px" };
1091
- this.files.push(fileInfo);
1092
- //因为异步处理的差异,补偿一次删除
1093
- /** @type {?} */
1094
- let index = -1;
1095
- this.files.forEach((/**
1096
- * @param {?} x
1097
- * @return {?}
1098
- */
1099
- x => {
1100
- if (x.name == fileInfo.name) {
1101
- if (index == -1)
1102
- index = this.files.indexOf(x);
1103
- }
1104
- }));
1105
- if (index != -1 && index != this.files.length - 1) {
1106
- this.files.splice(index, 1);
1107
- this.uploadFileInfoList.splice(index, 1);
1108
- this.uploadedFileInfoList.splice(index, 1);
1109
- }
1110
- });
1111
- }
1112
- }
1113
- }
1114
- /**
1115
- * @param {?} strList
1116
- * @return {?}
1117
- */
1118
- listToString(strList) {
1119
- /** @type {?} */
1120
- const result = strList.filter((/**
1121
- * @param {?} item
1122
- * @return {?}
1123
- */
1124
- item => item.trim() !== ''));
1125
- /** @type {?} */
1126
- let name = "";
1127
- for (let i = 0; i < result.length; i++) {
1128
- name += result[i] + (i === result.length - 1 ? "" : ",");
1129
- }
1130
- return name;
1131
- }
1132
- /**
1133
- * @param {?} $event
1134
- * @param {?} file
1135
- * @return {?}
1136
- */
1137
- securityChange($event, file) {
1138
- file.securityInfo = $event.data;
1139
- /** @type {?} */
1140
- let uploadFile = this.uploadFileInfoList.filter((/**
1141
- * @param {?} x
1142
- * @return {?}
1143
- */
1144
- x => x.metadataId = file.id))[0];
1145
- uploadFile.securityInfo = $event.data;
1146
- }
1147
- /**
1148
- * @param {?} $event
1149
- * @param {?} file
1150
- * @return {?}
1151
- */
1152
- typeChange($event, file) {
1153
- file.extensionName = $event.data.name;
1154
- /** @type {?} */
1155
- let exStorageFileInfo = new ExStorageFileInfo;
1156
- if (file.extensionName == this.storageExtension.defaultPropertyName) {
1157
- if (this.exStorageFileList.filter((/**
1158
- * @param {?} x
1159
- * @return {?}
1160
- */
1161
- x => x.metadataId == file.id)).length > 0)
1162
- this.exStorageFileList.splice(this.exStorageFileList.findIndex((/**
1163
- * @param {?} x
1164
- * @return {?}
1165
- */
1166
- x => x.metadataId == file.id)), 1);
1167
- }
1168
- else {
1169
- if (this.exStorageFileList.filter((/**
1170
- * @param {?} x
1171
- * @return {?}
1172
- */
1173
- x => x.metadataId == file.id)).length > 0) {
1174
- exStorageFileInfo = this.exStorageFileList.filter((/**
1175
- * @param {?} x
1176
- * @return {?}
1177
- */
1178
- x => x.metadataId == file.id))[0];
1179
- exStorageFileInfo.exPropertyName = file.extensionName;
1180
- }
1181
- else {
1182
- exStorageFileInfo.metadataId = file.id;
1183
- exStorageFileInfo.exPropertyName = file.extensionName;
1184
- this.exStorageFileList.push(exStorageFileInfo);
1185
- }
1186
- }
1187
- }
1188
- /**
1189
- * @return {?}
1190
- */
1191
- upload() {
1192
- if (this.uploadedFileTotal != this.files.filter((/**
1193
- * @param {?} x
1194
- * @return {?}
1195
- */
1196
- x => x.isUploading || x.uploadResult)).length) {
1197
- this.msgService.warning(this.localepipe.transform('wait'));
1198
- return of(false);
1199
- }
1200
- if (this.haveSecurityInfo) {
1201
- this.uploadService.saveSecurityInfo(this.uploadFileInfoList, this.rootId).subscribe();
1202
- }
1203
- if (this.storageExtension == null)
1204
- return of(this.uploadFileInfoList);
1205
- else {
1206
- if (this.exStorageFileList.length == 0)
1207
- return of(this.uploadFileInfoList);
1208
- else {
1209
- /** @type {?} */
1210
- const loading = this.loadService.show({
1211
- message: this.localepipe.transform('saveTo') + this.storageExtension.extensionName
1212
- });
1213
- return this.uploadService.changeStorageInstance(this.exStorageFileList, this.rootId).pipe(map((/**
1214
- * @param {?} res
1215
- * @return {?}
1216
- */
1217
- res => {
1218
- // if (res != null)
1219
- // this.msgService.error('保存到' + this.storageExtension.extensionName + "失败,上传文件自动保存到" + this.storageExtension.defaultPropertyName + "存储。" + res.error.Message);
1220
- loading.close();
1221
- return this.uploadFileInfoList;
1222
- })));
1223
- }
1224
- }
1225
- }
1226
- /**
1227
- * @return {?}
1228
- */
1229
- cancel() {
1230
- if (this.uploadFileInfoList.length == 0)
1231
- return;
1232
- this.uploadFileInfoList.forEach((/**
1233
- * @param {?} element
1234
- * @return {?}
1235
- */
1236
- element => {
1237
- this.metadataIdList.push(element.metadataId);
1238
- }));
1239
- this.uploadService.cancel(this.metadataIdList, this.rootId).subscribe();
1240
- }
1241
- /**
1242
- * @return {?}
1243
- */
1244
- getUploadFileInfoList() {
1245
- return this.uploadFileInfoList;
1246
- }
1247
- /**
1248
- * @param {?} file
1249
- * @return {?}
1250
- */
1251
- delete(file) {
1252
- this.files.splice(this.files.indexOf(file), 1);
1253
- if (file.uploadResult)
1254
- this.uploadedFileTotal--;
1255
- if (this.exStorageFileList.filter((/**
1256
- * @param {?} x
1257
- * @return {?}
1258
- */
1259
- x => x.metadataId == file.id)).length > 0) {
1260
- this.exStorageFileList.splice(this.exStorageFileList.findIndex((/**
1261
- * @param {?} x
1262
- * @return {?}
1263
- */
1264
- x => x.metadataId == file.id)), 1);
1265
- }
1266
- }
1267
- /**
1268
- * @param {?} size
1269
- * @return {?}
1270
- */
1271
- getFileSize(size) {
1272
- if (size < 102400)
1273
- return (size / 1024).toFixed(1) + "K";
1274
- else if (size < 1024 * 1024)
1275
- return (size / 1024).toFixed(0) + "K";
1276
- else if (size < 100 * 1024 * 1024)
1277
- return (size / 1024 / 1024).toFixed(1) + "M";
1278
- else if (size < 1024 * 1024 * 1024)
1279
- return (size / 1024 / 1024).toFixed(0) + "M";
1280
- else
1281
- return (size / 1024 / 1024 / 1024).toFixed(1) + "G";
1282
- }
1283
- /**
1284
- * @return {?}
1285
- */
1286
- showByGroup() {
1287
- this.showType = 0;
1288
- // this.selectedFileCount = 0;
1289
- }
1290
- /**
1291
- * @return {?}
1292
- */
1293
- showByList() {
1294
- this.showType = 1;
1295
- // this.selectedFileCount = 0;
1296
- if (this.selectedFileCount != 0 && this.selectedFileCount == this.files.length) {
1297
- this.fileAllSelected = true;
1298
- }
1299
- }
1300
- /**
1301
- * @param {?} file
1302
- * @return {?}
1303
- */
1304
- mouseOver(file) {
1305
- file.mouseOn = true;
1306
- }
1307
- /**
1308
- * @param {?} file
1309
- * @return {?}
1310
- */
1311
- mouseOut(file) {
1312
- file.mouseOn = false;
1313
- }
1314
- /**
1315
- * @param {?} oldUrl
1316
- * @return {?}
1317
- */
1318
- createBaseUrl(oldUrl) {
1319
- /** @type {?} */
1320
- const baseUrl = BasePathService.convertPath(oldUrl);
1321
- return baseUrl;
1322
- }
1323
- }
1324
- FileUploadComponent.decorators = [
1325
- { type: Component, args: [{
1326
- selector: 'app-file-upload',
1327
- template: "<div *ngIf=\"hasSelectedFile\">\r\n\r\n <div class=\"farris-header\" style=\"height: 50px; width: 100%\">\r\n <div class=\"btn btn-secondary upload_button\">\r\n <img [src]=\"uploadLittleIconAddress\">\r\n <span>{{'uploadFile' | locale}} </span>\r\n <input type=\"file\" (focus)=\"showLoading()\" (change)=\"fileSelected($event)\" id=\"file\" multiple=\"multiple\"\r\n title=\"\" [accept]=\"fileType\" [disabled]=\"uploadBtnDisabled\">\r\n </div>\r\n\r\n\r\n <button *ngIf=\"showType==0 && !fileAllSelected && files.length >0 \" style=\"padding-left: 20px\"\r\n class=\"btn-link btn ng-star-inserted\" (click)=\"selectAllFile()\">{{'selectAll' | locale}}</button>\r\n <button *ngIf=\"showType==0 && fileAllSelected && files.length >0 \" style=\"padding-left: 20px\"\r\n class=\"btn-link btn ng-star-inserted\" (click)=\"selectAllFile()\">{{'selectNull' | locale}}</button>\r\n <button *ngIf=\"showType==0 && selectedFileCount>0\" style=\"padding-left: 20px\"\r\n class=\"btn-link btn ng-star-inserted\" (click)=\"listMultipleDeleteFile()\">{{'delete' | locale}}</button>\r\n\r\n <button *ngIf=\"showType==1 && selectedFileCount>0\" style=\"padding-left: 20px\"\r\n class=\"btn-link btn ng-star-inserted\" (click)=\"listMultipleDeleteFile()\">{{'delete' | locale}}</button>\r\n <span class=\"help_text\" *ngIf=\"files.length >0\">\u6587\u4EF6\u4E2A\u6570\uFF1A{{files.length}}</span>\r\n\r\n <farris-radio-group class=\"button_group_upload\" [(model)]=\"radioButtonGroupValue\" [horizontal]=\"false\">\r\n <farris-radio-button [label]=\"'showByGroup'\" (click)=\"showByGroup()\">\r\n <span class=\"f-icon f-icon-sudoku-new\"> </span>\r\n </farris-radio-button>\r\n <farris-radio-button [label]=\"'showByList'\" (click)=\"showByList()\">\r\n <span class=\"f-icon f-icon-page-title-define\"> </span>\r\n </farris-radio-button>\r\n\r\n </farris-radio-group>\r\n\r\n <!-- <kendo-buttongroup [selection]=\"'single'\" class=\"button_group_upload \"\r\n style=\"background-color: #ffffff; color: #388FFF;border: 1px solid #ddd;\" look=\"flat\">\r\n <button kendoButton [selected]=\"true\" [toggleable]=\"true\"\r\n [imageUrl]=\"'/platform/runtime/dfs/images/piclist.png'\" (click)=\"showByGroup()\"></button>\r\n <button kendoButton [toggleable]=\"true\" [imageUrl]=\"'/platform/runtime/dfs/images/queuelist.png'\"\r\n (click)=\"showByList()\"></button>\r\n </kendo-buttongroup> -->\r\n\r\n\r\n </div>\r\n\r\n <!-- <div class=\"progress\" style=\"height: 12px;\">\r\n <div class=\"progress-bar\" role=\"progressbar\" [ngStyle]=\"uploadProcess\"></div>\r\n </div> -->\r\n\r\n <div class=\"pic_list\" *ngIf=\"showType==0\">\r\n <ul *ngFor=\"let file of files\">\r\n <li (mouseenter)=\"mouseOver(file)\" (mouseleave)=\"mouseOut(file)\">\r\n <div *ngIf=\"file.isUploading\">\r\n <farris-progress [type]=\"'circle'\" [percent]=\"file.uploadProcess\" [strokeLinecap]=\"'square'\"\r\n [status]=\"'active'\"></farris-progress>\r\n </div>\r\n\r\n <table *ngIf=\"!file.uploadResult && !file.isUploading\"\r\n style=\"margin: 0 auto; border: 1px solid #ddd; width: 135px; height: 160px;\">\r\n <tr style=\"margin: 0 auto ; height: 80px;\">\r\n <td style=\"text-align: center\"><span class=\"f-icon f-icon-warn\"></span></td>\r\n </tr>\r\n <tr style=\"margin: 0 auto ; height: 30px;\">\r\n <td style=\"text-align: center\"> {{'uploadFailure' | locale}} </td>\r\n </tr>\r\n <tr>\r\n <td style=\"text-align: center\"><button style=\"margin: 0 auto ; height: 20px; \"\r\n class=\"btn-link btn ng-star-inserted\" (click)=\"showErrorMessage(file)\">{{'detail' |\r\n locale}}</button></td>\r\n </tr>\r\n </table>\r\n <div *ngIf=\"!file.isUploading && file.uploadResult\" style=\"border: 1px solid #ddd;\">\r\n <img [src]='file.source' [ngStyle]=\"file.style\">\r\n <div *ngIf=\"haveExtensionProperty\"\r\n style=\"width: 133px; height: 25px; background-color: white; position: absolute;bottom: 0; \">\r\n\r\n <div style=\"width: 100px;height: 25px;position:absolute;margin: 0 17px;\">\r\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"propertiesNames\"\r\n [idField]=\"'id'\" [textField]=\"'name'\" (selectChange)=\"typeChange($event,file)\"\r\n [enableClear]=\"false\">\r\n <!-- <ng-template #itemTemp let-item>\r\n <div class=\"combo-list\">\r\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\r\n <span class=\"combo-list-label\">{{item.label}}</span>\r\n </div>\r\n </ng-template> -->\r\n </farris-combo-list>\r\n </div>\r\n </div>\r\n <div *ngIf=\"haveSecurityInfo\"\r\n style=\"width: 133px; height: 25px; background-color: white; position: absolute;bottom: 0; \">\r\n\r\n <div style=\"width: 100px;height: 25px;position:absolute;margin: 0 17px;\">\r\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"securityInfoList\"\r\n [idField]=\"'id'\" [textField]=\"'name'\" (selectChange)=\"securityChange($event,file)\"\r\n [enableClear]=\"false\">\r\n <!-- <ng-template #itemTemp let-item>\r\n <div class=\"combo-list\">\r\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\r\n <span class=\"combo-list-label\">{{item.label}}</span>\r\n </div>\r\n </ng-template> -->\r\n </farris-combo-list>\r\n </div>\r\n </div>\r\n </div>\r\n <table *ngIf=\"!file.isUploading\">\r\n <tr style=\"height: 20px\">\r\n <td style=\"width: 15px; vertical-align: middle; text-align: center\">\r\n <!-- <input type=\"checkbox\" [id]=\"file.name\" (click)=\"checkoutSelectFile(file.name)\"> -->\r\n <div class=\"farris-input-wrap\" style=\"height: 20px\" (click)=\"checkoutSelectFile(file)\">\r\n <div class=\"custom-control custom-checkbox\" style=\"margin: 4px 0 0;height: 20px;\"\r\n [ngStyle]=\"checkboxPos\">\r\n <input class=\"custom-control-input\" type=\"checkbox\" [id]=\"file.name\"\r\n [(ngModel)]=\"file.selectd\">\r\n <label class=\"custom-control-label\"\r\n style=\"padding: 0 0 10px 0; position: relative; top: -8px;\"></label>\r\n </div>\r\n </div>\r\n </td>\r\n <td style=\"width: 120px; vertical-align: middle; text-align: center\" [title]=\"file.name\">\r\n {{file.picListDisplayName}}</td>\r\n </tr>\r\n </table>\r\n <!-- <span>{{file.picListDisplayName}}</span> -->\r\n <!-- <p class=\"filename\">{{file.picListDisplayName}}</p> -->\r\n <button *ngIf=\"!file.isUploading && file.mouseOn\"\r\n style=\"position: absolute; top: 0; right: 0px; width: 24px; height: 24px; border: none;\"\r\n (click)=\"listDeleteFile(file)\">\r\n <span style=\"position: relative; right: 2px; \" class=\"f-icon f-icon-delete\"> </span>\r\n </button>\r\n <!-- <button *ngIf=\"file.hasUploaded\" class=\"k-primary\" kendoButton [icon]=\"'check'\" [disabled]=\"true\"></button> -->\r\n </li>\r\n </ul>\r\n <br>\r\n </div>\r\n\r\n <div class=\"queue_list\" *ngIf=\"showType==1\">\r\n <table>\r\n <tr style=\"height: 50px; table-layout:fixed;\">\r\n <th style=\"width: 40px; vertical-align: middle; text-align: center\">\r\n <!-- <input type=\"checkbox\" id=\"allCheckBox\" (click)=\"selectAllFile()\"> -->\r\n <div class=\"farris-input-wrap\" (click)=\"selectAllFile()\">\r\n <div class=\"custom-control custom-checkbox\" style=\"margin: 4px 0 0\">\r\n <input class=\"custom-control-input\" type=\"checkbox\" id=\"allCheckBox\"\r\n [(ngModel)]=\"fileAllSelected\">\r\n <label class=\"custom-control-label\" style=\"padding: 0\"></label>\r\n </div>\r\n </div>\r\n </th>\r\n <th style=\"vertical-align: middle\" [ngStyle]=\"queueListStyle\">{{'fileName' | locale}}</th>\r\n <th style=\"width: 100px; vertical-align: middle\">{{'size' | locale}}</th>\r\n <th style=\"width: 170px; vertical-align: middle; text-align: center\">{{'state' | locale}}</th>\r\n <th *ngIf=\"haveExtensionProperty\" style=\"width: 100px; vertical-align: middle; text-align: center\">\r\n {{storageExtension.extensionName}}\r\n </th>\r\n <th style=\"width: 140px; vertical-align: middle; text-align: center\">{{'operation' | locale}}</th>\r\n </tr>\r\n </table>\r\n <div style=\"height: 370px; overflow: auto;\">\r\n <table>\r\n <tr *ngFor=\"let file of files\" style=\"height: 40px\">\r\n <td colspan=\"5\" *ngIf=\"file.isUploading\">\r\n <!-- <div style=\"width:100%; display: table-cell; vertical-align: middle; text-align: center; \"> -->\r\n <div style=\"width: 500px;margin:0 auto\">\r\n <farris-progress [percent]=\"file.uploadProcess\" [status]=\"'active'\">\r\n </farris-progress>\r\n </div>\r\n\r\n </td>\r\n <td *ngIf=\"!file.isUploading\" style=\" width: 40px; vertical-align: middle; text-align: center\">\r\n <!-- <input type=\"checkbox\" [id]=\"file.name\" (click)=\"checkoutSelectFile(file.name)\"> -->\r\n <div class=\"farris-input-wrap\" (click)=\"checkoutSelectFile(file)\">\r\n <div class=\"custom-control custom-checkbox\" style=\"margin: 4px 0 0\">\r\n <input class=\"custom-control-input\" type=\"checkbox\" [id]=\"file.name\"\r\n [(ngModel)]=\"file.selectd\">\r\n <label class=\"custom-control-label\" style=\"padding: 0\"></label>\r\n </div>\r\n </div>\r\n </td>\r\n <td *ngIf=\"!file.isUploading\" style=\"vertical-align: middle\" [ngStyle]=\"queueListStyle\">\r\n {{file.queueListDisplayName}}</td>\r\n <td *ngIf=\"!file.isUploading\" style=\"width: 100px; vertical-align: middle\">{{file.size}}</td>\r\n <td *ngIf=\"!file.isUploading\" style=\"text-align: center; width: 170px; vertical-align: middle;\">\r\n <table *ngIf=\"!file.uploadResult\" style=\"margin: 0 auto\">\r\n <tr style=\"margin: 0 auto\">\r\n <td><span class=\"f-icon f-icon-error\"></span></td>\r\n <td> {{'uploadFailure' | locale}} </td>\r\n <td><button style=\"height: 24px\" class=\"btn-link btn ng-star-inserted\"\r\n (click)=\"showErrorMessage(file)\">{{'detail' | locale}}</button></td>\r\n </tr>\r\n </table>\r\n <!-- <span *ngIf=\"!file.uploadResult\"><span class=\"f-icon f-icon-error\"></span> \u4E0A\u4F20\u5931\u8D25 <button\r\n class=\"btn-link btn ng-star-inserted\" (click)=\"showErrorMessage(file)\">\u8BE6\u60C5</button></span> -->\r\n <span *ngIf=\"file.uploadResult\"><span class=\"f-icon f-icon-success\"></span> {{'uploadSucceed' |\r\n locale}}</span>\r\n </td>\r\n <td *ngIf=\"!file.isUploading&&haveExtensionProperty\"\r\n style=\"text-align: center; width: 100px; vertical-align: middle;\">\r\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"propertiesNames\"\r\n [idField]=\"'id'\" [textField]=\"'name'\" (selectChange)=\"typeChange($event,file)\"\r\n [enableClear]=\"false\">\r\n <!-- <ng-template #itemTemp let-item>\r\n <div class=\"combo-list\">\r\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\r\n <span class=\"combo-list-label\">{{item.label}}</span>\r\n </div>\r\n </ng-template> -->\r\n </farris-combo-list>\r\n </td>\r\n <td *ngIf=\"!file.isUploading&&haveSecurityInfo\"\r\n style=\"text-align: center; width: 100px; vertical-align: middle;\">\r\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"securityInfoList\"\r\n [idField]=\"'id'\" [textField]=\"'name'\" (selectChange)=\"securityChange($event,file)\"\r\n [enableClear]=\"false\">\r\n <!-- <ng-template #itemTemp let-item>\r\n <div class=\"combo-list\">\r\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\r\n <span class=\"combo-list-label\">{{item.label}}</span>\r\n </div>\r\n </ng-template> -->\r\n </farris-combo-list>\r\n </td>\r\n\r\n <td *ngIf=\"!file.isUploading\" style=\"text-align: center; width: 140px; vertical-align: middle;\">\r\n <!-- <button *ngIf=\"file.uploadResult\" class=\"btn-link btn ng-star-inserted\" (click)=\"retryUploadFile(file.name)\">\u91CD\u8BD5</button> -->\r\n <button class=\"btn-link btn ng-star-inserted\" style=\"margin: 0 auto\"\r\n (click)=\"listDeleteFile(file)\">{{'delete' | locale}}</button>\r\n </td>\r\n\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!hasSelectedFile\" class='home_page'>\r\n <img [src]=\"uploadIconAddress\">\r\n <div>\r\n <span [class]=\"getRightClass()\">{{'uploadFile' | locale}} </span>\r\n <input type=\"file\" style=\"height: 32px;\" (change)=\"fileSelected($event)\" id=\"file\" multiple=\"multiple\" title=\"\" [accept]=\"fileType\" [disabled]=\"uploadBtnDisabled\">\r\n <!-- <input type=\"file\" (focus)=\"showLoading()\" (change)=\"fileSelected($event)\" id=\"file\" multiple=\"multiple\" title=\"\" [accept]=\"fileType\"> -->\r\n </div>\r\n</div>\r\n",
1328
- styles: [".home_page{text-align:center}.home_page img{position:absolute;top:180px;margin-left:-35px;width:70px;height:56px}.home_page div{position:absolute;left:50%;top:255px;margin-left:-75px;width:150px;height:32px;overflow:hidden}.home_page div span{width:150px;height:32px;position:absolute;z-index:10;left:0}.home_page div input{position:absolute;left:0;top:0;opacity:0;filter:'alpha(opacity=0)';z-index:11}.upload_button{width:110px;height:32px;overflow:hidden}.upload_button span{position:relative;right:-4px;top:4px;width:56px;height:22px;font-size:14px}.upload_button input{height:32px;width:110px;position:absolute;left:22px;top:12px;opacity:0;filter:'alpha(opacity=0)';overflow:hidden}.upload_button img{position:relative;left:-6px;top:3px;width:14px;height:14px}.button_group_upload{position:absolute;right:18px;top:12px;height:26px;width:90px}.button_group_upload button{height:26px;width:26px}.fileinput-button{position:absolute;right:60px;bottom:40px;overflow:hidden;width:24px;height:24px;border-radius:12px;transform:scale(2.5);-ms-transform:scale(2.5);-moz-transform:scale(2.5);-webkit-transform:scale(2.5);-o-transform:scale(2.5);color:#0686fd}.fileinput-button input{position:absolute;left:0;top:0;opacity:0;filter:'alpha(opacity=0)'}.pic-droplist{height:24px;color:#e0e1e2;background-color:#e0e1e2}.pic-droplist input-group{display:table-cell;width:100px;text-align:center;border:0}.pic-droplist input-group div{border:0}.pic-droplist input-group div div,.pic-droplist input-group div input{background-color:#e0e1e2}.pic_list{padding:0;height:400px;overflow-y:auto;overflow-x:hidden}.pic_list ul{padding:0;list-style:none;width:100%;margin:20px 0 0 20px}.pic_list ul li{height:179px;width:135px;margin:8px 0 8px 12px;float:left;overflow:hidden;align-items:center;position:relative}.pic_list ul li div{width:135px;height:159px;margin:auto;display:table-cell;vertical-align:middle;text-align:center;position:relative}.pic_list ul li div img{max-width:60px;max-height:60px;align-items:center;margin:auto;vertical-align:middle;text-align:center}.pic_list ul li span.filename{width:100px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.queue_list{display:block;height:420px;overflow-y:auto}.file_list{list-style:none;margin:0;padding:0;overflow-x:hidden;overflow-y:auto}.file_list li{height:50px;line-height:35px;font-size:16px;position:relative}.file_list li button{float:right;top:6px;right:10px;width:20px}.file_list li p.title{padding:0 0 0 6px;margin:0 210px 0 0}.file_list li p.size{position:absolute;width:100px;top:0;right:100px}input#file:disabled{cursor:not-allowed}.help_text{color:rgba(0,0,0,.35);position:absolute;top:16px;right:120px}"]
1329
- }] }
1330
- ];
1331
- /** @nocollapse */
1332
- FileUploadComponent.ctorParameters = () => [
1333
- { type: MessagerService },
1334
- { type: UploadService },
1335
- { type: LoadingService },
1336
- { type: Injector }
1337
- ];
1338
- FileUploadComponent.propDecorators = {
1339
- formId: [{ type: Input }],
1340
- rootId: [{ type: Input }],
1341
- fileType: [{ type: Input }],
1342
- fileCount: [{ type: Input }],
1343
- oldIdList: [{ type: Input }],
1344
- securityInfo: [{ type: Input }],
1345
- fileNameLength: [{ type: Input }],
1346
- opCell: [{ type: ViewChild, args: ['opCell',] }]
1347
- };
1348
- if (false) {
1349
- /** @type {?} */
1350
- FileUploadComponent.prototype.files;
1351
- /** @type {?} */
1352
- FileUploadComponent.prototype.metadataIdList;
1353
- /** @type {?} */
1354
- FileUploadComponent.prototype.uploadFileInfoList;
1355
- /** @type {?} */
1356
- FileUploadComponent.prototype.errFileList;
1357
- /** @type {?} */
1358
- FileUploadComponent.prototype.errTypeList;
1359
- /** @type {?} */
1360
- FileUploadComponent.prototype.nullFileList;
1361
- /** @type {?} */
1362
- FileUploadComponent.prototype.beyondFileList;
1363
- /** @type {?} */
1364
- FileUploadComponent.prototype.fileNameOversizeList;
1365
- /** @type {?} */
1366
- FileUploadComponent.prototype.invalidCharactersFileList;
1367
- /** @type {?} */
1368
- FileUploadComponent.prototype.invalidExtNamesFileList;
1369
- /** @type {?} */
1370
- FileUploadComponent.prototype.unrecognizedTypeFileList;
1371
- /** @type {?} */
1372
- FileUploadComponent.prototype.invalidCharacters;
1373
- /** @type {?} */
1374
- FileUploadComponent.prototype.invalidExtNames;
1375
- /** @type {?} */
1376
- FileUploadComponent.prototype.showType;
1377
- /** @type {?} */
1378
- FileUploadComponent.prototype.mouseOn;
1379
- /** @type {?} */
1380
- FileUploadComponent.prototype.isWhiteList;
1381
- /** @type {?} */
1382
- FileUploadComponent.prototype.bufferSize;
1383
- /** @type {?} */
1384
- FileUploadComponent.prototype.selectedFiles;
1385
- /** @type {?} */
1386
- FileUploadComponent.prototype.radioButtonGroupValue;
1387
- /** @type {?} */
1388
- FileUploadComponent.prototype.selectedFileCount;
1389
- /** @type {?} */
1390
- FileUploadComponent.prototype.uploadBtnDisabled;
1391
- /** @type {?} */
1392
- FileUploadComponent.prototype.uploadIconAddress;
1393
- /** @type {?} */
1394
- FileUploadComponent.prototype.uploadLittleIconAddress;
1395
- /** @type {?} */
1396
- FileUploadComponent.prototype.hasSelectedFile;
1397
- /** @type {?} */
1398
- FileUploadComponent.prototype.fileAllSelected;
1399
- /** @type {?} */
1400
- FileUploadComponent.prototype.uploadProcess;
1401
- /** @type {?} */
1402
- FileUploadComponent.prototype.fileTotalChunk;
1403
- /** @type {?} */
1404
- FileUploadComponent.prototype.requestArray;
1405
- /** @type {?} */
1406
- FileUploadComponent.prototype.requestBodyArray;
1407
- /** @type {?} */
1408
- FileUploadComponent.prototype.uploadedChunk;
1409
- /** @type {?} */
1410
- FileUploadComponent.prototype.uploadedProcess;
1411
- /** @type {?} */
1412
- FileUploadComponent.prototype.storageExtension;
1413
- /** @type {?} */
1414
- FileUploadComponent.prototype.defaultPropertyName;
1415
- /** @type {?} */
1416
- FileUploadComponent.prototype.propertiesNames;
1417
- /** @type {?} */
1418
- FileUploadComponent.prototype.securityInfoList;
1419
- /** @type {?} */
1420
- FileUploadComponent.prototype.queueListStyle;
1421
- /** @type {?} */
1422
- FileUploadComponent.prototype.dropListValue;
1423
- /** @type {?} */
1424
- FileUploadComponent.prototype.uploadedFileTotal;
1425
- /** @type {?} */
1426
- FileUploadComponent.prototype.allowedMultiUpload;
1427
- /** @type {?} */
1428
- FileUploadComponent.prototype.haveExtensionProperty;
1429
- /** @type {?} */
1430
- FileUploadComponent.prototype.haveSecurityInfo;
1431
- /** @type {?} */
1432
- FileUploadComponent.prototype.uploadedFileInfoList;
1433
- /** @type {?} */
1434
- FileUploadComponent.prototype.oldUploadedFileList;
1435
- /** @type {?} */
1436
- FileUploadComponent.prototype.uploadInfoErrorMessage;
1437
- /** @type {?} */
1438
- FileUploadComponent.prototype.sameNameAllowed;
1439
- /** @type {?} */
1440
- FileUploadComponent.prototype.maxFileSize;
1441
- /** @type {?} */
1442
- FileUploadComponent.prototype.localeid;
1443
- /** @type {?} */
1444
- FileUploadComponent.prototype.localepipe;
1445
- /** @type {?} */
1446
- FileUploadComponent.prototype.httpclient;
1447
- /** @type {?} */
1448
- FileUploadComponent.prototype.checkboxPos;
1449
- /** @type {?} */
1450
- FileUploadComponent.prototype.formId;
1451
- /** @type {?} */
1452
- FileUploadComponent.prototype.rootId;
1453
- /** @type {?} */
1454
- FileUploadComponent.prototype.fileType;
1455
- /** @type {?} */
1456
- FileUploadComponent.prototype.fileCount;
1457
- /** @type {?} */
1458
- FileUploadComponent.prototype.oldIdList;
1459
- /** @type {?} */
1460
- FileUploadComponent.prototype.securityInfo;
1461
- /** @type {?} */
1462
- FileUploadComponent.prototype.fileNameLength;
1463
- /** @type {?} */
1464
- FileUploadComponent.prototype.opCell;
1465
- /** @type {?} */
1466
- FileUploadComponent.prototype.totalLoad;
1467
- /** @type {?} */
1468
- FileUploadComponent.prototype.exStorageFileList;
1469
- /**
1470
- * @type {?}
1471
- * @private
1472
- */
1473
- FileUploadComponent.prototype.msgService;
1474
- /**
1475
- * @type {?}
1476
- * @private
1477
- */
1478
- FileUploadComponent.prototype.uploadService;
1479
- /**
1480
- * @type {?}
1481
- * @private
1482
- */
1483
- FileUploadComponent.prototype.loadService;
1484
- /**
1485
- * @type {?}
1486
- * @private
1487
- */
1488
- FileUploadComponent.prototype.injector;
1489
- /* Skipping unhandled member: ;*/
1490
- }
1491
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdzcC1zdmMvZm9ybWRvYy11cGxvYWQvIiwic291cmNlcyI6WyJsaWIvdXBsb2FkL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxRSxP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SUFBRSw0Q0FBb0M7Ozs7O0lBQUUsMENBQW1DOzs7OztJQUFFLHVDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiwgSW5qZWN0b3IsIExPQ0FMRV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGaWxlSW5mbyB9IGZyb20gJy4uL2VudGl0eS9maWxlaW5mbyc7XHJcbmltcG9ydCB7IERvY1R5cGUgfSBmcm9tICcuLi9lbnRpdHkvZG9jdHlwZSc7XHJcbmltcG9ydCB7IEdzcEZvcm1Eb2NJbmZvIH0gZnJvbSAnLi4vZW50aXR5L2dzcGZvcm1kb2NpbmZvJztcclxuaW1wb3J0IHsgT3BlcmF0aW5nTW9kZXMgfSBmcm9tICcuLi9lbnRpdHkvb3BlcmF0aW5nbW9kZXMnO1xyXG5pbXBvcnQgeyBVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vdXBsb2FkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVcGxvYWRGaWxlSW5mbyB9IGZyb20gJy4uL2VudGl0eS91cGxvYWRmaWxlaW5mbyc7XHJcbmltcG9ydCB7IE1lc3NhZ2VyU2VydmljZSB9IGZyb20gJ0BmYXJyaXMvdWktbWVzc2FnZXInO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR3NwRm9ybVVwbG9hZEVudGl0eSB9IGZyb20gJy4uL2VudGl0eS9nc3Bmb3JtdXBsb2FkZW50aXR5JztcclxuaW1wb3J0IHsgVVVJRCB9IGZyb20gJ2FuZ3VsYXIyLXV1aWQnO1xyXG5pbXBvcnQgeyBTdG9yYWdlRXh0ZW5zaW9uIH0gZnJvbSAnLi4vZW50aXR5L3N0b3JhZ2VleHRlbnNpb24nO1xyXG5pbXBvcnQgeyBFeFN0b3JhZ2VGaWxlSW5mbyB9IGZyb20gJy4uL2VudGl0eS9leHRlbnNpb25zdG9yYWdlZmlsZWluZm8nO1xyXG5pbXBvcnQgeyBEcm9wTGlzdEVudGl0eSB9IGZyb20gJy4uL2VudGl0eS9kcm9wbGlzdGVudGl0eSc7XHJcbmltcG9ydCB7IExvYWRpbmdTZXJ2aWNlIH0gZnJvbSAnQGZhcnJpcy91aS1sb2FkaW5nJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEZpbGVTdGF0ZSB9IGZyb20gJy4uL2VudGl0eS9maWxlc3RhdGUnO1xyXG5pbXBvcnQgeyBMb2NhbExhbmdQaXBlIH0gZnJvbSAnLi4vLi4vbG9jYWwucGlwZSc7XHJcbmltcG9ydCB7IEdzcERvY1NlY3VyaXR5QmFzZUluZm8gfSBmcm9tICcuLi9lbnRpdHkvZ3NwZG9jc2VjdXJpdHliYXNlaW5mbyc7XHJcbmltcG9ydCB7IFNlY3VyaXR5RW50aXR5IH0gZnJvbSAnLi4vZW50aXR5L3NlY3VyaXR5ZW50aXR5JztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluaXRNdWx0aVVwbG9hZFJlcXVlc3QgfSBmcm9tICcuLi9lbnRpdHkvaW5pdG11bHRpdXBsb2FkcmVxdWVzdCc7XHJcbmltcG9ydCB7IENvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0IH0gZnJvbSAnLi4vZW50aXR5L2NvbXBsZXRlbXVsdGl1cGxvYWRyZXF1ZXN0JztcclxuaW1wb3J0IHsgR3NwRm9ybVN0cmVhbUVudGl0eSB9IGZyb20gJy4uL2VudGl0eS9nc3Bmb3Jtc3RyZWFtZW50aXR5JztcclxuaW1wb3J0IHsgTXVsdGlVcGxvYWRSZXF1ZXN0IH0gZnJvbSAnLi4vZW50aXR5L211bHRpdXBsb2FkcmVxdWVzdCc7XHJcbmltcG9ydCB7IE11bHRpVXBsb2FkUmVzdWx0IH0gZnJvbSAnLi4vZW50aXR5L211bHRpdXBsb2FkcmVzdWx0JztcclxuaW1wb3J0IHsgQmFzZVBhdGhTZXJ2aWNlIH0gZnJvbSAnQGZhcnJpcy9ydGYnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZmlsZS11cGxvYWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS11cGxvYWQuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGZpbGVzOiBGaWxlSW5mb1tdID0gW107XHJcbiAgbWV0YWRhdGFJZExpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgdXBsb2FkRmlsZUluZm9MaXN0OiBVcGxvYWRGaWxlSW5mb1tdID0gW107XHJcbiAgZXJyRmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgZXJyVHlwZUxpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgbnVsbEZpbGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGJleW9uZEZpbGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZpbGVOYW1lT3ZlcnNpemVMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGludmFsaWRDaGFyYWN0ZXJzRmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgaW52YWxpZEV4dE5hbWVzRmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgdW5yZWNvZ25pemVkVHlwZUZpbGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGludmFsaWRDaGFyYWN0ZXJzOiBzdHJpbmcgPSAnJztcclxuICBpbnZhbGlkRXh0TmFtZXM6IHN0cmluZyA9ICcnO1xyXG4gIHNob3dUeXBlOiBudW1iZXIgPSAwO1xyXG4gIG1vdXNlT246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1doaXRlTGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGJ1ZmZlclNpemUgPSA1ICogMTAyNCAqIDEwMjQ7XHJcbiAgc2VsZWN0ZWRGaWxlczogYW55O1xyXG4gIHJhZGlvQnV0dG9uR3JvdXBWYWx1ZTtcclxuICBzZWxlY3RlZEZpbGVDb3VudDogbnVtYmVyID0gMDtcclxuICB1cGxvYWRCdG5EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICB1cGxvYWRJY29uQWRkcmVzcyA9IHRoaXMuY3JlYXRlQmFzZVVybCgnL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy91cGxvYWQuc3ZnJyk7XHJcbiAgdXBsb2FkTGl0dGxlSWNvbkFkZHJlc3MgPSB0aGlzLmNyZWF0ZUJhc2VVcmwoJy9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvdXBsb2FkSWNvbi5zdmcnKTtcclxuXHJcbiAgaGFzU2VsZWN0ZWRGaWxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGZpbGVBbGxTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICB1cGxvYWRQcm9jZXNzID0geyB3aWR0aDogJzAlJyB9O1xyXG5cclxuICBmaWxlVG90YWxDaHVuazogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG5cclxuICByZXF1ZXN0QXJyYXk6IEFycmF5PE9ic2VydmFibGU8YW55Pj4gPSBuZXcgQXJyYXk7XHJcblxyXG4gIHJlcXVlc3RCb2R5QXJyYXk6IEFycmF5PEdzcEZvcm1VcGxvYWRFbnRpdHk+ID0gbmV3IEFycmF5O1xyXG5cclxuICB1cGxvYWRlZENodW5rOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgdXBsb2FkZWRQcm9jZXNzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcblxyXG4gIC8vYWxsU2VsZWN0ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHN0b3JhZ2VFeHRlbnNpb246IFN0b3JhZ2VFeHRlbnNpb247XHJcblxyXG4gIGRlZmF1bHRQcm9wZXJ0eU5hbWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgcHJvcGVydGllc05hbWVzOiBEcm9wTGlzdEVudGl0eVtdID0gW107XHJcblxyXG4gIHNlY3VyaXR5SW5mb0xpc3Q6IFNlY3VyaXR5RW50aXR5W10gPSBbXTtcclxuXHJcbiAgcXVldWVMaXN0U3R5bGUgPSB7IHdpZHRoOiAnNDgwcHgnIH07XHJcblxyXG4gIGRyb3BMaXN0VmFsdWU6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIHVwbG9hZGVkRmlsZVRvdGFsOiBudW1iZXIgPSAwO1xyXG5cclxuICBhbGxvd2VkTXVsdGlVcGxvYWQ6IGJvb2xlYW47XHJcblxyXG4gIGhhdmVFeHRlbnNpb25Qcm9wZXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBoYXZlU2VjdXJpdHlJbmZvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHVwbG9hZGVkRmlsZUluZm9MaXN0ID0gW107XHJcbiAgb2xkVXBsb2FkZWRGaWxlTGlzdCA9IFtdO1xyXG4gIC8vdXBsb2FkZWROYW1lTGlzdCA9IFtdO1xyXG4gIHVwbG9hZEluZm9FcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIHNhbWVOYW1lQWxsb3dlZCA9IHRydWU7XHJcbiAgbWF4RmlsZVNpemU6IG51bWJlciA9IDA7O1xyXG4gIGxvY2FsZWlkOiBzdHJpbmc7XHJcbiAgbG9jYWxlcGlwZTogTG9jYWxMYW5nUGlwZTtcclxuICBodHRwY2xpZW50OiBIdHRwQ2xpZW50O1xyXG4gIGNoZWNrYm94UG9zID0geyB0b3A6ICcwcHgnIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtc2dTZXJ2aWNlOiBNZXNzYWdlclNlcnZpY2UsIHByaXZhdGUgdXBsb2FkU2VydmljZTogVXBsb2FkU2VydmljZSwgcHJpdmF0ZSBsb2FkU2VydmljZTogTG9hZGluZ1NlcnZpY2UsIHByaXZhdGUgaW5qZWN0b3I/OiBJbmplY3Rvcikge1xyXG4gICAgaWYgKHRoaXMuaW5qZWN0b3IpIHtcclxuICAgICAgdGhpcy5odHRwY2xpZW50ID0gdGhpcy5pbmplY3Rvci5nZXQoSHR0cENsaWVudCk7XHJcbiAgICAgIHRoaXMubG9jYWxlaWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImxhbmd1YWdlQ29kZVwiKSB8fCB0aGlzLmluamVjdG9yLmdldChMT0NBTEVfSUQpO1xyXG4gICAgICB0aGlzLmxvY2FsZXBpcGUgPSBuZXcgTG9jYWxMYW5nUGlwZSh0aGlzLmxvY2FsZWlkKTtcclxuICAgIH1cclxuICB9XHJcbiAgQElucHV0KCkgZm9ybUlkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcm9vdElkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZmlsZVR5cGU6IHN0cmluZyA9IFwiKlwiO1xyXG4gIEBJbnB1dCgpIGZpbGVDb3VudDogbnVtYmVyID0gMDtcclxuICBASW5wdXQoKSBvbGRJZExpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgQElucHV0KCkgc2VjdXJpdHlJbmZvOiBHc3BEb2NTZWN1cml0eUJhc2VJbmZvID0gbnVsbDtcclxuICBASW5wdXQoKSBmaWxlTmFtZUxlbmd0aDogbnVtYmVyID0gMDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnb3BDZWxsJykgb3BDZWxsOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+PSAwKVxyXG4gICAgICB0aGlzLmNoZWNrYm94UG9zLnRvcCA9ICcxNHB4JztcclxuICAgIC8vaWYgKHRoaXMuc3RvcmFnZVNlcnZpY2UgIT0gbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuc2VjdXJpdHlJbmZvICE9IG51bGwpIHtcclxuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFNlY3VyaXR5SW5mb0xpc3QodGhpcy5zZWN1cml0eUluZm8pLnN1YnNjcmliZShcclxuICAgICAgICByZXMgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYXZlU2VjdXJpdHlJbmZvID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgIHJlcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlY3VyaXR5SW5mb0xpc3QucHVzaCh7IGlkOiBpLnRvU3RyaW5nKCksIHNlY3VyaXR5SWQ6IGVsZW1lbnQuc2VjdXJpdHlJZCwgc2VjdXJpdHlMZXZlbDogZWxlbWVudC5zZWN1cml0eUxldmVsLCBuYW1lOiBlbGVtZW50Lm5hbWUgfSk7XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgfVxyXG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFN0b3JhZ2VFeHRlbnNpb25JbmZvKCkuc3Vic2NyaWJlKFxyXG4gICAgICByZXMgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXJyb3IgPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5kZWZhdWx0UHJvcGVydHlOYW1lID0gdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWU7XHJcbiAgICAgICAgICB0aGlzLnByb3BlcnRpZXNOYW1lcy5wdXNoKHsgaWQ6IFwiMFwiLCBuYW1lOiB0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZGVmYXVsdFByb3BlcnR5TmFtZSB9KTtcclxuICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgIC8vIHRoaXMucHJvcGVydGllc05hbWVzLnB1c2goLi4uKHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25Qcm9wZXJ0eU5hbWVMaXN0KSk7XHJcbiAgICAgICAgICB0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZXh0ZW5zaW9uUHJvcGVydHlOYW1lTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BlcnRpZXNOYW1lcy5wdXNoKHsgaWQ6ICgrK2kpLnRvU3RyaW5nKCksIG5hbWU6IGVsZW1lbnQgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMucXVldWVMaXN0U3R5bGUud2lkdGggPSAnMzgwcHgnO1xyXG4gICAgICAgICAgdGhpcy5oYXZlRXh0ZW5zaW9uUHJvcGVydHkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuICAgIHRoaXMudXBsb2FkU2VydmljZS5nZXRVcGxvYWRJbmZvKHRoaXMucm9vdElkKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgaWYgKHJlcy5lcnJvciAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRJbmZvRXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ+iOt+WPluS4iuS8oOS/oeaBr+aKpemUme+8jOmUmeivr+S/oeaBr+S4uu+8micsZXJyTXNnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRCdG5EaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2FtZU5hbWVBbGxvd2VkID0gcmVzLnNhbWVOYW1lQWxsb3dlZDtcclxuICAgICAgICB0aGlzLm1heEZpbGVTaXplID0gcGFyc2VJbnQoSlNPTi5wYXJzZShyZXMudmFsaWRhdGVDb25maWd1cmF0aW9uKS5tYXhGaWxlU2l6ZSk7XHJcbiAgICAgICAgdGhpcy5pc1doaXRlTGlzdCA9IEpTT04ucGFyc2UocmVzLnZhbGlkYXRlQ29uZmlndXJhdGlvbikud2hpdGVMaXN0O1xyXG4gICAgICAgIHRoaXMuaW52YWxpZENoYXJhY3RlcnMgPSBKU09OLnBhcnNlKHJlcy52YWxpZGF0ZUNvbmZpZ3VyYXRpb24pLmludmFsaWRDaGFyYWN0ZXJzO1xyXG4gICAgICAgIHRoaXMuaW52YWxpZEV4dE5hbWVzID0gSlNPTi5wYXJzZShyZXMudmFsaWRhdGVDb25maWd1cmF0aW9uKS5pbnZhbGlkRXh0TmFtZXMudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB0aGlzLmFsbG93ZWRNdWx0aVVwbG9hZCA9IHJlcy5hbGxvd2VkTXVsdGlVcGxvYWQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNhbWVOYW1lQWxsb3dlZCkge1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFVwbG9hZGVkRmlsZUluZm9MaXN0KHRoaXMuZm9ybUlkLCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICByZXMgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXJyb3IgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdCA9IHJlcztcclxuICAgICAgICAgICAgICAgIHRoaXMub2xkVXBsb2FkZWRGaWxlTGlzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGlmICh0aGlzLm9sZElkTGlzdCAhPSBudWxsICYmIHRoaXMub2xkSWRMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbCh0aGlzLm9sZElkTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmFkaW9CdXR0b25Hcm91cFZhbHVlID0gJ3Nob3dCeUdyb3VwJztcclxuICB9XHJcblxyXG4gIHRvdGFsTG9hZDogYW55ID0gbnVsbDtcclxuXHJcbiAgc2hvd0xvYWRpbmcoKSB7XHJcbiAgICB0aGlzLmhhc1NlbGVjdGVkRmlsZSA9IHRydWU7XHJcbiAgICAvLyBpZiAodGhpcy50b3RhbExvYWQgPT0gbnVsbClcclxuICAgIC8vICAgdGhpcy50b3RhbExvYWQgPSB0aGlzLmxvYWRTZXJ2aWNlLnNob3coe1xyXG4gICAgLy8gICAgIG1lc3NhZ2U6IHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3VwbG9hZGluZycpXHJcbiAgICAvLyAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmlnaHRDbGFzcygpIHtcclxuICAgIGlmICh0aGlzLnVwbG9hZEJ0bkRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1wcmltYXJ5IGJ0bi1sZyBkaXNhYmxlZCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJ2J0biBidG4tcHJpbWFyeSBidG4tbGcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmluZEludmFsaWRDaGFyYWN0ZXIobmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IGNoYXJMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgdGhpcy5pbnZhbGlkQ2hhcmFjdGVycy5zcGxpdCgnfCcpLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGlmIChuYW1lLmluZGV4T2YoZWxlbWVudCkgPj0gMClcclxuICAgICAgICBjaGFyTGlzdC5wdXNoKGVsZW1lbnQpO1xyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gY2hhckxpc3Q7XHJcbiAgfVxyXG5cclxuXHJcbiAgaGFzRmlsZVR5cGUoZmlsZSkge1xyXG4gICAgcmV0dXJuIGZpbGUubmFtZS5pbmNsdWRlcygnLicpO1xyXG4gIH1cclxuXHJcbiAgZmlsZVNlbGVjdGVkKCRldmVudCkge1xyXG4gICAgaWYgKHRoaXMudXBsb2FkSW5mb0Vycm9yTWVzc2FnZSkge1xyXG4gICAgICB0aGlzLm1zZ1NlcnZpY2UuZXJyb3IodGhpcy51cGxvYWRJbmZvRXJyb3JNZXNzYWdlKTtcclxuICAgICAgdGhpcy51cGxvYWRCdG5EaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhhc1NlbGVjdGVkRmlsZSA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmlsZScpO1xyXG5cclxuICAgIGlmICh0aGlzLmZpbGVDb3VudCA+IDApIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5maWxlcy5sZW5ndGggKyB0aGlzLmZpbGVzLmxlbmd0aCA+IHRoaXMuZmlsZUNvdW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkTnVtOiBudW1iZXIgPSAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCBhcyBudW1iZXIpICsgdGhpcy5maWxlcy5sZW5ndGg7XHJcbiAgICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcodGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnc2VsZWN0ZWRDb3VudCcpICsgc2VsZWN0ZWROdW0gKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdsaW1pdENvdW50JykgKyB0aGlzLmZpbGVDb3VudCArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL3RoaXMuZmxhZyA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRGaWxlcy5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc2VsZWN0ZWRGaWxlID0gdGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzW2ldO1xyXG4gICAgICBzZWxlY3RlZEZpbGUuaXNBbGxvd2VkVXBsb2FkID0gdHJ1ZTtcclxuICAgICAgLy9zZWxlY3RlZEZpbGUuc2xpY2VcclxuICAgICAgbGV0IHV1aWQgPSBVVUlELlVVSUQoKTtcclxuXHJcbiAgICAgIGlmIChzZWxlY3RlZEZpbGUuc2l6ZSA9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5udWxsRmlsZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmZpbGVOYW1lTGVuZ3RoID4gMCAmJiBzZWxlY3RlZEZpbGUubmFtZS5sZW5ndGggPiB0aGlzLmZpbGVOYW1lTGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5maWxlTmFtZU92ZXJzaXplTGlzdC5wdXNoKHNlbGVjdGVkRmlsZS5uYW1lKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMubWF4RmlsZVNpemUgIT0gbnVsbCAmJiB0aGlzLm1heEZpbGVTaXplID4gMCkge1xyXG4gICAgICAgIGlmIChzZWxlY3RlZEZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUgKiAxMDAwKSB7XHJcbiAgICAgICAgICB0aGlzLmJleW9uZEZpbGVMaXN0LnB1c2goc2VsZWN0ZWRGaWxlLm5hbWUpO1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBpbnZhbGlkQ2hhckxpc3QgPSB0aGlzLmZpbmRJbnZhbGlkQ2hhcmFjdGVyKHNlbGVjdGVkRmlsZS5uYW1lKTtcclxuICAgICAgbGV0IGludmFsaWRDaGFyTGlzdEZpbHRlciA9IGludmFsaWRDaGFyTGlzdC5maWx0ZXIoKHMpID0+IHtcclxuICAgICAgICByZXR1cm4gcyAmJiBzLnRyaW0oKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBcIlwiXHJcbiAgICAgIGlmIChpbnZhbGlkQ2hhckxpc3RGaWx0ZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGludmFsaWRDaGFyTGlzdEZpbHRlci5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgZXJyb3JNZXNzYWdlICs9IFwiXFxcIlwiO1xyXG4gICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGVsZW1lbnQ7XHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gXCJcXFwiXCI7XHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gKGluZGV4ID09PSBpbnZhbGlkQ2hhckxpc3RGaWx0ZXIubGVuZ3RoIC0gMSkgPyBcIlwiIDogXCIsXCI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgc2VsZWN0ZWRGaWxlLmlzQWxsb3dlZFVwbG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcodGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnaW52YWxpZENoYXJhY3RlcnMnKSArIGVycm9yTWVzc2FnZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5maWxlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICBzZWxlY3RlZEZpbGUuaXNBbGxvd2VkVXBsb2FkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmludmFsaWRDaGFyYWN0ZXJzRmlsZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaGFzRmlsZVR5cGUoc2VsZWN0ZWRGaWxlKSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICBzZWxlY3RlZEZpbGUuaXNBbGxvd2VkVXBsb2FkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyhzZWxlY3RlZEZpbGUubmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ1VucmVjb2duaXplZEZpbGVUeXBlJykgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgc2VsZWN0ZWRGaWxlLmlzQWxsb3dlZFVwbG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy51bnJlY29nbml6ZWRUeXBlRmlsZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGxldCBjdXJGaWxlU3VmZml4ID0gc2VsZWN0ZWRGaWxlLm5hbWUuc3BsaXQoJy4nKVsxXTtcclxuICAgICAgbGV0IGN1ckZpbGVTdWZmaXggPSBzZWxlY3RlZEZpbGUubmFtZS5zdWJzdHIoc2VsZWN0ZWRGaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IGV4dE5hbWVzID0gdGhpcy5saXN0VG9TdHJpbmcodGhpcy5pbnZhbGlkRXh0TmFtZXMuc3BsaXQoJ3wnKSk7XHJcbiAgICAgIGNvbnN0IGV4dE5hbWVzQXJ5ID0gdGhpcy5pbnZhbGlkRXh0TmFtZXMuc3BsaXQoJ3wnKTtcclxuICAgICAgaWYgKCF0aGlzLmlzV2hpdGVMaXN0ICYmIGV4dE5hbWVzQXJ5LmluY2x1ZGVzKGN1ckZpbGVTdWZmaXgpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5maWxlcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgIHNlbGVjdGVkRmlsZS5pc0FsbG93ZWRVcGxvYWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHNlbGVjdGVkRmlsZS5uYW1lICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnaW52YWxpZEV4dE5hbWVzJykgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdibGFja0V4dE5hbWVzJykgKyBleHROYW1lcyArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5maWxlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICBzZWxlY3RlZEZpbGUuaXNBbGxvd2VkVXBsb2FkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmludmFsaWRFeHROYW1lc0ZpbGVMaXN0LnB1c2goc2VsZWN0ZWRGaWxlLm5hbWUpO1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmlzV2hpdGVMaXN0ICYmICFleHROYW1lc0FyeS5pbmNsdWRlcyhjdXJGaWxlU3VmZml4KSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICBzZWxlY3RlZEZpbGUuaXNBbGxvd2VkVXBsb2FkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyhzZWxlY3RlZEZpbGUubmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2ludmFsaWRFeHROYW1lcycpICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnd2hpdGVFeHROYW1lcycpICsgZXh0TmFtZXMgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgc2VsZWN0ZWRGaWxlLmlzQWxsb3dlZFVwbG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5pbnZhbGlkRXh0TmFtZXNGaWxlTGlzdC5wdXNoKHNlbGVjdGVkRmlsZS5uYW1lKTtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLnNhbWVOYW1lQWxsb3dlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKSAhPSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgY29uc3QgbXNnID0gdGhpcy5tc2dTZXJ2aWNlLnNob3coJ3dhcm5pbmcnLCB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdoYXZlU2FtZU5hbWUnKSArIHNlbGVjdGVkRmlsZS5uYW1lLCB7XHJcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZToge1xyXG4gICAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVuYW1lJyksXHJcbiAgICAgICAgICAgICAgICAgIGNsczogJ2J0biBidG4tc2Vjb25kYXJ5JyxcclxuICAgICAgICAgICAgICAgICAgaGFuZGxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9sZE5hbWU6IHN0cmluZyA9IHNlbGVjdGVkRmlsZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZsYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZmxhZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSA9IG9sZE5hbWUuc3Vic3RyaW5nKDAsIG9sZE5hbWUubGFzdEluZGV4T2YoJy4nKSkgKyAnKCcgKyBpICsgJyknICsgb2xkTmFtZS5zdWJzdHJpbmcob2xkTmFtZS5sYXN0SW5kZXhPZignLicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IG5ld05hbWUpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGUodXVpZCwgc2VsZWN0ZWRGaWxlLCBuZXdOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBtc2cuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVwbGFjZScpLFxyXG4gICAgICAgICAgICAgICAgICBjbHM6ICdidG4gYnRuLXNlY29uZGFyeScsXHJcbiAgICAgICAgICAgICAgICAgIGhhbmRsZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHV1aWQgPSB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKS5tZXRhZGF0YUlkO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZSh1dWlkLCBzZWxlY3RlZEZpbGUsIHNlbGVjdGVkRmlsZS5uYW1lLCBGaWxlU3RhdGUuVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsLS07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2xkVXBsb2FkZWRGaWxlTGlzdC5maW5kKHggPT4geC5maWxlTmFtZSA9PSBzZWxlY3RlZEZpbGUubmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwrKztcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHguZmlsZU5hbWUgPT0gc2VsZWN0ZWRGaWxlLm5hbWUpWzBdKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG1zZy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdjYW5jZWwnKSxcclxuICAgICAgICAgICAgICAgICAgY2xzOiAnYnRuIGJ0bi1zZWNvbmRhcnknLFxyXG4gICAgICAgICAgICAgICAgICBoYW5kbGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBtc2cuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0ZWRGaWxlLmlzQWxsb3dlZFVwbG9hZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMudXBsb2FkRmlsZSh1dWlkLCBzZWxlY3RlZEZpbGUsIHNlbGVjdGVkRmlsZS5uYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmVyckZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMuZXJyRmlsZUxpc3QpO1xyXG4gICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyh0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdoYXZlU2FtZU5hbWUnKSArIG5hbWUgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XHJcbiAgICAgIHRoaXMuZXJyRmlsZUxpc3QgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5udWxsRmlsZUxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5saXN0VG9TdHJpbmcodGhpcy5udWxsRmlsZUxpc3QpO1xyXG4gICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyhuYW1lICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnc2l6ZVplcm8nKSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcclxuICAgICAgdGhpcy5udWxsRmlsZUxpc3QgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWxlTmFtZU92ZXJzaXplTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmZpbGVOYW1lT3ZlcnNpemVMaXN0KTtcclxuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2ZpbGVOYW1lT3ZlclNpemUnKSArIHRoaXMuZmlsZU5hbWVMZW5ndGggKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XHJcbiAgICAgIHRoaXMuZmlsZU5hbWVPdmVyc2l6ZUxpc3QgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5iZXlvbmRGaWxlTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmJleW9uZEZpbGVMaXN0KTtcclxuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NpemVNYXgnKSArIHRoaXMubWF4RmlsZVNpemUgKyBcIktCXCIgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XHJcbiAgICAgIHRoaXMuYmV5b25kRmlsZUxpc3QgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pbnZhbGlkQ2hhcmFjdGVyc0ZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMuaW52YWxpZENoYXJhY3RlcnNGaWxlTGlzdCk7XHJcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKG5hbWUgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdpbnZhbGlkQ2hhcmFjdGVycycpICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVjaG9vc2VGaWxlJykpO1xyXG4gICAgICB0aGlzLmludmFsaWRDaGFyYWN0ZXJzRmlsZUxpc3QgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pbnZhbGlkRXh0TmFtZXNGaWxlTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmludmFsaWRFeHROYW1lc0ZpbGVMaXN0KTtcclxuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2ludmFsaWRFeHROYW1lcycpICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVjaG9vc2VGaWxlJykpO1xyXG4gICAgICB0aGlzLmludmFsaWRFeHROYW1lc0ZpbGVMaXN0ID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudW5yZWNvZ25pemVkVHlwZUZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMudW5yZWNvZ25pemVkVHlwZUZpbGVMaXN0KTtcclxuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ1VucmVjb2duaXplZEZpbGVUeXBlJykgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XHJcbiAgICAgIHRoaXMudW5yZWNvZ25pemVkVHlwZUZpbGVMaXN0ID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWxlcyA9IHRoaXMuZmlsZXMuc2xpY2UoKTtcclxuICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAkZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XHJcbiAgICAvLyBsb2FkaW5nLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICBzaG93RXJyb3JNZXNzYWdlKGZpbGUpIHtcclxuICAgIHRoaXMubXNnU2VydmljZS5lcnJvcih0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCd1cGxvYWRGYWlsdXJlJykgKyBmaWxlLmVycm9yTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWxlSW5mbyh1dWlkOiBzdHJpbmcsIHNlbGVjdGVkRmlsZSwgZmlsZU5hbWU6IHN0cmluZyk6IGFueSB7XHJcblxyXG4gICAgbGV0IGZpbGVJbmZvOiBGaWxlSW5mbztcclxuXHJcbiAgICBmaWxlSW5mbyA9IHtcclxuICAgICAgaWQ6IHV1aWQsXHJcbiAgICAgIG5hbWU6IGZpbGVOYW1lLFxyXG4gICAgICB0eXBlOiBzZWxlY3RlZEZpbGUudHlwZSxcclxuICAgICAgc291cmNlOiBcIlwiLFxyXG4gICAgICBzaXplOiB0aGlzLmdldEZpbGVTaXplKHNlbGVjdGVkRmlsZS5zaXplKSxcclxuICAgICAgZmlsZVNpemU6IHNlbGVjdGVkRmlsZS5zaXplLFxyXG4gICAgICBwaWNMaXN0RGlzcGxheU5hbWU6IHRoaXMuZ2V0UGljTGlzdERpc3BsYXlOYW1lKGZpbGVOYW1lKSxcclxuICAgICAgcXVldWVMaXN0RGlzcGxheU5hbWU6IHRoaXMuZ2V0UXVldWVEaXNwbGF5TmFtZShmaWxlTmFtZSksXHJcbiAgICAgIC8vY29udGVudDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLFxyXG4gICAgICBoYXNVcGxvYWRlZDogZmFsc2UsXHJcbiAgICAgIG1vdXNlT246IGZhbHNlLFxyXG4gICAgICBzZWxlY3RkOiBmYWxzZSxcclxuICAgICAgaXNVcGxvYWRpbmc6IHRydWUsXHJcbiAgICAgIHVwbG9hZFJlc3VsdDogZmFsc2UsXHJcbiAgICAgIHVwbG9hZFByb2Nlc3M6IDAsXHJcbiAgICAgIGVycm9yTWVzc2FnZTogXCJcIixcclxuICAgICAgZXh0ZW5zaW9uRHJvcExpc3RJZDogMCxcclxuICAgICAgZXh0ZW5zaW9uTmFtZTogXCJcIixcclxuICAgICAgc2VjdXJpdHlEcm9wTGlzdElkOiAwLFxyXG4gICAgICBzZWN1cml0eUluZm86IHRoaXMuc2VjdXJpdHlJbmZvTGlzdFswXSxcclxuICAgICAgc3R5bGU6IHt9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3RvcmFnZUV4dGVuc2lvbiAhPSBudWxsKVxyXG4gICAgICBmaWxlSW5mby5leHRlbnNpb25OYW1lID0gdGhpcy5kZWZhdWx0UHJvcGVydHlOYW1lO1xyXG5cclxuXHJcbiAgICBsZXQgdHlwZTogc3RyaW5nID0gc2VsZWN0ZWRGaWxlLnR5cGU7XHJcbiAgICBpZiAodHlwZS5pbmNsdWRlcyhcInRpZmZcIikpIHtcclxuICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuT3RoZXIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XHJcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLkltYWdlKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJ3b3JkXCIpKSB7XHJcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLldvcmQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcInBkZlwiKSkge1xyXG4gICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5QZGYpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcInBsYWluXCIpKSB7XHJcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLlR4dCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwic2hlZXRcIikgfHwgdHlwZS5pbmNsdWRlcyhcImV4Y2VsXCIpKSB7XHJcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLkV4Y2VsKVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcInBvd2VycG9pbnRcIikgfHwgdHlwZS5pbmNsdWRlcyhcInByZXNlbnRhdGlvblwiKSkge1xyXG4gICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5Qb3dlcnBvaW50KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJ6aXBcIikgfHwgc2VsZWN0ZWRGaWxlLm5hbWUuaW5jbHVkZXMoXCIucmFyXCIpKSB7XHJcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLlppcCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuT3RoZXIpO1xyXG4gICAgICAvLyBsZXQgbmFtZTogc3RyaW5nID0gc2VsZWN0ZWRGaWxlLm5hbWU7XHJcbiAgICAgIC8vIGxldCBlcnJUeXBlID0gbmFtZS5zdWJzdHJpbmcoc2VsZWN0ZWRGaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKSk7XHJcbiAgICAgIC8vIHRoaXMuZXJyVHlwZUxpc3QucHVzaChlcnJUeXBlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaWxlSW5mbztcclxuICB9XHJcblxyXG4gIHVwbG9hZEZpbGUodXVpZDogc3RyaW5nLCBzZWxlY3RlZEZpbGUsIGZpbGVOYW1lOiBzdHJpbmcsIHN0YXRlOiBGaWxlU3RhdGUgPSBGaWxlU3RhdGUuTmV3KSB7XHJcblxyXG4gICAgbGV0IGZpbGVJbmZvID0gdGhpcy5oYW5kbGVGaWxlSW5mbyh1dWlkLCBzZWxlY3RlZEZpbGUsIGZpbGVOYW1lKTtcclxuXHJcbiAgICBsZXQgdXBsb2FkRmlsZUluZm8gPSBuZXcgVXBsb2FkRmlsZUluZm8oKTtcclxuXHJcbiAgICB1cGxvYWRGaWxlSW5mby5tZXRhZGF0YUlkID0gdXVpZDtcclxuICAgIHVwbG9hZEZpbGVJbmZvLmZpbGVOYW1lID0gZmlsZUluZm8ubmFtZTtcclxuICAgIHVwbG9hZEZpbGVJbmZvLmZpbGVTaXplID0gZmlsZUluZm8uc2l6ZTtcclxuICAgIHVwbG9hZEZpbGVJbmZvLm9yaWdpbmFsU2l6ZSA9IGZpbGVJbmZvLmZpbGVTaXplO1xyXG4gICAgdXBsb2FkRmlsZUluZm8uc3RhdGUgPSBzdGF0ZTtcclxuICAgIHVwbG9hZEZpbGVJbmZvLnNlY3VyaXR5SW5mbyA9IHRoaXMuc2VjdXJpdHlJbmZvTGlzdFswXTtcclxuXHJcblxyXG4gICAgLy/liKTmlq3mmK/lkKbmlK/mjIHliIbniYfkuIrkvKBcclxuICAgIGlmICh0aGlzLmFsbG93ZWRNdWx0aVVwbG9hZCkge1xyXG5cclxuICAgICAgLy/mlK/mjIHliIbniYfkuIrkvKBcclxuICAgICAgbGV0IGluaXRSZXF1ZXN0OiBJbml0TXVsdGlVcGxvYWRSZXF1ZXN0ID0gbmV3IEluaXRNdWx0aVVwbG9hZFJlcXVlc3Q7XHJcblxyXG4gICAgICBpbml0UmVxdWVzdC5wYXRoID0gdGhpcy5mb3JtSWQ7XHJcbiAgICAgIGluaXRSZXF1ZXN0Lm1ldGFkYXRhSWQgPSB1dWlkO1xyXG4gICAgICBpbml0UmVxdWVzdC5yb290SWQgPSB0aGlzLnJvb3RJZDtcclxuICAgICAgaW5pdFJlcXVlc3Quc2l6ZSA9IGZpbGVJbmZvLmZpbGVTaXplO1xyXG4gICAgICBpbml0UmVxdWVzdC5maWxlTmFtZSA9IGZpbGVOYW1lO1xyXG5cclxuICAgICAgLy/liJ3lp4vljJbliIbniYdcclxuICAgICAgdGhpcy5pbml0TXVsdGlVcGxvYWQoaW5pdFJlcXVlc3QpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuZXJyb3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRSZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCB1cGxvYWRJZCA9IHJlcy51cGxvYWRJZDtcclxuICAgICAgICAgIGxldCBjaHVua1RvdGFsOiBudW1iZXIgPSBNYXRoLmNlaWwoc2VsZWN0ZWRGaWxlLnNpemUgLyB0aGlzLmJ1ZmZlclNpemUpO1xyXG4gICAgICAgICAgbGV0IGNodW5rSW5kZXg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgICAgbGV0IG11bHRpUmVzdWx0TGlzdDogTXVsdGlVcGxvYWRSZXN1bHRbXSA9IFtdO1xyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZVRvdGFsQ2h1bmtbdXVpZF0gPSBjaHVua1RvdGFsO1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlZENodW5rW3V1aWRdID0gMDtcclxuXHJcbiAgICAgICAgICB3aGlsZSAoY2h1bmtJbmRleCA8IGNodW5rVG90YWwpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBuZXh0U2l6ZSA9IE1hdGgubWluKChjaHVua0luZGV4ICsgMSkgKiB0aGlzLmJ1ZmZlclNpemUsIHNlbGVjdGVkRmlsZS5zaXplKTtcclxuICAgICAgICAgICAgbGV0IGZpbGVEYXRhID0gc2VsZWN0ZWRGaWxlLnNsaWNlKGNodW5rSW5kZXggKiB0aGlzLmJ1ZmZlclNpemUsIG5leHRTaXplKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBtdWx0aVJlcXVlc3QgPSBuZXcgTXVsdGlVcGxvYWRSZXF1ZXN0O1xyXG4gICAgICAgICAgICBtdWx0aVJlcXVlc3QubWV0YWRhdGFJZCA9IHV1aWQ7XHJcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC5yb290SWQgPSB0aGlzLnJvb3RJZDtcclxuICAgICAgICAgICAgbXVsdGlSZXF1ZXN0LnVwbG9hZElkID0gdXBsb2FkSWQ7XHJcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC5pbmRleCA9IGNodW5rSW5kZXg7XHJcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC50b3RhbCA9IGNodW5rVG90YWw7XHJcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC5zaXplID0gZmlsZURhdGEuc2l6ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ211bHRpUmVxdWVzdCcsIEpTT04uc3RyaW5naWZ5KG11bHRpUmVxdWVzdCkpO1xyXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlRGF0YSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm11bHRpVXBsb2FkKGZvcm1EYXRhKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICBpZiAocmVzLmVycm9yICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmVycm9yTWVzc2FnZSA9IHJlcy5lcnJvci5NZXNzYWdlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtdWx0aVJlc3VsdExpc3QucHVzaChyZXMucmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRDaHVua1t1dWlkXSsrO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRQcm9jZXNzID0gTnVtYmVyLnBhcnNlSW50KCh0aGlzLnVwbG9hZGVkQ2h1bmtbdXVpZF0gLyB0aGlzLmZpbGVUb3RhbENodW5rW3V1aWRdICogMTAwKS50b0ZpeGVkKDApKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwbG9hZGVkQ2h1bmtbdXVpZF0gPT0gdGhpcy5maWxlVG90YWxDaHVua1t1dWlkXSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAobXVsdGlSZXN1bHRMaXN0Lmxlbmd0aCA9PSB0aGlzLmZpbGVUb3RhbENodW5rW3V1aWRdKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21wbGV0ZU11bHRpVXBsb2FkUmVxdWVzdDogQ29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3QgPSBuZXcgQ29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3QubWV0YWRhdGFJZCA9IHV1aWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3QucGFydExpc3QgPSBtdWx0aVJlc3VsdExpc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3Qucm9vdElkID0gdGhpcy5yb290SWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3QudXBsb2FkSWQgPSB1cGxvYWRJZDtcclxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU11bHRpVXBsb2FkUmVxdWVzdC5zaXplID0gZmlsZUluZm8uZmlsZVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGF2ZUV4dGVuc2lvblByb3BlcnR5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3QuZXhQcm9wZXJ0eU5hbWUgPSB0aGlzLmRlZmF1bHRQcm9wZXJ0eU5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZU11bHRpVXBsb2FkKGNvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0KS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3QgPSB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5jb25jYXQodXBsb2FkRmlsZUluZm8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0ID0gdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5jb25jYXQodXBsb2FkRmlsZUluZm8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsKys7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC8v5ZCO5Y+w5byC5q2l5ou85o6l5paH5qGjXHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRSZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5lcnJvck1lc3NhZ2UgPSB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdtaXNtYXRjaENodW5rU2l6ZScpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgIGNodW5rSW5kZXggPSBjaHVua0luZGV4ICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgIH0pXHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGVudGl0eSA9IG5ldyBHc3BGb3JtU3RyZWFtRW50aXR5O1xyXG4gICAgICBlbnRpdHkuZm9ybUlkID0gdGhpcy5mb3JtSWQ7XHJcbiAgICAgIGVudGl0eS5tZXRhZGF0YUlkID0gdXVpZDtcclxuICAgICAgZW50aXR5Lm1vZGUgPSBPcGVyYXRpbmdNb2Rlcy5UZW1wO1xyXG4gICAgICBlbnRpdHkucm9vdElkID0gdGhpcy5yb290SWQ7XHJcbiAgICAgIGVudGl0eS5zaXplID0gc2VsZWN0ZWRGaWxlLnNpemU7XHJcbiAgICAgIGVudGl0eS5maWxlTmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICBpZiAodGhpcy5oYXZlRXh0ZW5zaW9uUHJvcGVydHkpXHJcbiAgICAgICAgZW50aXR5LmV4UHJvcGVydHlOYW1lID0gdGhpcy5kZWZhdWx0UHJvcGVydHlOYW1lO1xyXG5cclxuICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgndXBsb2FkRW50aXR5JywgSlNPTi5zdHJpbmdpZnkoZW50aXR5KSk7XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHNlbGVjdGVkRmlsZSk7XHJcblxyXG5cclxuICAgICAgbGV0IGludGVydmFsSWQ7XHJcblxyXG4gICAgICB0aGlzLnVwbG9hZFNpbmdsZUZpbGUoZm9ybURhdGEpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRSZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0ID0gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuY29uY2F0KHVwbG9hZEZpbGVJbmZvKTtcclxuICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QgPSB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmNvbmNhdCh1cGxvYWRGaWxlSW5mbyk7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsKys7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICB9KVxyXG5cclxuICAgICAgbGV0IGluZGV4ID0gLTE7XHJcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICBpZiAoeC5uYW1lID09IGZpbGVJbmZvLm5hbWUpIHtcclxuICAgICAgICAgIGlmIChpbmRleCA9PSAtMSlcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmZpbGVzLmluZGV4T2YoeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggIT0gdGhpcy5maWxlcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgdGhpcy5maWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICB0aGlzLmdldFVwbG9hZFByb2Nlc3MoZW50aXR5Lm1ldGFkYXRhSWQpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5lcnJvciAhPSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFByb2Nlc3MgPSAxMDtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmVzIDwgMTApXHJcbiAgICAgICAgICAgICAgcmVzID0gMTA7XHJcbiAgICAgICAgICAgIGlmIChyZXMgPiA5MClcclxuICAgICAgICAgICAgICByZXMgPSA5MDtcclxuICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRQcm9jZXNzID0gcmVzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sIDIwMCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0VXBsb2FkUHJvY2VzcyhtZXRhZGF0YUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cclxuICAgIGxldCB1cmwgPSBcIi9hcGkvcnVudGltZS9kZnMvdjEuMC9mb3JtZG9jL3VwbG9hZC9wcm9jZXNzP21ldGFkYXRhaWQ9XCIgKyBtZXRhZGF0YUlkO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHBjbGllbnQuZ2V0KHVybCkucGlwZShcclxuICAgICAgdGFwKHJlcyA9PiB7IH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICByZXR1cm4gb2YoZXJyb3IpO1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRTaW5nbGVGaWxlKGZvcm1kYXRhOiBGb3JtRGF0YSk6IE9ic2VydmFibGU8YW55PiB7XHJcblxyXG4gICAgbGV0IHVybCA9IFwiL2FwaS9ydW50aW1lL2Rmcy92MS4wL2Zvcm1kb2Mvc2luZ2xlXCI7XHJcbiAgICBjb25zdCBiYXNlVXJsID0gQmFzZVBhdGhTZXJ2aWNlLmNvbnZlcnRQYXRoKHVybCk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwY2xpZW50LnBvc3QoYmFzZVVybCwgZm9ybWRhdGEpLnBpcGUoXHJcbiAgICAgIHRhcChyZXMgPT4geyB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG9mKGVycm9yKTtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkU2xpY2VGaWxlKGZvcm1kYXRhOiBGb3JtRGF0YSk6IE9ic2VydmFibGU8YW55PiB7XHJcblxyXG4gICAgbGV0IHVybCA9IFwiL2FwaS9ydW50aW1lL2Rmcy92MS4wL2Zvcm1kb2Mvc2xpY2VcIjtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSBCYXNlUGF0aFNlcnZpY2UuY29udmVydFBhdGgodXJsKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHBjbGllbnQucG9zdChiYXNlVXJsLCBmb3JtZGF0YSkucGlwZShcclxuICAgICAgdGFwKHJlcyA9PiB7IH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICByZXR1cm4gb2YoZXJyb3IpO1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBpbml0TXVsdGlVcGxvYWQocmVxdWVzdDogSW5pdE11bHRpVXBsb2FkUmVxdWVzdCk6IE9ic2VydmFibGU8YW55PiB7XHJcblxyXG4gICAgbGV0IHVybCA9IFwiL2FwaS9ydW50aW1lL2Rmcy92MS4wL2Zvcm1kb2MvbXVsdGkvaW5pdFwiO1xyXG4gICAgY29uc3QgYmFzZVVybCA9IEJhc2VQYXRoU2VydmljZS5jb252ZXJ0UGF0aCh1cmwpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cGNsaWVudC5wb3N0KGJhc2VVcmwsIHJlcXVlc3QpLnBpcGUoXHJcbiAgICAgIHRhcChyZXMgPT4geyB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG9mKGVycm9yKTtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgbXVsdGlVcGxvYWQoZm9ybWRhdGE6IEZvcm1EYXRhKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHJcbiAgICBsZXQgdXJsID0gXCIvYXBpL3J1bnRpbWUvZGZzL3YxLjAvZm9ybWRvYy9tdWx0aS91cGxvYWRcIjtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSBCYXNlUGF0aFNlcnZpY2UuY29udmVydFBhdGgodXJsKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHBjbGllbnQucG9zdChiYXNlVXJsLCBmb3JtZGF0YSkucGlwZShcclxuICAgICAgdGFwKHJlcyA9PiB7IH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICByZXR1cm4gb2YoZXJyb3IpO1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBjb21wbGV0ZU11bHRpVXBsb2FkKHJlcXVlc3Q6IENvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHJcbiAgICBsZXQgdXJsID0gXCIvYXBpL3J1bnRpbWUvZGZzL3YxLjAvZm9ybWRvYy9tdWx0aS9jb21wbGV0ZVwiO1xyXG4gICAgY29uc3QgYmFzZVVybCA9IEJhc2VQYXRoU2VydmljZS5jb252ZXJ0UGF0aCh1cmwpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cGNsaWVudC5wb3N0KGJhc2VVcmwsIHJlcXVlc3QpLnBpcGUoXHJcbiAgICAgIHRhcChyZXMgPT4geyB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG9mKGVycm9yKTtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBzZWxlY3RBbGxGaWxlKCkge1xyXG5cclxuICAgIGlmICghdGhpcy5maWxlQWxsU2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG5cclxuICAgICAgICBlbGVtZW50LnNlbGVjdGQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gdGhpcy5maWxlcy5sZW5ndGg7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG5cclxuICAgICAgICBlbGVtZW50LnNlbGVjdGQgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGNoZWNrb3V0U2VsZWN0RmlsZShmaWxlOiBGaWxlSW5mbykge1xyXG4gICAgLy8gbGV0IG9iajogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmlsZU5hbWUpO1xyXG4gICAgZmlsZS5zZWxlY3RkID0gIWZpbGUuc2VsZWN0ZDtcclxuICAgIGlmIChmaWxlLnNlbGVjdGQpXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQrKztcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudC0tO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPT0gdGhpcy5maWxlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAvL3RoaXMuaXNGaWxlQWxsU2VsZWN0ZWQoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAvL3RoaXMuaXNGaWxlQWxsU2VsZWN0ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBsaXN0RGVsZXRlRmlsZShmaWxlSW5mbzogRmlsZUluZm8pIHtcclxuICAgIGlmIChmaWxlSW5mby5zZWxlY3RkKVxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50LS07XHJcbiAgICAvL2NvbnNvbGUubG9nKGZpbGVOYW1lKTtcclxuICAgIHRoaXMuZmlsZXMuc3BsaWNlKHRoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyksIDEpO1xyXG4gICAgaWYgKGZpbGVJbmZvLnVwbG9hZFJlc3VsdCkge1xyXG4gICAgICBsZXQgaWRMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBpZExpc3QucHVzaChmaWxlSW5mby5pZCk7XHJcbiAgICAgIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwoaWRMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4LmZpbGVOYW1lID09IGZpbGVJbmZvLm5hbWUpWzBdKSwgMSk7XHJcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHguZmlsZU5hbWUgPT0gZmlsZUluZm8ubmFtZSlbMF0pLCAxKTtcclxuICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPT0gMClcclxuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGxpc3RNdWx0aXBsZURlbGV0ZUZpbGUoKSB7XHJcbiAgICBsZXQgc2VsZWN0ZWRGaWxlOiBGaWxlSW5mb1tdID0gW107XHJcbiAgICB0aGlzLmZpbGVzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGxldCBvYmo6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQubmFtZSk7XHJcbiAgICAgIGlmIChvYmouY2hlY2tlZClcclxuICAgICAgICBzZWxlY3RlZEZpbGUucHVzaChlbGVtZW50KTtcclxuICAgIH0pXHJcbiAgICBsZXQgbWV0YWRhdGFMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgc2VsZWN0ZWRGaWxlLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIG1ldGFkYXRhTGlzdC5wdXNoKGVsZW1lbnQuaWQpO1xyXG4gICAgICB0aGlzLmZpbGVzLnNwbGljZSh0aGlzLmZpbGVzLmluZGV4T2YoZWxlbWVudCksIDEpO1xyXG4gICAgICBpZiAoZWxlbWVudC51cGxvYWRSZXN1bHQpIHtcclxuXHJcbiAgICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmluZGV4T2YodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBlbGVtZW50Lm5hbWUpWzBdKSwgMSk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBlbGVtZW50Lm5hbWUpWzBdKSwgMSk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbChtZXRhZGF0YUxpc3QsIHRoaXMucm9vdElkKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBsZXQgYWxsQm94OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFsbENoZWNrQm94XCIpO1xyXG4gICAgaWYgKGFsbEJveCAhPSBudWxsKVxyXG4gICAgICBhbGxCb3guY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XHJcbiAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldFBpY0xpc3REaXNwbGF5TmFtZShmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoZmlsZU5hbWUubGVuZ3RoIDw9IDEwKVxyXG4gICAgICByZXR1cm4gZmlsZU5hbWU7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGhlYWRDb250ZW50ID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIDIpO1xyXG4gICAgICBsZXQgdGFpbENvbnRlbnQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSAtIDIpO1xyXG4gICAgICByZXR1cm4gaGVhZENvbnRlbnQgKyBcIuKAplwiICsgdGFpbENvbnRlbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRRdWV1ZURpc3BsYXlOYW1lKGZpbGVOYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBmaWxlTmFtZTtcclxuICB9XHJcblxyXG4gIGFkZERvY0luZm8oc2VsZWN0ZEZpbGUsIGZpbGVJbmZvOiBGaWxlSW5mbywgZG9jVHlwZTogRG9jVHlwZSkge1xyXG5cclxuICAgIHN3aXRjaCAoZG9jVHlwZSkge1xyXG4gICAgICBjYXNlIERvY1R5cGUuV29yZDoge1xyXG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IHRoaXMuY3JlYXRlQmFzZVVybChcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvd29yZC5wbmdcIik7XHJcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBEb2NUeXBlLlBkZjoge1xyXG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IHRoaXMuY3JlYXRlQmFzZVVybChcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvcGRmLnBuZ1wiKTtcclxuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIERvY1R5cGUuRXhjZWw6IHtcclxuICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSB0aGlzLmNyZWF0ZUJhc2VVcmwoXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL2V4Y2VsLnBuZ1wiKTtcclxuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIERvY1R5cGUuVHh0OiB7XHJcbiAgICAgICAgZmlsZUluZm8uc291cmNlID0gdGhpcy5jcmVhdGVCYXNlVXJsKFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy90eHQucG5nXCIpO1xyXG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgRG9jVHlwZS5aaXA6IHtcclxuICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSB0aGlzLmNyZWF0ZUJhc2VVcmwoXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3ppcC5wbmdcIik7XHJcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBEb2NUeXBlLlBvd2VycG9pbnQ6IHtcclxuICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSB0aGlzLmNyZWF0ZUJhc2VVcmwoXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3BwdC5wbmdcIik7XHJcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBEb2NUeXBlLk90aGVyOiB7XHJcbiAgICAgICAgZmlsZUluZm8uc291cmNlID0gdGhpcy5jcmVhdGVCYXNlVXJsKFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9maWxlLnBuZ1wiKTtcclxuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIERvY1R5cGUuSW1hZ2U6IHtcclxuICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChzZWxlY3RkRmlsZSk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChfZXZlbnQpID0+IHtcclxuICAgICAgICAgIGxldCBpbWdVcmwgPSByZWFkZXIucmVzdWx0O1xyXG4gICAgICAgICAgaWYgKHRoaXMuaW5qZWN0b3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZXQgc2FuaXRpemVyID0gdGhpcy5pbmplY3Rvci5nZXQoRG9tU2FuaXRpemVyKTtcclxuICAgICAgICAgICAgaW1nVXJsID0gc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpbWdVcmwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZmlsZUluZm8uc291cmNlID0gaW1nVXJsO1xyXG4gICAgICAgICAgZmlsZUluZm8uc3R5bGUgPSB7IFwibWF4LXdpZHRoXCI6IFwiMTIwcHhcIiwgXCJtYXgtaGVpZ2h0XCI6IFwiMTE4cHhcIiB9XHJcbiAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xyXG5cclxuICAgICAgICAgIC8v5Zug5Li65byC5q2l5aSE55CG55qE5beu5byC77yM6KGl5YG/5LiA5qyh5Yig6ZmkXHJcbiAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcclxuICAgICAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgaWYgKHgubmFtZSA9PSBmaWxlSW5mby5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKVxyXG4gICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLmZpbGVzLmluZGV4T2YoeCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggIT0gdGhpcy5maWxlcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBsaXN0VG9TdHJpbmcoc3RyTGlzdDogc3RyaW5nW10pIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHN0ckxpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbS50cmltKCkgIT09ICcnKTtcclxuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbmFtZSArPSByZXN1bHRbaV0gKyAoaSA9PT0gcmVzdWx0Lmxlbmd0aCAtIDEgPyBcIlwiIDogXCIsXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfVxyXG5cclxuICBzZWN1cml0eUNoYW5nZSgkZXZlbnQ6IGFueSwgZmlsZTogRmlsZUluZm8pIHtcclxuICAgIGZpbGUuc2VjdXJpdHlJbmZvID0gJGV2ZW50LmRhdGE7XHJcbiAgICBsZXQgdXBsb2FkRmlsZSA9IHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9IGZpbGUuaWQpWzBdO1xyXG4gICAgdXBsb2FkRmlsZS5zZWN1cml0eUluZm8gPSAkZXZlbnQuZGF0YTtcclxuICB9XHJcblxyXG5cclxuICBleFN0b3JhZ2VGaWxlTGlzdDogRXhTdG9yYWdlRmlsZUluZm9bXSA9IFtdO1xyXG5cclxuICB0eXBlQ2hhbmdlKCRldmVudDogYW55LCBmaWxlOiBGaWxlSW5mbykge1xyXG4gICAgZmlsZS5leHRlbnNpb25OYW1lID0gJGV2ZW50LmRhdGEubmFtZTtcclxuICAgIGxldCBleFN0b3JhZ2VGaWxlSW5mbzogRXhTdG9yYWdlRmlsZUluZm8gPSBuZXcgRXhTdG9yYWdlRmlsZUluZm87XHJcbiAgICBpZiAoZmlsZS5leHRlbnNpb25OYW1lID09IHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5kZWZhdWx0UHJvcGVydHlOYW1lKSB7XHJcbiAgICAgIGlmICh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKS5sZW5ndGggPiAwKVxyXG4gICAgICAgIHRoaXMuZXhTdG9yYWdlRmlsZUxpc3Quc3BsaWNlKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmluZEluZGV4KHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLCAxKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBleFN0b3JhZ2VGaWxlSW5mbyA9IHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpWzBdO1xyXG4gICAgICAgIGV4U3RvcmFnZUZpbGVJbmZvLmV4UHJvcGVydHlOYW1lID0gZmlsZS5leHRlbnNpb25OYW1lO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGV4U3RvcmFnZUZpbGVJbmZvLm1ldGFkYXRhSWQgPSBmaWxlLmlkO1xyXG4gICAgICAgIGV4U3RvcmFnZUZpbGVJbmZvLmV4UHJvcGVydHlOYW1lID0gZmlsZS5leHRlbnNpb25OYW1lO1xyXG4gICAgICAgIHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QucHVzaChleFN0b3JhZ2VGaWxlSW5mbyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwbG9hZCgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlVG90YWwgIT0gdGhpcy5maWxlcy5maWx0ZXIoeCA9PiB4LmlzVXBsb2FkaW5nIHx8IHgudXBsb2FkUmVzdWx0KS5sZW5ndGgpIHtcclxuXHJcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3dhaXQnKSk7XHJcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5oYXZlU2VjdXJpdHlJbmZvKSB7XHJcbiAgICAgIHRoaXMudXBsb2FkU2VydmljZS5zYXZlU2VjdXJpdHlJbmZvKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdG9yYWdlRXh0ZW5zaW9uID09IG51bGwpXHJcbiAgICAgIHJldHVybiBvZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QubGVuZ3RoID09IDApXHJcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0KTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZFNlcnZpY2Uuc2hvdyh7XHJcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdzYXZlVG8nKSArIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25OYW1lXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkU2VydmljZS5jaGFuZ2VTdG9yYWdlSW5zdGFuY2UodGhpcy5leFN0b3JhZ2VGaWxlTGlzdCwgdGhpcy5yb290SWQpLnBpcGUoXHJcbiAgICAgICAgICBtYXAocmVzID0+IHtcclxuICAgICAgICAgICAgLy8gaWYgKHJlcyAhPSBudWxsKVxyXG4gICAgICAgICAgICAvLyAgIHRoaXMubXNnU2VydmljZS5lcnJvcign5L+d5a2Y5YiwJyArIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25OYW1lICsgXCLlpLHotKXvvIzkuIrkvKDmlofku7boh6rliqjkv53lrZjliLBcIiArIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5kZWZhdWx0UHJvcGVydHlOYW1lICsgXCLlrZjlgqjjgIJcIiArIHJlcy5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Q7XHJcbiAgICAgICAgICB9KSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgaWYgKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0Lmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICB0aGlzLm1ldGFkYXRhSWRMaXN0LnB1c2goZWxlbWVudC5tZXRhZGF0YUlkKTtcclxuICAgIH0pXHJcbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY2FuY2VsKHRoaXMubWV0YWRhdGFJZExpc3QsIHRoaXMucm9vdElkKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRVcGxvYWRGaWxlSW5mb0xpc3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Q7XHJcbiAgfVxyXG5cclxuICBkZWxldGUoZmlsZSkge1xyXG4gICAgdGhpcy5maWxlcy5zcGxpY2UodGhpcy5maWxlcy5pbmRleE9mKGZpbGUpLCAxKTtcclxuICAgIGlmIChmaWxlLnVwbG9hZFJlc3VsdClcclxuICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xyXG4gICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5zcGxpY2UodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maW5kSW5kZXgoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZCksIDEpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGdldEZpbGVTaXplKHNpemU6IG51bWJlcikge1xyXG4gICAgaWYgKHNpemUgPCAxMDI0MDApXHJcbiAgICAgIHJldHVybiAoc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIktcIjtcclxuICAgIGVsc2UgaWYgKHNpemUgPCAxMDI0ICogMTAyNClcclxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCkudG9GaXhlZCgwKSArIFwiS1wiO1xyXG4gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMCAqIDEwMjQgKiAxMDI0KVxyXG4gICAgICByZXR1cm4gKHNpemUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgxKSArIFwiTVwiO1xyXG4gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMjQgKiAxMDI0ICogMTAyNClcclxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMCkgKyBcIk1cIjtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDEpICsgXCJHXCI7XHJcbiAgfVxyXG4gIHNob3dCeUdyb3VwKCkge1xyXG4gICAgdGhpcy5zaG93VHlwZSA9IDA7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gMDtcclxuICB9XHJcblxyXG4gIHNob3dCeUxpc3QoKSB7XHJcbiAgICB0aGlzLnNob3dUeXBlID0gMTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPSAwO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgIT0gMCAmJiB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlT3ZlcihmaWxlKSB7XHJcbiAgICBmaWxlLm1vdXNlT24gPSB0cnVlO1xyXG4gIH1cclxuICBtb3VzZU91dChmaWxlKSB7XHJcbiAgICBmaWxlLm1vdXNlT24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUJhc2VVcmwob2xkVXJsOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSBCYXNlUGF0aFNlcnZpY2UuY29udmVydFBhdGgob2xkVXJsKVxyXG4gICAgcmV0dXJuIGJhc2VVcmw7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuIl19
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import { Component, Input, ViewChild, TemplateRef, Injector, LOCALE_ID } from '@angular/core';
6
+ import { DocType } from '../entity/doctype';
7
+ import { OperatingModes } from '../entity/operatingmodes';
8
+ import { UploadService } from '../upload.service';
9
+ import { UploadFileInfo } from '../entity/uploadfileinfo';
10
+ import { MessagerService } from '@farris/ui-messager';
11
+ import { catchError, map, tap } from 'rxjs/operators';
12
+ import { of } from 'rxjs';
13
+ import { UUID } from 'angular2-uuid';
14
+ import { ExStorageFileInfo } from '../entity/extensionstoragefileinfo';
15
+ import { LoadingService } from '@farris/ui-loading';
16
+ import { DomSanitizer } from '@angular/platform-browser';
17
+ import { FileState } from '../entity/filestate';
18
+ import { LocalLangPipe } from '../../local.pipe';
19
+ import { GspDocSecurityBaseInfo } from '../entity/gspdocsecuritybaseinfo';
20
+ import { HttpClient } from '@angular/common/http';
21
+ import { InitMultiUploadRequest } from '../entity/initmultiuploadrequest';
22
+ import { CompleteMultiUploadRequest } from '../entity/completemultiuploadrequest';
23
+ import { GspFormStreamEntity } from '../entity/gspformstreamentity';
24
+ import { MultiUploadRequest } from '../entity/multiuploadrequest';
25
+ import { BasePathService } from '@farris/rtf';
26
+ export class FileUploadComponent {
27
+ /**
28
+ * @param {?} msgService
29
+ * @param {?} uploadService
30
+ * @param {?} loadService
31
+ * @param {?=} injector
32
+ */
33
+ constructor(msgService, uploadService, loadService, injector) {
34
+ this.msgService = msgService;
35
+ this.uploadService = uploadService;
36
+ this.loadService = loadService;
37
+ this.injector = injector;
38
+ this.files = [];
39
+ this.metadataIdList = [];
40
+ this.uploadFileInfoList = [];
41
+ this.errFileList = [];
42
+ this.errTypeList = [];
43
+ this.nullFileList = [];
44
+ this.beyondFileList = [];
45
+ this.fileNameOversizeList = [];
46
+ this.invalidCharactersFileList = [];
47
+ this.invalidExtNamesFileList = [];
48
+ this.unrecognizedTypeFileList = [];
49
+ this.invalidCharacters = '';
50
+ this.invalidExtNames = '';
51
+ this.showType = 0;
52
+ this.mouseOn = false;
53
+ this.isWhiteList = false;
54
+ this.bufferSize = 5 * 1024 * 1024;
55
+ this.selectedFileCount = 0;
56
+ this.uploadBtnDisabled = false;
57
+ this.uploadIconAddress = this.createBaseUrl('/platform/runtime/dfs/images/upload.svg');
58
+ this.uploadLittleIconAddress = this.createBaseUrl('/platform/runtime/dfs/images/uploadIcon.svg');
59
+ this.hasSelectedFile = false;
60
+ this.fileAllSelected = false;
61
+ this.uploadProcess = { width: '0%' };
62
+ this.fileTotalChunk = {};
63
+ this.requestArray = new Array;
64
+ this.requestBodyArray = new Array;
65
+ this.uploadedChunk = {};
66
+ this.uploadedProcess = {};
67
+ this.defaultPropertyName = "";
68
+ this.propertiesNames = [];
69
+ this.securityInfoList = [];
70
+ this.queueListStyle = { width: '480px' };
71
+ this.dropListValue = "";
72
+ this.uploadedFileTotal = 0;
73
+ this.haveExtensionProperty = false;
74
+ this.haveSecurityInfo = false;
75
+ this.uploadedFileInfoList = [];
76
+ this.oldUploadedFileList = [];
77
+ //uploadedNameList = [];
78
+ this.uploadInfoErrorMessage = "";
79
+ this.sameNameAllowed = true;
80
+ this.maxFileSize = 0;
81
+ this.checkboxPos = { top: '0px' };
82
+ this.fileType = "*";
83
+ this.fileCount = 0;
84
+ this.oldIdList = [];
85
+ this.securityInfo = null;
86
+ this.fileNameLength = 0;
87
+ this.totalLoad = null;
88
+ this.exStorageFileList = [];
89
+ if (this.injector) {
90
+ this.httpclient = this.injector.get(HttpClient);
91
+ this.localeid = localStorage.getItem("languageCode") || this.injector.get(LOCALE_ID);
92
+ this.localepipe = new LocalLangPipe(this.localeid);
93
+ }
94
+ }
95
+ ;
96
+ /**
97
+ * @return {?}
98
+ */
99
+ ngOnInit() {
100
+ if (navigator.userAgent.indexOf('Firefox') >= 0)
101
+ this.checkboxPos.top = '14px';
102
+ //if (this.storageService != null) {
103
+ if (this.securityInfo != null) {
104
+ this.uploadService.getSecurityInfoList(this.securityInfo).subscribe((/**
105
+ * @param {?} res
106
+ * @return {?}
107
+ */
108
+ res => {
109
+ this.haveSecurityInfo = true;
110
+ /** @type {?} */
111
+ let i = 0;
112
+ res.forEach((/**
113
+ * @param {?} element
114
+ * @return {?}
115
+ */
116
+ element => {
117
+ this.securityInfoList.push({ id: i.toString(), securityId: element.securityId, securityLevel: element.securityLevel, name: element.name });
118
+ i++;
119
+ }));
120
+ }));
121
+ }
122
+ this.uploadService.getStorageExtensionInfo().subscribe((/**
123
+ * @param {?} res
124
+ * @return {?}
125
+ */
126
+ res => {
127
+ if (res != null && res.error == null) {
128
+ this.storageExtension = res;
129
+ this.defaultPropertyName = this.storageExtension.defaultPropertyName;
130
+ this.propertiesNames.push({ id: "0", name: this.storageExtension.defaultPropertyName });
131
+ /** @type {?} */
132
+ let i = 0;
133
+ // this.propertiesNames.push(...(this.storageExtension.extensionPropertyNameList));
134
+ this.storageExtension.extensionPropertyNameList.forEach((/**
135
+ * @param {?} element
136
+ * @return {?}
137
+ */
138
+ element => {
139
+ this.propertiesNames.push({ id: (++i).toString(), name: element });
140
+ }));
141
+ this.queueListStyle.width = '380px';
142
+ this.haveExtensionProperty = true;
143
+ }
144
+ }));
145
+ this.uploadService.getUploadInfo(this.rootId).subscribe((/**
146
+ * @param {?} res
147
+ * @return {?}
148
+ */
149
+ res => {
150
+ if (res.error != null) {
151
+ this.uploadInfoErrorMessage = res.error.Message;
152
+ // console.log('获取上传信息报错,错误信息为:',errMsg);
153
+ return;
154
+ }
155
+ else {
156
+ this.uploadBtnDisabled = false;
157
+ this.sameNameAllowed = res.sameNameAllowed;
158
+ this.maxFileSize = parseInt(JSON.parse(res.validateConfiguration).maxFileSize);
159
+ this.isWhiteList = JSON.parse(res.validateConfiguration).whiteList;
160
+ this.invalidCharacters = JSON.parse(res.validateConfiguration).invalidCharacters;
161
+ this.invalidExtNames = JSON.parse(res.validateConfiguration).invalidExtNames.toLowerCase();
162
+ this.allowedMultiUpload = res.allowedMultiUpload;
163
+ if (!this.sameNameAllowed) {
164
+ this.uploadService.getUploadedFileInfoList(this.formId, this.rootId).subscribe((/**
165
+ * @param {?} res
166
+ * @return {?}
167
+ */
168
+ res => {
169
+ if (res != null && res.error == null) {
170
+ this.uploadedFileInfoList = res;
171
+ this.oldUploadedFileList = JSON.parse(JSON.stringify(res));
172
+ ;
173
+ }
174
+ }));
175
+ }
176
+ }
177
+ }));
178
+ if (this.oldIdList != null && this.oldIdList.length > 0) {
179
+ // this.uploadService.cancel(this.oldIdList, this.rootId).subscribe();
180
+ }
181
+ this.radioButtonGroupValue = 'showByGroup';
182
+ }
183
+ /**
184
+ * @return {?}
185
+ */
186
+ showLoading() {
187
+ this.hasSelectedFile = true;
188
+ // if (this.totalLoad == null)
189
+ // this.totalLoad = this.loadService.show({
190
+ // message: this.localepipe.transform('uploading')
191
+ // });
192
+ }
193
+ /**
194
+ * @return {?}
195
+ */
196
+ getRightClass() {
197
+ if (this.uploadBtnDisabled) {
198
+ return 'btn btn-primary btn-lg disabled';
199
+ }
200
+ else {
201
+ return 'btn btn-primary btn-lg';
202
+ }
203
+ }
204
+ /**
205
+ * @param {?} name
206
+ * @return {?}
207
+ */
208
+ findInvalidCharacter(name) {
209
+ /** @type {?} */
210
+ let charList = [];
211
+ this.invalidCharacters.split('|').forEach((/**
212
+ * @param {?} element
213
+ * @return {?}
214
+ */
215
+ element => {
216
+ if (name.indexOf(element) >= 0)
217
+ charList.push(element);
218
+ }));
219
+ return charList;
220
+ }
221
+ /**
222
+ * @param {?} file
223
+ * @return {?}
224
+ */
225
+ hasFileType(file) {
226
+ return file.name.includes('.');
227
+ }
228
+ /**
229
+ * @param {?} $event
230
+ * @return {?}
231
+ */
232
+ fileSelected($event) {
233
+ if (this.uploadInfoErrorMessage) {
234
+ this.msgService.error(this.uploadInfoErrorMessage);
235
+ this.uploadBtnDisabled = true;
236
+ return;
237
+ }
238
+ this.hasSelectedFile = true;
239
+ this.selectedFiles = document.querySelector('#file');
240
+ if (this.fileCount > 0) {
241
+ if (this.selectedFiles.files.length + this.files.length > this.fileCount) {
242
+ /** @type {?} */
243
+ let selectedNum = ((/** @type {?} */ (this.selectedFiles.files.length))) + this.files.length;
244
+ this.msgService.warning(this.localepipe.transform('selectedCount') + selectedNum + this.localepipe.transform('limitCount') + this.fileCount + this.localepipe.transform('rechooseFile'));
245
+ return;
246
+ }
247
+ }
248
+ //this.flag = 0;
249
+ for (let i = 0; i < this.selectedFiles.files.length; i++) {
250
+ /** @type {?} */
251
+ let selectedFile = this.selectedFiles.files[i];
252
+ selectedFile.isAllowedUpload = true;
253
+ //selectedFile.slice
254
+ /** @type {?} */
255
+ let uuid = UUID.UUID();
256
+ if (selectedFile.size == 0) {
257
+ this.nullFileList.push(selectedFile.name);
258
+ continue;
259
+ }
260
+ if (this.fileNameLength > 0 && selectedFile.name.length > this.fileNameLength) {
261
+ this.fileNameOversizeList.push(selectedFile.name);
262
+ continue;
263
+ }
264
+ if (this.maxFileSize != null && this.maxFileSize > 0) {
265
+ if (selectedFile.size > this.maxFileSize * 1000) {
266
+ this.beyondFileList.push(selectedFile.name);
267
+ continue;
268
+ }
269
+ }
270
+ /** @type {?} */
271
+ const invalidCharList = this.findInvalidCharacter(selectedFile.name);
272
+ /** @type {?} */
273
+ let invalidCharListFilter = invalidCharList.filter((/**
274
+ * @param {?} s
275
+ * @return {?}
276
+ */
277
+ (s) => {
278
+ return s && s.trim();
279
+ }));
280
+ /** @type {?} */
281
+ let errorMessage = "";
282
+ if (invalidCharListFilter.length > 0) {
283
+ invalidCharListFilter.forEach((/**
284
+ * @param {?} element
285
+ * @param {?} index
286
+ * @return {?}
287
+ */
288
+ (element, index) => {
289
+ errorMessage += "\"";
290
+ errorMessage += element;
291
+ errorMessage += "\"";
292
+ errorMessage += (index === invalidCharListFilter.length - 1) ? "" : ",";
293
+ }));
294
+ if (this.selectedFiles.files.length === 1) {
295
+ selectedFile.isAllowedUpload = false;
296
+ this.msgService.warning(this.localepipe.transform('invalidCharacters') + errorMessage + this.localepipe.transform('rechooseFile'));
297
+ return;
298
+ }
299
+ if (this.selectedFiles.files.length > 1) {
300
+ selectedFile.isAllowedUpload = false;
301
+ this.invalidCharactersFileList.push(selectedFile.name);
302
+ continue;
303
+ }
304
+ }
305
+ if (!this.hasFileType(selectedFile)) {
306
+ if (this.selectedFiles.files.length === 1) {
307
+ selectedFile.isAllowedUpload = false;
308
+ this.msgService.warning(selectedFile.name + this.localepipe.transform('UnrecognizedFileType') + this.localepipe.transform('rechooseFile'));
309
+ return;
310
+ }
311
+ if (this.selectedFiles.files.length > 1) {
312
+ selectedFile.isAllowedUpload = false;
313
+ this.unrecognizedTypeFileList.push(selectedFile.name);
314
+ continue;
315
+ }
316
+ }
317
+ // let curFileSuffix = selectedFile.name.split('.')[1];
318
+ /** @type {?} */
319
+ let curFileSuffix = selectedFile.name.substr(selectedFile.name.lastIndexOf('.') + 1).toLowerCase();
320
+ /** @type {?} */
321
+ const extNames = this.listToString(this.invalidExtNames.split('|'));
322
+ /** @type {?} */
323
+ const extNamesAry = this.invalidExtNames.split('|');
324
+ if (!this.isWhiteList && extNamesAry.includes(curFileSuffix)) {
325
+ if (this.selectedFiles.files.length === 1) {
326
+ selectedFile.isAllowedUpload = false;
327
+ this.msgService.warning(selectedFile.name + this.localepipe.transform('invalidExtNames') + this.localepipe.transform('blackExtNames') + extNames + this.localepipe.transform('rechooseFile'));
328
+ return;
329
+ }
330
+ if (this.selectedFiles.files.length > 1) {
331
+ selectedFile.isAllowedUpload = false;
332
+ this.invalidExtNamesFileList.push(selectedFile.name);
333
+ continue;
334
+ }
335
+ }
336
+ if (this.isWhiteList && !extNamesAry.includes(curFileSuffix)) {
337
+ if (this.selectedFiles.files.length === 1) {
338
+ selectedFile.isAllowedUpload = false;
339
+ this.msgService.warning(selectedFile.name + this.localepipe.transform('invalidExtNames') + this.localepipe.transform('whiteExtNames') + extNames + this.localepipe.transform('rechooseFile'));
340
+ return;
341
+ }
342
+ if (this.selectedFiles.files.length > 1) {
343
+ selectedFile.isAllowedUpload = false;
344
+ this.invalidExtNamesFileList.push(selectedFile.name);
345
+ continue;
346
+ }
347
+ }
348
+ if (!this.sameNameAllowed) {
349
+ if (this.uploadedFileInfoList.find((/**
350
+ * @param {?} x
351
+ * @return {?}
352
+ */
353
+ x => x.fileName == selectedFile.name)) != null) {
354
+ /** @type {?} */
355
+ const msg = this.msgService.show('warning', this.localepipe.transform('haveSameName') + selectedFile.name, {
356
+ initialState: {
357
+ buttons: [
358
+ {
359
+ text: this.localepipe.transform('rename'),
360
+ cls: 'btn btn-secondary',
361
+ handle: (/**
362
+ * @return {?}
363
+ */
364
+ () => {
365
+ /** @type {?} */
366
+ let oldName = selectedFile.name;
367
+ /** @type {?} */
368
+ let newName;
369
+ /** @type {?} */
370
+ let flag = true;
371
+ /** @type {?} */
372
+ let i = 1;
373
+ while (flag) {
374
+ newName = oldName.substring(0, oldName.lastIndexOf('.')) + '(' + i + ')' + oldName.substring(oldName.lastIndexOf('.'));
375
+ if (this.uploadedFileInfoList.find((/**
376
+ * @param {?} x
377
+ * @return {?}
378
+ */
379
+ x => x.fileName == newName)) != null) {
380
+ i++;
381
+ }
382
+ else
383
+ flag = false;
384
+ }
385
+ this.uploadFile(uuid, selectedFile, newName);
386
+ msg.close();
387
+ })
388
+ },
389
+ {
390
+ text: this.localepipe.transform('replace'),
391
+ cls: 'btn btn-secondary',
392
+ handle: (/**
393
+ * @return {?}
394
+ */
395
+ () => {
396
+ uuid = this.uploadedFileInfoList.find((/**
397
+ * @param {?} x
398
+ * @return {?}
399
+ */
400
+ x => x.fileName == selectedFile.name)).metadataId;
401
+ this.uploadFile(uuid, selectedFile, selectedFile.name, FileState.Update);
402
+ this.uploadedFileTotal--;
403
+ if (this.oldUploadedFileList.find((/**
404
+ * @param {?} x
405
+ * @return {?}
406
+ */
407
+ x => x.fileName == selectedFile.name))) {
408
+ this.uploadedFileTotal++;
409
+ this.uploadedFileInfoList.splice(this.uploadedFileInfoList.indexOf(this.uploadedFileInfoList.filter((/**
410
+ * @param {?} x
411
+ * @return {?}
412
+ */
413
+ x => x.fileName == selectedFile.name))[0]), 1);
414
+ }
415
+ msg.close();
416
+ })
417
+ },
418
+ {
419
+ text: this.localepipe.transform('cancel'),
420
+ cls: 'btn btn-secondary',
421
+ handle: (/**
422
+ * @return {?}
423
+ */
424
+ () => {
425
+ msg.close();
426
+ })
427
+ }
428
+ ]
429
+ }
430
+ });
431
+ continue;
432
+ }
433
+ }
434
+ if (selectedFile.isAllowedUpload === true) {
435
+ this.uploadFile(uuid, selectedFile, selectedFile.name);
436
+ }
437
+ }
438
+ if (this.errFileList.length > 0) {
439
+ /** @type {?} */
440
+ let name = this.listToString(this.errFileList);
441
+ this.msgService.warning(this.localepipe.transform('haveSameName') + name + this.localepipe.transform('rechooseFile'));
442
+ this.errFileList = [];
443
+ }
444
+ if (this.nullFileList.length > 0) {
445
+ /** @type {?} */
446
+ let name = this.listToString(this.nullFileList);
447
+ this.msgService.warning(name + this.localepipe.transform('sizeZero') + this.localepipe.transform('rechooseFile'));
448
+ this.nullFileList = [];
449
+ }
450
+ if (this.fileNameOversizeList.length > 0) {
451
+ /** @type {?} */
452
+ let name = this.listToString(this.fileNameOversizeList);
453
+ this.msgService.warning(name + this.localepipe.transform('fileNameOverSize') + this.fileNameLength + this.localepipe.transform('rechooseFile'));
454
+ this.fileNameOversizeList = [];
455
+ }
456
+ if (this.beyondFileList.length > 0) {
457
+ /** @type {?} */
458
+ let name = this.listToString(this.beyondFileList);
459
+ this.msgService.warning(name + this.localepipe.transform('sizeMax') + this.maxFileSize + "KB" + this.localepipe.transform('rechooseFile'));
460
+ this.beyondFileList = [];
461
+ }
462
+ if (this.invalidCharactersFileList.length > 0) {
463
+ /** @type {?} */
464
+ let name = this.listToString(this.invalidCharactersFileList);
465
+ this.msgService.warning(name + this.localepipe.transform('invalidCharacters') + this.localepipe.transform('rechooseFile'));
466
+ this.invalidCharactersFileList = [];
467
+ }
468
+ if (this.invalidExtNamesFileList.length > 0) {
469
+ /** @type {?} */
470
+ let name = this.listToString(this.invalidExtNamesFileList);
471
+ this.msgService.warning(name + this.localepipe.transform('invalidExtNames') + this.localepipe.transform('rechooseFile'));
472
+ this.invalidExtNamesFileList = [];
473
+ }
474
+ if (this.unrecognizedTypeFileList.length > 0) {
475
+ /** @type {?} */
476
+ let name = this.listToString(this.unrecognizedTypeFileList);
477
+ this.msgService.warning(name + this.localepipe.transform('UnrecognizedFileType') + this.localepipe.transform('rechooseFile'));
478
+ this.unrecognizedTypeFileList = [];
479
+ }
480
+ this.files = this.files.slice();
481
+ this.fileAllSelected = false;
482
+ $event.target.value = '';
483
+ // loading.close();
484
+ }
485
+ /**
486
+ * @param {?} file
487
+ * @return {?}
488
+ */
489
+ showErrorMessage(file) {
490
+ this.msgService.error(this.localepipe.transform('uploadFailurej') + file.errorMessage);
491
+ }
492
+ /**
493
+ * @param {?} uuid
494
+ * @param {?} selectedFile
495
+ * @param {?} fileName
496
+ * @return {?}
497
+ */
498
+ handleFileInfo(uuid, selectedFile, fileName) {
499
+ /** @type {?} */
500
+ let fileInfo;
501
+ fileInfo = {
502
+ id: uuid,
503
+ name: fileName,
504
+ type: selectedFile.type,
505
+ source: "",
506
+ size: this.getFileSize(selectedFile.size),
507
+ fileSize: selectedFile.size,
508
+ picListDisplayName: this.getPicListDisplayName(fileName),
509
+ queueListDisplayName: this.getQueueDisplayName(fileName),
510
+ //content: reader.result.toString(),
511
+ hasUploaded: false,
512
+ mouseOn: false,
513
+ selectd: false,
514
+ isUploading: true,
515
+ uploadResult: false,
516
+ uploadProcess: 0,
517
+ errorMessage: "",
518
+ extensionDropListId: 0,
519
+ extensionName: "",
520
+ securityDropListId: 0,
521
+ securityInfo: this.securityInfoList[0],
522
+ style: {}
523
+ };
524
+ if (this.storageExtension != null)
525
+ fileInfo.extensionName = this.defaultPropertyName;
526
+ /** @type {?} */
527
+ let type = selectedFile.type;
528
+ if (type.includes("tiff")) {
529
+ this.addDocInfo(selectedFile, fileInfo, DocType.Other);
530
+ }
531
+ else if (type.includes("image")) {
532
+ this.addDocInfo(selectedFile, fileInfo, DocType.Image);
533
+ }
534
+ else if (type.includes("word")) {
535
+ this.addDocInfo(selectedFile, fileInfo, DocType.Word);
536
+ }
537
+ else if (type.includes("pdf")) {
538
+ this.addDocInfo(selectedFile, fileInfo, DocType.Pdf);
539
+ }
540
+ else if (type.includes("plain")) {
541
+ this.addDocInfo(selectedFile, fileInfo, DocType.Txt);
542
+ }
543
+ else if (type.includes("sheet") || type.includes("excel")) {
544
+ this.addDocInfo(selectedFile, fileInfo, DocType.Excel);
545
+ }
546
+ else if (type.includes("powerpoint") || type.includes("presentation")) {
547
+ this.addDocInfo(selectedFile, fileInfo, DocType.Powerpoint);
548
+ }
549
+ else if (type.includes("zip") || selectedFile.name.includes(".rar")) {
550
+ this.addDocInfo(selectedFile, fileInfo, DocType.Zip);
551
+ }
552
+ else {
553
+ this.addDocInfo(selectedFile, fileInfo, DocType.Other);
554
+ // let name: string = selectedFile.name;
555
+ // let errType = name.substring(selectedFile.name.lastIndexOf('.'));
556
+ // this.errTypeList.push(errType);
557
+ }
558
+ return fileInfo;
559
+ }
560
+ /**
561
+ * @param {?} uuid
562
+ * @param {?} selectedFile
563
+ * @param {?} fileName
564
+ * @param {?=} state
565
+ * @return {?}
566
+ */
567
+ uploadFile(uuid, selectedFile, fileName, state = FileState.New) {
568
+ /** @type {?} */
569
+ let fileInfo = this.handleFileInfo(uuid, selectedFile, fileName);
570
+ /** @type {?} */
571
+ let uploadFileInfo = new UploadFileInfo();
572
+ uploadFileInfo.metadataId = uuid;
573
+ uploadFileInfo.fileName = fileInfo.name;
574
+ uploadFileInfo.fileSize = fileInfo.size;
575
+ uploadFileInfo.originalSize = fileInfo.fileSize;
576
+ uploadFileInfo.state = state;
577
+ uploadFileInfo.securityInfo = this.securityInfoList[0];
578
+ //判断是否支持分片上传
579
+ if (this.allowedMultiUpload) {
580
+ //支持分片上传
581
+ /** @type {?} */
582
+ let initRequest = new InitMultiUploadRequest;
583
+ initRequest.path = this.formId;
584
+ initRequest.metadataId = uuid;
585
+ initRequest.rootId = this.rootId;
586
+ initRequest.size = fileInfo.fileSize;
587
+ initRequest.fileName = fileName;
588
+ //初始化分片
589
+ this.initMultiUpload(initRequest).subscribe((/**
590
+ * @param {?} res
591
+ * @return {?}
592
+ */
593
+ res => {
594
+ if (res.error != null) {
595
+ this.files[this.files.indexOf(fileInfo)].uploadResult = false;
596
+ this.files[this.files.indexOf(fileInfo)].isUploading = false;
597
+ this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
598
+ }
599
+ else {
600
+ /** @type {?} */
601
+ let uploadId = res.uploadId;
602
+ /** @type {?} */
603
+ let chunkTotal = Math.ceil(selectedFile.size / this.bufferSize);
604
+ /** @type {?} */
605
+ let chunkIndex = 0;
606
+ /** @type {?} */
607
+ let multiResultList = [];
608
+ this.fileTotalChunk[uuid] = chunkTotal;
609
+ this.uploadedChunk[uuid] = 0;
610
+ while (chunkIndex < chunkTotal) {
611
+ /** @type {?} */
612
+ let nextSize = Math.min((chunkIndex + 1) * this.bufferSize, selectedFile.size);
613
+ /** @type {?} */
614
+ let fileData = selectedFile.slice(chunkIndex * this.bufferSize, nextSize);
615
+ /** @type {?} */
616
+ let multiRequest = new MultiUploadRequest;
617
+ multiRequest.metadataId = uuid;
618
+ multiRequest.rootId = this.rootId;
619
+ multiRequest.uploadId = uploadId;
620
+ multiRequest.index = chunkIndex;
621
+ multiRequest.total = chunkTotal;
622
+ multiRequest.size = fileData.size;
623
+ /** @type {?} */
624
+ let formData = new FormData();
625
+ formData.append('multiRequest', JSON.stringify(multiRequest));
626
+ formData.append('file', fileData);
627
+ this.multiUpload(formData).subscribe((/**
628
+ * @param {?} res
629
+ * @return {?}
630
+ */
631
+ res => {
632
+ if (res.error != null) {
633
+ this.files[this.files.indexOf(fileInfo)].uploadResult = false;
634
+ this.files[this.files.indexOf(fileInfo)].isUploading = false;
635
+ this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
636
+ }
637
+ else {
638
+ multiResultList.push(res.result);
639
+ this.uploadedChunk[uuid]++;
640
+ this.files[this.files.indexOf(fileInfo)].uploadProcess = Number.parseInt((this.uploadedChunk[uuid] / this.fileTotalChunk[uuid] * 100).toFixed(0));
641
+ if (this.uploadedChunk[uuid] == this.fileTotalChunk[uuid]) {
642
+ if (multiResultList.length == this.fileTotalChunk[uuid]) {
643
+ /** @type {?} */
644
+ let completeMultiUploadRequest = new CompleteMultiUploadRequest;
645
+ completeMultiUploadRequest.metadataId = uuid;
646
+ completeMultiUploadRequest.partList = multiResultList;
647
+ completeMultiUploadRequest.rootId = this.rootId;
648
+ completeMultiUploadRequest.uploadId = uploadId;
649
+ completeMultiUploadRequest.size = fileInfo.fileSize;
650
+ if (this.haveExtensionProperty)
651
+ completeMultiUploadRequest.exPropertyName = this.defaultPropertyName;
652
+ this.completeMultiUpload(completeMultiUploadRequest).subscribe((/**
653
+ * @param {?} res
654
+ * @return {?}
655
+ */
656
+ res => {
657
+ if (res.status != 200) {
658
+ this.files[this.files.indexOf(fileInfo)].uploadResult = false;
659
+ this.files[this.files.indexOf(fileInfo)].isUploading = false;
660
+ this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
661
+ }
662
+ else {
663
+ this.files[this.files.indexOf(fileInfo)].uploadResult = true;
664
+ this.files[this.files.indexOf(fileInfo)].isUploading = false;
665
+ this.uploadFileInfoList = this.uploadFileInfoList.concat(uploadFileInfo);
666
+ this.uploadedFileInfoList = this.uploadedFileInfoList.concat(uploadFileInfo);
667
+ this.uploadedFileTotal++;
668
+ }
669
+ }));
670
+ //后台异步拼接文档
671
+ }
672
+ else {
673
+ this.files[this.files.indexOf(fileInfo)].uploadResult = false;
674
+ this.files[this.files.indexOf(fileInfo)].isUploading = false;
675
+ this.files[this.files.indexOf(fileInfo)].errorMessage = this.localepipe.transform('mismatchChunkSize');
676
+ }
677
+ }
678
+ }
679
+ }));
680
+ chunkIndex = chunkIndex + 1;
681
+ }
682
+ }
683
+ }));
684
+ }
685
+ else {
686
+ /** @type {?} */
687
+ let entity = new GspFormStreamEntity;
688
+ entity.formId = this.formId;
689
+ entity.metadataId = uuid;
690
+ entity.mode = OperatingModes.Temp;
691
+ entity.rootId = this.rootId;
692
+ entity.size = selectedFile.size;
693
+ entity.fileName = fileName;
694
+ if (this.haveExtensionProperty)
695
+ entity.exPropertyName = this.defaultPropertyName;
696
+ /** @type {?} */
697
+ let formData = new FormData();
698
+ formData.append('uploadEntity', JSON.stringify(entity));
699
+ formData.append('file', selectedFile);
700
+ /** @type {?} */
701
+ let intervalId;
702
+ this.uploadSingleFile(formData).subscribe((/**
703
+ * @param {?} res
704
+ * @return {?}
705
+ */
706
+ res => {
707
+ if (res != null) {
708
+ this.files[this.files.indexOf(fileInfo)].uploadResult = false;
709
+ this.files[this.files.indexOf(fileInfo)].isUploading = false;
710
+ this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
711
+ }
712
+ else {
713
+ this.files[this.files.indexOf(fileInfo)].uploadResult = true;
714
+ this.files[this.files.indexOf(fileInfo)].isUploading = false;
715
+ this.uploadFileInfoList = this.uploadFileInfoList.concat(uploadFileInfo);
716
+ this.uploadedFileInfoList = this.uploadedFileInfoList.concat(uploadFileInfo);
717
+ this.uploadedFileTotal++;
718
+ }
719
+ clearInterval(intervalId);
720
+ }));
721
+ /** @type {?} */
722
+ let index = -1;
723
+ this.files.forEach((/**
724
+ * @param {?} x
725
+ * @return {?}
726
+ */
727
+ x => {
728
+ if (x.name == fileInfo.name) {
729
+ if (index == -1)
730
+ index = this.files.indexOf(x);
731
+ }
732
+ }));
733
+ if (index != -1 && index != this.files.length - 1) {
734
+ this.files.splice(index, 1);
735
+ this.uploadFileInfoList.splice(this.uploadFileInfoList.findIndex((/**
736
+ * @param {?} item
737
+ * @return {?}
738
+ */
739
+ item => item.fileName === fileInfo.name)), 1);
740
+ this.uploadedFileInfoList.splice(this.uploadedFileInfoList.findIndex((/**
741
+ * @param {?} item
742
+ * @return {?}
743
+ */
744
+ item => item.fileName === fileInfo.name)), 1);
745
+ this.uploadedFileTotal--;
746
+ }
747
+ intervalId = setInterval((/**
748
+ * @return {?}
749
+ */
750
+ () => {
751
+ this.getUploadProcess(entity.metadataId).subscribe((/**
752
+ * @param {?} res
753
+ * @return {?}
754
+ */
755
+ res => {
756
+ if (res.error != null)
757
+ this.files[this.files.indexOf(fileInfo)].uploadProcess = 10;
758
+ else {
759
+ if (res < 10)
760
+ res = 10;
761
+ if (res > 90)
762
+ res = 90;
763
+ this.files[this.files.indexOf(fileInfo)].uploadProcess = res;
764
+ }
765
+ }));
766
+ }), 200);
767
+ }
768
+ }
769
+ /**
770
+ * @param {?} metadataId
771
+ * @return {?}
772
+ */
773
+ getUploadProcess(metadataId) {
774
+ /** @type {?} */
775
+ let url = "/api/runtime/dfs/v1.0/formdoc/upload/process?metadataid=" + metadataId;
776
+ return this.httpclient.get(url).pipe(tap((/**
777
+ * @param {?} res
778
+ * @return {?}
779
+ */
780
+ res => { })), catchError((/**
781
+ * @param {?} error
782
+ * @return {?}
783
+ */
784
+ (error) => {
785
+ return of(error);
786
+ })));
787
+ }
788
+ /**
789
+ * @param {?} formdata
790
+ * @return {?}
791
+ */
792
+ uploadSingleFile(formdata) {
793
+ /** @type {?} */
794
+ let url = "/api/runtime/dfs/v1.0/formdoc/single";
795
+ /** @type {?} */
796
+ const baseUrl = BasePathService.convertPath(url);
797
+ return this.httpclient.post(baseUrl, formdata).pipe(tap((/**
798
+ * @param {?} res
799
+ * @return {?}
800
+ */
801
+ res => { })), catchError((/**
802
+ * @param {?} error
803
+ * @return {?}
804
+ */
805
+ (error) => {
806
+ return of(error);
807
+ })));
808
+ }
809
+ /**
810
+ * @param {?} formdata
811
+ * @return {?}
812
+ */
813
+ uploadSliceFile(formdata) {
814
+ /** @type {?} */
815
+ let url = "/api/runtime/dfs/v1.0/formdoc/slice";
816
+ /** @type {?} */
817
+ const baseUrl = BasePathService.convertPath(url);
818
+ return this.httpclient.post(baseUrl, formdata).pipe(tap((/**
819
+ * @param {?} res
820
+ * @return {?}
821
+ */
822
+ res => { })), catchError((/**
823
+ * @param {?} error
824
+ * @return {?}
825
+ */
826
+ (error) => {
827
+ return of(error);
828
+ })));
829
+ }
830
+ /**
831
+ * @param {?} request
832
+ * @return {?}
833
+ */
834
+ initMultiUpload(request) {
835
+ /** @type {?} */
836
+ let url = "/api/runtime/dfs/v1.0/formdoc/multi/init";
837
+ /** @type {?} */
838
+ const baseUrl = BasePathService.convertPath(url);
839
+ return this.httpclient.post(baseUrl, request).pipe(tap((/**
840
+ * @param {?} res
841
+ * @return {?}
842
+ */
843
+ res => { })), catchError((/**
844
+ * @param {?} error
845
+ * @return {?}
846
+ */
847
+ (error) => {
848
+ return of(error);
849
+ })));
850
+ }
851
+ /**
852
+ * @param {?} formdata
853
+ * @return {?}
854
+ */
855
+ multiUpload(formdata) {
856
+ /** @type {?} */
857
+ let url = "/api/runtime/dfs/v1.0/formdoc/multi/upload";
858
+ /** @type {?} */
859
+ const baseUrl = BasePathService.convertPath(url);
860
+ return this.httpclient.post(baseUrl, formdata).pipe(tap((/**
861
+ * @param {?} res
862
+ * @return {?}
863
+ */
864
+ res => { })), catchError((/**
865
+ * @param {?} error
866
+ * @return {?}
867
+ */
868
+ (error) => {
869
+ return of(error);
870
+ })));
871
+ }
872
+ /**
873
+ * @param {?} request
874
+ * @return {?}
875
+ */
876
+ completeMultiUpload(request) {
877
+ /** @type {?} */
878
+ let url = "/api/runtime/dfs/v1.0/formdoc/multi/complete";
879
+ /** @type {?} */
880
+ const baseUrl = BasePathService.convertPath(url);
881
+ return this.httpclient.post(baseUrl, request).pipe(tap((/**
882
+ * @param {?} res
883
+ * @return {?}
884
+ */
885
+ res => { })), catchError((/**
886
+ * @param {?} error
887
+ * @return {?}
888
+ */
889
+ (error) => {
890
+ return of(error);
891
+ })));
892
+ }
893
+ /**
894
+ * @return {?}
895
+ */
896
+ selectAllFile() {
897
+ if (!this.fileAllSelected) {
898
+ this.files.forEach((/**
899
+ * @param {?} element
900
+ * @return {?}
901
+ */
902
+ element => {
903
+ element.selectd = true;
904
+ }));
905
+ this.fileAllSelected = true;
906
+ this.selectedFileCount = this.files.length;
907
+ }
908
+ else {
909
+ this.files.forEach((/**
910
+ * @param {?} element
911
+ * @return {?}
912
+ */
913
+ element => {
914
+ element.selectd = false;
915
+ }));
916
+ this.fileAllSelected = false;
917
+ this.selectedFileCount = 0;
918
+ }
919
+ }
920
+ /**
921
+ * @param {?} file
922
+ * @return {?}
923
+ */
924
+ checkoutSelectFile(file) {
925
+ // let obj: any = document.getElementById(fileName);
926
+ file.selectd = !file.selectd;
927
+ if (file.selectd)
928
+ this.selectedFileCount++;
929
+ else
930
+ this.selectedFileCount--;
931
+ if (this.selectedFileCount == this.files.length) {
932
+ this.fileAllSelected = true;
933
+ //this.isFileAllSelected();
934
+ }
935
+ else {
936
+ this.fileAllSelected = false;
937
+ //this.isFileAllSelected();
938
+ }
939
+ }
940
+ /**
941
+ * @param {?} fileInfo
942
+ * @return {?}
943
+ */
944
+ listDeleteFile(fileInfo) {
945
+ if (fileInfo.selectd)
946
+ this.selectedFileCount--;
947
+ //console.log(fileName);
948
+ this.files.splice(this.files.indexOf(fileInfo), 1);
949
+ if (fileInfo.uploadResult) {
950
+ /** @type {?} */
951
+ let idList = [];
952
+ idList.push(fileInfo.id);
953
+ this.uploadService.cancel(idList, this.rootId).subscribe();
954
+ this.uploadFileInfoList.splice(this.uploadFileInfoList.indexOf(this.uploadFileInfoList.filter((/**
955
+ * @param {?} x
956
+ * @return {?}
957
+ */
958
+ x => x.fileName == fileInfo.name))[0]), 1);
959
+ this.uploadedFileInfoList.splice(this.uploadedFileInfoList.indexOf(this.uploadedFileInfoList.filter((/**
960
+ * @param {?} x
961
+ * @return {?}
962
+ */
963
+ x => x.fileName == fileInfo.name))[0]), 1);
964
+ this.uploadedFileTotal--;
965
+ }
966
+ if (this.selectedFileCount == 0)
967
+ this.fileAllSelected = false;
968
+ }
969
+ /**
970
+ * @return {?}
971
+ */
972
+ listMultipleDeleteFile() {
973
+ /** @type {?} */
974
+ let selectedFile = [];
975
+ this.files.forEach((/**
976
+ * @param {?} element
977
+ * @return {?}
978
+ */
979
+ element => {
980
+ /** @type {?} */
981
+ let obj = document.getElementById(element.name);
982
+ if (obj.checked)
983
+ selectedFile.push(element);
984
+ }));
985
+ /** @type {?} */
986
+ let metadataList = [];
987
+ selectedFile.forEach((/**
988
+ * @param {?} element
989
+ * @return {?}
990
+ */
991
+ element => {
992
+ metadataList.push(element.id);
993
+ this.files.splice(this.files.indexOf(element), 1);
994
+ if (element.uploadResult) {
995
+ this.uploadFileInfoList.splice(this.uploadFileInfoList.indexOf(this.uploadFileInfoList.filter((/**
996
+ * @param {?} x
997
+ * @return {?}
998
+ */
999
+ x => x.fileName == element.name))[0]), 1);
1000
+ this.uploadedFileInfoList.splice(this.uploadedFileInfoList.indexOf(this.uploadedFileInfoList.filter((/**
1001
+ * @param {?} x
1002
+ * @return {?}
1003
+ */
1004
+ x => x.fileName == element.name))[0]), 1);
1005
+ this.uploadedFileTotal--;
1006
+ }
1007
+ }));
1008
+ this.uploadService.cancel(metadataList, this.rootId).subscribe();
1009
+ /** @type {?} */
1010
+ let allBox = document.getElementById("allCheckBox");
1011
+ if (allBox != null)
1012
+ allBox.checked = false;
1013
+ this.selectedFileCount = 0;
1014
+ this.fileAllSelected = false;
1015
+ }
1016
+ /**
1017
+ * @param {?} fileName
1018
+ * @return {?}
1019
+ */
1020
+ getPicListDisplayName(fileName) {
1021
+ if (fileName.length <= 10)
1022
+ return fileName;
1023
+ else {
1024
+ /** @type {?} */
1025
+ let headContent = fileName.substring(0, 2);
1026
+ /** @type {?} */
1027
+ let tailContent = fileName.substring(fileName.lastIndexOf('.') - 2);
1028
+ return headContent + "…" + tailContent;
1029
+ }
1030
+ }
1031
+ /**
1032
+ * @param {?} fileName
1033
+ * @return {?}
1034
+ */
1035
+ getQueueDisplayName(fileName) {
1036
+ return fileName;
1037
+ }
1038
+ /**
1039
+ * @param {?} selectdFile
1040
+ * @param {?} fileInfo
1041
+ * @param {?} docType
1042
+ * @return {?}
1043
+ */
1044
+ addDocInfo(selectdFile, fileInfo, docType) {
1045
+ switch (docType) {
1046
+ case DocType.Word: {
1047
+ fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/word.png");
1048
+ this.files.push(fileInfo);
1049
+ break;
1050
+ }
1051
+ case DocType.Pdf: {
1052
+ fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/pdf.png");
1053
+ this.files.push(fileInfo);
1054
+ break;
1055
+ }
1056
+ case DocType.Excel: {
1057
+ fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/excel.png");
1058
+ this.files.push(fileInfo);
1059
+ break;
1060
+ }
1061
+ case DocType.Txt: {
1062
+ fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/txt.png");
1063
+ this.files.push(fileInfo);
1064
+ break;
1065
+ }
1066
+ case DocType.Zip: {
1067
+ fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/zip.png");
1068
+ this.files.push(fileInfo);
1069
+ break;
1070
+ }
1071
+ case DocType.Powerpoint: {
1072
+ fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/ppt.png");
1073
+ this.files.push(fileInfo);
1074
+ break;
1075
+ }
1076
+ case DocType.Other: {
1077
+ fileInfo.source = this.createBaseUrl("/platform/runtime/dfs/images/file.png");
1078
+ this.files.push(fileInfo);
1079
+ break;
1080
+ }
1081
+ case DocType.Image: {
1082
+ /** @type {?} */
1083
+ let reader = new FileReader();
1084
+ reader.readAsDataURL(selectdFile);
1085
+ reader.onload = (/**
1086
+ * @param {?} _event
1087
+ * @return {?}
1088
+ */
1089
+ (_event) => {
1090
+ /** @type {?} */
1091
+ let imgUrl = reader.result;
1092
+ if (this.injector != null) {
1093
+ /** @type {?} */
1094
+ let sanitizer = this.injector.get(DomSanitizer);
1095
+ imgUrl = sanitizer.bypassSecurityTrustResourceUrl(imgUrl);
1096
+ }
1097
+ fileInfo.source = imgUrl;
1098
+ fileInfo.style = { "max-width": "120px", "max-height": "118px" };
1099
+ this.files.push(fileInfo);
1100
+ //因为异步处理的差异,补偿一次删除
1101
+ /** @type {?} */
1102
+ let index = -1;
1103
+ this.files.forEach((/**
1104
+ * @param {?} x
1105
+ * @return {?}
1106
+ */
1107
+ x => {
1108
+ if (x.name == fileInfo.name) {
1109
+ if (index == -1)
1110
+ index = this.files.indexOf(x);
1111
+ }
1112
+ }));
1113
+ if (index != -1 && index != this.files.length - 1) {
1114
+ this.files.splice(index, 1);
1115
+ this.uploadFileInfoList.splice(this.uploadFileInfoList.findIndex((/**
1116
+ * @param {?} item
1117
+ * @return {?}
1118
+ */
1119
+ item => item.fileName === fileInfo.name)), 1);
1120
+ this.uploadedFileInfoList.splice(this.uploadedFileInfoList.findIndex((/**
1121
+ * @param {?} item
1122
+ * @return {?}
1123
+ */
1124
+ item => item.fileName === fileInfo.name)), 1);
1125
+ this.uploadedFileTotal--;
1126
+ }
1127
+ });
1128
+ }
1129
+ }
1130
+ }
1131
+ /**
1132
+ * @param {?} strList
1133
+ * @return {?}
1134
+ */
1135
+ listToString(strList) {
1136
+ /** @type {?} */
1137
+ const result = strList.filter((/**
1138
+ * @param {?} item
1139
+ * @return {?}
1140
+ */
1141
+ item => item.trim() !== ''));
1142
+ /** @type {?} */
1143
+ let name = "";
1144
+ for (let i = 0; i < result.length; i++) {
1145
+ name += result[i] + (i === result.length - 1 ? "" : ",");
1146
+ }
1147
+ return name;
1148
+ }
1149
+ /**
1150
+ * @param {?} $event
1151
+ * @param {?} file
1152
+ * @return {?}
1153
+ */
1154
+ securityChange($event, file) {
1155
+ file.securityInfo = $event.selections[0];
1156
+ /** @type {?} */
1157
+ let uploadFile = this.uploadFileInfoList.filter((/**
1158
+ * @param {?} x
1159
+ * @return {?}
1160
+ */
1161
+ x => x.metadataId === file.id))[0];
1162
+ uploadFile.securityInfo = $event.selections[0];
1163
+ }
1164
+ /**
1165
+ * @param {?} $event
1166
+ * @param {?} file
1167
+ * @return {?}
1168
+ */
1169
+ typeChange($event, file) {
1170
+ file.extensionName = $event.selections[0].name;
1171
+ /** @type {?} */
1172
+ let exStorageFileInfo = new ExStorageFileInfo;
1173
+ if (file.extensionName == this.storageExtension.defaultPropertyName) {
1174
+ if (this.exStorageFileList.filter((/**
1175
+ * @param {?} x
1176
+ * @return {?}
1177
+ */
1178
+ x => x.metadataId == file.id)).length > 0)
1179
+ this.exStorageFileList.splice(this.exStorageFileList.findIndex((/**
1180
+ * @param {?} x
1181
+ * @return {?}
1182
+ */
1183
+ x => x.metadataId == file.id)), 1);
1184
+ }
1185
+ else {
1186
+ if (this.exStorageFileList.filter((/**
1187
+ * @param {?} x
1188
+ * @return {?}
1189
+ */
1190
+ x => x.metadataId == file.id)).length > 0) {
1191
+ exStorageFileInfo = this.exStorageFileList.filter((/**
1192
+ * @param {?} x
1193
+ * @return {?}
1194
+ */
1195
+ x => x.metadataId == file.id))[0];
1196
+ exStorageFileInfo.exPropertyName = file.extensionName;
1197
+ }
1198
+ else {
1199
+ exStorageFileInfo.metadataId = file.id;
1200
+ exStorageFileInfo.exPropertyName = file.extensionName;
1201
+ this.exStorageFileList.push(exStorageFileInfo);
1202
+ }
1203
+ }
1204
+ }
1205
+ /**
1206
+ * @return {?}
1207
+ */
1208
+ upload() {
1209
+ if (this.uploadFileInfoList.length != this.files.filter((/**
1210
+ * @param {?} x
1211
+ * @return {?}
1212
+ */
1213
+ x => x.isUploading || x.uploadResult)).length) {
1214
+ this.msgService.warning(this.localepipe.transform('wait'));
1215
+ return of(false);
1216
+ }
1217
+ if (this.haveSecurityInfo) {
1218
+ this.uploadService.saveSecurityInfo(this.uploadFileInfoList, this.rootId).subscribe();
1219
+ }
1220
+ if (this.storageExtension == null)
1221
+ return of(this.uploadFileInfoList);
1222
+ else {
1223
+ if (this.exStorageFileList.length == 0)
1224
+ return of(this.uploadFileInfoList);
1225
+ else {
1226
+ /** @type {?} */
1227
+ const loading = this.loadService.show({
1228
+ message: this.localepipe.transform('saveTo') + this.storageExtension.extensionName
1229
+ });
1230
+ return this.uploadService.changeStorageInstance(this.exStorageFileList, this.rootId).pipe(map((/**
1231
+ * @param {?} res
1232
+ * @return {?}
1233
+ */
1234
+ res => {
1235
+ // if (res != null)
1236
+ // this.msgService.error('保存到' + this.storageExtension.extensionName + "失败,上传文件自动保存到" + this.storageExtension.defaultPropertyName + "存储。" + res.error.Message);
1237
+ loading.close();
1238
+ return this.uploadFileInfoList;
1239
+ })));
1240
+ }
1241
+ }
1242
+ }
1243
+ /**
1244
+ * @return {?}
1245
+ */
1246
+ cancel() {
1247
+ if (this.uploadFileInfoList.length == 0)
1248
+ return;
1249
+ this.uploadFileInfoList.forEach((/**
1250
+ * @param {?} element
1251
+ * @return {?}
1252
+ */
1253
+ element => {
1254
+ this.metadataIdList.push(element.metadataId);
1255
+ }));
1256
+ this.uploadService.cancel(this.metadataIdList, this.rootId).subscribe();
1257
+ }
1258
+ /**
1259
+ * @return {?}
1260
+ */
1261
+ getUploadFileInfoList() {
1262
+ return this.uploadFileInfoList;
1263
+ }
1264
+ /**
1265
+ * @param {?} file
1266
+ * @return {?}
1267
+ */
1268
+ delete(file) {
1269
+ this.files.splice(this.files.indexOf(file), 1);
1270
+ if (file.uploadResult)
1271
+ this.uploadedFileTotal--;
1272
+ if (this.exStorageFileList.filter((/**
1273
+ * @param {?} x
1274
+ * @return {?}
1275
+ */
1276
+ x => x.metadataId == file.id)).length > 0) {
1277
+ this.exStorageFileList.splice(this.exStorageFileList.findIndex((/**
1278
+ * @param {?} x
1279
+ * @return {?}
1280
+ */
1281
+ x => x.metadataId == file.id)), 1);
1282
+ }
1283
+ }
1284
+ /**
1285
+ * @param {?} size
1286
+ * @return {?}
1287
+ */
1288
+ getFileSize(size) {
1289
+ if (size < 102400)
1290
+ return (size / 1024).toFixed(1) + "K";
1291
+ else if (size < 1024 * 1024)
1292
+ return (size / 1024).toFixed(0) + "K";
1293
+ else if (size < 100 * 1024 * 1024)
1294
+ return (size / 1024 / 1024).toFixed(1) + "M";
1295
+ else if (size < 1024 * 1024 * 1024)
1296
+ return (size / 1024 / 1024).toFixed(0) + "M";
1297
+ else
1298
+ return (size / 1024 / 1024 / 1024).toFixed(1) + "G";
1299
+ }
1300
+ /**
1301
+ * @return {?}
1302
+ */
1303
+ showByGroup() {
1304
+ this.showType = 0;
1305
+ // this.selectedFileCount = 0;
1306
+ }
1307
+ /**
1308
+ * @return {?}
1309
+ */
1310
+ showByList() {
1311
+ this.showType = 1;
1312
+ // this.selectedFileCount = 0;
1313
+ if (this.selectedFileCount != 0 && this.selectedFileCount == this.files.length) {
1314
+ this.fileAllSelected = true;
1315
+ }
1316
+ }
1317
+ /**
1318
+ * @param {?} file
1319
+ * @return {?}
1320
+ */
1321
+ mouseOver(file) {
1322
+ file.mouseOn = true;
1323
+ }
1324
+ /**
1325
+ * @param {?} file
1326
+ * @return {?}
1327
+ */
1328
+ mouseOut(file) {
1329
+ file.mouseOn = false;
1330
+ }
1331
+ /**
1332
+ * @param {?} oldUrl
1333
+ * @return {?}
1334
+ */
1335
+ createBaseUrl(oldUrl) {
1336
+ /** @type {?} */
1337
+ const baseUrl = BasePathService.convertPath(oldUrl);
1338
+ return baseUrl;
1339
+ }
1340
+ }
1341
+ FileUploadComponent.decorators = [
1342
+ { type: Component, args: [{
1343
+ selector: 'app-file-upload',
1344
+ template: "<div *ngIf=\"hasSelectedFile\">\n\n <div class=\"farris-header\" style=\"height: 50px; width: 100%\">\n <div class=\"btn btn-secondary upload_button\">\n <img [src]=\"uploadLittleIconAddress\">\n <span>{{'uploadFile' | locale}} </span>\n <input type=\"file\" (focus)=\"showLoading()\" (change)=\"fileSelected($event)\" id=\"file\" multiple=\"multiple\"\n title=\"\" [accept]=\"fileType\" [disabled]=\"uploadBtnDisabled\">\n </div>\n\n\n <button *ngIf=\"showType==0 && !fileAllSelected && files.length >0 \" style=\"padding-left: 20px\"\n class=\"btn-link btn ng-star-inserted\" (click)=\"selectAllFile()\">{{'selectAll' | locale}}</button>\n <button *ngIf=\"showType==0 && fileAllSelected && files.length >0 \" style=\"padding-left: 20px\"\n class=\"btn-link btn ng-star-inserted\" (click)=\"selectAllFile()\">{{'selectNull' | locale}}</button>\n <button *ngIf=\"showType==0 && selectedFileCount>0\" style=\"padding-left: 20px\"\n class=\"btn-link btn ng-star-inserted\" (click)=\"listMultipleDeleteFile()\">{{'delete' | locale}}</button>\n\n <button *ngIf=\"showType==1 && selectedFileCount>0\" style=\"padding-left: 20px\"\n class=\"btn-link btn ng-star-inserted\" (click)=\"listMultipleDeleteFile()\">{{'delete' | locale}}</button>\n <span class=\"help_text\" *ngIf=\"files.length >0\">{{'fileCount' | locale}} {{files.length}}</span>\n\n <farris-radio-group class=\"button_group_upload\" [(model)]=\"radioButtonGroupValue\" [horizontal]=\"false\">\n <farris-radio-button [label]=\"'showByGroup'\" (click)=\"showByGroup()\">\n <span class=\"f-icon f-icon-sudoku-new\"> </span>\n </farris-radio-button>\n <farris-radio-button [label]=\"'showByList'\" (click)=\"showByList()\">\n <span class=\"f-icon f-icon-page-title-define\"> </span>\n </farris-radio-button>\n\n </farris-radio-group>\n\n <!-- <kendo-buttongroup [selection]=\"'single'\" class=\"button_group_upload \"\n style=\"background-color: #ffffff; color: #388FFF;border: 1px solid #ddd;\" look=\"flat\">\n <button kendoButton [selected]=\"true\" [toggleable]=\"true\"\n [imageUrl]=\"'/platform/runtime/dfs/images/piclist.png'\" (click)=\"showByGroup()\"></button>\n <button kendoButton [toggleable]=\"true\" [imageUrl]=\"'/platform/runtime/dfs/images/queuelist.png'\"\n (click)=\"showByList()\"></button>\n </kendo-buttongroup> -->\n\n\n </div>\n\n <!-- <div class=\"progress\" style=\"height: 12px;\">\n <div class=\"progress-bar\" role=\"progressbar\" [ngStyle]=\"uploadProcess\"></div>\n </div> -->\n\n <div class=\"pic_list\" *ngIf=\"showType==0\">\n <ul *ngFor=\"let file of files\">\n <li (mouseenter)=\"mouseOver(file)\" (mouseleave)=\"mouseOut(file)\">\n <div *ngIf=\"file.isUploading\" class=\"loading_box\">\n <div><farris-progress [type]=\"'circle'\" [percent]=\"file.uploadProcess\" [strokeLinecap]=\"'square'\"\n [status]=\"'active'\"></farris-progress>\n </div>\n <div style=\"width: 120px; vertical-align: middle; text-align: center\" [title]=\"file.name\">\n {{ file.picListDisplayName }}\n </div>\n </div>\n <table *ngIf=\"!file.uploadResult && !file.isUploading\"\n style=\"margin: 0 auto; border: 1px solid #ddd; width: 135px; height: 160px;\">\n <tr style=\"margin: 0 auto ; height: 80px;\">\n <td style=\"text-align: center\"><span class=\"f-icon f-icon-warn\"></span></td>\n </tr>\n <tr style=\"margin: 0 auto ; height: 30px;\">\n <td style=\"text-align: center\"> {{'uploadFailure' | locale}} </td>\n </tr>\n <tr>\n <td style=\"text-align: center\"><button style=\"margin: 0 auto ; height: 20px; \"\n class=\"btn-link btn ng-star-inserted\" (click)=\"showErrorMessage(file)\">{{'detail' |\n locale}}</button></td>\n </tr>\n </table>\n <div *ngIf=\"!file.isUploading && file.uploadResult\" style=\"border: 1px solid #ddd;\">\n <img [src]='file.source' [ngStyle]=\"file.style\">\n <div *ngIf=\"haveExtensionProperty\"\n style=\"width: 133px; height: 25px; background-color: white; position: absolute;bottom: 0; \">\n\n <div style=\"width: 100px;height: 25px;position:absolute;margin: 0 17px;\">\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"propertiesNames\"\n [idField]=\"'id'\" [textField]=\"'name'\" (valueChange)=\"typeChange($event,file)\"\n [enableClear]=\"false\">\n <!-- <ng-template #itemTemp let-item>\n <div class=\"combo-list\">\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\n <span class=\"combo-list-label\">{{item.label}}</span>\n </div>\n </ng-template> -->\n </farris-combo-list>\n </div>\n </div>\n <div *ngIf=\"haveSecurityInfo\"\n style=\"width: 133px; height: 25px; background-color: white; position: absolute;bottom: 0; \">\n\n <div style=\"width: 100px;height: 25px;position:absolute;margin: 0 17px;\">\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"securityInfoList\"\n [idField]=\"'id'\" [textField]=\"'name'\" (valueChange)=\"securityChange($event,file)\"\n [enableClear]=\"false\">\n <!-- <ng-template #itemTemp let-item>\n <div class=\"combo-list\">\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\n <span class=\"combo-list-label\">{{item.label}}</span>\n </div>\n </ng-template> -->\n </farris-combo-list>\n </div>\n </div>\n </div>\n <table *ngIf=\"!file.isUploading\">\n <tr style=\"height: 20px\">\n <td style=\"width: 15px; vertical-align: middle; text-align: center\">\n <!-- <input type=\"checkbox\" [id]=\"file.name\" (click)=\"checkoutSelectFile(file.name)\"> -->\n <div class=\"farris-input-wrap\" style=\"height: 20px\" (click)=\"checkoutSelectFile(file)\">\n <div class=\"custom-control custom-checkbox\" style=\"margin: 4px 0 0;height: 20px;\"\n [ngStyle]=\"checkboxPos\">\n <input class=\"custom-control-input\" type=\"checkbox\" [id]=\"file.name\"\n [(ngModel)]=\"file.selectd\">\n <label class=\"custom-control-label\"\n style=\"padding: 0 0 10px 0; position: relative; top: -8px;\"></label>\n </div>\n </div>\n </td>\n <td style=\"width: 120px; vertical-align: middle; text-align: center\" [title]=\"file.name\">\n {{file.picListDisplayName}}</td>\n </tr>\n </table>\n <!-- <span>{{file.picListDisplayName}}</span> -->\n <!-- <p class=\"filename\">{{file.picListDisplayName}}</p> -->\n <button *ngIf=\"!file.isUploading && file.mouseOn\"\n style=\"position: absolute; top: 0; right: 0px; width: 24px; height: 24px; border: none;\"\n (click)=\"listDeleteFile(file)\">\n <span style=\"position: relative; right: 2px; \" class=\"f-icon f-icon-delete\"> </span>\n </button>\n <!-- <button *ngIf=\"file.hasUploaded\" class=\"k-primary\" kendoButton [icon]=\"'check'\" [disabled]=\"true\"></button> -->\n </li>\n </ul>\n <br>\n </div>\n\n <div class=\"queue_list\" *ngIf=\"showType==1\">\n <table>\n <tr style=\"height: 50px; table-layout:fixed;\">\n <th style=\"width: 40px; vertical-align: middle; text-align: center\">\n <!-- <input type=\"checkbox\" id=\"allCheckBox\" (click)=\"selectAllFile()\"> -->\n <div class=\"farris-input-wrap\" (click)=\"selectAllFile()\">\n <div class=\"custom-control custom-checkbox\" style=\"margin: 4px 0 0\">\n <input class=\"custom-control-input\" type=\"checkbox\" id=\"allCheckBox\"\n [(ngModel)]=\"fileAllSelected\">\n <label class=\"custom-control-label\" style=\"padding: 0\"></label>\n </div>\n </div>\n </th>\n <th style=\"vertical-align: middle\" [ngStyle]=\"queueListStyle\">{{'fileName' | locale}}</th>\n <th style=\"width: 100px; vertical-align: middle\">{{'size' | locale}}</th>\n <th style=\"width: 170px; vertical-align: middle; text-align: center\">{{'state' | locale}}</th>\n <th *ngIf=\"haveExtensionProperty\" style=\"width: 100px; vertical-align: middle; text-align: center\">\n {{storageExtension.extensionName}}\n </th>\n <th style=\"width: 140px; vertical-align: middle; text-align: center\">{{'operation' | locale}}</th>\n </tr>\n </table>\n <div style=\"height: 370px; overflow: auto;\">\n <table>\n <tr *ngFor=\"let file of files\" style=\"height: 40px\">\n <td colspan=\"5\" *ngIf=\"file.isUploading\">\n <!-- <div style=\"width:100%; display: table-cell; vertical-align: middle; text-align: center; \"> -->\n <div style=\"display:flex;\">\n <div style=\"vertical-align: middle;padding-left:45px\" [ngStyle]=\"queueListStyle\">{{ file.queueListDisplayName }}</div>\n <div style=\"width:40%\"><farris-progress [percent]=\"file.uploadProcess\" [status]=\"'active'\"></farris-progress></div>\n </div>\n </td>\n <td *ngIf=\"!file.isUploading\" style=\" width: 40px; vertical-align: middle; text-align: center\">\n <!-- <input type=\"checkbox\" [id]=\"file.name\" (click)=\"checkoutSelectFile(file.name)\"> -->\n <div class=\"farris-input-wrap\" (click)=\"checkoutSelectFile(file)\">\n <div class=\"custom-control custom-checkbox\" style=\"margin: 4px 0 0\">\n <input class=\"custom-control-input\" type=\"checkbox\" [id]=\"file.name\"\n [(ngModel)]=\"file.selectd\">\n <label class=\"custom-control-label\" style=\"padding: 0\"></label>\n </div>\n </div>\n </td>\n <td *ngIf=\"!file.isUploading\" style=\"vertical-align: middle\" [ngStyle]=\"queueListStyle\">\n {{file.queueListDisplayName}}</td>\n <td *ngIf=\"!file.isUploading\" style=\"width: 100px; vertical-align: middle\">{{file.size}}</td>\n <td *ngIf=\"!file.isUploading\" style=\"text-align: center; width: 170px; vertical-align: middle;\">\n <table *ngIf=\"!file.uploadResult\" style=\"margin: 0 auto\">\n <tr style=\"margin: 0 auto\">\n <td><span class=\"f-icon f-icon-error\"></span></td>\n <td> {{'uploadFailure' | locale}} </td>\n <td><button style=\"height: 24px\" class=\"btn-link btn ng-star-inserted\"\n (click)=\"showErrorMessage(file)\">{{'detail' | locale}}</button></td>\n </tr>\n </table>\n <!-- <span *ngIf=\"!file.uploadResult\"><span class=\"f-icon f-icon-error\"></span> \u4E0A\u4F20\u5931\u8D25 <button\n class=\"btn-link btn ng-star-inserted\" (click)=\"showErrorMessage(file)\">\u8BE6\u60C5</button></span> -->\n <span *ngIf=\"file.uploadResult\"><span class=\"f-icon f-icon-success\"></span> {{'uploadSucceed' |\n locale}}</span>\n </td>\n <td *ngIf=\"!file.isUploading&&haveExtensionProperty\"\n style=\"text-align: center; width: 100px; vertical-align: middle;\">\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"propertiesNames\"\n [idField]=\"'id'\" [textField]=\"'name'\" (valueChange)=\"typeChange($event,file)\"\n [enableClear]=\"false\">\n <!-- <ng-template #itemTemp let-item>\n <div class=\"combo-list\">\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\n <span class=\"combo-list-label\">{{item.label}}</span>\n </div>\n </ng-template> -->\n </farris-combo-list>\n </td>\n <td *ngIf=\"!file.isUploading&&haveSecurityInfo\"\n style=\"text-align: center; width: 100px; vertical-align: middle;\">\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"securityInfoList\"\n [idField]=\"'id'\" [textField]=\"'name'\" (valueChange)=\"securityChange($event,file)\"\n [enableClear]=\"false\">\n <!-- <ng-template #itemTemp let-item>\n <div class=\"combo-list\">\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\n <span class=\"combo-list-label\">{{item.label}}</span>\n </div>\n </ng-template> -->\n </farris-combo-list>\n </td>\n\n <td *ngIf=\"!file.isUploading\" style=\"text-align: center; width: 140px; vertical-align: middle;\">\n <!-- <button *ngIf=\"file.uploadResult\" class=\"btn-link btn ng-star-inserted\" (click)=\"retryUploadFile(file.name)\">\u91CD\u8BD5</button> -->\n <button class=\"btn-link btn ng-star-inserted\" style=\"margin: 0 auto\"\n (click)=\"listDeleteFile(file)\">{{'delete' | locale}}</button>\n </td>\n\n </tr>\n </table>\n </div>\n </div>\n</div>\n\n<div *ngIf=\"!hasSelectedFile\" class='home_page'>\n <img [src]=\"uploadIconAddress\">\n <div>\n <span [class]=\"getRightClass()\">{{'uploadFile' | locale}} </span>\n <input type=\"file\" style=\"height: 32px;\" (change)=\"fileSelected($event)\" id=\"file\" multiple=\"multiple\" title=\"\" [accept]=\"fileType\" [disabled]=\"uploadBtnDisabled\">\n <!-- <input type=\"file\" (focus)=\"showLoading()\" (change)=\"fileSelected($event)\" id=\"file\" multiple=\"multiple\" title=\"\" [accept]=\"fileType\"> -->\n </div>\n</div>\n",
1345
+ styles: [".home_page{text-align:center}.home_page img{position:absolute;top:180px;margin-left:-35px;width:70px;height:56px}.home_page div{position:absolute;left:50%;top:255px;margin-left:-75px;width:150px;height:32px;overflow:hidden}.home_page div span{width:150px;height:32px;position:absolute;z-index:10;left:0}.home_page div input{position:absolute;left:0;top:0;opacity:0;filter:'alpha(opacity=0)';z-index:11}.upload_button{width:110px;height:32px;overflow:hidden}.upload_button span{position:relative;right:-4px;top:4px;width:56px;height:22px;font-size:14px}.upload_button input{height:32px;width:110px;position:absolute;left:22px;top:12px;opacity:0;filter:'alpha(opacity=0)';overflow:hidden}.upload_button img{position:relative;left:-6px;top:3px;width:14px;height:14px}.button_group_upload{position:absolute;right:18px;top:12px;height:26px;width:90px}.button_group_upload button{height:26px;width:26px}.fileinput-button{position:absolute;right:60px;bottom:40px;overflow:hidden;width:24px;height:24px;border-radius:12px;transform:scale(2.5);-ms-transform:scale(2.5);-moz-transform:scale(2.5);-webkit-transform:scale(2.5);-o-transform:scale(2.5);color:#0686fd}.fileinput-button input{position:absolute;left:0;top:0;opacity:0;filter:'alpha(opacity=0)'}.pic-droplist{height:24px;color:#e0e1e2;background-color:#e0e1e2}.pic-droplist input-group{display:table-cell;width:100px;text-align:center;border:0}.pic-droplist input-group div{border:0}.pic-droplist input-group div div,.pic-droplist input-group div input{background-color:#e0e1e2}.pic_list{padding:0;height:400px;overflow-y:auto;overflow-x:hidden}.pic_list ul{padding:0;list-style:none;width:100%;margin:20px 0 0 20px}.pic_list ul li{height:179px;width:135px;margin:8px 0 8px 12px;float:left;overflow:hidden;align-items:center;position:relative}.pic_list ul li div{width:135px;height:159px;margin:auto;display:table-cell;vertical-align:middle;text-align:center;position:relative}.pic_list ul li .loading_box{display:flex;flex-direction:column}.pic_list ul li div img{max-width:60px;max-height:60px;align-items:center;margin:auto;vertical-align:middle;text-align:center}.pic_list ul li span.filename{width:100px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.queue_list{display:block;height:420px;overflow-y:auto}.file_list{list-style:none;margin:0;padding:0;overflow-x:hidden;overflow-y:auto}.file_list li{height:50px;line-height:35px;font-size:16px;position:relative}.file_list li button{float:right;top:6px;right:10px;width:20px}.file_list li p.title{padding:0 0 0 6px;margin:0 210px 0 0}.file_list li p.size{position:absolute;width:100px;top:0;right:100px}input#file:disabled{cursor:not-allowed}.help_text{color:rgba(0,0,0,.35);position:absolute;top:16px;right:120px}"]
1346
+ }] }
1347
+ ];
1348
+ /** @nocollapse */
1349
+ FileUploadComponent.ctorParameters = () => [
1350
+ { type: MessagerService },
1351
+ { type: UploadService },
1352
+ { type: LoadingService },
1353
+ { type: Injector }
1354
+ ];
1355
+ FileUploadComponent.propDecorators = {
1356
+ formId: [{ type: Input }],
1357
+ rootId: [{ type: Input }],
1358
+ fileType: [{ type: Input }],
1359
+ fileCount: [{ type: Input }],
1360
+ oldIdList: [{ type: Input }],
1361
+ securityInfo: [{ type: Input }],
1362
+ fileNameLength: [{ type: Input }],
1363
+ opCell: [{ type: ViewChild, args: ['opCell',] }]
1364
+ };
1365
+ if (false) {
1366
+ /** @type {?} */
1367
+ FileUploadComponent.prototype.files;
1368
+ /** @type {?} */
1369
+ FileUploadComponent.prototype.metadataIdList;
1370
+ /** @type {?} */
1371
+ FileUploadComponent.prototype.uploadFileInfoList;
1372
+ /** @type {?} */
1373
+ FileUploadComponent.prototype.errFileList;
1374
+ /** @type {?} */
1375
+ FileUploadComponent.prototype.errTypeList;
1376
+ /** @type {?} */
1377
+ FileUploadComponent.prototype.nullFileList;
1378
+ /** @type {?} */
1379
+ FileUploadComponent.prototype.beyondFileList;
1380
+ /** @type {?} */
1381
+ FileUploadComponent.prototype.fileNameOversizeList;
1382
+ /** @type {?} */
1383
+ FileUploadComponent.prototype.invalidCharactersFileList;
1384
+ /** @type {?} */
1385
+ FileUploadComponent.prototype.invalidExtNamesFileList;
1386
+ /** @type {?} */
1387
+ FileUploadComponent.prototype.unrecognizedTypeFileList;
1388
+ /** @type {?} */
1389
+ FileUploadComponent.prototype.invalidCharacters;
1390
+ /** @type {?} */
1391
+ FileUploadComponent.prototype.invalidExtNames;
1392
+ /** @type {?} */
1393
+ FileUploadComponent.prototype.showType;
1394
+ /** @type {?} */
1395
+ FileUploadComponent.prototype.mouseOn;
1396
+ /** @type {?} */
1397
+ FileUploadComponent.prototype.isWhiteList;
1398
+ /** @type {?} */
1399
+ FileUploadComponent.prototype.bufferSize;
1400
+ /** @type {?} */
1401
+ FileUploadComponent.prototype.selectedFiles;
1402
+ /** @type {?} */
1403
+ FileUploadComponent.prototype.radioButtonGroupValue;
1404
+ /** @type {?} */
1405
+ FileUploadComponent.prototype.selectedFileCount;
1406
+ /** @type {?} */
1407
+ FileUploadComponent.prototype.uploadBtnDisabled;
1408
+ /** @type {?} */
1409
+ FileUploadComponent.prototype.uploadIconAddress;
1410
+ /** @type {?} */
1411
+ FileUploadComponent.prototype.uploadLittleIconAddress;
1412
+ /** @type {?} */
1413
+ FileUploadComponent.prototype.hasSelectedFile;
1414
+ /** @type {?} */
1415
+ FileUploadComponent.prototype.fileAllSelected;
1416
+ /** @type {?} */
1417
+ FileUploadComponent.prototype.uploadProcess;
1418
+ /** @type {?} */
1419
+ FileUploadComponent.prototype.fileTotalChunk;
1420
+ /** @type {?} */
1421
+ FileUploadComponent.prototype.requestArray;
1422
+ /** @type {?} */
1423
+ FileUploadComponent.prototype.requestBodyArray;
1424
+ /** @type {?} */
1425
+ FileUploadComponent.prototype.uploadedChunk;
1426
+ /** @type {?} */
1427
+ FileUploadComponent.prototype.uploadedProcess;
1428
+ /** @type {?} */
1429
+ FileUploadComponent.prototype.storageExtension;
1430
+ /** @type {?} */
1431
+ FileUploadComponent.prototype.defaultPropertyName;
1432
+ /** @type {?} */
1433
+ FileUploadComponent.prototype.propertiesNames;
1434
+ /** @type {?} */
1435
+ FileUploadComponent.prototype.securityInfoList;
1436
+ /** @type {?} */
1437
+ FileUploadComponent.prototype.queueListStyle;
1438
+ /** @type {?} */
1439
+ FileUploadComponent.prototype.dropListValue;
1440
+ /** @type {?} */
1441
+ FileUploadComponent.prototype.uploadedFileTotal;
1442
+ /** @type {?} */
1443
+ FileUploadComponent.prototype.allowedMultiUpload;
1444
+ /** @type {?} */
1445
+ FileUploadComponent.prototype.haveExtensionProperty;
1446
+ /** @type {?} */
1447
+ FileUploadComponent.prototype.haveSecurityInfo;
1448
+ /** @type {?} */
1449
+ FileUploadComponent.prototype.uploadedFileInfoList;
1450
+ /** @type {?} */
1451
+ FileUploadComponent.prototype.oldUploadedFileList;
1452
+ /** @type {?} */
1453
+ FileUploadComponent.prototype.uploadInfoErrorMessage;
1454
+ /** @type {?} */
1455
+ FileUploadComponent.prototype.sameNameAllowed;
1456
+ /** @type {?} */
1457
+ FileUploadComponent.prototype.maxFileSize;
1458
+ /** @type {?} */
1459
+ FileUploadComponent.prototype.localeid;
1460
+ /** @type {?} */
1461
+ FileUploadComponent.prototype.localepipe;
1462
+ /** @type {?} */
1463
+ FileUploadComponent.prototype.httpclient;
1464
+ /** @type {?} */
1465
+ FileUploadComponent.prototype.checkboxPos;
1466
+ /** @type {?} */
1467
+ FileUploadComponent.prototype.formId;
1468
+ /** @type {?} */
1469
+ FileUploadComponent.prototype.rootId;
1470
+ /** @type {?} */
1471
+ FileUploadComponent.prototype.fileType;
1472
+ /** @type {?} */
1473
+ FileUploadComponent.prototype.fileCount;
1474
+ /** @type {?} */
1475
+ FileUploadComponent.prototype.oldIdList;
1476
+ /** @type {?} */
1477
+ FileUploadComponent.prototype.securityInfo;
1478
+ /** @type {?} */
1479
+ FileUploadComponent.prototype.fileNameLength;
1480
+ /** @type {?} */
1481
+ FileUploadComponent.prototype.opCell;
1482
+ /** @type {?} */
1483
+ FileUploadComponent.prototype.totalLoad;
1484
+ /** @type {?} */
1485
+ FileUploadComponent.prototype.exStorageFileList;
1486
+ /**
1487
+ * @type {?}
1488
+ * @private
1489
+ */
1490
+ FileUploadComponent.prototype.msgService;
1491
+ /**
1492
+ * @type {?}
1493
+ * @private
1494
+ */
1495
+ FileUploadComponent.prototype.uploadService;
1496
+ /**
1497
+ * @type {?}
1498
+ * @private
1499
+ */
1500
+ FileUploadComponent.prototype.loadService;
1501
+ /**
1502
+ * @type {?}
1503
+ * @private
1504
+ */
1505
+ FileUploadComponent.prototype.injector;
1506
+ /* Skipping unhandled member: ;*/
1507
+ }
1508
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdzcC1zdmMvZm9ybWRvYy11cGxvYWQvIiwic291cmNlcyI6WyJsaWIvdXBsb2FkL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxRSxP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RCw0Q0FBOEM7O0lBQzlDLDhDQUFnRDs7SUFHaEQsK0NBQW1DOztJQUVuQyxrREFBaUM7O0lBQ2pDLDhDQUF1Qzs7SUFFdkMsK0NBQXdDOztJQUV4Qyw2Q0FBb0M7O0lBRXBDLDRDQUEyQjs7SUFFM0IsZ0RBQThCOztJQUU5QixpREFBNEI7O0lBRTVCLG9EQUF1Qzs7SUFFdkMsK0NBQWtDOztJQUVsQyxtREFBMEI7O0lBQzFCLGtEQUF5Qjs7SUFFekIscURBQW9DOztJQUVwQyw4Q0FBdUI7O0lBQ3ZCLDBDQUF3Qjs7SUFDeEIsdUNBQWlCOztJQUNqQix5Q0FBMEI7O0lBQzFCLHlDQUF1Qjs7SUFDdkIsMENBQTRCOztJQVM1QixxQ0FBd0I7O0lBQ3hCLHFDQUF3Qjs7SUFDeEIsdUNBQWdDOztJQUNoQyx3Q0FBK0I7O0lBQy9CLHdDQUFrQzs7SUFDbEMsMkNBQXFEOztJQUNyRCw2Q0FBb0M7O0lBRXBDLHFDQUE4Qzs7SUFtRTlDLHdDQUFzQjs7SUF1dkJ0QixnREFBNEM7Ozs7O0lBejBCaEMseUNBQW1DOzs7OztJQUFFLDRDQUFvQzs7Ozs7SUFBRSwwQ0FBbUM7Ozs7O0lBQUUsdUNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIFRlbXBsYXRlUmVmLCBJbmplY3RvciwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWxlSW5mbyB9IGZyb20gJy4uL2VudGl0eS9maWxlaW5mbyc7XG5pbXBvcnQgeyBEb2NUeXBlIH0gZnJvbSAnLi4vZW50aXR5L2RvY3R5cGUnO1xuaW1wb3J0IHsgR3NwRm9ybURvY0luZm8gfSBmcm9tICcuLi9lbnRpdHkvZ3NwZm9ybWRvY2luZm8nO1xuaW1wb3J0IHsgT3BlcmF0aW5nTW9kZXMgfSBmcm9tICcuLi9lbnRpdHkvb3BlcmF0aW5nbW9kZXMnO1xuaW1wb3J0IHsgVXBsb2FkU2VydmljZSB9IGZyb20gJy4uL3VwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7IFVwbG9hZEZpbGVJbmZvIH0gZnJvbSAnLi4vZW50aXR5L3VwbG9hZGZpbGVpbmZvJztcbmltcG9ydCB7IE1lc3NhZ2VyU2VydmljZSB9IGZyb20gJ0BmYXJyaXMvdWktbWVzc2FnZXInO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3NwRm9ybVVwbG9hZEVudGl0eSB9IGZyb20gJy4uL2VudGl0eS9nc3Bmb3JtdXBsb2FkZW50aXR5JztcbmltcG9ydCB7IFVVSUQgfSBmcm9tICdhbmd1bGFyMi11dWlkJztcbmltcG9ydCB7IFN0b3JhZ2VFeHRlbnNpb24gfSBmcm9tICcuLi9lbnRpdHkvc3RvcmFnZWV4dGVuc2lvbic7XG5pbXBvcnQgeyBFeFN0b3JhZ2VGaWxlSW5mbyB9IGZyb20gJy4uL2VudGl0eS9leHRlbnNpb25zdG9yYWdlZmlsZWluZm8nO1xuaW1wb3J0IHsgRHJvcExpc3RFbnRpdHkgfSBmcm9tICcuLi9lbnRpdHkvZHJvcGxpc3RlbnRpdHknO1xuaW1wb3J0IHsgTG9hZGluZ1NlcnZpY2UgfSBmcm9tICdAZmFycmlzL3VpLWxvYWRpbmcnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBGaWxlU3RhdGUgfSBmcm9tICcuLi9lbnRpdHkvZmlsZXN0YXRlJztcbmltcG9ydCB7IExvY2FsTGFuZ1BpcGUgfSBmcm9tICcuLi8uLi9sb2NhbC5waXBlJztcbmltcG9ydCB7IEdzcERvY1NlY3VyaXR5QmFzZUluZm8gfSBmcm9tICcuLi9lbnRpdHkvZ3NwZG9jc2VjdXJpdHliYXNlaW5mbyc7XG5pbXBvcnQgeyBTZWN1cml0eUVudGl0eSB9IGZyb20gJy4uL2VudGl0eS9zZWN1cml0eWVudGl0eSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluaXRNdWx0aVVwbG9hZFJlcXVlc3QgfSBmcm9tICcuLi9lbnRpdHkvaW5pdG11bHRpdXBsb2FkcmVxdWVzdCc7XG5pbXBvcnQgeyBDb21wbGV0ZU11bHRpVXBsb2FkUmVxdWVzdCB9IGZyb20gJy4uL2VudGl0eS9jb21wbGV0ZW11bHRpdXBsb2FkcmVxdWVzdCc7XG5pbXBvcnQgeyBHc3BGb3JtU3RyZWFtRW50aXR5IH0gZnJvbSAnLi4vZW50aXR5L2dzcGZvcm1zdHJlYW1lbnRpdHknO1xuaW1wb3J0IHsgTXVsdGlVcGxvYWRSZXF1ZXN0IH0gZnJvbSAnLi4vZW50aXR5L211bHRpdXBsb2FkcmVxdWVzdCc7XG5pbXBvcnQgeyBNdWx0aVVwbG9hZFJlc3VsdCB9IGZyb20gJy4uL2VudGl0eS9tdWx0aXVwbG9hZHJlc3VsdCc7XG5pbXBvcnQgeyBCYXNlUGF0aFNlcnZpY2UgfSBmcm9tICdAZmFycmlzL3J0Zic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1maWxlLXVwbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgZmlsZXM6IEZpbGVJbmZvW10gPSBbXTtcbiAgbWV0YWRhdGFJZExpc3Q6IHN0cmluZ1tdID0gW107XG4gIHVwbG9hZEZpbGVJbmZvTGlzdDogVXBsb2FkRmlsZUluZm9bXSA9IFtdO1xuICBlcnJGaWxlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgZXJyVHlwZUxpc3Q6IHN0cmluZ1tdID0gW107XG4gIG51bGxGaWxlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgYmV5b25kRmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XG4gIGZpbGVOYW1lT3ZlcnNpemVMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBpbnZhbGlkQ2hhcmFjdGVyc0ZpbGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBpbnZhbGlkRXh0TmFtZXNGaWxlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgdW5yZWNvZ25pemVkVHlwZUZpbGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBpbnZhbGlkQ2hhcmFjdGVyczogc3RyaW5nID0gJyc7XG4gIGludmFsaWRFeHROYW1lczogc3RyaW5nID0gJyc7XG4gIHNob3dUeXBlOiBudW1iZXIgPSAwO1xuICBtb3VzZU9uOiBib29sZWFuID0gZmFsc2U7XG4gIGlzV2hpdGVMaXN0OiBib29sZWFuID0gZmFsc2U7XG4gIGJ1ZmZlclNpemUgPSA1ICogMTAyNCAqIDEwMjQ7XG4gIHNlbGVjdGVkRmlsZXM6IGFueTtcbiAgcmFkaW9CdXR0b25Hcm91cFZhbHVlO1xuICBzZWxlY3RlZEZpbGVDb3VudDogbnVtYmVyID0gMDtcbiAgdXBsb2FkQnRuRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICB1cGxvYWRJY29uQWRkcmVzcyA9IHRoaXMuY3JlYXRlQmFzZVVybCgnL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy91cGxvYWQuc3ZnJyk7XG4gIHVwbG9hZExpdHRsZUljb25BZGRyZXNzID0gdGhpcy5jcmVhdGVCYXNlVXJsKCcvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3VwbG9hZEljb24uc3ZnJyk7XG5cbiAgaGFzU2VsZWN0ZWRGaWxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZmlsZUFsbFNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgdXBsb2FkUHJvY2VzcyA9IHsgd2lkdGg6ICcwJScgfTtcblxuICBmaWxlVG90YWxDaHVuazogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gIHJlcXVlc3RBcnJheTogQXJyYXk8T2JzZXJ2YWJsZTxhbnk+PiA9IG5ldyBBcnJheTtcblxuICByZXF1ZXN0Qm9keUFycmF5OiBBcnJheTxHc3BGb3JtVXBsb2FkRW50aXR5PiA9IG5ldyBBcnJheTtcblxuICB1cGxvYWRlZENodW5rOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gIHVwbG9hZGVkUHJvY2VzczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gIC8vYWxsU2VsZWN0ZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBzdG9yYWdlRXh0ZW5zaW9uOiBTdG9yYWdlRXh0ZW5zaW9uO1xuXG4gIGRlZmF1bHRQcm9wZXJ0eU5hbWU6IHN0cmluZyA9IFwiXCI7XG4gIHByb3BlcnRpZXNOYW1lczogRHJvcExpc3RFbnRpdHlbXSA9IFtdO1xuXG4gIHNlY3VyaXR5SW5mb0xpc3Q6IFNlY3VyaXR5RW50aXR5W10gPSBbXTtcblxuICBxdWV1ZUxpc3RTdHlsZSA9IHsgd2lkdGg6ICc0ODBweCcgfTtcblxuICBkcm9wTGlzdFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXG4gIHVwbG9hZGVkRmlsZVRvdGFsOiBudW1iZXIgPSAwO1xuXG4gIGFsbG93ZWRNdWx0aVVwbG9hZDogYm9vbGVhbjtcblxuICBoYXZlRXh0ZW5zaW9uUHJvcGVydHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBoYXZlU2VjdXJpdHlJbmZvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgdXBsb2FkZWRGaWxlSW5mb0xpc3QgPSBbXTtcbiAgb2xkVXBsb2FkZWRGaWxlTGlzdCA9IFtdO1xuICAvL3VwbG9hZGVkTmFtZUxpc3QgPSBbXTtcbiAgdXBsb2FkSW5mb0Vycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcblxuICBzYW1lTmFtZUFsbG93ZWQgPSB0cnVlO1xuICBtYXhGaWxlU2l6ZTogbnVtYmVyID0gMDs7XG4gIGxvY2FsZWlkOiBzdHJpbmc7XG4gIGxvY2FsZXBpcGU6IExvY2FsTGFuZ1BpcGU7XG4gIGh0dHBjbGllbnQ6IEh0dHBDbGllbnQ7XG4gIGNoZWNrYm94UG9zID0geyB0b3A6ICcwcHgnIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1zZ1NlcnZpY2U6IE1lc3NhZ2VyU2VydmljZSwgcHJpdmF0ZSB1cGxvYWRTZXJ2aWNlOiBVcGxvYWRTZXJ2aWNlLCBwcml2YXRlIGxvYWRTZXJ2aWNlOiBMb2FkaW5nU2VydmljZSwgcHJpdmF0ZSBpbmplY3Rvcj86IEluamVjdG9yKSB7XG4gICAgaWYgKHRoaXMuaW5qZWN0b3IpIHtcbiAgICAgIHRoaXMuaHR0cGNsaWVudCA9IHRoaXMuaW5qZWN0b3IuZ2V0KEh0dHBDbGllbnQpO1xuICAgICAgdGhpcy5sb2NhbGVpZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibGFuZ3VhZ2VDb2RlXCIpIHx8IHRoaXMuaW5qZWN0b3IuZ2V0KExPQ0FMRV9JRCk7XG4gICAgICB0aGlzLmxvY2FsZXBpcGUgPSBuZXcgTG9jYWxMYW5nUGlwZSh0aGlzLmxvY2FsZWlkKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KCkgZm9ybUlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHJvb3RJZDogc3RyaW5nO1xuICBASW5wdXQoKSBmaWxlVHlwZTogc3RyaW5nID0gXCIqXCI7XG4gIEBJbnB1dCgpIGZpbGVDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgb2xkSWRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBzZWN1cml0eUluZm86IEdzcERvY1NlY3VyaXR5QmFzZUluZm8gPSBudWxsO1xuICBASW5wdXQoKSBmaWxlTmFtZUxlbmd0aDogbnVtYmVyID0gMDtcblxuICBAVmlld0NoaWxkKCdvcENlbGwnKSBvcENlbGw6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID49IDApXG4gICAgICB0aGlzLmNoZWNrYm94UG9zLnRvcCA9ICcxNHB4JztcbiAgICAvL2lmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlICE9IG51bGwpIHtcbiAgICBpZiAodGhpcy5zZWN1cml0eUluZm8gIT0gbnVsbCkge1xuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFNlY3VyaXR5SW5mb0xpc3QodGhpcy5zZWN1cml0eUluZm8pLnN1YnNjcmliZShcbiAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICB0aGlzLmhhdmVTZWN1cml0eUluZm8gPSB0cnVlO1xuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICByZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VjdXJpdHlJbmZvTGlzdC5wdXNoKHsgaWQ6IGkudG9TdHJpbmcoKSwgc2VjdXJpdHlJZDogZWxlbWVudC5zZWN1cml0eUlkLCBzZWN1cml0eUxldmVsOiBlbGVtZW50LnNlY3VyaXR5TGV2ZWwsIG5hbWU6IGVsZW1lbnQubmFtZSB9KTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuZ2V0U3RvcmFnZUV4dGVuc2lvbkluZm8oKS5zdWJzY3JpYmUoXG4gICAgICByZXMgPT4ge1xuICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgcmVzLmVycm9yID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnN0b3JhZ2VFeHRlbnNpb24gPSByZXM7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0UHJvcGVydHlOYW1lID0gdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWU7XG4gICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzTmFtZXMucHVzaCh7IGlkOiBcIjBcIiwgbmFtZTogdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWUgfSk7XG4gICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgIC8vIHRoaXMucHJvcGVydGllc05hbWVzLnB1c2goLi4uKHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25Qcm9wZXJ0eU5hbWVMaXN0KSk7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmV4dGVuc2lvblByb3BlcnR5TmFtZUxpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydGllc05hbWVzLnB1c2goeyBpZDogKCsraSkudG9TdHJpbmcoKSwgbmFtZTogZWxlbWVudCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnF1ZXVlTGlzdFN0eWxlLndpZHRoID0gJzM4MHB4JztcbiAgICAgICAgICB0aGlzLmhhdmVFeHRlbnNpb25Qcm9wZXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG5cbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuZ2V0VXBsb2FkSW5mbyh0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBpZiAocmVzLmVycm9yICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy51cGxvYWRJbmZvRXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCfojrflj5bkuIrkvKDkv6Hmga/miqXplJnvvIzplJnor6/kv6Hmga/kuLrvvJonLGVyck1zZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBsb2FkQnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zYW1lTmFtZUFsbG93ZWQgPSByZXMuc2FtZU5hbWVBbGxvd2VkO1xuICAgICAgICB0aGlzLm1heEZpbGVTaXplID0gcGFyc2VJbnQoSlNPTi5wYXJzZShyZXMudmFsaWRhdGVDb25maWd1cmF0aW9uKS5tYXhGaWxlU2l6ZSk7XG4gICAgICAgIHRoaXMuaXNXaGl0ZUxpc3QgPSBKU09OLnBhcnNlKHJlcy52YWxpZGF0ZUNvbmZpZ3VyYXRpb24pLndoaXRlTGlzdDtcbiAgICAgICAgdGhpcy5pbnZhbGlkQ2hhcmFjdGVycyA9IEpTT04ucGFyc2UocmVzLnZhbGlkYXRlQ29uZmlndXJhdGlvbikuaW52YWxpZENoYXJhY3RlcnM7XG4gICAgICAgIHRoaXMuaW52YWxpZEV4dE5hbWVzID0gSlNPTi5wYXJzZShyZXMudmFsaWRhdGVDb25maWd1cmF0aW9uKS5pbnZhbGlkRXh0TmFtZXMudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdGhpcy5hbGxvd2VkTXVsdGlVcGxvYWQgPSByZXMuYWxsb3dlZE11bHRpVXBsb2FkO1xuICAgICAgICBpZiAoIXRoaXMuc2FtZU5hbWVBbGxvd2VkKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFVwbG9hZGVkRmlsZUluZm9MaXN0KHRoaXMuZm9ybUlkLCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmIHJlcy5lcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdCA9IHJlcztcbiAgICAgICAgICAgICAgICB0aGlzLm9sZFVwbG9hZGVkRmlsZUxpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpOztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKHRoaXMub2xkSWRMaXN0ICE9IG51bGwgJiYgdGhpcy5vbGRJZExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgLy8gdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbCh0aGlzLm9sZElkTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHRoaXMucmFkaW9CdXR0b25Hcm91cFZhbHVlID0gJ3Nob3dCeUdyb3VwJztcbiAgfVxuXG4gIHRvdGFsTG9hZDogYW55ID0gbnVsbDtcblxuICBzaG93TG9hZGluZygpIHtcbiAgICB0aGlzLmhhc1NlbGVjdGVkRmlsZSA9IHRydWU7XG4gICAgLy8gaWYgKHRoaXMudG90YWxMb2FkID09IG51bGwpXG4gICAgLy8gICB0aGlzLnRvdGFsTG9hZCA9IHRoaXMubG9hZFNlcnZpY2Uuc2hvdyh7XG4gICAgLy8gICAgIG1lc3NhZ2U6IHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3VwbG9hZGluZycpXG4gICAgLy8gICB9KTtcbiAgfVxuXG4gIGdldFJpZ2h0Q2xhc3MoKSB7XG4gICAgaWYgKHRoaXMudXBsb2FkQnRuRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1wcmltYXJ5IGJ0bi1sZyBkaXNhYmxlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1wcmltYXJ5IGJ0bi1sZyc7XG4gICAgfVxuICB9XG5cbiAgZmluZEludmFsaWRDaGFyYWN0ZXIobmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGxldCBjaGFyTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICB0aGlzLmludmFsaWRDaGFyYWN0ZXJzLnNwbGl0KCd8JykuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmIChuYW1lLmluZGV4T2YoZWxlbWVudCkgPj0gMClcbiAgICAgICAgY2hhckxpc3QucHVzaChlbGVtZW50KTtcbiAgICB9KVxuXG4gICAgcmV0dXJuIGNoYXJMaXN0O1xuICB9XG5cblxuICBoYXNGaWxlVHlwZShmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGUubmFtZS5pbmNsdWRlcygnLicpO1xuICB9XG5cbiAgZmlsZVNlbGVjdGVkKCRldmVudCkge1xuICAgIGlmICh0aGlzLnVwbG9hZEluZm9FcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRoaXMubXNnU2VydmljZS5lcnJvcih0aGlzLnVwbG9hZEluZm9FcnJvck1lc3NhZ2UpO1xuICAgICAgdGhpcy51cGxvYWRCdG5EaXNhYmxlZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNTZWxlY3RlZEZpbGUgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWxlJyk7XG5cbiAgICBpZiAodGhpcy5maWxlQ291bnQgPiAwKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCArIHRoaXMuZmlsZXMubGVuZ3RoID4gdGhpcy5maWxlQ291bnQpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkTnVtOiBudW1iZXIgPSAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCBhcyBudW1iZXIpICsgdGhpcy5maWxlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NlbGVjdGVkQ291bnQnKSArIHNlbGVjdGVkTnVtICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnbGltaXRDb3VudCcpICsgdGhpcy5maWxlQ291bnQgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3RoaXMuZmxhZyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBzZWxlY3RlZEZpbGUgPSB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXNbaV07XG4gICAgICBzZWxlY3RlZEZpbGUuaXNBbGxvd2VkVXBsb2FkID0gdHJ1ZTtcbiAgICAgIC8vc2VsZWN0ZWRGaWxlLnNsaWNlXG4gICAgICBsZXQgdXVpZCA9IFVVSUQuVVVJRCgpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRGaWxlLnNpemUgPT0gMCkge1xuICAgICAgICB0aGlzLm51bGxGaWxlTGlzdC5wdXNoKHNlbGVjdGVkRmlsZS5uYW1lKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZpbGVOYW1lTGVuZ3RoID4gMCAmJiBzZWxlY3RlZEZpbGUubmFtZS5sZW5ndGggPiB0aGlzLmZpbGVOYW1lTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZmlsZU5hbWVPdmVyc2l6ZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhGaWxlU2l6ZSAhPSBudWxsICYmIHRoaXMubWF4RmlsZVNpemUgPiAwKSB7XG4gICAgICAgIGlmIChzZWxlY3RlZEZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUgKiAxMDAwKSB7XG4gICAgICAgICAgdGhpcy5iZXlvbmRGaWxlTGlzdC5wdXNoKHNlbGVjdGVkRmlsZS5uYW1lKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnZhbGlkQ2hhckxpc3QgPSB0aGlzLmZpbmRJbnZhbGlkQ2hhcmFjdGVyKHNlbGVjdGVkRmlsZS5uYW1lKTtcbiAgICAgIGxldCBpbnZhbGlkQ2hhckxpc3RGaWx0ZXIgPSBpbnZhbGlkQ2hhckxpc3QuZmlsdGVyKChzKSA9PiB7XG4gICAgICAgIHJldHVybiBzICYmIHMudHJpbSgpO1xuICAgICAgfSk7XG4gICAgICBsZXQgZXJyb3JNZXNzYWdlID0gXCJcIlxuICAgICAgaWYgKGludmFsaWRDaGFyTGlzdEZpbHRlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGludmFsaWRDaGFyTGlzdEZpbHRlci5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBcIlxcXCJcIjtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gZWxlbWVudDtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gXCJcXFwiXCI7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlICs9IChpbmRleCA9PT0gaW52YWxpZENoYXJMaXN0RmlsdGVyLmxlbmd0aCAtIDEpID8gXCJcIiA6IFwiLFwiO1xuICAgICAgICB9KVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHNlbGVjdGVkRmlsZS5pc0FsbG93ZWRVcGxvYWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyh0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdpbnZhbGlkQ2hhcmFjdGVycycpICsgZXJyb3JNZXNzYWdlICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVjaG9vc2VGaWxlJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBzZWxlY3RlZEZpbGUuaXNBbGxvd2VkVXBsb2FkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pbnZhbGlkQ2hhcmFjdGVyc0ZpbGVMaXN0LnB1c2goc2VsZWN0ZWRGaWxlLm5hbWUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmhhc0ZpbGVUeXBlKHNlbGVjdGVkRmlsZSkpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5maWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBzZWxlY3RlZEZpbGUuaXNBbGxvd2VkVXBsb2FkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcoc2VsZWN0ZWRGaWxlLm5hbWUgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdVbnJlY29nbml6ZWRGaWxlVHlwZScpICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVjaG9vc2VGaWxlJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBzZWxlY3RlZEZpbGUuaXNBbGxvd2VkVXBsb2FkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy51bnJlY29nbml6ZWRUeXBlRmlsZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbGV0IGN1ckZpbGVTdWZmaXggPSBzZWxlY3RlZEZpbGUubmFtZS5zcGxpdCgnLicpWzFdO1xuICAgICAgbGV0IGN1ckZpbGVTdWZmaXggPSBzZWxlY3RlZEZpbGUubmFtZS5zdWJzdHIoc2VsZWN0ZWRGaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBleHROYW1lcyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMuaW52YWxpZEV4dE5hbWVzLnNwbGl0KCd8JykpO1xuICAgICAgY29uc3QgZXh0TmFtZXNBcnkgPSB0aGlzLmludmFsaWRFeHROYW1lcy5zcGxpdCgnfCcpO1xuICAgICAgaWYgKCF0aGlzLmlzV2hpdGVMaXN0ICYmIGV4dE5hbWVzQXJ5LmluY2x1ZGVzKGN1ckZpbGVTdWZmaXgpKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc2VsZWN0ZWRGaWxlLmlzQWxsb3dlZFVwbG9hZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHNlbGVjdGVkRmlsZS5uYW1lICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnaW52YWxpZEV4dE5hbWVzJykgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdibGFja0V4dE5hbWVzJykgKyBleHROYW1lcyArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5maWxlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgc2VsZWN0ZWRGaWxlLmlzQWxsb3dlZFVwbG9hZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaW52YWxpZEV4dE5hbWVzRmlsZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzV2hpdGVMaXN0ICYmICFleHROYW1lc0FyeS5pbmNsdWRlcyhjdXJGaWxlU3VmZml4KSkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHNlbGVjdGVkRmlsZS5pc0FsbG93ZWRVcGxvYWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyhzZWxlY3RlZEZpbGUubmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2ludmFsaWRFeHROYW1lcycpICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnd2hpdGVFeHROYW1lcycpICsgZXh0TmFtZXMgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHNlbGVjdGVkRmlsZS5pc0FsbG93ZWRVcGxvYWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmludmFsaWRFeHROYW1lc0ZpbGVMaXN0LnB1c2goc2VsZWN0ZWRGaWxlLm5hbWUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zYW1lTmFtZUFsbG93ZWQpIHtcbiAgICAgICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZCh4ID0+IHguZmlsZU5hbWUgPT0gc2VsZWN0ZWRGaWxlLm5hbWUpICE9IG51bGwpIHtcblxuICAgICAgICAgIGNvbnN0IG1zZyA9IHRoaXMubXNnU2VydmljZS5zaG93KCd3YXJuaW5nJywgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnaGF2ZVNhbWVOYW1lJykgKyBzZWxlY3RlZEZpbGUubmFtZSwge1xuICAgICAgICAgICAgaW5pdGlhbFN0YXRlOiB7XG4gICAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZW5hbWUnKSxcbiAgICAgICAgICAgICAgICAgIGNsczogJ2J0biBidG4tc2Vjb25kYXJ5JyxcbiAgICAgICAgICAgICAgICAgIGhhbmRsZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2xkTmFtZTogc3RyaW5nID0gc2VsZWN0ZWRGaWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lXG4gICAgICAgICAgICAgICAgICAgIGxldCBmbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAxO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBvbGROYW1lLnN1YnN0cmluZygwLCBvbGROYW1lLmxhc3RJbmRleE9mKCcuJykpICsgJygnICsgaSArICcpJyArIG9sZE5hbWUuc3Vic3RyaW5nKG9sZE5hbWUubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZCh4ID0+IHguZmlsZU5hbWUgPT0gbmV3TmFtZSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGUodXVpZCwgc2VsZWN0ZWRGaWxlLCBuZXdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbXNnLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZXBsYWNlJyksXG4gICAgICAgICAgICAgICAgICBjbHM6ICdidG4gYnRuLXNlY29uZGFyeScsXG4gICAgICAgICAgICAgICAgICBoYW5kbGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXVpZCA9IHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZCh4ID0+IHguZmlsZU5hbWUgPT0gc2VsZWN0ZWRGaWxlLm5hbWUpLm1ldGFkYXRhSWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZSh1dWlkLCBzZWxlY3RlZEZpbGUsIHNlbGVjdGVkRmlsZS5uYW1lLCBGaWxlU3RhdGUuVXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbGRVcGxvYWRlZEZpbGVMaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwrKztcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LnNwbGljZSh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmluZGV4T2YodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKVswXSksIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1zZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnY2FuY2VsJyksXG4gICAgICAgICAgICAgICAgICBjbHM6ICdidG4gYnRuLXNlY29uZGFyeScsXG4gICAgICAgICAgICAgICAgICBoYW5kbGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbXNnLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNlbGVjdGVkRmlsZS5pc0FsbG93ZWRVcGxvYWQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy51cGxvYWRGaWxlKHV1aWQsIHNlbGVjdGVkRmlsZSwgc2VsZWN0ZWRGaWxlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmVyckZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmVyckZpbGVMaXN0KTtcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2hhdmVTYW1lTmFtZScpICsgbmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcbiAgICAgIHRoaXMuZXJyRmlsZUxpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5udWxsRmlsZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMubnVsbEZpbGVMaXN0KTtcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKG5hbWUgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdzaXplWmVybycpICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVjaG9vc2VGaWxlJykpO1xuICAgICAgdGhpcy5udWxsRmlsZUxpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWxlTmFtZU92ZXJzaXplTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5saXN0VG9TdHJpbmcodGhpcy5maWxlTmFtZU92ZXJzaXplTGlzdCk7XG4gICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyhuYW1lICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnZmlsZU5hbWVPdmVyU2l6ZScpICsgdGhpcy5maWxlTmFtZUxlbmd0aCArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcbiAgICAgIHRoaXMuZmlsZU5hbWVPdmVyc2l6ZUxpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iZXlvbmRGaWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5saXN0VG9TdHJpbmcodGhpcy5iZXlvbmRGaWxlTGlzdCk7XG4gICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyhuYW1lICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnc2l6ZU1heCcpICsgdGhpcy5tYXhGaWxlU2l6ZSArIFwiS0JcIiArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcbiAgICAgIHRoaXMuYmV5b25kRmlsZUxpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnZhbGlkQ2hhcmFjdGVyc0ZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmludmFsaWRDaGFyYWN0ZXJzRmlsZUxpc3QpO1xuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2ludmFsaWRDaGFyYWN0ZXJzJykgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICB0aGlzLmludmFsaWRDaGFyYWN0ZXJzRmlsZUxpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnZhbGlkRXh0TmFtZXNGaWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5saXN0VG9TdHJpbmcodGhpcy5pbnZhbGlkRXh0TmFtZXNGaWxlTGlzdCk7XG4gICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyhuYW1lICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnaW52YWxpZEV4dE5hbWVzJykgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICB0aGlzLmludmFsaWRFeHROYW1lc0ZpbGVMaXN0ID0gW107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudW5yZWNvZ25pemVkVHlwZUZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLnVucmVjb2duaXplZFR5cGVGaWxlTGlzdCk7XG4gICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyhuYW1lICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnVW5yZWNvZ25pemVkRmlsZVR5cGUnKSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcbiAgICAgIHRoaXMudW5yZWNvZ25pemVkVHlwZUZpbGVMaXN0ID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5maWxlcyA9IHRoaXMuZmlsZXMuc2xpY2UoKTtcbiAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgICRldmVudC50YXJnZXQudmFsdWUgPSAnJztcbiAgICAvLyBsb2FkaW5nLmNsb3NlKCk7XG4gIH1cblxuICBzaG93RXJyb3JNZXNzYWdlKGZpbGUpIHtcbiAgICB0aGlzLm1zZ1NlcnZpY2UuZXJyb3IodGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgndXBsb2FkRmFpbHVyZWonKSArIGZpbGUuZXJyb3JNZXNzYWdlKTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVJbmZvKHV1aWQ6IHN0cmluZywgc2VsZWN0ZWRGaWxlLCBmaWxlTmFtZTogc3RyaW5nKTogYW55IHtcblxuICAgIGxldCBmaWxlSW5mbzogRmlsZUluZm87XG5cbiAgICBmaWxlSW5mbyA9IHtcbiAgICAgIGlkOiB1dWlkLFxuICAgICAgbmFtZTogZmlsZU5hbWUsXG4gICAgICB0eXBlOiBzZWxlY3RlZEZpbGUudHlwZSxcbiAgICAgIHNvdXJjZTogXCJcIixcbiAgICAgIHNpemU6IHRoaXMuZ2V0RmlsZVNpemUoc2VsZWN0ZWRGaWxlLnNpemUpLFxuICAgICAgZmlsZVNpemU6IHNlbGVjdGVkRmlsZS5zaXplLFxuICAgICAgcGljTGlzdERpc3BsYXlOYW1lOiB0aGlzLmdldFBpY0xpc3REaXNwbGF5TmFtZShmaWxlTmFtZSksXG4gICAgICBxdWV1ZUxpc3REaXNwbGF5TmFtZTogdGhpcy5nZXRRdWV1ZURpc3BsYXlOYW1lKGZpbGVOYW1lKSxcbiAgICAgIC8vY29udGVudDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLFxuICAgICAgaGFzVXBsb2FkZWQ6IGZhbHNlLFxuICAgICAgbW91c2VPbjogZmFsc2UsXG4gICAgICBzZWxlY3RkOiBmYWxzZSxcbiAgICAgIGlzVXBsb2FkaW5nOiB0cnVlLFxuICAgICAgdXBsb2FkUmVzdWx0OiBmYWxzZSxcbiAgICAgIHVwbG9hZFByb2Nlc3M6IDAsXG4gICAgICBlcnJvck1lc3NhZ2U6IFwiXCIsXG4gICAgICBleHRlbnNpb25Ecm9wTGlzdElkOiAwLFxuICAgICAgZXh0ZW5zaW9uTmFtZTogXCJcIixcbiAgICAgIHNlY3VyaXR5RHJvcExpc3RJZDogMCxcbiAgICAgIHNlY3VyaXR5SW5mbzogdGhpcy5zZWN1cml0eUluZm9MaXN0WzBdLFxuICAgICAgc3R5bGU6IHt9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RvcmFnZUV4dGVuc2lvbiAhPSBudWxsKVxuICAgICAgZmlsZUluZm8uZXh0ZW5zaW9uTmFtZSA9IHRoaXMuZGVmYXVsdFByb3BlcnR5TmFtZTtcblxuXG4gICAgbGV0IHR5cGU6IHN0cmluZyA9IHNlbGVjdGVkRmlsZS50eXBlO1xuICAgIGlmICh0eXBlLmluY2x1ZGVzKFwidGlmZlwiKSkge1xuICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuT3RoZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLkltYWdlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcIndvcmRcIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLldvcmQpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwicGRmXCIpKSB7XG4gICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5QZGYpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwicGxhaW5cIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLlR4dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJzaGVldFwiKSB8fCB0eXBlLmluY2x1ZGVzKFwiZXhjZWxcIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLkV4Y2VsKVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwicG93ZXJwb2ludFwiKSB8fCB0eXBlLmluY2x1ZGVzKFwicHJlc2VudGF0aW9uXCIpKSB7XG4gICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5Qb3dlcnBvaW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcInppcFwiKSB8fCBzZWxlY3RlZEZpbGUubmFtZS5pbmNsdWRlcyhcIi5yYXJcIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLlppcCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuT3RoZXIpO1xuICAgICAgLy8gbGV0IG5hbWU6IHN0cmluZyA9IHNlbGVjdGVkRmlsZS5uYW1lO1xuICAgICAgLy8gbGV0IGVyclR5cGUgPSBuYW1lLnN1YnN0cmluZyhzZWxlY3RlZEZpbGUubmFtZS5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgIC8vIHRoaXMuZXJyVHlwZUxpc3QucHVzaChlcnJUeXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVJbmZvO1xuICB9XG5cbiAgdXBsb2FkRmlsZSh1dWlkOiBzdHJpbmcsIHNlbGVjdGVkRmlsZSwgZmlsZU5hbWU6IHN0cmluZywgc3RhdGU6IEZpbGVTdGF0ZSA9IEZpbGVTdGF0ZS5OZXcpIHtcblxuICAgIGxldCBmaWxlSW5mbyA9IHRoaXMuaGFuZGxlRmlsZUluZm8odXVpZCwgc2VsZWN0ZWRGaWxlLCBmaWxlTmFtZSk7XG5cbiAgICBsZXQgdXBsb2FkRmlsZUluZm8gPSBuZXcgVXBsb2FkRmlsZUluZm8oKTtcblxuICAgIHVwbG9hZEZpbGVJbmZvLm1ldGFkYXRhSWQgPSB1dWlkO1xuICAgIHVwbG9hZEZpbGVJbmZvLmZpbGVOYW1lID0gZmlsZUluZm8ubmFtZTtcbiAgICB1cGxvYWRGaWxlSW5mby5maWxlU2l6ZSA9IGZpbGVJbmZvLnNpemU7XG4gICAgdXBsb2FkRmlsZUluZm8ub3JpZ2luYWxTaXplID0gZmlsZUluZm8uZmlsZVNpemU7XG4gICAgdXBsb2FkRmlsZUluZm8uc3RhdGUgPSBzdGF0ZTtcbiAgICB1cGxvYWRGaWxlSW5mby5zZWN1cml0eUluZm8gPSB0aGlzLnNlY3VyaXR5SW5mb0xpc3RbMF07XG5cblxuICAgIC8v5Yik5pat5piv5ZCm5pSv5oyB5YiG54mH5LiK5LygXG4gICAgaWYgKHRoaXMuYWxsb3dlZE11bHRpVXBsb2FkKSB7XG5cbiAgICAgIC8v5pSv5oyB5YiG54mH5LiK5LygXG4gICAgICBsZXQgaW5pdFJlcXVlc3Q6IEluaXRNdWx0aVVwbG9hZFJlcXVlc3QgPSBuZXcgSW5pdE11bHRpVXBsb2FkUmVxdWVzdDtcblxuICAgICAgaW5pdFJlcXVlc3QucGF0aCA9IHRoaXMuZm9ybUlkO1xuICAgICAgaW5pdFJlcXVlc3QubWV0YWRhdGFJZCA9IHV1aWQ7XG4gICAgICBpbml0UmVxdWVzdC5yb290SWQgPSB0aGlzLnJvb3RJZDtcbiAgICAgIGluaXRSZXF1ZXN0LnNpemUgPSBmaWxlSW5mby5maWxlU2l6ZTtcbiAgICAgIGluaXRSZXF1ZXN0LmZpbGVOYW1lID0gZmlsZU5hbWU7XG5cbiAgICAgIC8v5Yid5aeL5YyW5YiG54mHXG4gICAgICB0aGlzLmluaXRNdWx0aVVwbG9hZChpbml0UmVxdWVzdCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIGlmIChyZXMuZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHVwbG9hZElkID0gcmVzLnVwbG9hZElkO1xuICAgICAgICAgIGxldCBjaHVua1RvdGFsOiBudW1iZXIgPSBNYXRoLmNlaWwoc2VsZWN0ZWRGaWxlLnNpemUgLyB0aGlzLmJ1ZmZlclNpemUpO1xuICAgICAgICAgIGxldCBjaHVua0luZGV4OiBudW1iZXIgPSAwO1xuXG4gICAgICAgICAgbGV0IG11bHRpUmVzdWx0TGlzdDogTXVsdGlVcGxvYWRSZXN1bHRbXSA9IFtdO1xuXG4gICAgICAgICAgdGhpcy5maWxlVG90YWxDaHVua1t1dWlkXSA9IGNodW5rVG90YWw7XG4gICAgICAgICAgdGhpcy51cGxvYWRlZENodW5rW3V1aWRdID0gMDtcblxuICAgICAgICAgIHdoaWxlIChjaHVua0luZGV4IDwgY2h1bmtUb3RhbCkge1xuXG4gICAgICAgICAgICBsZXQgbmV4dFNpemUgPSBNYXRoLm1pbigoY2h1bmtJbmRleCArIDEpICogdGhpcy5idWZmZXJTaXplLCBzZWxlY3RlZEZpbGUuc2l6ZSk7XG4gICAgICAgICAgICBsZXQgZmlsZURhdGEgPSBzZWxlY3RlZEZpbGUuc2xpY2UoY2h1bmtJbmRleCAqIHRoaXMuYnVmZmVyU2l6ZSwgbmV4dFNpemUpO1xuXG4gICAgICAgICAgICBsZXQgbXVsdGlSZXF1ZXN0ID0gbmV3IE11bHRpVXBsb2FkUmVxdWVzdDtcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC5tZXRhZGF0YUlkID0gdXVpZDtcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC5yb290SWQgPSB0aGlzLnJvb3RJZDtcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC51cGxvYWRJZCA9IHVwbG9hZElkO1xuICAgICAgICAgICAgbXVsdGlSZXF1ZXN0LmluZGV4ID0gY2h1bmtJbmRleDtcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC50b3RhbCA9IGNodW5rVG90YWw7XG4gICAgICAgICAgICBtdWx0aVJlcXVlc3Quc2l6ZSA9IGZpbGVEYXRhLnNpemU7XG5cbiAgICAgICAgICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdtdWx0aVJlcXVlc3QnLCBKU09OLnN0cmluZ2lmeShtdWx0aVJlcXVlc3QpKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGVEYXRhKTtcblxuICAgICAgICAgICAgdGhpcy5tdWx0aVVwbG9hZChmb3JtRGF0YSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXMuZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbXVsdGlSZXN1bHRMaXN0LnB1c2gocmVzLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZENodW5rW3V1aWRdKys7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRQcm9jZXNzID0gTnVtYmVyLnBhcnNlSW50KCh0aGlzLnVwbG9hZGVkQ2h1bmtbdXVpZF0gLyB0aGlzLmZpbGVUb3RhbENodW5rW3V1aWRdICogMTAwKS50b0ZpeGVkKDApKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51cGxvYWRlZENodW5rW3V1aWRdID09IHRoaXMuZmlsZVRvdGFsQ2h1bmtbdXVpZF0pIHtcbiAgICAgICAgICAgICAgICAgIGlmIChtdWx0aVJlc3VsdExpc3QubGVuZ3RoID09IHRoaXMuZmlsZVRvdGFsQ2h1bmtbdXVpZF0pIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgY29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3Q6IENvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0ID0gbmV3IENvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0O1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU11bHRpVXBsb2FkUmVxdWVzdC5tZXRhZGF0YUlkID0gdXVpZDtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3QucGFydExpc3QgPSBtdWx0aVJlc3VsdExpc3Q7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0LnJvb3RJZCA9IHRoaXMucm9vdElkO1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU11bHRpVXBsb2FkUmVxdWVzdC51cGxvYWRJZCA9IHVwbG9hZElkO1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU11bHRpVXBsb2FkUmVxdWVzdC5zaXplID0gZmlsZUluZm8uZmlsZVNpemU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhdmVFeHRlbnNpb25Qcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU11bHRpVXBsb2FkUmVxdWVzdC5leFByb3BlcnR5TmFtZSA9IHRoaXMuZGVmYXVsdFByb3BlcnR5TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZU11bHRpVXBsb2FkKGNvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0KS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1cyAhPSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmVycm9yTWVzc2FnZSA9IHJlcy5lcnJvci5NZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCA9IHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmNvbmNhdCh1cGxvYWRGaWxlSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0ID0gdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5jb25jYXQodXBsb2FkRmlsZUluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbCsrO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC8v5ZCO5Y+w5byC5q2l5ou85o6l5paH5qGjXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnbWlzbWF0Y2hDaHVua1NpemUnKTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY2h1bmtJbmRleCA9IGNodW5rSW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cblxuICAgICAgfSlcblxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZW50aXR5ID0gbmV3IEdzcEZvcm1TdHJlYW1FbnRpdHk7XG4gICAgICBlbnRpdHkuZm9ybUlkID0gdGhpcy5mb3JtSWQ7XG4gICAgICBlbnRpdHkubWV0YWRhdGFJZCA9IHV1aWQ7XG4gICAgICBlbnRpdHkubW9kZSA9IE9wZXJhdGluZ01vZGVzLlRlbXA7XG4gICAgICBlbnRpdHkucm9vdElkID0gdGhpcy5yb290SWQ7XG4gICAgICBlbnRpdHkuc2l6ZSA9IHNlbGVjdGVkRmlsZS5zaXplO1xuICAgICAgZW50aXR5LmZpbGVOYW1lID0gZmlsZU5hbWU7XG4gICAgICBpZiAodGhpcy5oYXZlRXh0ZW5zaW9uUHJvcGVydHkpXG4gICAgICAgIGVudGl0eS5leFByb3BlcnR5TmFtZSA9IHRoaXMuZGVmYXVsdFByb3BlcnR5TmFtZTtcblxuICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ3VwbG9hZEVudGl0eScsIEpTT04uc3RyaW5naWZ5KGVudGl0eSkpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgc2VsZWN0ZWRGaWxlKTtcblxuXG4gICAgICBsZXQgaW50ZXJ2YWxJZDtcblxuICAgICAgdGhpcy51cGxvYWRTaW5nbGVGaWxlKGZvcm1EYXRhKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgaWYgKHJlcyAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRSZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5lcnJvck1lc3NhZ2UgPSByZXMuZXJyb3IuTWVzc2FnZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0ID0gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuY29uY2F0KHVwbG9hZEZpbGVJbmZvKTtcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0ID0gdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5jb25jYXQodXBsb2FkRmlsZUluZm8pO1xuICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwrKztcblxuICAgICAgICB9XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICB9KVxuXG4gICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgaWYgKHgubmFtZSA9PSBmaWxlSW5mby5uYW1lKSB7XG4gICAgICAgICAgaWYgKGluZGV4ID09IC0xKVxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmZpbGVzLmluZGV4T2YoeCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggIT0gdGhpcy5maWxlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRoaXMuZmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uZmlsZU5hbWUgPT09IGZpbGVJbmZvLm5hbWUpLCAxKTtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmZpbGVOYW1lID09PSBmaWxlSW5mby5uYW1lKSwgMSk7XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICAgIH1cblxuICAgICAgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRVcGxvYWRQcm9jZXNzKGVudGl0eS5tZXRhZGF0YUlkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICBpZiAocmVzLmVycm9yICE9IG51bGwpXG4gICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFByb2Nlc3MgPSAxMDtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyZXMgPCAxMClcbiAgICAgICAgICAgICAgcmVzID0gMTA7XG4gICAgICAgICAgICBpZiAocmVzID4gOTApXG4gICAgICAgICAgICAgIHJlcyA9IDkwO1xuICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRQcm9jZXNzID0gcmVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuXG4gIH1cblxuICBnZXRVcGxvYWRQcm9jZXNzKG1ldGFkYXRhSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICBsZXQgdXJsID0gXCIvYXBpL3J1bnRpbWUvZGZzL3YxLjAvZm9ybWRvYy91cGxvYWQvcHJvY2Vzcz9tZXRhZGF0YWlkPVwiICsgbWV0YWRhdGFJZDtcblxuICAgIHJldHVybiB0aGlzLmh0dHBjbGllbnQuZ2V0KHVybCkucGlwZShcbiAgICAgIHRhcChyZXMgPT4geyB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICByZXR1cm4gb2YoZXJyb3IpO1xuICAgICAgfSkpO1xuICB9XG5cbiAgdXBsb2FkU2luZ2xlRmlsZShmb3JtZGF0YTogRm9ybURhdGEpOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgbGV0IHVybCA9IFwiL2FwaS9ydW50aW1lL2Rmcy92MS4wL2Zvcm1kb2Mvc2luZ2xlXCI7XG4gICAgY29uc3QgYmFzZVVybCA9IEJhc2VQYXRoU2VydmljZS5jb252ZXJ0UGF0aCh1cmwpO1xuICAgIHJldHVybiB0aGlzLmh0dHBjbGllbnQucG9zdChiYXNlVXJsLCBmb3JtZGF0YSkucGlwZShcbiAgICAgIHRhcChyZXMgPT4geyB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICByZXR1cm4gb2YoZXJyb3IpO1xuICAgICAgfSkpO1xuICB9XG5cbiAgdXBsb2FkU2xpY2VGaWxlKGZvcm1kYXRhOiBGb3JtRGF0YSk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICBsZXQgdXJsID0gXCIvYXBpL3J1bnRpbWUvZGZzL3YxLjAvZm9ybWRvYy9zbGljZVwiO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBCYXNlUGF0aFNlcnZpY2UuY29udmVydFBhdGgodXJsKTtcbiAgICByZXR1cm4gdGhpcy5odHRwY2xpZW50LnBvc3QoYmFzZVVybCwgZm9ybWRhdGEpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHsgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKGVycm9yKTtcbiAgICAgIH0pKTtcbiAgfVxuXG4gIGluaXRNdWx0aVVwbG9hZChyZXF1ZXN0OiBJbml0TXVsdGlVcGxvYWRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIGxldCB1cmwgPSBcIi9hcGkvcnVudGltZS9kZnMvdjEuMC9mb3JtZG9jL211bHRpL2luaXRcIjtcbiAgICBjb25zdCBiYXNlVXJsID0gQmFzZVBhdGhTZXJ2aWNlLmNvbnZlcnRQYXRoKHVybCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cGNsaWVudC5wb3N0KGJhc2VVcmwsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHsgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKGVycm9yKTtcbiAgICAgIH0pKTtcbiAgfVxuXG4gIG11bHRpVXBsb2FkKGZvcm1kYXRhOiBGb3JtRGF0YSk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICBsZXQgdXJsID0gXCIvYXBpL3J1bnRpbWUvZGZzL3YxLjAvZm9ybWRvYy9tdWx0aS91cGxvYWRcIjtcbiAgICBjb25zdCBiYXNlVXJsID0gQmFzZVBhdGhTZXJ2aWNlLmNvbnZlcnRQYXRoKHVybCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cGNsaWVudC5wb3N0KGJhc2VVcmwsIGZvcm1kYXRhKS5waXBlKFxuICAgICAgdGFwKHJlcyA9PiB7IH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHJldHVybiBvZihlcnJvcik7XG4gICAgICB9KSk7XG4gIH1cblxuICBjb21wbGV0ZU11bHRpVXBsb2FkKHJlcXVlc3Q6IENvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIGxldCB1cmwgPSBcIi9hcGkvcnVudGltZS9kZnMvdjEuMC9mb3JtZG9jL211bHRpL2NvbXBsZXRlXCI7XG4gICAgY29uc3QgYmFzZVVybCA9IEJhc2VQYXRoU2VydmljZS5jb252ZXJ0UGF0aCh1cmwpO1xuICAgIHJldHVybiB0aGlzLmh0dHBjbGllbnQucG9zdChiYXNlVXJsLCByZXF1ZXN0KS5waXBlKFxuICAgICAgdGFwKHJlcyA9PiB7IH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHJldHVybiBvZihlcnJvcik7XG4gICAgICB9KSk7XG4gIH1cblxuXG5cbiAgc2VsZWN0QWxsRmlsZSgpIHtcblxuICAgIGlmICghdGhpcy5maWxlQWxsU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcblxuICAgICAgICBlbGVtZW50LnNlbGVjdGQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gdGhpcy5maWxlcy5sZW5ndGg7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0ZCA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XG4gICAgfVxuICB9XG5cblxuICBjaGVja291dFNlbGVjdEZpbGUoZmlsZTogRmlsZUluZm8pIHtcbiAgICAvLyBsZXQgb2JqOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaWxlTmFtZSk7XG4gICAgZmlsZS5zZWxlY3RkID0gIWZpbGUuc2VsZWN0ZDtcbiAgICBpZiAoZmlsZS5zZWxlY3RkKVxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCsrO1xuICAgIGVsc2VcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQtLTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9PSB0aGlzLmZpbGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgLy90aGlzLmlzRmlsZUFsbFNlbGVjdGVkKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIC8vdGhpcy5pc0ZpbGVBbGxTZWxlY3RlZCgpO1xuICAgIH1cblxuICB9XG5cbiAgbGlzdERlbGV0ZUZpbGUoZmlsZUluZm86IEZpbGVJbmZvKSB7XG4gICAgaWYgKGZpbGVJbmZvLnNlbGVjdGQpXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50LS07XG4gICAgLy9jb25zb2xlLmxvZyhmaWxlTmFtZSk7XG4gICAgdGhpcy5maWxlcy5zcGxpY2UodGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKSwgMSk7XG4gICAgaWYgKGZpbGVJbmZvLnVwbG9hZFJlc3VsdCkge1xuICAgICAgbGV0IGlkTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlkTGlzdC5wdXNoKGZpbGVJbmZvLmlkKTtcbiAgICAgIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwoaWRMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG5cbiAgICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LnNwbGljZSh0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHguZmlsZU5hbWUgPT0gZmlsZUluZm8ubmFtZSlbMF0pLCAxKTtcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHguZmlsZU5hbWUgPT0gZmlsZUluZm8ubmFtZSlbMF0pLCAxKTtcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPT0gMClcbiAgICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XG4gIH1cblxuICBsaXN0TXVsdGlwbGVEZWxldGVGaWxlKCkge1xuICAgIGxldCBzZWxlY3RlZEZpbGU6IEZpbGVJbmZvW10gPSBbXTtcbiAgICB0aGlzLmZpbGVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBsZXQgb2JqOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50Lm5hbWUpO1xuICAgICAgaWYgKG9iai5jaGVja2VkKVxuICAgICAgICBzZWxlY3RlZEZpbGUucHVzaChlbGVtZW50KTtcbiAgICB9KVxuICAgIGxldCBtZXRhZGF0YUxpc3Q6IHN0cmluZ1tdID0gW107XG4gICAgc2VsZWN0ZWRGaWxlLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBtZXRhZGF0YUxpc3QucHVzaChlbGVtZW50LmlkKTtcbiAgICAgIHRoaXMuZmlsZXMuc3BsaWNlKHRoaXMuZmlsZXMuaW5kZXhPZihlbGVtZW50KSwgMSk7XG4gICAgICBpZiAoZWxlbWVudC51cGxvYWRSZXN1bHQpIHtcblxuICAgICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4LmZpbGVOYW1lID09IGVsZW1lbnQubmFtZSlbMF0pLCAxKTtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBlbGVtZW50Lm5hbWUpWzBdKSwgMSk7XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwobWV0YWRhdGFMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG5cbiAgICBsZXQgYWxsQm94OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFsbENoZWNrQm94XCIpO1xuICAgIGlmIChhbGxCb3ggIT0gbnVsbClcbiAgICAgIGFsbEJveC5jaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XG4gICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgfVxuXG5cbiAgZ2V0UGljTGlzdERpc3BsYXlOYW1lKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoZmlsZU5hbWUubGVuZ3RoIDw9IDEwKVxuICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIGVsc2Uge1xuICAgICAgbGV0IGhlYWRDb250ZW50ID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIDIpO1xuICAgICAgbGV0IHRhaWxDb250ZW50ID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgLSAyKTtcbiAgICAgIHJldHVybiBoZWFkQ29udGVudCArIFwi4oCmXCIgKyB0YWlsQ29udGVudDtcbiAgICB9XG4gIH1cblxuICBnZXRRdWV1ZURpc3BsYXlOYW1lKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZmlsZU5hbWU7XG4gIH1cblxuICBhZGREb2NJbmZvKHNlbGVjdGRGaWxlLCBmaWxlSW5mbzogRmlsZUluZm8sIGRvY1R5cGU6IERvY1R5cGUpIHtcblxuICAgIHN3aXRjaCAoZG9jVHlwZSkge1xuICAgICAgY2FzZSBEb2NUeXBlLldvcmQ6IHtcbiAgICAgICAgZmlsZUluZm8uc291cmNlID0gdGhpcy5jcmVhdGVCYXNlVXJsKFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy93b3JkLnBuZ1wiKTtcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRG9jVHlwZS5QZGY6IHtcbiAgICAgICAgZmlsZUluZm8uc291cmNlID0gdGhpcy5jcmVhdGVCYXNlVXJsKFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9wZGYucG5nXCIpO1xuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBEb2NUeXBlLkV4Y2VsOiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IHRoaXMuY3JlYXRlQmFzZVVybChcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvZXhjZWwucG5nXCIpO1xuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBEb2NUeXBlLlR4dDoge1xuICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSB0aGlzLmNyZWF0ZUJhc2VVcmwoXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3R4dC5wbmdcIik7XG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIERvY1R5cGUuWmlwOiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IHRoaXMuY3JlYXRlQmFzZVVybChcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvemlwLnBuZ1wiKTtcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRG9jVHlwZS5Qb3dlcnBvaW50OiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IHRoaXMuY3JlYXRlQmFzZVVybChcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvcHB0LnBuZ1wiKTtcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRG9jVHlwZS5PdGhlcjoge1xuICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSB0aGlzLmNyZWF0ZUJhc2VVcmwoXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL2ZpbGUucG5nXCIpO1xuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBEb2NUeXBlLkltYWdlOiB7XG4gICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChzZWxlY3RkRmlsZSk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoX2V2ZW50KSA9PiB7XG4gICAgICAgICAgbGV0IGltZ1VybCA9IHJlYWRlci5yZXN1bHQ7XG4gICAgICAgICAgaWYgKHRoaXMuaW5qZWN0b3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHNhbml0aXplciA9IHRoaXMuaW5qZWN0b3IuZ2V0KERvbVNhbml0aXplcik7XG4gICAgICAgICAgICBpbWdVcmwgPSBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGltZ1VybCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IGltZ1VybDtcbiAgICAgICAgICBmaWxlSW5mby5zdHlsZSA9IHsgXCJtYXgtd2lkdGhcIjogXCIxMjBweFwiLCBcIm1heC1oZWlnaHRcIjogXCIxMThweFwiIH1cbiAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuXG4gICAgICAgICAgLy/lm6DkuLrlvILmraXlpITnkIbnmoTlt67lvILvvIzooaXlgb/kuIDmrKHliKDpmaRcbiAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICB0aGlzLmZpbGVzLmZvckVhY2goeCA9PiB7XG4gICAgICAgICAgICBpZiAoeC5uYW1lID09IGZpbGVJbmZvLm5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKVxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5maWxlcy5pbmRleE9mKHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ICE9IHRoaXMuZmlsZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5maWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uZmlsZU5hbWUgPT09IGZpbGVJbmZvLm5hbWUpLCAxKTtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5maWxlTmFtZSA9PT0gZmlsZUluZm8ubmFtZSksIDEpO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuXG4gIH1cblxuICBsaXN0VG9TdHJpbmcoc3RyTGlzdDogc3RyaW5nW10pIHtcbiAgICBjb25zdCByZXN1bHQgPSBzdHJMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0udHJpbSgpICE9PSAnJyk7XG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWUgKz0gcmVzdWx0W2ldICsgKGkgPT09IHJlc3VsdC5sZW5ndGggLSAxID8gXCJcIiA6IFwiLFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICBzZWN1cml0eUNoYW5nZSgkZXZlbnQ6IGFueSwgZmlsZTogRmlsZUluZm8pIHtcbiAgICBmaWxlLnNlY3VyaXR5SW5mbyA9ICRldmVudC5zZWxlY3Rpb25zWzBdO1xuICAgIGxldCB1cGxvYWRGaWxlID0gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09PSBmaWxlLmlkKVswXTtcbiAgICB1cGxvYWRGaWxlLnNlY3VyaXR5SW5mbyA9ICRldmVudC5zZWxlY3Rpb25zWzBdO1xuICB9XG5cblxuICBleFN0b3JhZ2VGaWxlTGlzdDogRXhTdG9yYWdlRmlsZUluZm9bXSA9IFtdO1xuXG4gIHR5cGVDaGFuZ2UoJGV2ZW50OiBhbnksIGZpbGU6IEZpbGVJbmZvKSB7XG4gICAgZmlsZS5leHRlbnNpb25OYW1lID0gJGV2ZW50LnNlbGVjdGlvbnNbMF0ubmFtZTtcbiAgICBsZXQgZXhTdG9yYWdlRmlsZUluZm86IEV4U3RvcmFnZUZpbGVJbmZvID0gbmV3IEV4U3RvcmFnZUZpbGVJbmZvO1xuICAgIGlmIChmaWxlLmV4dGVuc2lvbk5hbWUgPT0gdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgIGlmICh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKS5sZW5ndGggPiAwKVxuICAgICAgICB0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LnNwbGljZSh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbmRJbmRleCh4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKSwgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXhTdG9yYWdlRmlsZUluZm8gPSB0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKVswXTtcbiAgICAgICAgZXhTdG9yYWdlRmlsZUluZm8uZXhQcm9wZXJ0eU5hbWUgPSBmaWxlLmV4dGVuc2lvbk5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleFN0b3JhZ2VGaWxlSW5mby5tZXRhZGF0YUlkID0gZmlsZS5pZDtcbiAgICAgICAgZXhTdG9yYWdlRmlsZUluZm8uZXhQcm9wZXJ0eU5hbWUgPSBmaWxlLmV4dGVuc2lvbk5hbWU7XG4gICAgICAgIHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QucHVzaChleFN0b3JhZ2VGaWxlSW5mbyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBsb2FkKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0Lmxlbmd0aCAhPSB0aGlzLmZpbGVzLmZpbHRlcih4ID0+IHguaXNVcGxvYWRpbmcgfHwgeC51cGxvYWRSZXN1bHQpLmxlbmd0aCkge1xuXG4gICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyh0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCd3YWl0JykpO1xuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGF2ZVNlY3VyaXR5SW5mbykge1xuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLnNhdmVTZWN1cml0eUluZm8odGhpcy51cGxvYWRGaWxlSW5mb0xpc3QsIHRoaXMucm9vdElkKS5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RvcmFnZUV4dGVuc2lvbiA9PSBudWxsKVxuICAgICAgcmV0dXJuIG9mKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0KTtcbiAgICBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0Lmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gb2YodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLmxvYWRTZXJ2aWNlLnNob3coe1xuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NhdmVUbycpICsgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmV4dGVuc2lvbk5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZFNlcnZpY2UuY2hhbmdlU3RvcmFnZUluc3RhbmNlKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QsIHRoaXMucm9vdElkKS5waXBlKFxuICAgICAgICAgIG1hcChyZXMgPT4ge1xuICAgICAgICAgICAgLy8gaWYgKHJlcyAhPSBudWxsKVxuICAgICAgICAgICAgLy8gICB0aGlzLm1zZ1NlcnZpY2UuZXJyb3IoJ+S/neWtmOWIsCcgKyB0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZXh0ZW5zaW9uTmFtZSArIFwi5aSx6LSl77yM5LiK5Lyg5paH5Lu26Ieq5Yqo5L+d5a2Y5YiwXCIgKyB0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZGVmYXVsdFByb3BlcnR5TmFtZSArIFwi5a2Y5YKo44CCXCIgKyByZXMuZXJyb3IuTWVzc2FnZSk7XG4gICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Q7XG4gICAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgdGhpcy5tZXRhZGF0YUlkTGlzdC5wdXNoKGVsZW1lbnQubWV0YWRhdGFJZCk7XG4gICAgfSlcbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY2FuY2VsKHRoaXMubWV0YWRhdGFJZExpc3QsIHRoaXMucm9vdElkKS5zdWJzY3JpYmUoKTtcblxuICB9XG5cbiAgZ2V0VXBsb2FkRmlsZUluZm9MaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdDtcbiAgfVxuXG4gIGRlbGV0ZShmaWxlKSB7XG4gICAgdGhpcy5maWxlcy5zcGxpY2UodGhpcy5maWxlcy5pbmRleE9mKGZpbGUpLCAxKTtcbiAgICBpZiAoZmlsZS51cGxvYWRSZXN1bHQpXG4gICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsLS07XG4gICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZXhTdG9yYWdlRmlsZUxpc3Quc3BsaWNlKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmluZEluZGV4KHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLCAxKTtcbiAgICB9XG5cbiAgfVxuXG4gIGdldEZpbGVTaXplKHNpemU6IG51bWJlcikge1xuICAgIGlmIChzaXplIDwgMTAyNDAwKVxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCkudG9GaXhlZCgxKSArIFwiS1wiO1xuICAgIGVsc2UgaWYgKHNpemUgPCAxMDI0ICogMTAyNClcbiAgICAgIHJldHVybiAoc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMCkgKyBcIktcIjtcbiAgICBlbHNlIGlmIChzaXplIDwgMTAwICogMTAyNCAqIDEwMjQpXG4gICAgICByZXR1cm4gKHNpemUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgxKSArIFwiTVwiO1xuICAgIGVsc2UgaWYgKHNpemUgPCAxMDI0ICogMTAyNCAqIDEwMjQpXG4gICAgICByZXR1cm4gKHNpemUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgwKSArIFwiTVwiO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAoc2l6ZSAvIDEwMjQgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgxKSArIFwiR1wiO1xuICB9XG4gIHNob3dCeUdyb3VwKCkge1xuICAgIHRoaXMuc2hvd1R5cGUgPSAwO1xuICAgIC8vIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPSAwO1xuICB9XG5cbiAgc2hvd0J5TGlzdCgpIHtcbiAgICB0aGlzLnNob3dUeXBlID0gMTtcbiAgICAvLyB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gMDtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVDb3VudCAhPSAwICYmIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPT0gdGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBtb3VzZU92ZXIoZmlsZSkge1xuICAgIGZpbGUubW91c2VPbiA9IHRydWU7XG4gIH1cbiAgbW91c2VPdXQoZmlsZSkge1xuICAgIGZpbGUubW91c2VPbiA9IGZhbHNlO1xuICB9XG5cbiAgY3JlYXRlQmFzZVVybChvbGRVcmw6IHN0cmluZykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBCYXNlUGF0aFNlcnZpY2UuY29udmVydFBhdGgob2xkVXJsKVxuICAgIHJldHVybiBiYXNlVXJsO1xuICB9XG59XG5cblxuIl19