@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,15 +3,133 @@
|
|
|
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
|
-
var
|
|
12
|
+
var 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
|
+
var OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';
|
|
33
|
+
/** @type {?} */
|
|
34
|
+
var TOP_Z_INDEX = 2147483647;
|
|
35
|
+
/**
|
|
36
|
+
* @return {?}
|
|
37
|
+
*/
|
|
38
|
+
function openImporters() {
|
|
39
|
+
/** @type {?} */
|
|
40
|
+
var 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
|
+
function (entry, i) {
|
|
56
|
+
/** @type {?} */
|
|
57
|
+
var 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
|
+
var 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
|
+
function (fn) { return fn(); }));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* @param {?} entry
|
|
81
|
+
* @return {?}
|
|
82
|
+
*/
|
|
83
|
+
function unregisterOpenImporter(entry) {
|
|
84
|
+
/** @type {?} */
|
|
85
|
+
var reg = openImporters();
|
|
86
|
+
/** @type {?} */
|
|
87
|
+
var 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
|
+
function (fn) { return fn(); }));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* @param {?} entry
|
|
100
|
+
* @return {?}
|
|
101
|
+
*/
|
|
102
|
+
function isBlockedByOpenImporter(entry) {
|
|
103
|
+
/** @type {?} */
|
|
104
|
+
var 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
|
+
var reg = openImporters();
|
|
114
|
+
reg.listeners.push(fn);
|
|
115
|
+
return (/**
|
|
116
|
+
* @return {?}
|
|
117
|
+
*/
|
|
118
|
+
function () {
|
|
119
|
+
/** @type {?} */
|
|
120
|
+
var i = reg.listeners.indexOf(fn);
|
|
121
|
+
if (i >= 0)
|
|
122
|
+
reg.listeners.splice(i, 1);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/** @type {?} */
|
|
126
|
+
var appVersion = '1.1.20';
|
|
12
127
|
var CSVBoxButtonComponent = /** @class */ (function () {
|
|
13
|
-
function CSVBoxButtonComponent(sanitizer) {
|
|
128
|
+
function CSVBoxButtonComponent(sanitizer, cdr, zone) {
|
|
129
|
+
var _this = this;
|
|
14
130
|
this.sanitizer = sanitizer;
|
|
131
|
+
this.cdr = cdr;
|
|
132
|
+
this.zone = zone;
|
|
15
133
|
this.isModalShown = false;
|
|
16
134
|
this.licenseKey = null;
|
|
17
135
|
this.uuid = null;
|
|
@@ -24,6 +142,165 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
24
142
|
this.lazy = false;
|
|
25
143
|
this.iframe = null;
|
|
26
144
|
this.disabled = true;
|
|
145
|
+
// True while a different importer on the page is open: the button stays disabled.
|
|
146
|
+
this.blockedByOther = false;
|
|
147
|
+
this.registryEntry = { getHolder: (/**
|
|
148
|
+
* @return {?}
|
|
149
|
+
*/
|
|
150
|
+
function () { return _this.holder; }) };
|
|
151
|
+
this.fileSender = createFileSender({
|
|
152
|
+
getIframe: (/**
|
|
153
|
+
* @return {?}
|
|
154
|
+
*/
|
|
155
|
+
function () { return _this.iframe; }),
|
|
156
|
+
getToken: (/**
|
|
157
|
+
* @return {?}
|
|
158
|
+
*/
|
|
159
|
+
function () { return (/** @type {?} */ (_this.uuid)); }),
|
|
160
|
+
getTargetOrigin: (/**
|
|
161
|
+
* @return {?}
|
|
162
|
+
*/
|
|
163
|
+
function () { return (/** @type {?} */ (_this.targetOrigin)); }),
|
|
164
|
+
getBaseDomain: (/**
|
|
165
|
+
* @return {?}
|
|
166
|
+
*/
|
|
167
|
+
function () { return _this.baseDomain; }),
|
|
168
|
+
takeFile: (/**
|
|
169
|
+
* @return {?}
|
|
170
|
+
*/
|
|
171
|
+
function () {
|
|
172
|
+
/** @type {?} */
|
|
173
|
+
var file = _this.pendingFile;
|
|
174
|
+
_this.pendingFile = null;
|
|
175
|
+
return file;
|
|
176
|
+
}),
|
|
177
|
+
onSent: (/**
|
|
178
|
+
* @return {?}
|
|
179
|
+
*/
|
|
180
|
+
function () { return _this.startFileAckTimer(); })
|
|
181
|
+
});
|
|
182
|
+
this.unsubscribeOpenImporters = null;
|
|
183
|
+
this.pendingFile = null;
|
|
184
|
+
// Data-location sheets redirect to another host, so the iframe origin can differ from
|
|
185
|
+
// targetOrigin. baseDomain is used to check the real origin before trusting it.
|
|
186
|
+
this.baseDomain = "app.csvbox.io";
|
|
187
|
+
this.fileAckTimer = null;
|
|
188
|
+
this.messageListener = (/**
|
|
189
|
+
* @param {?} event
|
|
190
|
+
* @return {?}
|
|
191
|
+
*/
|
|
192
|
+
function (event) {
|
|
193
|
+
// Older importers send these as bare strings, without a token.
|
|
194
|
+
/** @type {?} */
|
|
195
|
+
var legacy = classifyLegacyMessage(event.data);
|
|
196
|
+
if (legacy) {
|
|
197
|
+
// Legacy messages carry no token, so the only way to tell which importer sent one is its
|
|
198
|
+
// window. Ignore those that came from another instance's iframe (or anywhere else).
|
|
199
|
+
if (!_this.iframe || event.source !== _this.iframe.contentWindow) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (legacy.type === "mainModalHidden") {
|
|
203
|
+
_this.handleModalClosed();
|
|
204
|
+
}
|
|
205
|
+
else if (legacy.type === "uploadSuccessful") {
|
|
206
|
+
if (_this.onImport)
|
|
207
|
+
_this.onImport(true);
|
|
208
|
+
if (_this.isImported)
|
|
209
|
+
_this.isImported(true);
|
|
210
|
+
if (_this.imported)
|
|
211
|
+
_this.imported(true);
|
|
212
|
+
}
|
|
213
|
+
else if (legacy.type === "uploadFailed") {
|
|
214
|
+
if (_this.onImport)
|
|
215
|
+
_this.onImport(false);
|
|
216
|
+
if (_this.isImported)
|
|
217
|
+
_this.isImported(false);
|
|
218
|
+
if (_this.imported)
|
|
219
|
+
_this.imported(false);
|
|
220
|
+
}
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
// Set-file handshake messages. The shared core does not classify these, so they are
|
|
224
|
+
// read here, behind the same unique_token check the core applies.
|
|
225
|
+
/** @type {?} */
|
|
226
|
+
var raw = event.data;
|
|
227
|
+
if (raw && typeof raw === "object" && raw.data && raw.data.unique_token == _this.uuid) {
|
|
228
|
+
_this.fileSender.learnOrigin(event);
|
|
229
|
+
if (raw.type === "csvbox-set-file-rejected" && raw.data.reason === "not-a-file") {
|
|
230
|
+
// Reply to our probe (it has no file). It only tells us the origin, so do nothing.
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (raw.type === "csvbox-modal-shown") {
|
|
234
|
+
_this.clearFileAckTimer();
|
|
235
|
+
registerOpenImporter(_this.registryEntry);
|
|
236
|
+
// What the file path in openModal() is waiting for. display as well as
|
|
237
|
+
// pointer-events: a second file declined while the first was still opening the
|
|
238
|
+
// modal has put the holder away in the meantime.
|
|
239
|
+
_this.isModalShown = true;
|
|
240
|
+
if (_this.holder) {
|
|
241
|
+
_this.holder.style.display = 'block';
|
|
242
|
+
_this.holder.style.pointerEvents = 'auto';
|
|
243
|
+
}
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (raw.type === "csvbox-set-file-rejected") {
|
|
247
|
+
_this.clearFileAckTimer();
|
|
248
|
+
// The importer has the file and will not take it. Put the holder away only if the
|
|
249
|
+
// modal was never confirmed up: a file declined while it is open leaves that modal
|
|
250
|
+
// where it is, and its own 'csvbox-modal-hidden' will put the holder away.
|
|
251
|
+
if (!_this.isModalShown && _this.holder) {
|
|
252
|
+
_this.holder.style.display = 'none';
|
|
253
|
+
_this.holder.style.pointerEvents = 'auto';
|
|
254
|
+
unregisterOpenImporter(_this.registryEntry);
|
|
255
|
+
}
|
|
256
|
+
console.warn("[csvbox] importer declined the supplied file: " + raw.data.reason);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/** @type {?} */
|
|
261
|
+
var message = classifyStructuredMessage(event.data, (/** @type {?} */ (_this.uuid)));
|
|
262
|
+
if (!message) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (message.type === "data-on-submit") {
|
|
266
|
+
if (_this.onSubmit)
|
|
267
|
+
_this.onSubmit(message.metadata);
|
|
268
|
+
if (_this.isSubmitted)
|
|
269
|
+
_this.isSubmitted(message.metadata);
|
|
270
|
+
if (_this.submitted)
|
|
271
|
+
_this.submitted(message.metadata);
|
|
272
|
+
}
|
|
273
|
+
else if (message.type === "data-push-status") {
|
|
274
|
+
if (!message.success) {
|
|
275
|
+
delete message.metadata["unique_token"];
|
|
276
|
+
}
|
|
277
|
+
if (_this.onImport)
|
|
278
|
+
_this.onImport(message.success, message.metadata);
|
|
279
|
+
if (_this.isImported)
|
|
280
|
+
_this.isImported(message.success, message.metadata);
|
|
281
|
+
if (_this.imported)
|
|
282
|
+
_this.imported(message.success, message.metadata);
|
|
283
|
+
}
|
|
284
|
+
else if (message.type === "csvbox-modal-hidden") {
|
|
285
|
+
_this.handleModalClosed();
|
|
286
|
+
}
|
|
287
|
+
else if (message.type === "csvbox-upload-successful") {
|
|
288
|
+
if (_this.onImport)
|
|
289
|
+
_this.onImport(true);
|
|
290
|
+
if (_this.isImported)
|
|
291
|
+
_this.isImported(true);
|
|
292
|
+
if (_this.imported)
|
|
293
|
+
_this.imported(true);
|
|
294
|
+
}
|
|
295
|
+
else if (message.type === "csvbox-upload-failed") {
|
|
296
|
+
if (_this.onImport)
|
|
297
|
+
_this.onImport(false);
|
|
298
|
+
if (_this.isImported)
|
|
299
|
+
_this.isImported(false);
|
|
300
|
+
if (_this.imported)
|
|
301
|
+
_this.imported(false);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
27
304
|
}
|
|
28
305
|
/**
|
|
29
306
|
* @return {?}
|
|
@@ -42,6 +319,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
42
319
|
theme: this.theme,
|
|
43
320
|
environment: this.environment
|
|
44
321
|
}, "angular", appVersion);
|
|
322
|
+
// Default place to send the file. A file is only ever sent to a named origin, never "*".
|
|
323
|
+
this.targetOrigin = new URL(iframeUrl).origin;
|
|
324
|
+
this.baseDomain = this.customDomain || "app.csvbox.io";
|
|
45
325
|
this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
|
|
46
326
|
};
|
|
47
327
|
/**
|
|
@@ -81,55 +361,12 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
81
361
|
*/
|
|
82
362
|
function () {
|
|
83
363
|
var _this = this;
|
|
84
|
-
window.addEventListener("message",
|
|
85
|
-
|
|
364
|
+
window.addEventListener("message", this.messageListener, false);
|
|
365
|
+
this.syncBlocked();
|
|
366
|
+
this.unsubscribeOpenImporters = subscribeOpenImporters((/**
|
|
86
367
|
* @return {?}
|
|
87
368
|
*/
|
|
88
|
-
function (
|
|
89
|
-
/** @type {?} */
|
|
90
|
-
var message = classifyStructuredMessage(event.data, (/** @type {?} */ (_this.uuid)));
|
|
91
|
-
if (!message) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
if (message.type === "data-on-submit") {
|
|
95
|
-
if (_this.onSubmit)
|
|
96
|
-
_this.onSubmit(message.metadata);
|
|
97
|
-
if (_this.isSubmitted)
|
|
98
|
-
_this.isSubmitted(message.metadata);
|
|
99
|
-
if (_this.submitted)
|
|
100
|
-
_this.submitted(message.metadata);
|
|
101
|
-
}
|
|
102
|
-
else if (message.type === "data-push-status") {
|
|
103
|
-
if (!message.success) {
|
|
104
|
-
delete message.metadata["unique_token"];
|
|
105
|
-
}
|
|
106
|
-
if (_this.onImport)
|
|
107
|
-
_this.onImport(message.success, message.metadata);
|
|
108
|
-
if (_this.isImported)
|
|
109
|
-
_this.isImported(message.success, message.metadata);
|
|
110
|
-
if (_this.imported)
|
|
111
|
-
_this.imported(message.success, message.metadata);
|
|
112
|
-
}
|
|
113
|
-
else if (message.type === "csvbox-modal-hidden") {
|
|
114
|
-
_this.handleModalClosed();
|
|
115
|
-
}
|
|
116
|
-
else if (message.type === "csvbox-upload-successful") {
|
|
117
|
-
if (_this.onImport)
|
|
118
|
-
_this.onImport(true);
|
|
119
|
-
if (_this.isImported)
|
|
120
|
-
_this.isImported(true);
|
|
121
|
-
if (_this.imported)
|
|
122
|
-
_this.imported(true);
|
|
123
|
-
}
|
|
124
|
-
else if (message.type === "csvbox-upload-failed") {
|
|
125
|
-
if (_this.onImport)
|
|
126
|
-
_this.onImport(false);
|
|
127
|
-
if (_this.isImported)
|
|
128
|
-
_this.isImported(false);
|
|
129
|
-
if (_this.imported)
|
|
130
|
-
_this.imported(false);
|
|
131
|
-
}
|
|
132
|
-
}), false);
|
|
369
|
+
function () { return _this.syncBlocked(); }));
|
|
133
370
|
if (this.lazy) {
|
|
134
371
|
this.disabled = false;
|
|
135
372
|
}
|
|
@@ -145,8 +382,10 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
145
382
|
* @return {?}
|
|
146
383
|
*/
|
|
147
384
|
function () {
|
|
148
|
-
if (this.holder)
|
|
385
|
+
if (this.holder) {
|
|
149
386
|
this.holder.style.display = 'none';
|
|
387
|
+
this.holder.style.pointerEvents = 'auto';
|
|
388
|
+
}
|
|
150
389
|
this.isModalShown = false;
|
|
151
390
|
this.isIframeLoaded = false;
|
|
152
391
|
this.openModalOnIframeLoad = false;
|
|
@@ -154,6 +393,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
154
393
|
this.holder.remove();
|
|
155
394
|
this.holder = null;
|
|
156
395
|
this.iframe = null;
|
|
396
|
+
// A new iframe is built on the next open, so the origin is learned again.
|
|
397
|
+
this.clearProbeTimer();
|
|
398
|
+
unregisterOpenImporter(this.registryEntry);
|
|
157
399
|
if (this.onClose)
|
|
158
400
|
this.onClose();
|
|
159
401
|
if (this.isClosed)
|
|
@@ -176,6 +418,7 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
176
418
|
var iframe = document.createElement("iframe");
|
|
177
419
|
this.iframe = iframe;
|
|
178
420
|
iframe.setAttribute("src", this.safeUrl);
|
|
421
|
+
iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
|
|
179
422
|
iframe.frameBorder = "0";
|
|
180
423
|
/** @type {?} */
|
|
181
424
|
var self = this;
|
|
@@ -203,6 +446,8 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
203
446
|
this.holder.setAttribute('id', "csvbox-embed-" + this.uuid);
|
|
204
447
|
this.holder.appendChild(iframe);
|
|
205
448
|
document.body.insertAdjacentElement('beforeend', this.holder);
|
|
449
|
+
// The holder did not exist yet if openModal() asked for the importer before it was built.
|
|
450
|
+
restackOpenImporters(openImporters());
|
|
206
451
|
};
|
|
207
452
|
/**
|
|
208
453
|
* @return {?}
|
|
@@ -211,6 +456,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
211
456
|
* @return {?}
|
|
212
457
|
*/
|
|
213
458
|
function () {
|
|
459
|
+
// Counts as open from the moment it is requested, so the other buttons are disabled while
|
|
460
|
+
// this importer is still loading, and so it is stacked above any importer opened earlier.
|
|
461
|
+
registerOpenImporter(this.registryEntry);
|
|
214
462
|
if (!this.iframe) {
|
|
215
463
|
this.openModalOnIframeLoad = true;
|
|
216
464
|
this.initImporter();
|
|
@@ -218,11 +466,36 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
218
466
|
}
|
|
219
467
|
if (!this.isModalShown) {
|
|
220
468
|
if (this.isIframeLoaded) {
|
|
221
|
-
this.
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
469
|
+
if (this.pendingFile) {
|
|
470
|
+
// The importer opens its own modal once it has the file, so that it can inject on
|
|
471
|
+
// 'shown.bs.modal'. Sending 'openModal' as well would race that.
|
|
472
|
+
//
|
|
473
|
+
// It can also decline: wrong step, an import file URL configured on the sheet, or
|
|
474
|
+
// an importer too old to know the message at all. So the holder goes up
|
|
475
|
+
// click-through and stays that way until 'csvbox-modal-shown' confirms the modal
|
|
476
|
+
// is really up. It covers the viewport at z-index 2147483647 and the importer
|
|
477
|
+
// renders transparent with its modal closed, so arming it on an unanswered message
|
|
478
|
+
// leaves an invisible sheet over the host page eating every click.
|
|
479
|
+
//
|
|
480
|
+
// display:block regardless, so the iframe lays out and animates normally; only
|
|
481
|
+
// pointer-events is held back. isModalShown likewise waits for the confirmation,
|
|
482
|
+
// or a declined file would latch the importer shut for good.
|
|
483
|
+
if (this.holder) {
|
|
484
|
+
this.holder.style.pointerEvents = 'none';
|
|
485
|
+
this.holder.style.display = 'block';
|
|
486
|
+
}
|
|
487
|
+
this.fileSender.send();
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
this.isModalShown = true;
|
|
491
|
+
if (this.holder) {
|
|
492
|
+
// Explicit: a previously declined file leaves the holder click-through.
|
|
493
|
+
this.holder.style.pointerEvents = 'auto';
|
|
494
|
+
this.holder.style.display = 'block';
|
|
495
|
+
}
|
|
496
|
+
if (this.iframe && this.iframe.contentWindow) {
|
|
497
|
+
this.iframe.contentWindow.postMessage('openModal', '*');
|
|
498
|
+
}
|
|
226
499
|
}
|
|
227
500
|
}
|
|
228
501
|
else {
|
|
@@ -230,18 +503,176 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
230
503
|
}
|
|
231
504
|
}
|
|
232
505
|
};
|
|
506
|
+
/**
|
|
507
|
+
* Open the importer on a File the host page already has, instead of the file picker.
|
|
508
|
+
*
|
|
509
|
+
* Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
|
|
510
|
+
* or `@ViewChild(CSVBoxButtonComponent)`.
|
|
511
|
+
*
|
|
512
|
+
* The File crosses to the iframe by structured clone, so the importer receives the real
|
|
513
|
+
* object and applies its own extension, worksheet and size rules to it -- this does not
|
|
514
|
+
* bypass any of them. Pass a File; a Blob has no name for the importer to read an
|
|
515
|
+
* extension from.
|
|
516
|
+
*/
|
|
517
|
+
/**
|
|
518
|
+
* Open the importer on a File the host page already has, instead of the file picker.
|
|
519
|
+
*
|
|
520
|
+
* Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
|
|
521
|
+
* or `\@ViewChild(CSVBoxButtonComponent)`.
|
|
522
|
+
*
|
|
523
|
+
* The File crosses to the iframe by structured clone, so the importer receives the real
|
|
524
|
+
* object and applies its own extension, worksheet and size rules to it -- this does not
|
|
525
|
+
* bypass any of them. Pass a File; a Blob has no name for the importer to read an
|
|
526
|
+
* extension from.
|
|
527
|
+
* @param {?} file
|
|
528
|
+
* @return {?}
|
|
529
|
+
*/
|
|
530
|
+
CSVBoxButtonComponent.prototype.openModalWithFile = /**
|
|
531
|
+
* Open the importer on a File the host page already has, instead of the file picker.
|
|
532
|
+
*
|
|
533
|
+
* Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
|
|
534
|
+
* or `\@ViewChild(CSVBoxButtonComponent)`.
|
|
535
|
+
*
|
|
536
|
+
* The File crosses to the iframe by structured clone, so the importer receives the real
|
|
537
|
+
* object and applies its own extension, worksheet and size rules to it -- this does not
|
|
538
|
+
* bypass any of them. Pass a File; a Blob has no name for the importer to read an
|
|
539
|
+
* extension from.
|
|
540
|
+
* @param {?} file
|
|
541
|
+
* @return {?}
|
|
542
|
+
*/
|
|
543
|
+
function (file) {
|
|
544
|
+
if (typeof File === 'undefined' || !(file instanceof File)) {
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
this.pendingFile = file;
|
|
548
|
+
// Already open: hand it over now rather than holding it for the next open. The importer
|
|
549
|
+
// takes it only while it is still on the upload step, and ignores it once the user has a
|
|
550
|
+
// dataset and a mapping in progress.
|
|
551
|
+
if (this.isModalShown && this.iframe && this.isIframeLoaded) {
|
|
552
|
+
this.fileSender.send();
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
this.openModal();
|
|
556
|
+
};
|
|
557
|
+
/**
|
|
558
|
+
* @return {?}
|
|
559
|
+
*/
|
|
560
|
+
CSVBoxButtonComponent.prototype.clearProbeTimer = /**
|
|
561
|
+
* @return {?}
|
|
562
|
+
*/
|
|
563
|
+
function () {
|
|
564
|
+
this.clearFileAckTimer();
|
|
565
|
+
this.fileSender.reset();
|
|
566
|
+
};
|
|
567
|
+
/**
|
|
568
|
+
* @return {?}
|
|
569
|
+
*/
|
|
570
|
+
CSVBoxButtonComponent.prototype.startFileAckTimer = /**
|
|
571
|
+
* @return {?}
|
|
572
|
+
*/
|
|
573
|
+
function () {
|
|
574
|
+
var _this = this;
|
|
575
|
+
this.clearFileAckTimer();
|
|
576
|
+
this.fileAckTimer = setTimeout((/**
|
|
577
|
+
* @return {?}
|
|
578
|
+
*/
|
|
579
|
+
function () {
|
|
580
|
+
_this.fileAckTimer = null;
|
|
581
|
+
_this.giveUpOnFile();
|
|
582
|
+
}), FILE_ACK_TIMEOUT_MS);
|
|
583
|
+
};
|
|
584
|
+
/**
|
|
585
|
+
* @return {?}
|
|
586
|
+
*/
|
|
587
|
+
CSVBoxButtonComponent.prototype.clearFileAckTimer = /**
|
|
588
|
+
* @return {?}
|
|
589
|
+
*/
|
|
590
|
+
function () {
|
|
591
|
+
if (this.fileAckTimer) {
|
|
592
|
+
clearTimeout(this.fileAckTimer);
|
|
593
|
+
this.fileAckTimer = null;
|
|
594
|
+
}
|
|
595
|
+
};
|
|
596
|
+
// The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
|
|
597
|
+
// old to know the message). Without this the holder would stay up, invisible and click-through,
|
|
598
|
+
// and the other instances' buttons would stay disabled for good.
|
|
599
|
+
// The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
|
|
600
|
+
// old to know the message). Without this the holder would stay up, invisible and click-through,
|
|
601
|
+
// and the other instances' buttons would stay disabled for good.
|
|
602
|
+
/**
|
|
603
|
+
* @return {?}
|
|
604
|
+
*/
|
|
605
|
+
CSVBoxButtonComponent.prototype.giveUpOnFile =
|
|
606
|
+
// The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
|
|
607
|
+
// old to know the message). Without this the holder would stay up, invisible and click-through,
|
|
608
|
+
// and the other instances' buttons would stay disabled for good.
|
|
609
|
+
/**
|
|
610
|
+
* @return {?}
|
|
611
|
+
*/
|
|
612
|
+
function () {
|
|
613
|
+
if (this.isModalShown) {
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
/** @type {?} */
|
|
617
|
+
var holder = this.holder;
|
|
618
|
+
if (holder) {
|
|
619
|
+
holder.style.display = 'none';
|
|
620
|
+
holder.style.pointerEvents = 'auto';
|
|
621
|
+
}
|
|
622
|
+
unregisterOpenImporter(this.registryEntry);
|
|
623
|
+
console.warn("[csvbox] the importer did not respond to the supplied file");
|
|
624
|
+
};
|
|
625
|
+
/**
|
|
626
|
+
* @private
|
|
627
|
+
* @return {?}
|
|
628
|
+
*/
|
|
629
|
+
CSVBoxButtonComponent.prototype.syncBlocked = /**
|
|
630
|
+
* @private
|
|
631
|
+
* @return {?}
|
|
632
|
+
*/
|
|
633
|
+
function () {
|
|
634
|
+
var _this = this;
|
|
635
|
+
/** @type {?} */
|
|
636
|
+
var blocked = isBlockedByOpenImporter(this.registryEntry);
|
|
637
|
+
if (blocked !== this.blockedByOther) {
|
|
638
|
+
// The registry can call back from outside Angular's zone (another instance, another app).
|
|
639
|
+
this.zone.run((/**
|
|
640
|
+
* @return {?}
|
|
641
|
+
*/
|
|
642
|
+
function () {
|
|
643
|
+
_this.blockedByOther = blocked;
|
|
644
|
+
_this.cdr.markForCheck();
|
|
645
|
+
}));
|
|
646
|
+
}
|
|
647
|
+
};
|
|
648
|
+
/**
|
|
649
|
+
* @return {?}
|
|
650
|
+
*/
|
|
651
|
+
CSVBoxButtonComponent.prototype.ngOnDestroy = /**
|
|
652
|
+
* @return {?}
|
|
653
|
+
*/
|
|
654
|
+
function () {
|
|
655
|
+
this.clearProbeTimer();
|
|
656
|
+
window.removeEventListener("message", this.messageListener);
|
|
657
|
+
unregisterOpenImporter(this.registryEntry);
|
|
658
|
+
if (this.unsubscribeOpenImporters) {
|
|
659
|
+
this.unsubscribeOpenImporters();
|
|
660
|
+
this.unsubscribeOpenImporters = null;
|
|
661
|
+
}
|
|
662
|
+
};
|
|
233
663
|
CSVBoxButtonComponent.decorators = [
|
|
234
664
|
{ type: Component, args: [{
|
|
235
665
|
selector: 'csvbox-button',
|
|
236
|
-
template: "\n <div>\n <button [disabled]=\"disabled\"
|
|
666
|
+
template: "\n <div>\n <button [disabled]=\"disabled || blockedByOther\" (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n "
|
|
237
667
|
}] }
|
|
238
668
|
];
|
|
239
669
|
/** @nocollapse */
|
|
240
670
|
CSVBoxButtonComponent.ctorParameters = function () { return [
|
|
241
|
-
{ type: DomSanitizer }
|
|
671
|
+
{ type: DomSanitizer },
|
|
672
|
+
{ type: ChangeDetectorRef },
|
|
673
|
+
{ type: NgZone }
|
|
242
674
|
]; };
|
|
243
675
|
CSVBoxButtonComponent.propDecorators = {
|
|
244
|
-
initiator: [{ type: ViewChild, args: ['initiator', { static: false },] }],
|
|
245
676
|
onImport: [{ type: Input }],
|
|
246
677
|
onReady: [{ type: Input }],
|
|
247
678
|
onClose: [{ type: Input }],
|
|
@@ -277,8 +708,6 @@ if (false) {
|
|
|
277
708
|
/** @type {?} */
|
|
278
709
|
CSVBoxButtonComponent.prototype.isModalShown;
|
|
279
710
|
/** @type {?} */
|
|
280
|
-
CSVBoxButtonComponent.prototype.initiator;
|
|
281
|
-
/** @type {?} */
|
|
282
711
|
CSVBoxButtonComponent.prototype.onImport;
|
|
283
712
|
/** @type {?} */
|
|
284
713
|
CSVBoxButtonComponent.prototype.onReady;
|
|
@@ -337,8 +766,51 @@ if (false) {
|
|
|
337
766
|
/** @type {?} */
|
|
338
767
|
CSVBoxButtonComponent.prototype.disabled;
|
|
339
768
|
/** @type {?} */
|
|
769
|
+
CSVBoxButtonComponent.prototype.blockedByOther;
|
|
770
|
+
/**
|
|
771
|
+
* @type {?}
|
|
772
|
+
* @private
|
|
773
|
+
*/
|
|
774
|
+
CSVBoxButtonComponent.prototype.registryEntry;
|
|
775
|
+
/**
|
|
776
|
+
* @type {?}
|
|
777
|
+
* @private
|
|
778
|
+
*/
|
|
779
|
+
CSVBoxButtonComponent.prototype.fileSender;
|
|
780
|
+
/**
|
|
781
|
+
* @type {?}
|
|
782
|
+
* @private
|
|
783
|
+
*/
|
|
784
|
+
CSVBoxButtonComponent.prototype.unsubscribeOpenImporters;
|
|
785
|
+
/** @type {?} */
|
|
340
786
|
CSVBoxButtonComponent.prototype.holder;
|
|
341
787
|
/** @type {?} */
|
|
788
|
+
CSVBoxButtonComponent.prototype.pendingFile;
|
|
789
|
+
/** @type {?} */
|
|
790
|
+
CSVBoxButtonComponent.prototype.targetOrigin;
|
|
791
|
+
/** @type {?} */
|
|
792
|
+
CSVBoxButtonComponent.prototype.baseDomain;
|
|
793
|
+
/**
|
|
794
|
+
* @type {?}
|
|
795
|
+
* @private
|
|
796
|
+
*/
|
|
797
|
+
CSVBoxButtonComponent.prototype.fileAckTimer;
|
|
798
|
+
/**
|
|
799
|
+
* @type {?}
|
|
800
|
+
* @private
|
|
801
|
+
*/
|
|
802
|
+
CSVBoxButtonComponent.prototype.messageListener;
|
|
803
|
+
/** @type {?} */
|
|
342
804
|
CSVBoxButtonComponent.prototype.sanitizer;
|
|
805
|
+
/**
|
|
806
|
+
* @type {?}
|
|
807
|
+
* @private
|
|
808
|
+
*/
|
|
809
|
+
CSVBoxButtonComponent.prototype.cdr;
|
|
810
|
+
/**
|
|
811
|
+
* @type {?}
|
|
812
|
+
* @private
|
|
813
|
+
*/
|
|
814
|
+
CSVBoxButtonComponent.prototype.zone;
|
|
343
815
|
}
|
|
344
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0lBRWpILFVBQVUsR0FBRyxRQUFRO0FBRTNCO0lBdURFLCtCQUFtQixTQUFzQjtRQUF0QixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBMUN6QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQXFCWixlQUFVLEdBQWtCLElBQUksQ0FBQztRQUVqQyxTQUFJLEdBQWtCLElBQUksQ0FBQztRQUMzQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBRy9CLFVBQUssR0FBa0IsSUFBSSxDQUFDO1FBRTVCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUV2QyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBSS9CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBRS9CLGFBQVEsR0FBWSxJQUFJLENBQUM7SUFFVSxDQUFDOzs7O0lBSTdDLHdDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7O1lBQ3ZCLFNBQVMsR0FBRyxjQUFjLENBQzVCO1lB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QUE0Qjs7SUFDNUIseUNBQTZCOztJQUU3QiwyQ0FBK0I7O0lBQy9CLHdDQUE0Qjs7SUFDNUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLDhDQUFrQzs7SUFDbEMsdUNBQTJCOztJQUMzQiwwQ0FBOEI7O0lBQzlCLHlDQUE2Qjs7SUFDN0IsNENBQWdDOztJQUVoQyxxQ0FBdUI7O0lBQ3ZCLCtDQUFpQzs7SUFDakMsMkNBQTBDOztJQUMxQyx3Q0FBMEI7O0lBQzFCLHFDQUFvQzs7SUFDcEMsNkNBQTRDOztJQUM1Qyw2Q0FBNEM7O0lBQzVDLHlDQUF3Qzs7SUFDeEMsNENBQThCOztJQUU5QixzQ0FBcUM7O0lBRXJDLCtDQUF5Qzs7SUFDekMsc0RBQWdEOztJQUVoRCxxQ0FBK0I7O0lBRS9CLHdDQUFhOztJQUViLHVDQUF3Qzs7SUFFeEMseUNBQWtDOztJQUlsQyx1Q0FBWTs7SUFGQSwwQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBTZWN1cml0eUNvbnRleHQsXG4gIEFmdGVyQ29udGVudEluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi4vdXRsaXMvaW5zZXJ0Q1NTJztcbmltcG9ydCB7IGJ1aWxkSW1wb3J0VXJsLCBnZW5lcmF0ZVV1aWQsIGJ1aWxkSW5pdFBheWxvYWQsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UgfSBmcm9tICdAc3VtaXRfeWV3YWxlL2FkYXB0ZXItY29yZSc7XG5cbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjE2JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgI2luaXRpYXRvciAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgXG59KVxuXG5leHBvcnQgY2xhc3MgQ1NWQm94QnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xuXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2luaXRpYXRvcicsIHtzdGF0aWM6IGZhbHNlfSkgaW5pdGlhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIG9uSW1wb3J0PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25DbG9zZT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvblN1Ym1pdD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc0Nsb3NlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1N1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGltcG9ydGVyUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgY2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBsb2FkU3RhcnRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIHVzZXI/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGR5bmFtaWNDb2x1bW5zPzogb2JqZWN0O1xuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9ucz86IG9iamVjdDtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGN1c3RvbURvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRhdGFMb2NhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZW52aXJvbm1lbnQ/OiBvYmplY3Q7XG5cbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzYWZlVXJsOiBhbnk7XG5cbiAgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOkRvbVNhbml0aXplcikge31cblxuICBob2xkZXI6IGFueTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICBsZXQgaWZyYW1lVXJsID0gYnVpbGRJbXBvcnRVcmwoXG4gICAgICB7XG4gICAgICAgIGxpY2Vuc2VLZXk6IHRoaXMubGljZW5zZUtleSxcbiAgICAgICAgY3VzdG9tRG9tYWluOiB0aGlzLmN1c3RvbURvbWFpbixcbiAgICAgICAgZGF0YUxvY2F0aW9uOiB0aGlzLmRhdGFMb2NhdGlvbixcbiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5lbnZpcm9ubWVudFxuICAgICAgfSxcbiAgICAgIFwiYW5ndWxhclwiLFxuICAgICAgYXBwVmVyc2lvblxuICAgICk7XG4gICAgdGhpcy5zYWZlVXJsID0gdGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGlmcmFtZVVybCkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmKGNoYW5nZXNbXCJ1c2VyXCJdICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT0gY2hhbmdlc1sndXNlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlclZhcmlhYmUoY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVXNlclZhcmlhYmUoZGF0YTogYW55KTogdm9pZCB7XG4gICAgdGhpcy51c2VyID0gZGF0YTtcbiAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIFwiY3VzdG9tZXJcIiA6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudCkgPT4ge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBjbGFzc2lmeVN0cnVjdHVyZWRNZXNzYWdlKGV2ZW50LmRhdGEsIHRoaXMudXVpZCEpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJkYXRhLW9uLXN1Ym1pdFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuc3VibWl0dGVkKSB0aGlzLnN1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtcHVzaC1zdGF0dXNcIikge1xuICAgICAgICBpZiAoIW1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLm1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTW9kYWxDbG9zZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtc3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xuICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LCBmYWxzZSk7XG5cbiAgICBpZih0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuaXNJZnJhbWVMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIucmVtb3ZlKCk7XG4gICAgdGhpcy5ob2xkZXIgPSBudWxsO1xuICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcbiAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcbiAgfVxuXG4gIGluaXRJbXBvcnRlcigpIHtcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xuXG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsKTtcbiAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcblxuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICBpZnJhbWUub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYub25SZWFkeSkgc2VsZi5vblJlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pc1JlYWR5KSBzZWxmLmlzUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmltcG9ydGVyUmVhZHkpIHNlbGYuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICBzZWxmLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzZWxmLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcbiAgICAgIGlmIChzZWxmLmlmcmFtZSAmJiBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoYnVpbGRJbml0UGF5bG9hZChzZWxmLnVzZXIsIHNlbGYuZHluYW1pY0NvbHVtbnMsIHNlbGYub3B0aW9ucywgc2VsZi51dWlkISksIFwiKlwiKTtcbiAgICAgIH1cbiAgICAgIGlmKHNlbGYub3Blbk1vZGFsT25JZnJhbWVMb2FkKSB7XG4gICAgICAgIHNlbGYub3Blbk1vZGFsKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmhvbGRlci5jbGFzc0xpc3QuYWRkKCdjc3Zib3gtaG9sZGVyJyk7XG4gICAgdGhpcy5ob2xkZXIuc2V0QXR0cmlidXRlKCdpZCcsIGBjc3Zib3gtZW1iZWQtJHt0aGlzLnV1aWR9YCk7XG4gICAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxuICAgICAgJ2JlZm9yZWVuZCcsIHRoaXMuaG9sZGVyXG4gICAgKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICBpZighdGhpcy5pZnJhbWUpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKCF0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgaWYodGhpcy5pc0lmcmFtZUxvYWRlZCkge1xuICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgICBpZih0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgaWYodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcbiAgICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuIl19
|
|
816
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxlQUFlLEVBR2YsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztJQUcxSixtQkFBbUIsR0FBRyxJQUFJOzs7O0FBT2hDLGdDQUFvRTs7O0lBQXRDLHNDQUFvQzs7Ozs7QUFDbEUsNEJBQW9GOzs7SUFBMUQsNkJBQTBCOztJQUFDLGtDQUE2Qjs7O0lBQzVFLGtCQUFrQixHQUFHLHVCQUF1Qjs7SUFDNUMsV0FBVyxHQUFHLFVBQVU7Ozs7QUFFOUIsU0FBUyxhQUFhOztRQUNkLENBQUMsR0FBRyxtQkFBQSxNQUFNLEVBQU87SUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEYsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMvQixDQUFDOzs7OztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPOzs7OztJQUFDLFVBQUMsS0FBSyxFQUFFLENBQUM7O1lB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Szt1QkFFTCxLQUFLO2lDQUNMLEtBQUs7NkJBQ0wsS0FBSzswQkFDTCxLQUFLO3VCQUNMLEtBQUs7K0JBQ0wsS0FBSzsrQkFDTCxLQUFLOzJCQUNMLEtBQUs7OEJBQ0wsS0FBSzt3QkFFTCxLQUFLO2lDQUVMLEtBQUs7d0NBQ0wsS0FBSzt1QkFFTCxLQUFLOzJCQU1MLEtBQUs7O0lBOFdSLDRCQUFDO0NBQUEsQUFsYUQsSUFrYUM7U0F2WlkscUJBQXFCOzs7SUFFaEMsNkNBQXFCOztJQUVyQix5Q0FBNkI7O0lBQzdCLHdDQUE0Qjs7SUFDNUIsd0NBQTRCOztJQUM1Qix5Q0FBNkI7O0lBRTdCLDJDQUErQjs7SUFDL0Isd0NBQTRCOztJQUM1Qix5Q0FBNkI7O0lBQzdCLDRDQUFnQzs7SUFFaEMsOENBQWtDOztJQUNsQyx1Q0FBMkI7O0lBQzNCLDBDQUE4Qjs7SUFDOUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLHFDQUF1Qjs7SUFDdkIsK0NBQWlDOztJQUNqQywyQ0FBMEM7O0lBQzFDLHdDQUEwQjs7SUFDMUIscUNBQW9DOztJQUNwQyw2Q0FBNEM7O0lBQzVDLDZDQUE0Qzs7SUFDNUMseUNBQXdDOztJQUN4Qyw0Q0FBOEI7O0lBRTlCLHNDQUFxQzs7SUFFckMsK0NBQXlDOztJQUN6QyxzREFBZ0Q7O0lBRWhELHFDQUErQjs7SUFFL0Isd0NBQWE7O0lBRWIsdUNBQXdDOztJQUV4Qyx5Q0FBa0M7O0lBS2xDLCtDQUFnQzs7Ozs7SUFFaEMsOENBQTRFOzs7OztJQUU1RSwyQ0FXRzs7Ozs7SUFFSCx5REFBNkQ7O0lBRTdELHVDQUFZOztJQUVaLDRDQUFnQzs7SUFFaEMsNkNBQWlDOztJQUlqQywyQ0FBcUM7Ozs7O0lBRXJDLDZDQUFpQzs7Ozs7SUFxQ2pDLGdEQXdGRTs7SUE3SlUsMENBQTZCOzs7OztJQUFFLG9DQUE4Qjs7Ozs7SUFBRSxxQ0FBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgU2VjdXJpdHlDb250ZXh0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBPbkRlc3Ryb3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBOZ1pvbmVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi4vdXRsaXMvaW5zZXJ0Q1NTJztcbmltcG9ydCB7IGJ1aWxkSW1wb3J0VXJsLCBnZW5lcmF0ZVV1aWQsIGJ1aWxkSW5pdFBheWxvYWQsIGNyZWF0ZUZpbGVTZW5kZXIsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UsIGNsYXNzaWZ5TGVnYWN5TWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuLy8gSG93IGxvbmcgd2Ugd2FpdCBmb3IgdGhlIGltcG9ydGVyIHRvIGNvbmZpcm0gYSBmaWxlIGl0IHdhcyBzZW50IGJlZm9yZSBnaXZpbmcgdXAgb24gaXQuXG5jb25zdCBGSUxFX0FDS19USU1FT1VUX01TID0gODAwMDtcblxuLy8gUGFnZS13aWRlIHJlY29yZCBvZiB0aGUgaW1wb3J0ZXJzIHRoYXQgYXJlIG9wZW4gb3Igb3BlbmluZywgc2hhcmVkIGJ5IGV2ZXJ5IENTVkJveCBhZGFwdGVyXG4vLyBvbiB0aGUgcGFnZSAoaXQgbGl2ZXMgb24gd2luZG93IHNvIHNlcGFyYXRlIGNvcGllcyBvZiBhbiBhZGFwdGVyIHNlZSB0aGUgc2FtZSBsaXN0KS4gSXQgZG9lc1xuLy8gdHdvIHRoaW5nczogdGhlIG5ld2VzdCBpbXBvcnRlciBpcyBzdGFja2VkIG9uIHRvcCAoZXZlcnkgaG9sZGVyIGlzIGZpeGVkLCBmdWxsIHNjcmVlbiBhbmRcbi8vIHotaW5kZXggMjE0NzQ4MzY0Nywgc28gZXF1YWwgei1pbmRleGVzIHdvdWxkIGxlYXZlIHRoZSBvbmUgdGhhdCBjb21lcyBmaXJzdCBpbiB0aGUgRE9NIG9uXG4vLyB0b3ApLCBhbmQgdGhlIG90aGVyIGluc3RhbmNlcyBsZWFybiB0aGF0IGFuIGltcG9ydGVyIGlzIG9wZW4gc28gdGhleSBjYW4gZGlzYWJsZSB0aGVpciBidXR0b24uXG5pbnRlcmZhY2UgT3BlbkltcG9ydGVyRW50cnkgeyBnZXRIb2xkZXI6ICgpID0+IEhUTUxFbGVtZW50IHwgbnVsbDsgfVxuaW50ZXJmYWNlIE9wZW5JbXBvcnRlcnMgeyBvcGVuOiBPcGVuSW1wb3J0ZXJFbnRyeVtdOyBsaXN0ZW5lcnM6IEFycmF5PCgpID0+IHZvaWQ+OyB9XG5jb25zdCBPUEVOX0lNUE9SVEVSU19LRVkgPSAnX19jc3Zib3hPcGVuSW1wb3J0ZXJzJztcbmNvbnN0IFRPUF9aX0lOREVYID0gMjE0NzQ4MzY0NztcblxuZnVuY3Rpb24gb3BlbkltcG9ydGVycygpOiBPcGVuSW1wb3J0ZXJzIHtcbiAgY29uc3QgdyA9IHdpbmRvdyBhcyBhbnk7XG4gIGlmICghd1tPUEVOX0lNUE9SVEVSU19LRVldKSB3W09QRU5fSU1QT1JURVJTX0tFWV0gPSB7IG9wZW46IFtdLCBsaXN0ZW5lcnM6IFtdIH07XG4gIHJldHVybiB3W09QRU5fSU1QT1JURVJTX0tFWV07XG59XG5cbmZ1bmN0aW9uIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZzogT3BlbkltcG9ydGVycyk6IHZvaWQge1xuICByZWcub3Blbi5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGNvbnN0IGhvbGRlciA9IGVudHJ5LmdldEhvbGRlcigpO1xuICAgIGlmIChob2xkZXIpIGhvbGRlci5zdHlsZS56SW5kZXggPSBTdHJpbmcoVE9QX1pfSU5ERVggLSAocmVnLm9wZW4ubGVuZ3RoIC0gMSAtIGkpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyT3BlbkltcG9ydGVyKGVudHJ5OiBPcGVuSW1wb3J0ZXJFbnRyeSk6IHZvaWQge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIGlmIChyZWcub3Blbi5pbmRleE9mKGVudHJ5KSA+PSAwKSByZXR1cm47XG4gIHJlZy5vcGVuLnB1c2goZW50cnkpO1xuICByZXN0YWNrT3BlbkltcG9ydGVycyhyZWcpO1xuICByZWcubGlzdGVuZXJzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbigpKTtcbn1cblxuZnVuY3Rpb24gdW5yZWdpc3Rlck9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICBjb25zdCBpID0gcmVnLm9wZW4uaW5kZXhPZihlbnRyeSk7XG4gIGlmIChpIDwgMCkgcmV0dXJuO1xuICByZWcub3Blbi5zcGxpY2UoaSwgMSk7XG4gIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZyk7XG4gIHJlZy5saXN0ZW5lcnMuc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKCkpO1xufVxuXG5mdW5jdGlvbiBpc0Jsb2NrZWRCeU9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiBib29sZWFuIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZXR1cm4gcmVnLm9wZW4ubGVuZ3RoID4gMCAmJiByZWcub3Blbi5pbmRleE9mKGVudHJ5KSA8IDA7XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZU9wZW5JbXBvcnRlcnMoZm46ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZWcubGlzdGVuZXJzLnB1c2goZm4pO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IGkgPSByZWcubGlzdGVuZXJzLmluZGV4T2YoZm4pO1xuICAgIGlmIChpID49IDApIHJlZy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICB9O1xufVxuXG5jb25zdCBhcHBWZXJzaW9uID0gJzEuMS4yMCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NzdmJveC1idXR0b24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBibG9ja2VkQnlPdGhlclwiIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5cbmV4cG9ydCBjbGFzcyBDU1ZCb3hCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblxuICBpc01vZGFsU2hvd24gPSBmYWxzZTtcblxuICBASW5wdXQoKSBvbkltcG9ydD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvblJlYWR5PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uQ2xvc2U/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25TdWJtaXQ/OiBGdW5jdGlvbjtcblxuICBASW5wdXQoKSBpc0ltcG9ydGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNDbG9zZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNTdWJtaXR0ZWQ/OiBGdW5jdGlvbjtcblxuICBASW5wdXQoKSBpbXBvcnRlclJlYWR5PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGNsb3NlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBzdWJtaXR0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaW1wb3J0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgbG9hZFN0YXJ0ZWQ/OiBGdW5jdGlvbjtcblxuICBASW5wdXQoKSB1c2VyPzogb2JqZWN0O1xuICBASW5wdXQoKSBkeW5hbWljQ29sdW1ucz86IG9iamVjdDtcbiAgQElucHV0KCkgbGljZW5zZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG9wdGlvbnM/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBjdXN0b21Eb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkYXRhTG9jYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGVudmlyb25tZW50Pzogb2JqZWN0O1xuXG4gIEBJbnB1dCgpIHRoZW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBpc0lmcmFtZUxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBvcGVuTW9kYWxPbklmcmFtZUxvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBsYXp5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2FmZVVybDogYW55O1xuXG4gIGlmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHNhbml0aXplcjpEb21TYW5pdGl6ZXIsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHt9XG5cbiAgLy8gVHJ1ZSB3aGlsZSBhIGRpZmZlcmVudCBpbXBvcnRlciBvbiB0aGUgcGFnZSBpcyBvcGVuOiB0aGUgYnV0dG9uIHN0YXlzIGRpc2FibGVkLlxuICBibG9ja2VkQnlPdGhlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVnaXN0cnlFbnRyeTogT3BlbkltcG9ydGVyRW50cnkgPSB7IGdldEhvbGRlcjogKCkgPT4gdGhpcy5ob2xkZXIgfTtcblxuICBwcml2YXRlIGZpbGVTZW5kZXIgPSBjcmVhdGVGaWxlU2VuZGVyKHtcbiAgICBnZXRJZnJhbWU6ICgpID0+IHRoaXMuaWZyYW1lLFxuICAgIGdldFRva2VuOiAoKSA9PiB0aGlzLnV1aWQgYXMgc3RyaW5nLFxuICAgIGdldFRhcmdldE9yaWdpbjogKCkgPT4gdGhpcy50YXJnZXRPcmlnaW4gYXMgc3RyaW5nLFxuICAgIGdldEJhc2VEb21haW46ICgpID0+IHRoaXMuYmFzZURvbWFpbixcbiAgICB0YWtlRmlsZTogKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMucGVuZGluZ0ZpbGU7XG4gICAgICB0aGlzLnBlbmRpbmdGaWxlID0gbnVsbDtcbiAgICAgIHJldHVybiBmaWxlO1xuICAgIH0sXG4gICAgb25TZW50OiAoKSA9PiB0aGlzLnN0YXJ0RmlsZUFja1RpbWVyKClcbiAgfSk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZU9wZW5JbXBvcnRlcnM6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGhvbGRlcjogYW55O1xuXG4gIHBlbmRpbmdGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XG5cbiAgdGFyZ2V0T3JpZ2luOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gRGF0YS1sb2NhdGlvbiBzaGVldHMgcmVkaXJlY3QgdG8gYW5vdGhlciBob3N0LCBzbyB0aGUgaWZyYW1lIG9yaWdpbiBjYW4gZGlmZmVyIGZyb21cbiAgLy8gdGFyZ2V0T3JpZ2luLiBiYXNlRG9tYWluIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHJlYWwgb3JpZ2luIGJlZm9yZSB0cnVzdGluZyBpdC5cbiAgYmFzZURvbWFpbjogc3RyaW5nID0gXCJhcHAuY3N2Ym94LmlvXCI7XG5cbiAgcHJpdmF0ZSBmaWxlQWNrVGltZXI6IGFueSA9IG51bGw7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG4gICAgbGV0IGlmcmFtZVVybCA9IGJ1aWxkSW1wb3J0VXJsKFxuICAgICAge1xuICAgICAgICBsaWNlbnNlS2V5OiB0aGlzLmxpY2Vuc2VLZXksXG4gICAgICAgIGN1c3RvbURvbWFpbjogdGhpcy5jdXN0b21Eb21haW4sXG4gICAgICAgIGRhdGFMb2NhdGlvbjogdGhpcy5kYXRhTG9jYXRpb24sXG4gICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICB0aGVtZTogdGhpcy50aGVtZSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZW52aXJvbm1lbnRcbiAgICAgIH0sXG4gICAgICBcImFuZ3VsYXJcIixcbiAgICAgIGFwcFZlcnNpb25cbiAgICApO1xuICAgIC8vIERlZmF1bHQgcGxhY2UgdG8gc2VuZCB0aGUgZmlsZS4gQSBmaWxlIGlzIG9ubHkgZXZlciBzZW50IHRvIGEgbmFtZWQgb3JpZ2luLCBuZXZlciBcIipcIi5cbiAgICB0aGlzLnRhcmdldE9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lVXJsKS5vcmlnaW47XG4gICAgdGhpcy5iYXNlRG9tYWluID0gdGhpcy5jdXN0b21Eb21haW4gfHwgXCJhcHAuY3N2Ym94LmlvXCI7XG4gICAgdGhpcy5zYWZlVXJsID0gdGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGlmcmFtZVVybCkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmKGNoYW5nZXNbXCJ1c2VyXCJdICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT0gY2hhbmdlc1sndXNlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlclZhcmlhYmUoY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVXNlclZhcmlhYmUoZGF0YTogYW55KTogdm9pZCB7XG4gICAgdGhpcy51c2VyID0gZGF0YTtcbiAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIFwiY3VzdG9tZXJcIiA6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VMaXN0ZW5lciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgLy8gT2xkZXIgaW1wb3J0ZXJzIHNlbmQgdGhlc2UgYXMgYmFyZSBzdHJpbmdzLCB3aXRob3V0IGEgdG9rZW4uXG4gICAgY29uc3QgbGVnYWN5ID0gY2xhc3NpZnlMZWdhY3lNZXNzYWdlKGV2ZW50LmRhdGEpO1xuICAgIGlmIChsZWdhY3kpIHtcbiAgICAgIC8vIExlZ2FjeSBtZXNzYWdlcyBjYXJyeSBubyB0b2tlbiwgc28gdGhlIG9ubHkgd2F5IHRvIHRlbGwgd2hpY2ggaW1wb3J0ZXIgc2VudCBvbmUgaXMgaXRzXG4gICAgICAvLyB3aW5kb3cuIElnbm9yZSB0aG9zZSB0aGF0IGNhbWUgZnJvbSBhbm90aGVyIGluc3RhbmNlJ3MgaWZyYW1lIChvciBhbnl3aGVyZSBlbHNlKS5cbiAgICAgIGlmICghdGhpcy5pZnJhbWUgfHwgZXZlbnQuc291cmNlICE9PSB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChsZWdhY3kudHlwZSA9PT0gXCJtYWluTW9kYWxIaWRkZW5cIikge1xuICAgICAgICB0aGlzLmhhbmRsZU1vZGFsQ2xvc2VkKCk7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2FjeS50eXBlID09PSBcInVwbG9hZFN1Y2Nlc3NmdWxcIikge1xuICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAobGVnYWN5LnR5cGUgPT09IFwidXBsb2FkRmFpbGVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0LWZpbGUgaGFuZHNoYWtlIG1lc3NhZ2VzLiBUaGUgc2hhcmVkIGNvcmUgZG9lcyBub3QgY2xhc3NpZnkgdGhlc2UsIHNvIHRoZXkgYXJlXG4gICAgLy8gcmVhZCBoZXJlLCBiZWhpbmQgdGhlIHNhbWUgdW5pcXVlX3Rva2VuIGNoZWNrIHRoZSBjb3JlIGFwcGxpZXMuXG4gICAgY29uc3QgcmF3ID0gZXZlbnQuZGF0YTtcbiAgICBpZiAocmF3ICYmIHR5cGVvZiByYXcgPT09IFwib2JqZWN0XCIgJiYgcmF3LmRhdGEgJiYgcmF3LmRhdGEudW5pcXVlX3Rva2VuID09IHRoaXMudXVpZCkge1xuICAgICAgdGhpcy5maWxlU2VuZGVyLmxlYXJuT3JpZ2luKGV2ZW50KTtcblxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1zZXQtZmlsZS1yZWplY3RlZFwiICYmIHJhdy5kYXRhLnJlYXNvbiA9PT0gXCJub3QtYS1maWxlXCIpIHtcbiAgICAgICAgLy8gUmVwbHkgdG8gb3VyIHByb2JlIChpdCBoYXMgbm8gZmlsZSkuIEl0IG9ubHkgdGVsbHMgdXMgdGhlIG9yaWdpbiwgc28gZG8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1tb2RhbC1zaG93blwiKSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWxlQWNrVGltZXIoKTtcbiAgICAgICAgcmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICAgICAgLy8gV2hhdCB0aGUgZmlsZSBwYXRoIGluIG9wZW5Nb2RhbCgpIGlzIHdhaXRpbmcgZm9yLiBkaXNwbGF5IGFzIHdlbGwgYXNcbiAgICAgICAgLy8gcG9pbnRlci1ldmVudHM6IGEgc2Vjb25kIGZpbGUgZGVjbGluZWQgd2hpbGUgdGhlIGZpcnN0IHdhcyBzdGlsbCBvcGVuaW5nIHRoZVxuICAgICAgICAvLyBtb2RhbCBoYXMgcHV0IHRoZSBob2xkZXIgYXdheSBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmF3LnR5cGUgPT09IFwiY3N2Ym94LXNldC1maWxlLXJlamVjdGVkXCIpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgaGFzIHRoZSBmaWxlIGFuZCB3aWxsIG5vdCB0YWtlIGl0LiBQdXQgdGhlIGhvbGRlciBhd2F5IG9ubHkgaWYgdGhlXG4gICAgICAgIC8vIG1vZGFsIHdhcyBuZXZlciBjb25maXJtZWQgdXA6IGEgZmlsZSBkZWNsaW5lZCB3aGlsZSBpdCBpcyBvcGVuIGxlYXZlcyB0aGF0IG1vZGFsXG4gICAgICAgIC8vIHdoZXJlIGl0IGlzLCBhbmQgaXRzIG93biAnY3N2Ym94LW1vZGFsLWhpZGRlbicgd2lsbCBwdXQgdGhlIGhvbGRlciBhd2F5LlxuICAgICAgICBpZiAoIXRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSBpbXBvcnRlciBkZWNsaW5lZCB0aGUgc3VwcGxpZWQgZmlsZTogXCIgKyByYXcuZGF0YS5yZWFzb24pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBjbGFzc2lmeVN0cnVjdHVyZWRNZXNzYWdlKGV2ZW50LmRhdGEsIHRoaXMudXVpZCEpO1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1vbi1zdWJtaXRcIikge1xuICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIGlmICh0aGlzLnN1Ym1pdHRlZCkgdGhpcy5zdWJtaXR0ZWQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICBpZiAoIW1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICBkZWxldGUgbWVzc2FnZS5tZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQobWVzc2FnZS5zdWNjZXNzLCBtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XG4gICAgICB0aGlzLmhhbmRsZU1vZGFsQ2xvc2VkKCk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xuICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm1lc3NhZ2VMaXN0ZW5lciwgZmFsc2UpO1xuICAgIHRoaXMuc3luY0Jsb2NrZWQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycyA9IHN1YnNjcmliZU9wZW5JbXBvcnRlcnMoKCkgPT4gdGhpcy5zeW5jQmxvY2tlZCgpKTtcblxuICAgIGlmKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW9kYWxDbG9zZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB7XG4gICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICB9XG4gICAgdGhpcy5pc01vZGFsU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLmlzSWZyYW1lTG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5ob2xkZXIpIHRoaXMuaG9sZGVyLnJlbW92ZSgpO1xuICAgIHRoaXMuaG9sZGVyID0gbnVsbDtcbiAgICB0aGlzLmlmcmFtZSA9IG51bGw7XG4gICAgLy8gQSBuZXcgaWZyYW1lIGlzIGJ1aWx0IG9uIHRoZSBuZXh0IG9wZW4sIHNvIHRoZSBvcmlnaW4gaXMgbGVhcm5lZCBhZ2Fpbi5cbiAgICB0aGlzLmNsZWFyUHJvYmVUaW1lcigpO1xuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcbiAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcbiAgfVxuXG4gIGluaXRJbXBvcnRlcigpIHtcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xuXG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsKTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwiYWxsb3dcIiwgXCJjbGlwYm9hcmQtcmVhZDsgY2xpcGJvYXJkLXdyaXRlICpcIik7XG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XG5cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLm9uUmVhZHkpIHNlbGYub25SZWFkeSgpO1xuICAgICAgaWYgKHNlbGYuaXNSZWFkeSkgc2VsZi5pc1JlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pbXBvcnRlclJlYWR5KSBzZWxmLmltcG9ydGVyUmVhZHkoKTtcblxuICAgICAgc2VsZi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5pc0lmcmFtZUxvYWRlZCA9IHRydWU7XG4gICAgICBpZiAoc2VsZi5pZnJhbWUgJiYgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKGJ1aWxkSW5pdFBheWxvYWQoc2VsZi51c2VyLCBzZWxmLmR5bmFtaWNDb2x1bW5zLCBzZWxmLm9wdGlvbnMsIHNlbGYudXVpZCEpLCBcIipcIik7XG4gICAgICB9XG4gICAgICBpZihzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xuICAgICAgICBzZWxmLm9wZW5Nb2RhbCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xuICAgIHRoaXMuaG9sZGVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcbiAgICAgICdiZWZvcmVlbmQnLCB0aGlzLmhvbGRlclxuICAgICk7XG4gICAgLy8gVGhlIGhvbGRlciBkaWQgbm90IGV4aXN0IHlldCBpZiBvcGVuTW9kYWwoKSBhc2tlZCBmb3IgdGhlIGltcG9ydGVyIGJlZm9yZSBpdCB3YXMgYnVpbHQuXG4gICAgcmVzdGFja09wZW5JbXBvcnRlcnMob3BlbkltcG9ydGVycygpKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICAvLyBDb3VudHMgYXMgb3BlbiBmcm9tIHRoZSBtb21lbnQgaXQgaXMgcmVxdWVzdGVkLCBzbyB0aGUgb3RoZXIgYnV0dG9ucyBhcmUgZGlzYWJsZWQgd2hpbGVcbiAgICAvLyB0aGlzIGltcG9ydGVyIGlzIHN0aWxsIGxvYWRpbmcsIGFuZCBzbyBpdCBpcyBzdGFja2VkIGFib3ZlIGFueSBpbXBvcnRlciBvcGVuZWQgZWFybGllci5cbiAgICByZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgIGlmKCF0aGlzLmlmcmFtZSkge1xuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICBpZih0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICAgIGlmKHRoaXMucGVuZGluZ0ZpbGUpIHtcbiAgICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgb3BlbnMgaXRzIG93biBtb2RhbCBvbmNlIGl0IGhhcyB0aGUgZmlsZSwgc28gdGhhdCBpdCBjYW4gaW5qZWN0IG9uXG4gICAgICAgICAgLy8gJ3Nob3duLmJzLm1vZGFsJy4gU2VuZGluZyAnb3Blbk1vZGFsJyBhcyB3ZWxsIHdvdWxkIHJhY2UgdGhhdC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEl0IGNhbiBhbHNvIGRlY2xpbmU6IHdyb25nIHN0ZXAsIGFuIGltcG9ydCBmaWxlIFVSTCBjb25maWd1cmVkIG9uIHRoZSBzaGVldCwgb3JcbiAgICAgICAgICAvLyBhbiBpbXBvcnRlciB0b28gb2xkIHRvIGtub3cgdGhlIG1lc3NhZ2UgYXQgYWxsLiBTbyB0aGUgaG9sZGVyIGdvZXMgdXBcbiAgICAgICAgICAvLyBjbGljay10aHJvdWdoIGFuZCBzdGF5cyB0aGF0IHdheSB1bnRpbCAnY3N2Ym94LW1vZGFsLXNob3duJyBjb25maXJtcyB0aGUgbW9kYWxcbiAgICAgICAgICAvLyBpcyByZWFsbHkgdXAuIEl0IGNvdmVycyB0aGUgdmlld3BvcnQgYXQgei1pbmRleCAyMTQ3NDgzNjQ3IGFuZCB0aGUgaW1wb3J0ZXJcbiAgICAgICAgICAvLyByZW5kZXJzIHRyYW5zcGFyZW50IHdpdGggaXRzIG1vZGFsIGNsb3NlZCwgc28gYXJtaW5nIGl0IG9uIGFuIHVuYW5zd2VyZWQgbWVzc2FnZVxuICAgICAgICAgIC8vIGxlYXZlcyBhbiBpbnZpc2libGUgc2hlZXQgb3ZlciB0aGUgaG9zdCBwYWdlIGVhdGluZyBldmVyeSBjbGljay5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGRpc3BsYXk6YmxvY2sgcmVnYXJkbGVzcywgc28gdGhlIGlmcmFtZSBsYXlzIG91dCBhbmQgYW5pbWF0ZXMgbm9ybWFsbHk7IG9ubHlcbiAgICAgICAgICAvLyBwb2ludGVyLWV2ZW50cyBpcyBoZWxkIGJhY2suIGlzTW9kYWxTaG93biBsaWtld2lzZSB3YWl0cyBmb3IgdGhlIGNvbmZpcm1hdGlvbixcbiAgICAgICAgICAvLyBvciBhIGRlY2xpbmVkIGZpbGUgd291bGQgbGF0Y2ggdGhlIGltcG9ydGVyIHNodXQgZm9yIGdvb2QuXG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maWxlU2VuZGVyLnNlbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0OiBhIHByZXZpb3VzbHkgZGVjbGluZWQgZmlsZSBsZWF2ZXMgdGhlIGhvbGRlciBjbGljay10aHJvdWdoLlxuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGltcG9ydGVyIG9uIGEgRmlsZSB0aGUgaG9zdCBwYWdlIGFscmVhZHkgaGFzLCBpbnN0ZWFkIG9mIHRoZSBmaWxlIHBpY2tlci5cbiAgICpcbiAgICogUmVhY2hhYmxlIHRocm91Z2ggYSB0ZW1wbGF0ZSByZWZlcmVuY2UgKGAjaW1wb3J0ZXJgIHRoZW4gYGltcG9ydGVyLm9wZW5Nb2RhbFdpdGhGaWxlKGZpbGUpYClcbiAgICogb3IgYEBWaWV3Q2hpbGQoQ1NWQm94QnV0dG9uQ29tcG9uZW50KWAuXG4gICAqXG4gICAqIFRoZSBGaWxlIGNyb3NzZXMgdG8gdGhlIGlmcmFtZSBieSBzdHJ1Y3R1cmVkIGNsb25lLCBzbyB0aGUgaW1wb3J0ZXIgcmVjZWl2ZXMgdGhlIHJlYWxcbiAgICogb2JqZWN0IGFuZCBhcHBsaWVzIGl0cyBvd24gZXh0ZW5zaW9uLCB3b3Jrc2hlZXQgYW5kIHNpemUgcnVsZXMgdG8gaXQgLS0gdGhpcyBkb2VzIG5vdFxuICAgKiBieXBhc3MgYW55IG9mIHRoZW0uIFBhc3MgYSBGaWxlOyBhIEJsb2IgaGFzIG5vIG5hbWUgZm9yIHRoZSBpbXBvcnRlciB0byByZWFkIGFuXG4gICAqIGV4dGVuc2lvbiBmcm9tLlxuICAgKi9cbiAgb3Blbk1vZGFsV2l0aEZpbGUoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgIGlmKHR5cGVvZiBGaWxlID09PSAndW5kZWZpbmVkJyB8fCAhKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0ZpbGUgPSBmaWxlO1xuXG4gICAgLy8gQWxyZWFkeSBvcGVuOiBoYW5kIGl0IG92ZXIgbm93IHJhdGhlciB0aGFuIGhvbGRpbmcgaXQgZm9yIHRoZSBuZXh0IG9wZW4uIFRoZSBpbXBvcnRlclxuICAgIC8vIHRha2VzIGl0IG9ubHkgd2hpbGUgaXQgaXMgc3RpbGwgb24gdGhlIHVwbG9hZCBzdGVwLCBhbmQgaWdub3JlcyBpdCBvbmNlIHRoZSB1c2VyIGhhcyBhXG4gICAgLy8gZGF0YXNldCBhbmQgYSBtYXBwaW5nIGluIHByb2dyZXNzLlxuICAgIGlmKHRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaWZyYW1lICYmIHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcbiAgICAgIHRoaXMuZmlsZVNlbmRlci5zZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuTW9kYWwoKTtcbiAgfVxuXG4gIGNsZWFyUHJvYmVUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlU2VuZGVyLnJlc2V0KCk7XG4gIH1cblxuICBzdGFydEZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlQWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUFja1RpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2l2ZVVwT25GaWxlKCk7XG4gICAgfSwgRklMRV9BQ0tfVElNRU9VVF9NUyk7XG4gIH1cblxuICBjbGVhckZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWxlQWNrVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZpbGVBY2tUaW1lcik7XG4gICAgICB0aGlzLmZpbGVBY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGltcG9ydGVyIG5ldmVyIGNvbmZpcm1lZCB0aGUgZmlsZSBpdCB3YXMgc2VudCAoYW4gb3JpZ2luIHdlIGRvIG5vdCB0cnVzdCwgb3IgYW4gaW1wb3J0ZXIgdG9vXG4gIC8vIG9sZCB0byBrbm93IHRoZSBtZXNzYWdlKS4gV2l0aG91dCB0aGlzIHRoZSBob2xkZXIgd291bGQgc3RheSB1cCwgaW52aXNpYmxlIGFuZCBjbGljay10aHJvdWdoLFxuICAvLyBhbmQgdGhlIG90aGVyIGluc3RhbmNlcycgYnV0dG9ucyB3b3VsZCBzdGF5IGRpc2FibGVkIGZvciBnb29kLlxuICBnaXZlVXBPbkZpbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvbGRlciA9IHRoaXMuaG9sZGVyO1xuICAgIGlmIChob2xkZXIpIHtcbiAgICAgIGhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSB0aGUgaW1wb3J0ZXIgZGlkIG5vdCByZXNwb25kIHRvIHRoZSBzdXBwbGllZCBmaWxlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQmxvY2tlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBibG9ja2VkID0gaXNCbG9ja2VkQnlPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZiAoYmxvY2tlZCAhPT0gdGhpcy5ibG9ja2VkQnlPdGhlcikge1xuICAgICAgLy8gVGhlIHJlZ2lzdHJ5IGNhbiBjYWxsIGJhY2sgZnJvbSBvdXRzaWRlIEFuZ3VsYXIncyB6b25lIChhbm90aGVyIGluc3RhbmNlLCBhbm90aGVyIGFwcCkuXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5ibG9ja2VkQnlPdGhlciA9IGJsb2NrZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclByb2JlVGltZXIoKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5tZXNzYWdlTGlzdGVuZXIpO1xuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZiAodGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKCk7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycyA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
|