@sumit_yewale/angular 1.1.18 → 1.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/bundles/sumit_yewale-angular.umd.js +532 -60
- package/bundles/sumit_yewale-angular.umd.js.map +1 -1
- package/bundles/sumit_yewale-angular.umd.min.js +1 -1
- package/bundles/sumit_yewale-angular.umd.min.js.map +1 -1
- package/esm2015/lib/csvbox-button.component.js +481 -60
- package/esm2015/public-api.js +1 -2
- package/esm5/lib/csvbox-button.component.js +535 -63
- package/esm5/public-api.js +1 -2
- package/fesm2015/sumit_yewale-angular.js +480 -59
- package/fesm2015/sumit_yewale-angular.js.map +1 -1
- package/fesm5/sumit_yewale-angular.js +534 -62
- package/fesm5/sumit_yewale-angular.js.map +1 -1
- package/lib/csvbox-button.component.d.ts +32 -4
- package/package.json +2 -8
- package/sumit_yewale-angular.metadata.json +1 -1
|
@@ -3,18 +3,137 @@
|
|
|
3
3
|
* Generated from: lib/csvbox-button.component.ts
|
|
4
4
|
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
5
|
*/
|
|
6
|
-
import { Component,
|
|
6
|
+
import { Component, Input, SecurityContext, ChangeDetectorRef, NgZone } from '@angular/core';
|
|
7
7
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
8
8
|
import { insertCSS } from '../utlis/insertCSS';
|
|
9
|
-
import { buildImportUrl, generateUuid, buildInitPayload, classifyStructuredMessage } from '@sumit_yewale/adapter-core';
|
|
9
|
+
import { buildImportUrl, generateUuid, buildInitPayload, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';
|
|
10
|
+
// How long we wait for the importer to confirm a file it was sent before giving up on it.
|
|
10
11
|
/** @type {?} */
|
|
11
|
-
const
|
|
12
|
+
const FILE_ACK_TIMEOUT_MS = 8000;
|
|
13
|
+
/**
|
|
14
|
+
* @record
|
|
15
|
+
*/
|
|
16
|
+
function OpenImporterEntry() { }
|
|
17
|
+
if (false) {
|
|
18
|
+
/** @type {?} */
|
|
19
|
+
OpenImporterEntry.prototype.getHolder;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @record
|
|
23
|
+
*/
|
|
24
|
+
function OpenImporters() { }
|
|
25
|
+
if (false) {
|
|
26
|
+
/** @type {?} */
|
|
27
|
+
OpenImporters.prototype.open;
|
|
28
|
+
/** @type {?} */
|
|
29
|
+
OpenImporters.prototype.listeners;
|
|
30
|
+
}
|
|
31
|
+
/** @type {?} */
|
|
32
|
+
const OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';
|
|
33
|
+
/** @type {?} */
|
|
34
|
+
const TOP_Z_INDEX = 2147483647;
|
|
35
|
+
/**
|
|
36
|
+
* @return {?}
|
|
37
|
+
*/
|
|
38
|
+
function openImporters() {
|
|
39
|
+
/** @type {?} */
|
|
40
|
+
const w = (/** @type {?} */ (window));
|
|
41
|
+
if (!w[OPEN_IMPORTERS_KEY])
|
|
42
|
+
w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };
|
|
43
|
+
return w[OPEN_IMPORTERS_KEY];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @param {?} reg
|
|
47
|
+
* @return {?}
|
|
48
|
+
*/
|
|
49
|
+
function restackOpenImporters(reg) {
|
|
50
|
+
reg.open.forEach((/**
|
|
51
|
+
* @param {?} entry
|
|
52
|
+
* @param {?} i
|
|
53
|
+
* @return {?}
|
|
54
|
+
*/
|
|
55
|
+
(entry, i) => {
|
|
56
|
+
/** @type {?} */
|
|
57
|
+
const holder = entry.getHolder();
|
|
58
|
+
if (holder)
|
|
59
|
+
holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* @param {?} entry
|
|
64
|
+
* @return {?}
|
|
65
|
+
*/
|
|
66
|
+
function registerOpenImporter(entry) {
|
|
67
|
+
/** @type {?} */
|
|
68
|
+
const reg = openImporters();
|
|
69
|
+
if (reg.open.indexOf(entry) >= 0)
|
|
70
|
+
return;
|
|
71
|
+
reg.open.push(entry);
|
|
72
|
+
restackOpenImporters(reg);
|
|
73
|
+
reg.listeners.slice().forEach((/**
|
|
74
|
+
* @param {?} fn
|
|
75
|
+
* @return {?}
|
|
76
|
+
*/
|
|
77
|
+
fn => fn()));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* @param {?} entry
|
|
81
|
+
* @return {?}
|
|
82
|
+
*/
|
|
83
|
+
function unregisterOpenImporter(entry) {
|
|
84
|
+
/** @type {?} */
|
|
85
|
+
const reg = openImporters();
|
|
86
|
+
/** @type {?} */
|
|
87
|
+
const i = reg.open.indexOf(entry);
|
|
88
|
+
if (i < 0)
|
|
89
|
+
return;
|
|
90
|
+
reg.open.splice(i, 1);
|
|
91
|
+
restackOpenImporters(reg);
|
|
92
|
+
reg.listeners.slice().forEach((/**
|
|
93
|
+
* @param {?} fn
|
|
94
|
+
* @return {?}
|
|
95
|
+
*/
|
|
96
|
+
fn => fn()));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* @param {?} entry
|
|
100
|
+
* @return {?}
|
|
101
|
+
*/
|
|
102
|
+
function isBlockedByOpenImporter(entry) {
|
|
103
|
+
/** @type {?} */
|
|
104
|
+
const reg = openImporters();
|
|
105
|
+
return reg.open.length > 0 && reg.open.indexOf(entry) < 0;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* @param {?} fn
|
|
109
|
+
* @return {?}
|
|
110
|
+
*/
|
|
111
|
+
function subscribeOpenImporters(fn) {
|
|
112
|
+
/** @type {?} */
|
|
113
|
+
const reg = openImporters();
|
|
114
|
+
reg.listeners.push(fn);
|
|
115
|
+
return (/**
|
|
116
|
+
* @return {?}
|
|
117
|
+
*/
|
|
118
|
+
() => {
|
|
119
|
+
/** @type {?} */
|
|
120
|
+
const i = reg.listeners.indexOf(fn);
|
|
121
|
+
if (i >= 0)
|
|
122
|
+
reg.listeners.splice(i, 1);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/** @type {?} */
|
|
126
|
+
const appVersion = '1.1.20';
|
|
12
127
|
export class CSVBoxButtonComponent {
|
|
13
128
|
/**
|
|
14
129
|
* @param {?} sanitizer
|
|
130
|
+
* @param {?} cdr
|
|
131
|
+
* @param {?} zone
|
|
15
132
|
*/
|
|
16
|
-
constructor(sanitizer) {
|
|
133
|
+
constructor(sanitizer, cdr, zone) {
|
|
17
134
|
this.sanitizer = sanitizer;
|
|
135
|
+
this.cdr = cdr;
|
|
136
|
+
this.zone = zone;
|
|
18
137
|
this.isModalShown = false;
|
|
19
138
|
this.licenseKey = null;
|
|
20
139
|
this.uuid = null;
|
|
@@ -27,53 +146,121 @@ export class CSVBoxButtonComponent {
|
|
|
27
146
|
this.lazy = false;
|
|
28
147
|
this.iframe = null;
|
|
29
148
|
this.disabled = true;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
149
|
+
// True while a different importer on the page is open: the button stays disabled.
|
|
150
|
+
this.blockedByOther = false;
|
|
151
|
+
this.registryEntry = { getHolder: (/**
|
|
152
|
+
* @return {?}
|
|
153
|
+
*/
|
|
154
|
+
() => this.holder) };
|
|
155
|
+
this.fileSender = createFileSender({
|
|
156
|
+
getIframe: (/**
|
|
157
|
+
* @return {?}
|
|
158
|
+
*/
|
|
159
|
+
() => this.iframe),
|
|
160
|
+
getToken: (/**
|
|
161
|
+
* @return {?}
|
|
162
|
+
*/
|
|
163
|
+
() => (/** @type {?} */ (this.uuid))),
|
|
164
|
+
getTargetOrigin: (/**
|
|
165
|
+
* @return {?}
|
|
166
|
+
*/
|
|
167
|
+
() => (/** @type {?} */ (this.targetOrigin))),
|
|
168
|
+
getBaseDomain: (/**
|
|
169
|
+
* @return {?}
|
|
170
|
+
*/
|
|
171
|
+
() => this.baseDomain),
|
|
172
|
+
takeFile: (/**
|
|
173
|
+
* @return {?}
|
|
174
|
+
*/
|
|
175
|
+
() => {
|
|
176
|
+
/** @type {?} */
|
|
177
|
+
const file = this.pendingFile;
|
|
178
|
+
this.pendingFile = null;
|
|
179
|
+
return file;
|
|
180
|
+
}),
|
|
181
|
+
onSent: (/**
|
|
182
|
+
* @return {?}
|
|
183
|
+
*/
|
|
184
|
+
() => this.startFileAckTimer())
|
|
185
|
+
});
|
|
186
|
+
this.unsubscribeOpenImporters = null;
|
|
187
|
+
this.pendingFile = null;
|
|
188
|
+
// Data-location sheets redirect to another host, so the iframe origin can differ from
|
|
189
|
+
// targetOrigin. baseDomain is used to check the real origin before trusting it.
|
|
190
|
+
this.baseDomain = "app.csvbox.io";
|
|
191
|
+
this.fileAckTimer = null;
|
|
192
|
+
this.messageListener = (/**
|
|
73
193
|
* @param {?} event
|
|
74
194
|
* @return {?}
|
|
75
195
|
*/
|
|
76
196
|
(event) => {
|
|
197
|
+
// Older importers send these as bare strings, without a token.
|
|
198
|
+
/** @type {?} */
|
|
199
|
+
const legacy = classifyLegacyMessage(event.data);
|
|
200
|
+
if (legacy) {
|
|
201
|
+
// Legacy messages carry no token, so the only way to tell which importer sent one is its
|
|
202
|
+
// window. Ignore those that came from another instance's iframe (or anywhere else).
|
|
203
|
+
if (!this.iframe || event.source !== this.iframe.contentWindow) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (legacy.type === "mainModalHidden") {
|
|
207
|
+
this.handleModalClosed();
|
|
208
|
+
}
|
|
209
|
+
else if (legacy.type === "uploadSuccessful") {
|
|
210
|
+
if (this.onImport)
|
|
211
|
+
this.onImport(true);
|
|
212
|
+
if (this.isImported)
|
|
213
|
+
this.isImported(true);
|
|
214
|
+
if (this.imported)
|
|
215
|
+
this.imported(true);
|
|
216
|
+
}
|
|
217
|
+
else if (legacy.type === "uploadFailed") {
|
|
218
|
+
if (this.onImport)
|
|
219
|
+
this.onImport(false);
|
|
220
|
+
if (this.isImported)
|
|
221
|
+
this.isImported(false);
|
|
222
|
+
if (this.imported)
|
|
223
|
+
this.imported(false);
|
|
224
|
+
}
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
// Set-file handshake messages. The shared core does not classify these, so they are
|
|
228
|
+
// read here, behind the same unique_token check the core applies.
|
|
229
|
+
/** @type {?} */
|
|
230
|
+
const raw = event.data;
|
|
231
|
+
if (raw && typeof raw === "object" && raw.data && raw.data.unique_token == this.uuid) {
|
|
232
|
+
this.fileSender.learnOrigin(event);
|
|
233
|
+
if (raw.type === "csvbox-set-file-rejected" && raw.data.reason === "not-a-file") {
|
|
234
|
+
// Reply to our probe (it has no file). It only tells us the origin, so do nothing.
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (raw.type === "csvbox-modal-shown") {
|
|
238
|
+
this.clearFileAckTimer();
|
|
239
|
+
registerOpenImporter(this.registryEntry);
|
|
240
|
+
// What the file path in openModal() is waiting for. display as well as
|
|
241
|
+
// pointer-events: a second file declined while the first was still opening the
|
|
242
|
+
// modal has put the holder away in the meantime.
|
|
243
|
+
this.isModalShown = true;
|
|
244
|
+
if (this.holder) {
|
|
245
|
+
this.holder.style.display = 'block';
|
|
246
|
+
this.holder.style.pointerEvents = 'auto';
|
|
247
|
+
}
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (raw.type === "csvbox-set-file-rejected") {
|
|
251
|
+
this.clearFileAckTimer();
|
|
252
|
+
// The importer has the file and will not take it. Put the holder away only if the
|
|
253
|
+
// modal was never confirmed up: a file declined while it is open leaves that modal
|
|
254
|
+
// where it is, and its own 'csvbox-modal-hidden' will put the holder away.
|
|
255
|
+
if (!this.isModalShown && this.holder) {
|
|
256
|
+
this.holder.style.display = 'none';
|
|
257
|
+
this.holder.style.pointerEvents = 'auto';
|
|
258
|
+
unregisterOpenImporter(this.registryEntry);
|
|
259
|
+
}
|
|
260
|
+
console.warn("[csvbox] importer declined the supplied file: " + raw.data.reason);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
77
264
|
/** @type {?} */
|
|
78
265
|
let message = classifyStructuredMessage(event.data, (/** @type {?} */ (this.uuid)));
|
|
79
266
|
if (!message) {
|
|
@@ -117,7 +304,58 @@ export class CSVBoxButtonComponent {
|
|
|
117
304
|
if (this.imported)
|
|
118
305
|
this.imported(false);
|
|
119
306
|
}
|
|
120
|
-
})
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* @return {?}
|
|
311
|
+
*/
|
|
312
|
+
ngOnInit() {
|
|
313
|
+
this.uuid = generateUuid();
|
|
314
|
+
/** @type {?} */
|
|
315
|
+
let iframeUrl = buildImportUrl({
|
|
316
|
+
licenseKey: this.licenseKey,
|
|
317
|
+
customDomain: this.customDomain,
|
|
318
|
+
dataLocation: this.dataLocation,
|
|
319
|
+
language: this.language,
|
|
320
|
+
theme: this.theme,
|
|
321
|
+
environment: this.environment
|
|
322
|
+
}, "angular", appVersion);
|
|
323
|
+
// Default place to send the file. A file is only ever sent to a named origin, never "*".
|
|
324
|
+
this.targetOrigin = new URL(iframeUrl).origin;
|
|
325
|
+
this.baseDomain = this.customDomain || "app.csvbox.io";
|
|
326
|
+
this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* @param {?} changes
|
|
330
|
+
* @return {?}
|
|
331
|
+
*/
|
|
332
|
+
ngOnChanges(changes) {
|
|
333
|
+
if (changes["user"] && changes['user'].currentValue != changes['user'].previousValue) {
|
|
334
|
+
this.updateUserVariabe(changes['user'].currentValue);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* @param {?} data
|
|
339
|
+
* @return {?}
|
|
340
|
+
*/
|
|
341
|
+
updateUserVariabe(data) {
|
|
342
|
+
this.user = data;
|
|
343
|
+
if (this.iframe && this.iframe.contentWindow) {
|
|
344
|
+
this.iframe.contentWindow.postMessage({
|
|
345
|
+
"customer": data
|
|
346
|
+
}, "*");
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* @return {?}
|
|
351
|
+
*/
|
|
352
|
+
ngAfterContentInit() {
|
|
353
|
+
window.addEventListener("message", this.messageListener, false);
|
|
354
|
+
this.syncBlocked();
|
|
355
|
+
this.unsubscribeOpenImporters = subscribeOpenImporters((/**
|
|
356
|
+
* @return {?}
|
|
357
|
+
*/
|
|
358
|
+
() => this.syncBlocked()));
|
|
121
359
|
if (this.lazy) {
|
|
122
360
|
this.disabled = false;
|
|
123
361
|
}
|
|
@@ -130,8 +368,10 @@ export class CSVBoxButtonComponent {
|
|
|
130
368
|
* @return {?}
|
|
131
369
|
*/
|
|
132
370
|
handleModalClosed() {
|
|
133
|
-
if (this.holder)
|
|
371
|
+
if (this.holder) {
|
|
134
372
|
this.holder.style.display = 'none';
|
|
373
|
+
this.holder.style.pointerEvents = 'auto';
|
|
374
|
+
}
|
|
135
375
|
this.isModalShown = false;
|
|
136
376
|
this.isIframeLoaded = false;
|
|
137
377
|
this.openModalOnIframeLoad = false;
|
|
@@ -139,6 +379,9 @@ export class CSVBoxButtonComponent {
|
|
|
139
379
|
this.holder.remove();
|
|
140
380
|
this.holder = null;
|
|
141
381
|
this.iframe = null;
|
|
382
|
+
// A new iframe is built on the next open, so the origin is learned again.
|
|
383
|
+
this.clearProbeTimer();
|
|
384
|
+
unregisterOpenImporter(this.registryEntry);
|
|
142
385
|
if (this.onClose)
|
|
143
386
|
this.onClose();
|
|
144
387
|
if (this.isClosed)
|
|
@@ -158,6 +401,7 @@ export class CSVBoxButtonComponent {
|
|
|
158
401
|
let iframe = document.createElement("iframe");
|
|
159
402
|
this.iframe = iframe;
|
|
160
403
|
iframe.setAttribute("src", this.safeUrl);
|
|
404
|
+
iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
|
|
161
405
|
iframe.frameBorder = "0";
|
|
162
406
|
/** @type {?} */
|
|
163
407
|
let self = this;
|
|
@@ -185,11 +429,16 @@ export class CSVBoxButtonComponent {
|
|
|
185
429
|
this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`);
|
|
186
430
|
this.holder.appendChild(iframe);
|
|
187
431
|
document.body.insertAdjacentElement('beforeend', this.holder);
|
|
432
|
+
// The holder did not exist yet if openModal() asked for the importer before it was built.
|
|
433
|
+
restackOpenImporters(openImporters());
|
|
188
434
|
}
|
|
189
435
|
/**
|
|
190
436
|
* @return {?}
|
|
191
437
|
*/
|
|
192
438
|
openModal() {
|
|
439
|
+
// Counts as open from the moment it is requested, so the other buttons are disabled while
|
|
440
|
+
// this importer is still loading, and so it is stacked above any importer opened earlier.
|
|
441
|
+
registerOpenImporter(this.registryEntry);
|
|
193
442
|
if (!this.iframe) {
|
|
194
443
|
this.openModalOnIframeLoad = true;
|
|
195
444
|
this.initImporter();
|
|
@@ -197,11 +446,36 @@ export class CSVBoxButtonComponent {
|
|
|
197
446
|
}
|
|
198
447
|
if (!this.isModalShown) {
|
|
199
448
|
if (this.isIframeLoaded) {
|
|
200
|
-
this.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
449
|
+
if (this.pendingFile) {
|
|
450
|
+
// The importer opens its own modal once it has the file, so that it can inject on
|
|
451
|
+
// 'shown.bs.modal'. Sending 'openModal' as well would race that.
|
|
452
|
+
//
|
|
453
|
+
// It can also decline: wrong step, an import file URL configured on the sheet, or
|
|
454
|
+
// an importer too old to know the message at all. So the holder goes up
|
|
455
|
+
// click-through and stays that way until 'csvbox-modal-shown' confirms the modal
|
|
456
|
+
// is really up. It covers the viewport at z-index 2147483647 and the importer
|
|
457
|
+
// renders transparent with its modal closed, so arming it on an unanswered message
|
|
458
|
+
// leaves an invisible sheet over the host page eating every click.
|
|
459
|
+
//
|
|
460
|
+
// display:block regardless, so the iframe lays out and animates normally; only
|
|
461
|
+
// pointer-events is held back. isModalShown likewise waits for the confirmation,
|
|
462
|
+
// or a declined file would latch the importer shut for good.
|
|
463
|
+
if (this.holder) {
|
|
464
|
+
this.holder.style.pointerEvents = 'none';
|
|
465
|
+
this.holder.style.display = 'block';
|
|
466
|
+
}
|
|
467
|
+
this.fileSender.send();
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
this.isModalShown = true;
|
|
471
|
+
if (this.holder) {
|
|
472
|
+
// Explicit: a previously declined file leaves the holder click-through.
|
|
473
|
+
this.holder.style.pointerEvents = 'auto';
|
|
474
|
+
this.holder.style.display = 'block';
|
|
475
|
+
}
|
|
476
|
+
if (this.iframe && this.iframe.contentWindow) {
|
|
477
|
+
this.iframe.contentWindow.postMessage('openModal', '*');
|
|
478
|
+
}
|
|
205
479
|
}
|
|
206
480
|
}
|
|
207
481
|
else {
|
|
@@ -209,13 +483,118 @@ export class CSVBoxButtonComponent {
|
|
|
209
483
|
}
|
|
210
484
|
}
|
|
211
485
|
}
|
|
486
|
+
/**
|
|
487
|
+
* Open the importer on a File the host page already has, instead of the file picker.
|
|
488
|
+
*
|
|
489
|
+
* Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
|
|
490
|
+
* or `\@ViewChild(CSVBoxButtonComponent)`.
|
|
491
|
+
*
|
|
492
|
+
* The File crosses to the iframe by structured clone, so the importer receives the real
|
|
493
|
+
* object and applies its own extension, worksheet and size rules to it -- this does not
|
|
494
|
+
* bypass any of them. Pass a File; a Blob has no name for the importer to read an
|
|
495
|
+
* extension from.
|
|
496
|
+
* @param {?} file
|
|
497
|
+
* @return {?}
|
|
498
|
+
*/
|
|
499
|
+
openModalWithFile(file) {
|
|
500
|
+
if (typeof File === 'undefined' || !(file instanceof File)) {
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
this.pendingFile = file;
|
|
504
|
+
// Already open: hand it over now rather than holding it for the next open. The importer
|
|
505
|
+
// takes it only while it is still on the upload step, and ignores it once the user has a
|
|
506
|
+
// dataset and a mapping in progress.
|
|
507
|
+
if (this.isModalShown && this.iframe && this.isIframeLoaded) {
|
|
508
|
+
this.fileSender.send();
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
this.openModal();
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* @return {?}
|
|
515
|
+
*/
|
|
516
|
+
clearProbeTimer() {
|
|
517
|
+
this.clearFileAckTimer();
|
|
518
|
+
this.fileSender.reset();
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* @return {?}
|
|
522
|
+
*/
|
|
523
|
+
startFileAckTimer() {
|
|
524
|
+
this.clearFileAckTimer();
|
|
525
|
+
this.fileAckTimer = setTimeout((/**
|
|
526
|
+
* @return {?}
|
|
527
|
+
*/
|
|
528
|
+
() => {
|
|
529
|
+
this.fileAckTimer = null;
|
|
530
|
+
this.giveUpOnFile();
|
|
531
|
+
}), FILE_ACK_TIMEOUT_MS);
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* @return {?}
|
|
535
|
+
*/
|
|
536
|
+
clearFileAckTimer() {
|
|
537
|
+
if (this.fileAckTimer) {
|
|
538
|
+
clearTimeout(this.fileAckTimer);
|
|
539
|
+
this.fileAckTimer = null;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
// The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
|
|
543
|
+
// old to know the message). Without this the holder would stay up, invisible and click-through,
|
|
544
|
+
// and the other instances' buttons would stay disabled for good.
|
|
545
|
+
/**
|
|
546
|
+
* @return {?}
|
|
547
|
+
*/
|
|
548
|
+
giveUpOnFile() {
|
|
549
|
+
if (this.isModalShown) {
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
/** @type {?} */
|
|
553
|
+
const holder = this.holder;
|
|
554
|
+
if (holder) {
|
|
555
|
+
holder.style.display = 'none';
|
|
556
|
+
holder.style.pointerEvents = 'auto';
|
|
557
|
+
}
|
|
558
|
+
unregisterOpenImporter(this.registryEntry);
|
|
559
|
+
console.warn("[csvbox] the importer did not respond to the supplied file");
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* @private
|
|
563
|
+
* @return {?}
|
|
564
|
+
*/
|
|
565
|
+
syncBlocked() {
|
|
566
|
+
/** @type {?} */
|
|
567
|
+
const blocked = isBlockedByOpenImporter(this.registryEntry);
|
|
568
|
+
if (blocked !== this.blockedByOther) {
|
|
569
|
+
// The registry can call back from outside Angular's zone (another instance, another app).
|
|
570
|
+
this.zone.run((/**
|
|
571
|
+
* @return {?}
|
|
572
|
+
*/
|
|
573
|
+
() => {
|
|
574
|
+
this.blockedByOther = blocked;
|
|
575
|
+
this.cdr.markForCheck();
|
|
576
|
+
}));
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* @return {?}
|
|
581
|
+
*/
|
|
582
|
+
ngOnDestroy() {
|
|
583
|
+
this.clearProbeTimer();
|
|
584
|
+
window.removeEventListener("message", this.messageListener);
|
|
585
|
+
unregisterOpenImporter(this.registryEntry);
|
|
586
|
+
if (this.unsubscribeOpenImporters) {
|
|
587
|
+
this.unsubscribeOpenImporters();
|
|
588
|
+
this.unsubscribeOpenImporters = null;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
212
591
|
}
|
|
213
592
|
CSVBoxButtonComponent.decorators = [
|
|
214
593
|
{ type: Component, args: [{
|
|
215
594
|
selector: 'csvbox-button',
|
|
216
595
|
template: `
|
|
217
596
|
<div>
|
|
218
|
-
<button [disabled]="disabled"
|
|
597
|
+
<button [disabled]="disabled || blockedByOther" (click)="openModal()" [attr.data-csvbox-token]="uuid">
|
|
219
598
|
<ng-content></ng-content>
|
|
220
599
|
</button>
|
|
221
600
|
</div>
|
|
@@ -224,10 +603,11 @@ CSVBoxButtonComponent.decorators = [
|
|
|
224
603
|
];
|
|
225
604
|
/** @nocollapse */
|
|
226
605
|
CSVBoxButtonComponent.ctorParameters = () => [
|
|
227
|
-
{ type: DomSanitizer }
|
|
606
|
+
{ type: DomSanitizer },
|
|
607
|
+
{ type: ChangeDetectorRef },
|
|
608
|
+
{ type: NgZone }
|
|
228
609
|
];
|
|
229
610
|
CSVBoxButtonComponent.propDecorators = {
|
|
230
|
-
initiator: [{ type: ViewChild, args: ['initiator', { static: false },] }],
|
|
231
611
|
onImport: [{ type: Input }],
|
|
232
612
|
onReady: [{ type: Input }],
|
|
233
613
|
onClose: [{ type: Input }],
|
|
@@ -260,8 +640,6 @@ if (false) {
|
|
|
260
640
|
/** @type {?} */
|
|
261
641
|
CSVBoxButtonComponent.prototype.isModalShown;
|
|
262
642
|
/** @type {?} */
|
|
263
|
-
CSVBoxButtonComponent.prototype.initiator;
|
|
264
|
-
/** @type {?} */
|
|
265
643
|
CSVBoxButtonComponent.prototype.onImport;
|
|
266
644
|
/** @type {?} */
|
|
267
645
|
CSVBoxButtonComponent.prototype.onReady;
|
|
@@ -320,8 +698,51 @@ if (false) {
|
|
|
320
698
|
/** @type {?} */
|
|
321
699
|
CSVBoxButtonComponent.prototype.disabled;
|
|
322
700
|
/** @type {?} */
|
|
701
|
+
CSVBoxButtonComponent.prototype.blockedByOther;
|
|
702
|
+
/**
|
|
703
|
+
* @type {?}
|
|
704
|
+
* @private
|
|
705
|
+
*/
|
|
706
|
+
CSVBoxButtonComponent.prototype.registryEntry;
|
|
707
|
+
/**
|
|
708
|
+
* @type {?}
|
|
709
|
+
* @private
|
|
710
|
+
*/
|
|
711
|
+
CSVBoxButtonComponent.prototype.fileSender;
|
|
712
|
+
/**
|
|
713
|
+
* @type {?}
|
|
714
|
+
* @private
|
|
715
|
+
*/
|
|
716
|
+
CSVBoxButtonComponent.prototype.unsubscribeOpenImporters;
|
|
717
|
+
/** @type {?} */
|
|
323
718
|
CSVBoxButtonComponent.prototype.holder;
|
|
324
719
|
/** @type {?} */
|
|
720
|
+
CSVBoxButtonComponent.prototype.pendingFile;
|
|
721
|
+
/** @type {?} */
|
|
722
|
+
CSVBoxButtonComponent.prototype.targetOrigin;
|
|
723
|
+
/** @type {?} */
|
|
724
|
+
CSVBoxButtonComponent.prototype.baseDomain;
|
|
725
|
+
/**
|
|
726
|
+
* @type {?}
|
|
727
|
+
* @private
|
|
728
|
+
*/
|
|
729
|
+
CSVBoxButtonComponent.prototype.fileAckTimer;
|
|
730
|
+
/**
|
|
731
|
+
* @type {?}
|
|
732
|
+
* @private
|
|
733
|
+
*/
|
|
734
|
+
CSVBoxButtonComponent.prototype.messageListener;
|
|
735
|
+
/** @type {?} */
|
|
325
736
|
CSVBoxButtonComponent.prototype.sanitizer;
|
|
737
|
+
/**
|
|
738
|
+
* @type {?}
|
|
739
|
+
* @private
|
|
740
|
+
*/
|
|
741
|
+
CSVBoxButtonComponent.prototype.cdr;
|
|
742
|
+
/**
|
|
743
|
+
* @type {?}
|
|
744
|
+
* @private
|
|
745
|
+
*/
|
|
746
|
+
CSVBoxButtonComponent.prototype.zone;
|
|
326
747
|
}
|
|
327
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O01BRWpILFVBQVUsR0FBRyxRQUFRO0FBYTNCLE1BQU0sT0FBTyxxQkFBcUI7Ozs7SUE0Q2hDLFlBQW1CLFNBQXNCO1FBQXRCLGNBQVMsR0FBVCxTQUFTLENBQWE7UUExQ3pDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBcUJaLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBRWpDLFNBQUksR0FBa0IsSUFBSSxDQUFDO1FBQzNCLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFHL0IsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFFNUIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBRXZDLFNBQUksR0FBWSxLQUFLLENBQUM7UUFJL0IsV0FBTSxHQUE2QixJQUFJLENBQUM7UUFFL0IsYUFBUSxHQUFZLElBQUksQ0FBQztJQUVVLENBQUM7Ozs7SUFJN0MsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7O1lBQ3ZCLFNBQVMsR0FBRyxj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SUFFaEMsOENBQWtDOztJQUNsQyx1Q0FBMkI7O0lBQzNCLDBDQUE4Qjs7SUFDOUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLHFDQUF1Qjs7SUFDdkIsK0NBQWlDOztJQUNqQywyQ0FBMEM7O0lBQzFDLHdDQUEwQjs7SUFDMUIscUNBQW9DOztJQUNwQyw2Q0FBNEM7O0lBQzVDLDZDQUE0Qzs7SUFDNUMseUNBQXdDOztJQUN4Qyw0Q0FBOEI7O0lBRTlCLHNDQUFxQzs7SUFFckMsK0NBQXlDOztJQUN6QyxzREFBZ0Q7O0lBRWhELHFDQUErQjs7SUFFL0Isd0NBQWE7O0lBRWIsdUNBQXdDOztJQUV4Qyx5Q0FBa0M7O0lBSWxDLHVDQUFZOztJQUZBLDBDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgQWZ0ZXJDb250ZW50SW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBpbnNlcnRDU1MgfSBmcm9tICcuLi91dGxpcy9pbnNlcnRDU1MnO1xuaW1wb3J0IHsgYnVpbGRJbXBvcnRVcmwsIGdlbmVyYXRlVXVpZCwgYnVpbGRJbml0UGF5bG9hZCwgY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuY29uc3QgYXBwVmVyc2lvbiA9ICcxLjEuMTYnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjc3Zib3gtYnV0dG9uJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAjaW5pdGlhdG9yIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5cbmV4cG9ydCBjbGFzcyBDU1ZCb3hCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgaXNNb2RhbFNob3duID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnaW5pdGlhdG9yJywge3N0YXRpYzogZmFsc2V9KSBpbml0aWF0b3I6IGFueTtcbiAgQElucHV0KCkgb25JbXBvcnQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25SZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvbkNsb3NlPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uU3VibWl0PzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgaXNJbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1JlYWR5PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzQ2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzU3VibWl0dGVkPzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgaW1wb3J0ZXJSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBjbG9zZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgc3VibWl0dGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGltcG9ydGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGxvYWRTdGFydGVkPzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgdXNlcj86IG9iamVjdDtcbiAgQElucHV0KCkgZHluYW1pY0NvbHVtbnM/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGxpY2Vuc2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBvcHRpb25zPzogb2JqZWN0O1xuICBASW5wdXQoKSB1dWlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZGF0YUxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBlbnZpcm9ubWVudD86IG9iamVjdDtcblxuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgaXNJZnJhbWVMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgb3Blbk1vZGFsT25JZnJhbWVMb2FkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbGF6eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNhZmVVcmw6IGFueTtcblxuICBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzYW5pdGl6ZXI6RG9tU2FuaXRpemVyKSB7fVxuXG4gIGhvbGRlcjogYW55O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgIGxldCBpZnJhbWVVcmwgPSBidWlsZEltcG9ydFVybChcbiAgICAgIHtcbiAgICAgICAgbGljZW5zZUtleTogdGhpcy5saWNlbnNlS2V5LFxuICAgICAgICBjdXN0b21Eb21haW46IHRoaXMuY3VzdG9tRG9tYWluLFxuICAgICAgICBkYXRhTG9jYXRpb246IHRoaXMuZGF0YUxvY2F0aW9uLFxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50XG4gICAgICB9LFxuICAgICAgXCJhbmd1bGFyXCIsXG4gICAgICBhcHBWZXJzaW9uXG4gICAgKTtcbiAgICB0aGlzLnNhZmVVcmwgPSB0aGlzLnNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMLCB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoaWZyYW1lVXJsKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYoY2hhbmdlc1tcInVzZXJcIl0gJiYgY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzWyd1c2VyJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyVmFyaWFiZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVVc2VyVmFyaWFiZShkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXIgPSBkYXRhO1xuICAgIGlmICh0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgXCJjdXN0b21lclwiIDogZGF0YVxuICAgICAgfSwgXCIqXCIpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGV2ZW50KSA9PiB7XG4gICAgICBsZXQgbWVzc2FnZSA9IGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UoZXZlbnQuZGF0YSwgdGhpcy51dWlkISk7XG4gICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtb24tc3VibWl0XCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmlzU3VibWl0dGVkKSB0aGlzLmlzU3VibWl0dGVkKG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5zdWJtaXR0ZWQpIHRoaXMuc3VibWl0dGVkKG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5zdWNjZXNzKSB7XG4gICAgICAgICAgZGVsZXRlIG1lc3NhZ2UubWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQobWVzc2FnZS5zdWNjZXNzLCBtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjc3Zib3gtbW9kYWwtaGlkZGVuXCIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlKTtcbiAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjc3Zib3gtdXBsb2FkLWZhaWxlZFwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChmYWxzZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTtcblxuICAgIGlmKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW9kYWxDbG9zZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuaXNNb2RhbFNob3duID0gZmFsc2U7XG4gICAgdGhpcy5pc0lmcmFtZUxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5yZW1vdmUoKTtcbiAgICB0aGlzLmhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5pZnJhbWUgPSBudWxsO1xuICAgIGlmICh0aGlzLm9uQ2xvc2UpIHRoaXMub25DbG9zZSgpO1xuICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB0aGlzLmlzQ2xvc2VkKCk7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB0aGlzLmNsb3NlZCgpO1xuICB9XG5cbiAgaW5pdEltcG9ydGVyKCkge1xuICAgIGlmICh0aGlzLmxvYWRTdGFydGVkKSB0aGlzLmxvYWRTdGFydGVkKCk7XG5cbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcblxuICAgIGluc2VydENTUygpO1xuXG4gICAgbGV0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLCB0aGlzLnNhZmVVcmwpO1xuICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xuXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc2VsZi5vblJlYWR5KSBzZWxmLm9uUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmlzUmVhZHkpIHNlbGYuaXNSZWFkeSgpO1xuICAgICAgaWYgKHNlbGYuaW1wb3J0ZXJSZWFkeSkgc2VsZi5pbXBvcnRlclJlYWR5KCk7XG5cbiAgICAgIHNlbGYuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuaXNJZnJhbWVMb2FkZWQgPSB0cnVlO1xuICAgICAgaWYgKHNlbGYuaWZyYW1lICYmIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShidWlsZEluaXRQYXlsb2FkKHNlbGYudXNlciwgc2VsZi5keW5hbWljQ29sdW1ucywgc2VsZi5vcHRpb25zLCBzZWxmLnV1aWQhKSwgXCIqXCIpO1xuICAgICAgfVxuICAgICAgaWYoc2VsZi5vcGVuTW9kYWxPbklmcmFtZUxvYWQpIHtcbiAgICAgICAgc2VsZi5vcGVuTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuaG9sZGVyLmNsYXNzTGlzdC5hZGQoJ2NzdmJveC1ob2xkZXInKTtcbiAgICB0aGlzLmhvbGRlci5zZXRBdHRyaWJ1dGUoJ2lkJywgYGNzdmJveC1lbWJlZC0ke3RoaXMudXVpZH1gKTtcbiAgICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXG4gICAgICAnYmVmb3JlZW5kJywgdGhpcy5ob2xkZXJcbiAgICApO1xuICB9XG5cbiAgb3Blbk1vZGFsKCk6IHZvaWQge1xuICAgIGlmKCF0aGlzLmlmcmFtZSkge1xuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICBpZih0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xuICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICBpZih0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xuICAgICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG4iXX0=
|
|
748
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxlQUFlLEVBR2YsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztNQUcxSixtQkFBbUIsR0FBRyxJQUFJOzs7O0FBT2hDLGdDQUFvRTs7O0lBQXRDLHNDQUFvQzs7Ozs7QUFDbEUsNEJBQW9GOzs7SUFBMUQsNkJBQTBCOztJQUFDLGtDQUE2Qjs7O01BQzVFLGtCQUFrQixHQUFHLHVCQUF1Qjs7TUFDNUMsV0FBVyxHQUFHLFVBQVU7Ozs7QUFFOUIsU0FBUyxhQUFhOztVQUNkLENBQUMsR0FBRyxtQkFBQSxNQUFNLEVBQU87SUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEYsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMvQixDQUFDOzs7OztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPOzs7OztJQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFB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QUM3Qix3Q0FBNEI7O0lBQzVCLHdDQUE0Qjs7SUFDNUIseUNBQTZCOztJQUU3QiwyQ0FBK0I7O0lBQy9CLHdDQUE0Qjs7SUFDNUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLDhDQUFrQzs7SUFDbEMsdUNBQTJCOztJQUMzQiwwQ0FBOEI7O0lBQzlCLHlDQUE2Qjs7SUFDN0IsNENBQWdDOztJQUVoQyxxQ0FBdUI7O0lBQ3ZCLCtDQUFpQzs7SUFDakMsMkNBQTBDOztJQUMxQyx3Q0FBMEI7O0lBQzFCLHFDQUFvQzs7SUFDcEMsNkNBQTRDOztJQUM1Qyw2Q0FBNEM7O0lBQzVDLHlDQUF3Qzs7SUFDeEMsNENBQThCOztJQUU5QixzQ0FBcUM7O0lBRXJDLCtDQUF5Qzs7SUFDekMsc0RBQWdEOztJQUVoRCxxQ0FBK0I7O0lBRS9CLHdDQUFhOztJQUViLHVDQUF3Qzs7SUFFeEMseUNBQWtDOztJQUtsQywrQ0FBZ0M7Ozs7O0lBRWhDLDhDQUE0RTs7Ozs7SUFFNUUsMkNBV0c7Ozs7O0lBRUgseURBQTZEOztJQUU3RCx1Q0FBWTs7SUFFWiw0Q0FBZ0M7O0lBRWhDLDZDQUFpQzs7SUFJakMsMkNBQXFDOzs7OztJQUVyQyw2Q0FBaUM7Ozs7O0lBcUNqQyxnREF3RkU7O0lBN0pVLDBDQUE2Qjs7Ozs7SUFBRSxvQ0FBOEI7Ozs7O0lBQUUscUNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGluc2VydENTUyB9IGZyb20gJy4uL3V0bGlzL2luc2VydENTUyc7XG5pbXBvcnQgeyBidWlsZEltcG9ydFVybCwgZ2VuZXJhdGVVdWlkLCBidWlsZEluaXRQYXlsb2FkLCBjcmVhdGVGaWxlU2VuZGVyLCBjbGFzc2lmeVN0cnVjdHVyZWRNZXNzYWdlLCBjbGFzc2lmeUxlZ2FjeU1lc3NhZ2UgfSBmcm9tICdAc3VtaXRfeWV3YWxlL2FkYXB0ZXItY29yZSc7XG5cbi8vIEhvdyBsb25nIHdlIHdhaXQgZm9yIHRoZSBpbXBvcnRlciB0byBjb25maXJtIGEgZmlsZSBpdCB3YXMgc2VudCBiZWZvcmUgZ2l2aW5nIHVwIG9uIGl0LlxuY29uc3QgRklMRV9BQ0tfVElNRU9VVF9NUyA9IDgwMDA7XG5cbi8vIFBhZ2Utd2lkZSByZWNvcmQgb2YgdGhlIGltcG9ydGVycyB0aGF0IGFyZSBvcGVuIG9yIG9wZW5pbmcsIHNoYXJlZCBieSBldmVyeSBDU1ZCb3ggYWRhcHRlclxuLy8gb24gdGhlIHBhZ2UgKGl0IGxpdmVzIG9uIHdpbmRvdyBzbyBzZXBhcmF0ZSBjb3BpZXMgb2YgYW4gYWRhcHRlciBzZWUgdGhlIHNhbWUgbGlzdCkuIEl0IGRvZXNcbi8vIHR3byB0aGluZ3M6IHRoZSBuZXdlc3QgaW1wb3J0ZXIgaXMgc3RhY2tlZCBvbiB0b3AgKGV2ZXJ5IGhvbGRlciBpcyBmaXhlZCwgZnVsbCBzY3JlZW4gYW5kXG4vLyB6LWluZGV4IDIxNDc0ODM2NDcsIHNvIGVxdWFsIHotaW5kZXhlcyB3b3VsZCBsZWF2ZSB0aGUgb25lIHRoYXQgY29tZXMgZmlyc3QgaW4gdGhlIERPTSBvblxuLy8gdG9wKSwgYW5kIHRoZSBvdGhlciBpbnN0YW5jZXMgbGVhcm4gdGhhdCBhbiBpbXBvcnRlciBpcyBvcGVuIHNvIHRoZXkgY2FuIGRpc2FibGUgdGhlaXIgYnV0dG9uLlxuaW50ZXJmYWNlIE9wZW5JbXBvcnRlckVudHJ5IHsgZ2V0SG9sZGVyOiAoKSA9PiBIVE1MRWxlbWVudCB8IG51bGw7IH1cbmludGVyZmFjZSBPcGVuSW1wb3J0ZXJzIHsgb3BlbjogT3BlbkltcG9ydGVyRW50cnlbXTsgbGlzdGVuZXJzOiBBcnJheTwoKSA9PiB2b2lkPjsgfVxuY29uc3QgT1BFTl9JTVBPUlRFUlNfS0VZID0gJ19fY3N2Ym94T3BlbkltcG9ydGVycyc7XG5jb25zdCBUT1BfWl9JTkRFWCA9IDIxNDc0ODM2NDc7XG5cbmZ1bmN0aW9uIG9wZW5JbXBvcnRlcnMoKTogT3BlbkltcG9ydGVycyB7XG4gIGNvbnN0IHcgPSB3aW5kb3cgYXMgYW55O1xuICBpZiAoIXdbT1BFTl9JTVBPUlRFUlNfS0VZXSkgd1tPUEVOX0lNUE9SVEVSU19LRVldID0geyBvcGVuOiBbXSwgbGlzdGVuZXJzOiBbXSB9O1xuICByZXR1cm4gd1tPUEVOX0lNUE9SVEVSU19LRVldO1xufVxuXG5mdW5jdGlvbiByZXN0YWNrT3BlbkltcG9ydGVycyhyZWc6IE9wZW5JbXBvcnRlcnMpOiB2b2lkIHtcbiAgcmVnLm9wZW4uZm9yRWFjaCgoZW50cnksIGkpID0+IHtcbiAgICBjb25zdCBob2xkZXIgPSBlbnRyeS5nZXRIb2xkZXIoKTtcbiAgICBpZiAoaG9sZGVyKSBob2xkZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKFRPUF9aX0lOREVYIC0gKHJlZy5vcGVuLmxlbmd0aCAtIDEgLSBpKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3Rlck9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICBpZiAocmVnLm9wZW4uaW5kZXhPZihlbnRyeSkgPj0gMCkgcmV0dXJuO1xuICByZWcub3Blbi5wdXNoKGVudHJ5KTtcbiAgcmVzdGFja09wZW5JbXBvcnRlcnMocmVnKTtcbiAgcmVnLmxpc3RlbmVycy5zbGljZSgpLmZvckVhY2goZm4gPT4gZm4oKSk7XG59XG5cbmZ1bmN0aW9uIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIoZW50cnk6IE9wZW5JbXBvcnRlckVudHJ5KTogdm9pZCB7XG4gIGNvbnN0IHJlZyA9IG9wZW5JbXBvcnRlcnMoKTtcbiAgY29uc3QgaSA9IHJlZy5vcGVuLmluZGV4T2YoZW50cnkpO1xuICBpZiAoaSA8IDApIHJldHVybjtcbiAgcmVnLm9wZW4uc3BsaWNlKGksIDEpO1xuICByZXN0YWNrT3BlbkltcG9ydGVycyhyZWcpO1xuICByZWcubGlzdGVuZXJzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbigpKTtcbn1cblxuZnVuY3Rpb24gaXNCbG9ja2VkQnlPcGVuSW1wb3J0ZXIoZW50cnk6IE9wZW5JbXBvcnRlckVudHJ5KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlZyA9IG9wZW5JbXBvcnRlcnMoKTtcbiAgcmV0dXJuIHJlZy5vcGVuLmxlbmd0aCA+IDAgJiYgcmVnLm9wZW4uaW5kZXhPZihlbnRyeSkgPCAwO1xufVxuXG5mdW5jdGlvbiBzdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKGZuOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZyA9IG9wZW5JbXBvcnRlcnMoKTtcbiAgcmVnLmxpc3RlbmVycy5wdXNoKGZuKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBpID0gcmVnLmxpc3RlbmVycy5pbmRleE9mKGZuKTtcbiAgICBpZiAoaSA+PSAwKSByZWcubGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgfTtcbn1cblxuY29uc3QgYXBwVmVyc2lvbiA9ICcxLjEuMjAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjc3Zib3gtYnV0dG9uJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgYmxvY2tlZEJ5T3RoZXJcIiAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgXG59KVxuXG5leHBvcnQgY2xhc3MgQ1NWQm94QnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgaXNNb2RhbFNob3duID0gZmFsc2U7XG5cbiAgQElucHV0KCkgb25JbXBvcnQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25SZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvbkNsb3NlPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uU3VibWl0PzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgaXNJbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1JlYWR5PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzQ2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzU3VibWl0dGVkPzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgaW1wb3J0ZXJSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBjbG9zZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgc3VibWl0dGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGltcG9ydGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGxvYWRTdGFydGVkPzogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgdXNlcj86IG9iamVjdDtcbiAgQElucHV0KCkgZHluYW1pY0NvbHVtbnM/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGxpY2Vuc2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBvcHRpb25zPzogb2JqZWN0O1xuICBASW5wdXQoKSB1dWlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZGF0YUxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBlbnZpcm9ubWVudD86IG9iamVjdDtcblxuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgaXNJZnJhbWVMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgb3Blbk1vZGFsT25JZnJhbWVMb2FkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbGF6eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNhZmVVcmw6IGFueTtcblxuICBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzYW5pdGl6ZXI6RG9tU2FuaXRpemVyLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgem9uZTogTmdab25lKSB7fVxuXG4gIC8vIFRydWUgd2hpbGUgYSBkaWZmZXJlbnQgaW1wb3J0ZXIgb24gdGhlIHBhZ2UgaXMgb3BlbjogdGhlIGJ1dHRvbiBzdGF5cyBkaXNhYmxlZC5cbiAgYmxvY2tlZEJ5T3RoZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlZ2lzdHJ5RW50cnk6IE9wZW5JbXBvcnRlckVudHJ5ID0geyBnZXRIb2xkZXI6ICgpID0+IHRoaXMuaG9sZGVyIH07XG5cbiAgcHJpdmF0ZSBmaWxlU2VuZGVyID0gY3JlYXRlRmlsZVNlbmRlcih7XG4gICAgZ2V0SWZyYW1lOiAoKSA9PiB0aGlzLmlmcmFtZSxcbiAgICBnZXRUb2tlbjogKCkgPT4gdGhpcy51dWlkIGFzIHN0cmluZyxcbiAgICBnZXRUYXJnZXRPcmlnaW46ICgpID0+IHRoaXMudGFyZ2V0T3JpZ2luIGFzIHN0cmluZyxcbiAgICBnZXRCYXNlRG9tYWluOiAoKSA9PiB0aGlzLmJhc2VEb21haW4sXG4gICAgdGFrZUZpbGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnBlbmRpbmdGaWxlO1xuICAgICAgdGhpcy5wZW5kaW5nRmlsZSA9IG51bGw7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9LFxuICAgIG9uU2VudDogKCkgPT4gdGhpcy5zdGFydEZpbGVBY2tUaW1lcigpXG4gIH0pO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBob2xkZXI6IGFueTtcblxuICBwZW5kaW5nRmlsZTogRmlsZSB8IG51bGwgPSBudWxsO1xuXG4gIHRhcmdldE9yaWdpbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIERhdGEtbG9jYXRpb24gc2hlZXRzIHJlZGlyZWN0IHRvIGFub3RoZXIgaG9zdCwgc28gdGhlIGlmcmFtZSBvcmlnaW4gY2FuIGRpZmZlciBmcm9tXG4gIC8vIHRhcmdldE9yaWdpbi4gYmFzZURvbWFpbiBpcyB1c2VkIHRvIGNoZWNrIHRoZSByZWFsIG9yaWdpbiBiZWZvcmUgdHJ1c3RpbmcgaXQuXG4gIGJhc2VEb21haW46IHN0cmluZyA9IFwiYXBwLmNzdmJveC5pb1wiO1xuXG4gIHByaXZhdGUgZmlsZUFja1RpbWVyOiBhbnkgPSBudWxsO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgIGxldCBpZnJhbWVVcmwgPSBidWlsZEltcG9ydFVybChcbiAgICAgIHtcbiAgICAgICAgbGljZW5zZUtleTogdGhpcy5saWNlbnNlS2V5LFxuICAgICAgICBjdXN0b21Eb21haW46IHRoaXMuY3VzdG9tRG9tYWluLFxuICAgICAgICBkYXRhTG9jYXRpb246IHRoaXMuZGF0YUxvY2F0aW9uLFxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50XG4gICAgICB9LFxuICAgICAgXCJhbmd1bGFyXCIsXG4gICAgICBhcHBWZXJzaW9uXG4gICAgKTtcbiAgICAvLyBEZWZhdWx0IHBsYWNlIHRvIHNlbmQgdGhlIGZpbGUuIEEgZmlsZSBpcyBvbmx5IGV2ZXIgc2VudCB0byBhIG5hbWVkIG9yaWdpbiwgbmV2ZXIgXCIqXCIuXG4gICAgdGhpcy50YXJnZXRPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVVybCkub3JpZ2luO1xuICAgIHRoaXMuYmFzZURvbWFpbiA9IHRoaXMuY3VzdG9tRG9tYWluIHx8IFwiYXBwLmNzdmJveC5pb1wiO1xuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZihjaGFuZ2VzW1widXNlclwiXSAmJiBjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlICE9IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJlKGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVVzZXJWYXJpYWJlKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCIgOiBkYXRhXG4gICAgICB9LCBcIipcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXNzYWdlTGlzdGVuZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIC8vIE9sZGVyIGltcG9ydGVycyBzZW5kIHRoZXNlIGFzIGJhcmUgc3RyaW5ncywgd2l0aG91dCBhIHRva2VuLlxuICAgIGNvbnN0IGxlZ2FjeSA9IGNsYXNzaWZ5TGVnYWN5TWVzc2FnZShldmVudC5kYXRhKTtcbiAgICBpZiAobGVnYWN5KSB7XG4gICAgICAvLyBMZWdhY3kgbWVzc2FnZXMgY2Fycnkgbm8gdG9rZW4sIHNvIHRoZSBvbmx5IHdheSB0byB0ZWxsIHdoaWNoIGltcG9ydGVyIHNlbnQgb25lIGlzIGl0c1xuICAgICAgLy8gd2luZG93LiBJZ25vcmUgdGhvc2UgdGhhdCBjYW1lIGZyb20gYW5vdGhlciBpbnN0YW5jZSdzIGlmcmFtZSAob3IgYW55d2hlcmUgZWxzZSkuXG4gICAgICBpZiAoIXRoaXMuaWZyYW1lIHx8IGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobGVnYWN5LnR5cGUgPT09IFwibWFpbk1vZGFsSGlkZGVuXCIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgICAgfSBlbHNlIGlmIChsZWdhY3kudHlwZSA9PT0gXCJ1cGxvYWRTdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2FjeS50eXBlID09PSBcInVwbG9hZEZhaWxlZFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldC1maWxlIGhhbmRzaGFrZSBtZXNzYWdlcy4gVGhlIHNoYXJlZCBjb3JlIGRvZXMgbm90IGNsYXNzaWZ5IHRoZXNlLCBzbyB0aGV5IGFyZVxuICAgIC8vIHJlYWQgaGVyZSwgYmVoaW5kIHRoZSBzYW1lIHVuaXF1ZV90b2tlbiBjaGVjayB0aGUgY29yZSBhcHBsaWVzLlxuICAgIGNvbnN0IHJhdyA9IGV2ZW50LmRhdGE7XG4gICAgaWYgKHJhdyAmJiB0eXBlb2YgcmF3ID09PSBcIm9iamVjdFwiICYmIHJhdy5kYXRhICYmIHJhdy5kYXRhLnVuaXF1ZV90b2tlbiA9PSB0aGlzLnV1aWQpIHtcbiAgICAgIHRoaXMuZmlsZVNlbmRlci5sZWFybk9yaWdpbihldmVudCk7XG5cbiAgICAgIGlmIChyYXcudHlwZSA9PT0gXCJjc3Zib3gtc2V0LWZpbGUtcmVqZWN0ZWRcIiAmJiByYXcuZGF0YS5yZWFzb24gPT09IFwibm90LWEtZmlsZVwiKSB7XG4gICAgICAgIC8vIFJlcGx5IHRvIG91ciBwcm9iZSAoaXQgaGFzIG5vIGZpbGUpLiBJdCBvbmx5IHRlbGxzIHVzIHRoZSBvcmlnaW4sIHNvIGRvIG5vdGhpbmcuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcudHlwZSA9PT0gXCJjc3Zib3gtbW9kYWwtc2hvd25cIikge1xuICAgICAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgICAgIHJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgICAgIC8vIFdoYXQgdGhlIGZpbGUgcGF0aCBpbiBvcGVuTW9kYWwoKSBpcyB3YWl0aW5nIGZvci4gZGlzcGxheSBhcyB3ZWxsIGFzXG4gICAgICAgIC8vIHBvaW50ZXItZXZlbnRzOiBhIHNlY29uZCBmaWxlIGRlY2xpbmVkIHdoaWxlIHRoZSBmaXJzdCB3YXMgc3RpbGwgb3BlbmluZyB0aGVcbiAgICAgICAgLy8gbW9kYWwgaGFzIHB1dCB0aGUgaG9sZGVyIGF3YXkgaW4gdGhlIG1lYW50aW1lLlxuICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1zZXQtZmlsZS1yZWplY3RlZFwiKSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWxlQWNrVGltZXIoKTtcbiAgICAgICAgLy8gVGhlIGltcG9ydGVyIGhhcyB0aGUgZmlsZSBhbmQgd2lsbCBub3QgdGFrZSBpdC4gUHV0IHRoZSBob2xkZXIgYXdheSBvbmx5IGlmIHRoZVxuICAgICAgICAvLyBtb2RhbCB3YXMgbmV2ZXIgY29uZmlybWVkIHVwOiBhIGZpbGUgZGVjbGluZWQgd2hpbGUgaXQgaXMgb3BlbiBsZWF2ZXMgdGhhdCBtb2RhbFxuICAgICAgICAvLyB3aGVyZSBpdCBpcywgYW5kIGl0cyBvd24gJ2NzdmJveC1tb2RhbC1oaWRkZW4nIHdpbGwgcHV0IHRoZSBob2xkZXIgYXdheS5cbiAgICAgICAgaWYgKCF0aGlzLmlzTW9kYWxTaG93biAmJiB0aGlzLmhvbGRlcikge1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKFwiW2NzdmJveF0gaW1wb3J0ZXIgZGVjbGluZWQgdGhlIHN1cHBsaWVkIGZpbGU6IFwiICsgcmF3LmRhdGEucmVhc29uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBtZXNzYWdlID0gY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZShldmVudC5kYXRhLCB0aGlzLnV1aWQhKTtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtb24tc3VibWl0XCIpIHtcbiAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgaWYgKHRoaXMuaXNTdWJtaXR0ZWQpIHRoaXMuaXNTdWJtaXR0ZWQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5zdWJtaXR0ZWQpIHRoaXMuc3VibWl0dGVkKG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtcHVzaC1zdGF0dXNcIikge1xuICAgICAgaWYgKCFtZXNzYWdlLnN1Y2Nlc3MpIHtcbiAgICAgICAgZGVsZXRlIG1lc3NhZ2UubWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC1tb2RhbC1oaWRkZW5cIikge1xuICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtc3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtZmFpbGVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5tZXNzYWdlTGlzdGVuZXIsIGZhbHNlKTtcbiAgICB0aGlzLnN5bmNCbG9ja2VkKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMgPSBzdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKCgpID0+IHRoaXMuc3luY0Jsb2NrZWQoKSk7XG5cbiAgICBpZih0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHRoaXMuaXNNb2RhbFNob3duID0gZmFsc2U7XG4gICAgdGhpcy5pc0lmcmFtZUxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5yZW1vdmUoKTtcbiAgICB0aGlzLmhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5pZnJhbWUgPSBudWxsO1xuICAgIC8vIEEgbmV3IGlmcmFtZSBpcyBidWlsdCBvbiB0aGUgbmV4dCBvcGVuLCBzbyB0aGUgb3JpZ2luIGlzIGxlYXJuZWQgYWdhaW4uXG4gICAgdGhpcy5jbGVhclByb2JlVGltZXIoKTtcbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKHRoaXMub25DbG9zZSkgdGhpcy5vbkNsb3NlKCk7XG4gICAgaWYgKHRoaXMuaXNDbG9zZWQpIHRoaXMuaXNDbG9zZWQoKTtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHRoaXMuY2xvc2VkKCk7XG4gIH1cblxuICBpbml0SW1wb3J0ZXIoKSB7XG4gICAgaWYgKHRoaXMubG9hZFN0YXJ0ZWQpIHRoaXMubG9hZFN0YXJ0ZWQoKTtcblxuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuXG4gICAgaW5zZXJ0Q1NTKCk7XG5cbiAgICBsZXQgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICB0aGlzLmlmcmFtZSA9IGlmcmFtZTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHRoaXMuc2FmZVVybCk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZShcImFsbG93XCIsIFwiY2xpcGJvYXJkLXJlYWQ7IGNsaXBib2FyZC13cml0ZSAqXCIpO1xuICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xuXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc2VsZi5vblJlYWR5KSBzZWxmLm9uUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmlzUmVhZHkpIHNlbGYuaXNSZWFkeSgpO1xuICAgICAgaWYgKHNlbGYuaW1wb3J0ZXJSZWFkeSkgc2VsZi5pbXBvcnRlclJlYWR5KCk7XG5cbiAgICAgIHNlbGYuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuaXNJZnJhbWVMb2FkZWQgPSB0cnVlO1xuICAgICAgaWYgKHNlbGYuaWZyYW1lICYmIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShidWlsZEluaXRQYXlsb2FkKHNlbGYudXNlciwgc2VsZi5keW5hbWljQ29sdW1ucywgc2VsZi5vcHRpb25zLCBzZWxmLnV1aWQhKSwgXCIqXCIpO1xuICAgICAgfVxuICAgICAgaWYoc2VsZi5vcGVuTW9kYWxPbklmcmFtZUxvYWQpIHtcbiAgICAgICAgc2VsZi5vcGVuTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuaG9sZGVyLmNsYXNzTGlzdC5hZGQoJ2NzdmJveC1ob2xkZXInKTtcbiAgICB0aGlzLmhvbGRlci5zZXRBdHRyaWJ1dGUoJ2lkJywgYGNzdmJveC1lbWJlZC0ke3RoaXMudXVpZH1gKTtcbiAgICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXG4gICAgICAnYmVmb3JlZW5kJywgdGhpcy5ob2xkZXJcbiAgICApO1xuICAgIC8vIFRoZSBob2xkZXIgZGlkIG5vdCBleGlzdCB5ZXQgaWYgb3Blbk1vZGFsKCkgYXNrZWQgZm9yIHRoZSBpbXBvcnRlciBiZWZvcmUgaXQgd2FzIGJ1aWx0LlxuICAgIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKG9wZW5JbXBvcnRlcnMoKSk7XG4gIH1cblxuICBvcGVuTW9kYWwoKTogdm9pZCB7XG4gICAgLy8gQ291bnRzIGFzIG9wZW4gZnJvbSB0aGUgbW9tZW50IGl0IGlzIHJlcXVlc3RlZCwgc28gdGhlIG90aGVyIGJ1dHRvbnMgYXJlIGRpc2FibGVkIHdoaWxlXG4gICAgLy8gdGhpcyBpbXBvcnRlciBpcyBzdGlsbCBsb2FkaW5nLCBhbmQgc28gaXQgaXMgc3RhY2tlZCBhYm92ZSBhbnkgaW1wb3J0ZXIgb3BlbmVkIGVhcmxpZXIuXG4gICAgcmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZighdGhpcy5pZnJhbWUpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKCF0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgaWYodGhpcy5pc0lmcmFtZUxvYWRlZCkge1xuICAgICAgICBpZih0aGlzLnBlbmRpbmdGaWxlKSB7XG4gICAgICAgICAgLy8gVGhlIGltcG9ydGVyIG9wZW5zIGl0cyBvd24gbW9kYWwgb25jZSBpdCBoYXMgdGhlIGZpbGUsIHNvIHRoYXQgaXQgY2FuIGluamVjdCBvblxuICAgICAgICAgIC8vICdzaG93bi5icy5tb2RhbCcuIFNlbmRpbmcgJ29wZW5Nb2RhbCcgYXMgd2VsbCB3b3VsZCByYWNlIHRoYXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJdCBjYW4gYWxzbyBkZWNsaW5lOiB3cm9uZyBzdGVwLCBhbiBpbXBvcnQgZmlsZSBVUkwgY29uZmlndXJlZCBvbiB0aGUgc2hlZXQsIG9yXG4gICAgICAgICAgLy8gYW4gaW1wb3J0ZXIgdG9vIG9sZCB0byBrbm93IHRoZSBtZXNzYWdlIGF0IGFsbC4gU28gdGhlIGhvbGRlciBnb2VzIHVwXG4gICAgICAgICAgLy8gY2xpY2stdGhyb3VnaCBhbmQgc3RheXMgdGhhdCB3YXkgdW50aWwgJ2NzdmJveC1tb2RhbC1zaG93bicgY29uZmlybXMgdGhlIG1vZGFsXG4gICAgICAgICAgLy8gaXMgcmVhbGx5IHVwLiBJdCBjb3ZlcnMgdGhlIHZpZXdwb3J0IGF0IHotaW5kZXggMjE0NzQ4MzY0NyBhbmQgdGhlIGltcG9ydGVyXG4gICAgICAgICAgLy8gcmVuZGVycyB0cmFuc3BhcmVudCB3aXRoIGl0cyBtb2RhbCBjbG9zZWQsIHNvIGFybWluZyBpdCBvbiBhbiB1bmFuc3dlcmVkIG1lc3NhZ2VcbiAgICAgICAgICAvLyBsZWF2ZXMgYW4gaW52aXNpYmxlIHNoZWV0IG92ZXIgdGhlIGhvc3QgcGFnZSBlYXRpbmcgZXZlcnkgY2xpY2suXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBkaXNwbGF5OmJsb2NrIHJlZ2FyZGxlc3MsIHNvIHRoZSBpZnJhbWUgbGF5cyBvdXQgYW5kIGFuaW1hdGVzIG5vcm1hbGx5OyBvbmx5XG4gICAgICAgICAgLy8gcG9pbnRlci1ldmVudHMgaXMgaGVsZCBiYWNrLiBpc01vZGFsU2hvd24gbGlrZXdpc2Ugd2FpdHMgZm9yIHRoZSBjb25maXJtYXRpb24sXG4gICAgICAgICAgLy8gb3IgYSBkZWNsaW5lZCBmaWxlIHdvdWxkIGxhdGNoIHRoZSBpbXBvcnRlciBzaHV0IGZvciBnb29kLlxuICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmlsZVNlbmRlci5zZW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xuICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgICAvLyBFeHBsaWNpdDogYSBwcmV2aW91c2x5IGRlY2xpbmVkIGZpbGUgbGVhdmVzIHRoZSBob2xkZXIgY2xpY2stdGhyb3VnaC5cbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBpbXBvcnRlciBvbiBhIEZpbGUgdGhlIGhvc3QgcGFnZSBhbHJlYWR5IGhhcywgaW5zdGVhZCBvZiB0aGUgZmlsZSBwaWNrZXIuXG4gICAqXG4gICAqIFJlYWNoYWJsZSB0aHJvdWdoIGEgdGVtcGxhdGUgcmVmZXJlbmNlIChgI2ltcG9ydGVyYCB0aGVuIGBpbXBvcnRlci5vcGVuTW9kYWxXaXRoRmlsZShmaWxlKWApXG4gICAqIG9yIGBAVmlld0NoaWxkKENTVkJveEJ1dHRvbkNvbXBvbmVudClgLlxuICAgKlxuICAgKiBUaGUgRmlsZSBjcm9zc2VzIHRvIHRoZSBpZnJhbWUgYnkgc3RydWN0dXJlZCBjbG9uZSwgc28gdGhlIGltcG9ydGVyIHJlY2VpdmVzIHRoZSByZWFsXG4gICAqIG9iamVjdCBhbmQgYXBwbGllcyBpdHMgb3duIGV4dGVuc2lvbiwgd29ya3NoZWV0IGFuZCBzaXplIHJ1bGVzIHRvIGl0IC0tIHRoaXMgZG9lcyBub3RcbiAgICogYnlwYXNzIGFueSBvZiB0aGVtLiBQYXNzIGEgRmlsZTsgYSBCbG9iIGhhcyBubyBuYW1lIGZvciB0aGUgaW1wb3J0ZXIgdG8gcmVhZCBhblxuICAgKiBleHRlbnNpb24gZnJvbS5cbiAgICovXG4gIG9wZW5Nb2RhbFdpdGhGaWxlKGZpbGU6IEZpbGUpOiB2b2lkIHtcbiAgICBpZih0eXBlb2YgRmlsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgIShmaWxlIGluc3RhbmNlb2YgRmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdGaWxlID0gZmlsZTtcblxuICAgIC8vIEFscmVhZHkgb3BlbjogaGFuZCBpdCBvdmVyIG5vdyByYXRoZXIgdGhhbiBob2xkaW5nIGl0IGZvciB0aGUgbmV4dCBvcGVuLiBUaGUgaW1wb3J0ZXJcbiAgICAvLyB0YWtlcyBpdCBvbmx5IHdoaWxlIGl0IGlzIHN0aWxsIG9uIHRoZSB1cGxvYWQgc3RlcCwgYW5kIGlnbm9yZXMgaXQgb25jZSB0aGUgdXNlciBoYXMgYVxuICAgIC8vIGRhdGFzZXQgYW5kIGEgbWFwcGluZyBpbiBwcm9ncmVzcy5cbiAgICBpZih0aGlzLmlzTW9kYWxTaG93biAmJiB0aGlzLmlmcmFtZSAmJiB0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICB0aGlzLmZpbGVTZW5kZXIuc2VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3Blbk1vZGFsKCk7XG4gIH1cblxuICBjbGVhclByb2JlVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgIHRoaXMuZmlsZVNlbmRlci5yZXNldCgpO1xuICB9XG5cbiAgc3RhcnRGaWxlQWNrVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgIHRoaXMuZmlsZUFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVBY2tUaW1lciA9IG51bGw7XG4gICAgICB0aGlzLmdpdmVVcE9uRmlsZSgpO1xuICAgIH0sIEZJTEVfQUNLX1RJTUVPVVRfTVMpO1xuICB9XG5cbiAgY2xlYXJGaWxlQWNrVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlsZUFja1RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5maWxlQWNrVGltZXIpO1xuICAgICAgdGhpcy5maWxlQWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBpbXBvcnRlciBuZXZlciBjb25maXJtZWQgdGhlIGZpbGUgaXQgd2FzIHNlbnQgKGFuIG9yaWdpbiB3ZSBkbyBub3QgdHJ1c3QsIG9yIGFuIGltcG9ydGVyIHRvb1xuICAvLyBvbGQgdG8ga25vdyB0aGUgbWVzc2FnZSkuIFdpdGhvdXQgdGhpcyB0aGUgaG9sZGVyIHdvdWxkIHN0YXkgdXAsIGludmlzaWJsZSBhbmQgY2xpY2stdGhyb3VnaCxcbiAgLy8gYW5kIHRoZSBvdGhlciBpbnN0YW5jZXMnIGJ1dHRvbnMgd291bGQgc3RheSBkaXNhYmxlZCBmb3IgZ29vZC5cbiAgZ2l2ZVVwT25GaWxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBob2xkZXIgPSB0aGlzLmhvbGRlcjtcbiAgICBpZiAoaG9sZGVyKSB7XG4gICAgICBob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgY29uc29sZS53YXJuKFwiW2NzdmJveF0gdGhlIGltcG9ydGVyIGRpZCBub3QgcmVzcG9uZCB0byB0aGUgc3VwcGxpZWQgZmlsZVwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY0Jsb2NrZWQoKTogdm9pZCB7XG4gICAgY29uc3QgYmxvY2tlZCA9IGlzQmxvY2tlZEJ5T3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKGJsb2NrZWQgIT09IHRoaXMuYmxvY2tlZEJ5T3RoZXIpIHtcbiAgICAgIC8vIFRoZSByZWdpc3RyeSBjYW4gY2FsbCBiYWNrIGZyb20gb3V0c2lkZSBBbmd1bGFyJ3Mgem9uZSAoYW5vdGhlciBpbnN0YW5jZSwgYW5vdGhlciBhcHApLlxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuYmxvY2tlZEJ5T3RoZXIgPSBibG9ja2VkO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQcm9iZVRpbWVyKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyKTtcbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycygpO1xuICAgICAgdGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIl19
|