@dereekb/dbx-firebase 12.5.0 → 12.5.2

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.
@@ -103,45 +103,52 @@ export function storageFileUploadFiles(input) {
103
103
  // emit new progress event
104
104
  _emitEvent();
105
105
  }
106
- function _markFileUploadDone(fileIndex, error) {
106
+ function _markFileUploadDone(fileIndex, finalError) {
107
107
  doneFileIndexes.add(fileIndex); // add to done file indexes
108
108
  activeFileIndexes.delete(fileIndex); // remove from active file indexes if it exists
109
109
  incompleteFileFileIndexes.delete(fileIndex); // remove from incomplete file indexes
110
110
  // update details
111
111
  allFilesAndDetails[fileIndex].endTime = new Date();
112
+ const error = finalError ?? allFilesAndDetails[fileIndex].error;
112
113
  allFilesAndDetails[fileIndex].success = !error;
113
114
  allFilesAndDetails[fileIndex].error = error;
114
115
  }
115
116
  function updateUploadProgress(input) {
116
- const { index: fileIndex, nextProgress, fileUploadTaskDone, error } = input;
117
- let nextOverallProgress = latestOverallProgress;
118
- const nextProgressPercent = fileUploadTaskDone ? 100 : (nextProgress?.progress ?? 0) * 100;
119
- // update the overall progress percentage
120
- if (nextProgressPercent) {
121
- // update the overall percentage
122
- const previousProgress = allFilesAndLatestProgress[fileIndex];
123
- const previousProgressPercent = previousProgress?.progress != null ? previousProgress.progress * 100 : 0;
124
- const progressPercentChange = nextProgressPercent - previousProgressPercent;
125
- // increase overall progress by the change
126
- nextOverallProgress += progressPercentChange * overallProgressPerCompletedFile;
127
- }
128
- // update the file progress
129
- if (nextProgress) {
130
- // update the latest FileProgress
131
- allFilesAndLatestProgress[fileIndex] = nextProgress;
132
- // only set fileRef once
133
- if (!allFilesAndDetails[fileIndex].fileRef) {
134
- allFilesAndDetails[fileIndex].fileRef = nextProgress.fileRef;
117
+ const { index: fileIndex, nextProgress, fileUploadTaskDone: inputFileUploadTaskDone, nonProgressError } = input;
118
+ const error = nonProgressError ?? nextProgress?.error;
119
+ const fileUploadTaskDone = inputFileUploadTaskDone ?? Boolean(error);
120
+ // the task may already be done, as after a progress-related error the complete task can get called.
121
+ const isTaskAlreadyDone = allFilesAndDetails[fileIndex].endTime != null;
122
+ if (!isTaskAlreadyDone) {
123
+ let nextOverallProgress = latestOverallProgress;
124
+ const nextProgressPercent = fileUploadTaskDone ? 100 : (nextProgress?.progress ?? 0) * 100;
125
+ // update the overall progress percentage
126
+ if (nextProgressPercent) {
127
+ // update the overall percentage
128
+ const previousProgress = allFilesAndLatestProgress[fileIndex];
129
+ const previousProgressPercent = previousProgress?.progress != null ? previousProgress.progress * 100 : 0;
130
+ const progressPercentChange = nextProgressPercent - previousProgressPercent;
131
+ // increase overall progress by the change
132
+ nextOverallProgress += progressPercentChange * overallProgressPerCompletedFile;
135
133
  }
134
+ // update the file progress
135
+ if (nextProgress) {
136
+ // update the latest FileProgress
137
+ allFilesAndLatestProgress[fileIndex] = nextProgress;
138
+ // only set fileRef once
139
+ if (!allFilesAndDetails[fileIndex].fileRef) {
140
+ allFilesAndDetails[fileIndex].fileRef = nextProgress.fileRef;
141
+ }
142
+ }
143
+ // if complete, update the indexes and details
144
+ if (fileUploadTaskDone) {
145
+ _markFileUploadDone(fileIndex, error);
146
+ }
147
+ // update the overall progress
148
+ latestOverallProgress = nextOverallProgress;
149
+ // emit the event to send it
150
+ _emitEvent(nextProgress);
136
151
  }
137
- // if complete, update the indexes and details
138
- if (fileUploadTaskDone) {
139
- _markFileUploadDone(fileIndex, error);
140
- }
141
- // update the overall progress
142
- latestOverallProgress = nextOverallProgress;
143
- // emit the event to send it
144
- _emitEvent(nextProgress);
145
152
  }
146
153
  function _emitEvent(nextProgress) {
147
154
  const isComplete = incompleteFileFileIndexes.size === 0;
@@ -200,7 +207,7 @@ export function storageFileUploadFiles(input) {
200
207
  // error occurred, update the progress with the error
201
208
  updateUploadProgress({
202
209
  index,
203
- error,
210
+ nonProgressError: error,
204
211
  fileUploadTaskDone: true
205
212
  });
206
213
  // always resolve, never reject
@@ -241,7 +248,6 @@ export function storageFileUploadFiles(input) {
241
248
  retriesAllowed: 0 // no retries allowed
242
249
  }).then(() => {
243
250
  // all tasks are finished. Complete the subscriber.
244
- console.log('complete');
245
251
  subscriber.complete();
246
252
  });
247
253
  }).pipe(shareReplay(1));
@@ -251,4 +257,4 @@ export function storageFileUploadFiles(input) {
251
257
  };
252
258
  return instance;
253
259
  }
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUudXBsb2FkLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2NvbnRhaW5lci9zdG9yYWdlZmlsZS51cGxvYWQuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwRSxPQUFPLEVBQXFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFxRXhEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE1BQXNDO0lBQzdFLE1BQU0sRUFBRSxjQUFjLEVBQUUsOEJBQThCLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFbEUsSUFBSSxTQUFtQyxDQUFDO0lBRXhDLE9BQU87UUFDTCxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUzRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsdUJBQXVCLENBQUM7WUFDaEQsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTdELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFnRCxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNqRixJQUFJLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QyxTQUFTLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUV0RCx5REFBeUQ7b0JBQ3pELFNBQVM7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QyxDQUFDO1FBQ0wsQ0FBQztRQUVELGdDQUFnQztRQUNoQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFVLENBQUMsQ0FBQztRQUV6RSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLEVBQUU7WUFDdkQsZ0JBQWdCO1lBQ2hCLGNBQWMsRUFBRSxDQUFDLENBQUMscUJBQXFCO1NBQ3hDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1gsbURBQW1EO1lBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXhCLE1BQU0sUUFBUSxHQUFtQztRQUMvQyxNQUFNO1FBQ04sTUFBTTtLQUNQLENBQUM7SUFFRixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcyB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB7IERieEZpcmViYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zdG9yYWdlL2ZpcmViYXNlLnN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBJbmRleE51bWJlciwgTWF5YmUsIFBlcmNlbnREZWNpbWFsLCBQZXJjZW50TnVtYmVyLCBQcm9taXNlT3JWYWx1ZSwgcnVuQXN5bmNUYXNrc0ZvclZhbHVlcywgc2VwYXJhdGVWYWx1ZXMgfSBmcm9tICdAZGVyZWVrYi91dGlsJztcbmltcG9ydCB7IE11bHRpU3Vic2NyaXB0aW9uT2JqZWN0IH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBGaXJlYmFzZVN0b3JhZ2VBY2Nlc3NvckZpbGUsIFN0b3JhZ2VDdXN0b21NZXRhZGF0YSwgU3RvcmFnZVBhdGhJbnB1dCwgU3RvcmFnZVVwbG9hZE9wdGlvbnMsIFN0b3JhZ2VVcGxvYWRUYXNrIH0gZnJvbSAnQGRlcmVla2IvZmlyZWJhc2UnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JzZXJ2YWJsZSBmb3IgdXBsb2FkaW5nIGEgZmlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgU3RvcmFnZUZpbGVVcGxvYWRIYW5kbGVyRnVuY3Rpb24gPSAoZmlsZTogRmlsZSkgPT4gUHJvbWlzZTxTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJJbnN0YW5jZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUZpbGVVcGxvYWRIYW5kbGVySW5zdGFuY2UgZXh0ZW5kcyBQaWNrPFN0b3JhZ2VVcGxvYWRUYXNrPEZpcmViYXNlU3RvcmFnZUFjY2Vzc29yRmlsZT4sICd0YXNrUmVmJyB8ICdwYXVzZScgfCAncmVzdW1lJyB8ICdjYW5jZWwnPiB7XG4gIC8qKlxuICAgKiBUaGUgdXBsb2FkIG9ic2VydmFibGUuXG4gICAqXG4gICAqIE11c3QgYmUgc3Vic2NyaWJlZCB0byBpbiBvcmRlciBmb3IgdGhlIHVwbG9hZCB0byBiZWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHVwbG9hZDogT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVGaWxlUHJvZ3Jlc3M+O1xufVxuXG4vKipcbiAqIEhhbmRsZXMgdXBsb2FkaW5nIGZpbGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlciB7XG4gIC8qKlxuICAgKiBVcGxvYWRzIGEgZmlsZSwgYW5kIHJldHVybnMgdGhlIGZpbGUgcHJvZ3Jlc3MgYXMgaXQgaXMgdXBsb2FkaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgdXBsb2FkRmlsZTogU3RvcmFnZUZpbGVVcGxvYWRIYW5kbGVyRnVuY3Rpb247XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgZmlsZSB1cGxvYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUZpbGVVcGxvYWRDb25maWcge1xuICAvKipcbiAgICogUGF0aCBmb3Igd2hlcmUgdG8gdXBsb2FkIHRoZSBmaWxlIHRvXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlUGF0aDogU3RvcmFnZVBhdGhJbnB1dDtcbiAgLyoqXG4gICAqIFVwbG9hZCBvcHRpb25zIGZvciB0aGUgZmlsZS5cbiAgICpcbiAgICogUmVzdW1hYmxlIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAqL1xuICByZWFkb25seSB1cGxvYWRPcHRpb25zPzogU3RvcmFnZUZpbGVVcGxvYWRDb25maWdPcHRpb25zO1xuICAvKipcbiAgICogQ3VzdG9tIG1ldGFkYXRhIGZvciB0aGUgZmlsZS5cbiAgICpcbiAgICogSXMgbWVyZ2VkIHdpdGggdXBsb2FkT3B0aW9ucydzIG1ldGFkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tTWV0YWRhdGE/OiBTdG9yYWdlQ3VzdG9tTWV0YWRhdGE7XG59XG5cbi8qKlxuICogU3RvcmFnZUZpbGVVcGxvYWRDb25maWcgdXBsb2FkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0b3JhZ2VGaWxlVXBsb2FkQ29uZmlnT3B0aW9ucyA9IE9taXQ8U3RvcmFnZVVwbG9hZE9wdGlvbnMsICdyZXN1bWFibGUnPjtcblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIGZpbGUgbmFtZXMgZm9yIHRoZSB1cGxvYWRlZCBmaWxlcy5cbiAqXG4gKiBJZiBub3Qgc2V0LCB0aGUgZmlsZSBuYW1lIHdpbGwgYmUgdXNlZCBhcyBpcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RvcmFnZUZpbGVVcGxvYWRDb25maWdGYWN0b3J5ID0gKGZpbGU6IEZpbGUpID0+IFByb21pc2VPclZhbHVlPFN0b3JhZ2VGaWxlVXBsb2FkQ29uZmlnPjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXIoKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJDb25maWcge1xuICByZWFkb25seSBzdG9yYWdlU2VydmljZTogRGJ4RmlyZWJhc2VTdG9yYWdlU2VydmljZTtcbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVVcGxvYWRDb25maWdGYWN0b3J5OiBTdG9yYWdlRmlsZVVwbG9hZENvbmZpZ0ZhY3Rvcnk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXIoY29uZmlnOiBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJDb25maWcpOiBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXIge1xuICBjb25zdCB7IHN0b3JhZ2VTZXJ2aWNlLCBzdG9yYWdlRmlsZVVwbG9hZENvbmZpZ0ZhY3RvcnkgfSA9IGNvbmZpZztcblxuICBsZXQgcmVzdW1hYmxlOiBNYXliZTxTdG9yYWdlVXBsb2FkVGFzaz47XG5cbiAgcmV0dXJuIHtcbiAgICB1cGxvYWRGaWxlOiBhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmFnZUZpbGVVcGxvYWRDb25maWcgPSBhd2FpdCBzdG9yYWdlRmlsZVVwbG9hZENvbmZpZ0ZhY3RvcnkoZmlsZSk7XG5cbiAgICAgIGNvbnN0IHsgc3RvcmFnZVBhdGggfSA9IHN0b3JhZ2VGaWxlVXBsb2FkQ29uZmlnO1xuICAgICAgY29uc3Qgc3RvcmFnZUFjY2Vzc29yRmlsZSA9IHN0b3JhZ2VTZXJ2aWNlLmZpbGUoc3RvcmFnZVBhdGgpO1xuXG4gICAgICBjb25zdCB1cGxvYWQgPSBuZXcgT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVGaWxlUHJvZ3Jlc3M+KCh4KSA9PiB7XG4gICAgICAgIGlmIChzdG9yYWdlQWNjZXNzb3JGaWxlLnVwbG9hZFJlc3VtYWJsZSkge1xuICAgICAgICAgIHJlc3VtYWJsZSA9IHN0b3JhZ2VBY2Nlc3NvckZpbGUudXBsb2FkUmVzdW1hYmxlKGZpbGUpO1xuXG4gICAgICAgICAgLy8gc3Vic2NyaWJlIHRvIHRoZSBldmVudCBieSBwaXBpbmcgdGhpcyBvYnNlcnZhYmxlIHRvIGl0XG4gICAgICAgICAgcmVzdW1hYmxlXG4gICAgICAgICAgICAuc3RyZWFtU25hcHNob3RFdmVudHMoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgoeCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYnl0ZXNUcmFuc2ZlcnJlZCwgdG90YWxCeXRlcyB9ID0geDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzOiBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVGaWxlUHJvZ3Jlc3MgPSB7XG4gICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgZmlsZVJlZjogc3RvcmFnZUFjY2Vzc29yRmlsZSxcbiAgICAgICAgICAgICAgICAgIHVwbG9hZFJlZjogcmVzdW1hYmxlLFxuICAgICAgICAgICAgICAgICAgYnl0ZXNUcmFuc2ZlcnJlZCxcbiAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgICAgICAgICAgICBwcm9ncmVzczogYnl0ZXNUcmFuc2ZlcnJlZCAvIHRvdGFsQnl0ZXNcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaWYgYW4gZXJyb3Igb2NjdXJzLCBjYXRjaCBpdCBhbmQgZW1pdCBpdCBhcyBhIHByb2dyZXNzXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3M6IERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcyA9IHtcbiAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICBmaWxlUmVmOiBzdG9yYWdlQWNjZXNzb3JGaWxlLFxuICAgICAgICAgICAgICAgICAgdXBsb2FkUmVmOiByZXN1bWFibGUsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgIGZhaWxlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YocHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VwbG9hZFJlc3VtYWJsZSgpIGZ1bmN0aW9uIHdhcyB1bmF2YWlsYWJsZS4nKTtcbiAgICAgICAgfVxuICAgICAgfSkucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgICAgIGNvbnN0IGluc3RhbmNlOiBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJJbnN0YW5jZSA9IHtcbiAgICAgICAgdXBsb2FkLFxuICAgICAgICB0YXNrUmVmOiBzdG9yYWdlQWNjZXNzb3JGaWxlLFxuICAgICAgICBwYXVzZTogKCkgPT4gcmVzdW1hYmxlPy5wYXVzZSgpID8/IGZhbHNlLFxuICAgICAgICByZXN1bWU6ICgpID0+IHJlc3VtYWJsZT8ucmVzdW1lKCkgPz8gZmFsc2UsXG4gICAgICAgIGNhbmNlbDogKCkgPT4gcmVzdW1hYmxlPy5jYW5jZWwoKSA/PyBmYWxzZVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gTUFSSzogVXBsb2FkIEZpbGVzXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNJbnB1dCB7XG4gIHJlYWRvbmx5IHVwbG9hZEhhbmRsZXI6IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlcjtcbiAgLyoqXG4gICAqIEZpbGVzIHRvIHVwbG9hZFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZXM6IEZpbGVbXTtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbWF4IHBhcmFsbGVsIHVwbG9hZHMgdG8gcGVyZm9ybSBhdCBhIHRpbWUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIDNcbiAgICovXG4gIHJlYWRvbmx5IG1heFBhcmFsbGVsVXBsb2Fkcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzSW5zdGFuY2Uge1xuICAvKipcbiAgICogQ2FuY2VscyB0aGUgdXBsb2FkIG9mIHRoZSByZW1haW5pbmcgZmlsZXMuXG4gICAqL1xuICBjYW5jZWwoKTogdm9pZDtcbiAgLyoqXG4gICAqIFRoZSB1cGxvYWQgb2JzZXJ2YWJsZS5cbiAgICpcbiAgICogTXVzdCBiZSBzdWJzY3JpYmVkIHRvIGluIG9yZGVyIGZvciB0aGUgdXBsb2FkIHRvIGJlZ2luLlxuICAgKi9cbiAgcmVhZG9ubHkgdXBsb2FkOiBPYnNlcnZhYmxlPFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNFdmVudD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0V2ZW50IHtcbiAgLyoqXG4gICAqIEFsbCBmaWxlcyBiZWluZyB1cGxvYWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgYWxsRmlsZXM6IEZpbGVbXTtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgZmlsZXMgaGF2ZSBiZWVuIHVwbG9hZGVkLlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IHZhbHVlIHNob3VsZCBiZSBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBpc0NvbXBsZXRlOiBib29sZWFuO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB1cGxvYWQgd2FzIGNhbmNlbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYW5jZWxlZD86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogVGhlIG92ZXJhbGwgcHJvZ3Jlc3Mgb2YgYWxsIGZpbGVzIGJlaW5nIHVwbG9hZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcmFsbFByb2dyZXNzOiBQZXJjZW50TnVtYmVyO1xuICAvKipcbiAgICogVGhlIHVwbG9hZCBwcm9ncmVzcyB0aGF0IHRyaWdnZXJlZCB0aGlzIGV2ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdXBsb2FkUHJvZ3Jlc3M/OiBNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVGaWxlUHJvZ3Jlc3M+O1xuICAvKipcbiAgICogVGhlIGZpbmFsIHJlc3VsdC5cbiAgICpcbiAgICogU2V0IHdoZW4gdGhlIGZpbmFsIGZpbGUgaGFzIGJlZW4gdXBsb2FkZWQgb3IgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdWx0PzogU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0ZpbmFsUmVzdWx0O1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGFyZSBzdGlsbCB1cGxvYWRpbmcgb3IgcXVldWVkIGZvciB1cGxvYWQuXG4gICAqL1xuICByZWFkb25seSBpbmNvbXBsZXRlRmlsZUNvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgYXJlIGFjdGl2ZS5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZUZpbGVDb3VudDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGFyZSBkb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9uZUZpbGVDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNGaW5hbFJlc3VsdCB7XG4gIHJlYWRvbmx5IHN0YXJ0VGltZTogRGF0ZTtcbiAgcmVhZG9ubHkgZW5kVGltZTogRGF0ZTtcbiAgcmVhZG9ubHkgZmlsZVJlc3VsdHM6IFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNGaW5hbEZpbGVSZXN1bHRbXTtcbiAgcmVhZG9ubHkgc3VjY2Vzc0ZpbGVSZXN1bHRzOiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRmluYWxGaWxlUmVzdWx0W107XG4gIHJlYWRvbmx5IGVycm9yRmlsZVJlc3VsdHM6IFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNGaW5hbEZpbGVSZXN1bHRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRmluYWxGaWxlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBzdGFydCB0aW1lIG9mIHRoZSBmaWxlIHVwbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VGltZTogRGF0ZTtcbiAgLyoqXG4gICAqIFRoZSBlbmQgdGltZSBvZiB0aGUgZmlsZSB1cGxvYWQsIG9yIHdoZW4gaXQgZmFpbGVkIG9yIHdhcyBjYW5jZWxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGVuZFRpbWU6IERhdGU7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGF0IHdhcyB1cGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGU6IEZpbGU7XG4gIC8qKlxuICAgKiBUaGUgYWNjZXNzb3IgZmlsZSBmb3IgdGhlIGZpbGUsIGlmIGF2YWlsYWJsZS5cbiAgICpcbiAgICogSXMgZ2VuZXJhbGx5IGF2YWlsYWJsZSBpZiBzdWNjZXNzIGlzIHRydWUuXG4gICAqL1xuICByZWFkb25seSBmaWxlUmVmPzogTWF5YmU8RmlyZWJhc2VTdG9yYWdlQWNjZXNzb3JGaWxlPjtcbiAgLyoqXG4gICAqIFRydWUgaWYgdGhlIGZpbGUgd2FzIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHJlYWRvbmx5IHN1Y2Nlc3M6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFcnJvciBpZiB0aGUgZmlsZSBmYWlsZWQgdG8gdXBsb2FkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBNYXliZTx1bmtub3duPjtcbiAgLyoqXG4gICAqIFRydWUgaWYgdGhlIGZpbGUgdXBsb2FkIHdhcyBjYW5jZWxsZWQuXG4gICAqL1xuICByZWFkb25seSBjYW5jZWxlZD86IE1heWJlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIFVwbG9hZHMgZmlsZXMgdXNpbmcgdGhlIHByb3ZpZGVkIHVwbG9hZCBoYW5kbGVyIGFuZCBmaWxlcy5cbiAqXG4gKiBBbiBvYnNlcnZhYmxlIGlzIHJldHVybmVkIHRoYXQgZW1pdHMgdGhlIGxhdGVzdCBmaWxlIGV2ZW50cyBmcm9tIGFueSBmaWxlIHRoYXQgaXMgYmVpbmcgdXBsb2FkZWQuXG4gKlxuICogQHBhcmFtIGlucHV0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmFnZUZpbGVVcGxvYWRGaWxlcyhpbnB1dDogU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0lucHV0KTogU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0luc3RhbmNlIHtcbiAgY29uc3QgeyB1cGxvYWRIYW5kbGVyLCBmaWxlcywgbWF4UGFyYWxsZWxVcGxvYWRzOiBpbnB1dE1heFBhcmFsbGVsVXBsb2FkcyB9ID0gaW5wdXQ7XG4gIGNvbnN0IG1heFBhcmFsbGVsVGFza3MgPSBpbnB1dE1heFBhcmFsbGVsVXBsb2FkcyA/PyAzO1xuXG4gIGNvbnN0IG11bHRpVXBsb2Fkc1N1YnNjcmlwdGlvbk9iamVjdCA9IG5ldyBNdWx0aVN1YnNjcmlwdGlvbk9iamVjdCgpO1xuXG4gIC8vIGJlZ2luIHRoZSB1cGxvYWQgZm9yIGVhY2ggZmlsZVxuICBjb25zdCBhbGxGaWxlcyA9IEFycmF5LmZyb20oZmlsZXMpO1xuXG4gIC8vIHVuc3Vic2NyaWJlIGZyb20gYWxsIHByZXZpb3VzIHVwbG9hZHNcbiAgbXVsdGlVcGxvYWRzU3Vic2NyaXB0aW9uT2JqZWN0LnVuc3ViKCk7XG5cbiAgaW50ZXJmYWNlIFVwZGF0ZVVwbG9hZFByb2dyZXNzSW5wdXQge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWxlIGluZGV4IG51bWJlci5cbiAgICAgKi9cbiAgICByZWFkb25seSBpbmRleDogSW5kZXhOdW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG5leHQgcHJvZ3Jlc3MgZXZlbnQsIGlmIGFwcGxpY2FibGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbmV4dFByb2dyZXNzPzogTWF5YmU8RGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlRmlsZVByb2dyZXNzPjtcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciB0aGF0IG9jY3VyZWQsIGlmIGFwcGxpY2FibGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXJyb3I/OiBNYXliZTx1bmtub3duPjtcbiAgICAvKipcbiAgICAgKiBQYXNzZWQgYXMgdHJ1ZSB3aGVuIHRoZSB1cGxvYWQgdGFzayBpcyBkb25lLlxuICAgICAqXG4gICAgICogRG9lcyBub3Qgc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWNjZXNzIHdhcyBhY2hpZXZlZCBvciBub3QuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZmlsZVVwbG9hZFRhc2tEb25lPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoZSB1cGxvYWQgd2FzIGNhbmNlbGVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhbmNlbGVkPzogYm9vbGVhbjtcbiAgfVxuXG4gIGludGVyZmFjZSBGaWxlVXBsb2FkRGV0YWlscyB7XG4gICAgcmVhZG9ubHkgZmlsZTogRmlsZTtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB1cGxvYWQgaW5zdGFuY2UgZm9yIHRoZSBmaWxlLlxuICAgICAqXG4gICAgICogU2V0IGlmIHRoZSBmaWxlIGlzIGN1cnJlbnRseSB1cGxvYWRpbmcuXG4gICAgICovXG4gICAgdXBsb2FkSW5zdGFuY2U/OiBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJJbnN0YW5jZTtcbiAgICBmaWxlUmVmPzogTWF5YmU8RmlyZWJhc2VTdG9yYWdlQWNjZXNzb3JGaWxlPjtcbiAgICBzdGFydFRpbWU/OiBEYXRlO1xuICAgIGVuZFRpbWU/OiBEYXRlO1xuICAgIHN1Y2Nlc3M/OiBib29sZWFuO1xuICAgIGNhbmNlbGVkPzogTWF5YmU8Ym9vbGVhbj47XG4gICAgZXJyb3I/OiBNYXliZTx1bmtub3duPjtcbiAgfVxuXG4gIGNvbnN0IGFsbEZpbGVzQW5kTGF0ZXN0UHJvZ3Jlc3M6IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcz5bXSA9IG5ldyBBcnJheShhbGxGaWxlcy5sZW5ndGgpO1xuICBjb25zdCBhbGxGaWxlc0FuZERldGFpbHM6IEZpbGVVcGxvYWREZXRhaWxzW10gPSBhbGxGaWxlcy5tYXAoKGZpbGUpID0+ICh7IGZpbGUgfSkpO1xuICBjb25zdCBvdmVyYWxsUHJvZ3Jlc3NQZXJDb21wbGV0ZWRGaWxlOiBQZXJjZW50RGVjaW1hbCA9ICgxIC8gYWxsRmlsZXNBbmRMYXRlc3RQcm9ncmVzcy5sZW5ndGgpIGFzIFBlcmNlbnREZWNpbWFsO1xuXG4gIC8qKlxuICAgKiBPbmNlIHNldCwgYW55IG5ldyBmaWxlIHVwbG9hZCB0YXNrIHRoYXQgaGl0cyB0aGlzIHdpbGwgcmV0dXJuIGFuIGNhbmNlbCBmYWlsdXJlLlxuICAgKi9cbiAgbGV0IGZsYWdnZWRDYW5jZWwgPSBmYWxzZTtcblxuICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgZmxhZ2dlZENhbmNlbCA9IHRydWU7XG4gIH07XG5cbiAgY29uc3QgdXBsb2FkID0gbmV3IE9ic2VydmFibGU8U3RvcmFnZUZpbGVVcGxvYWRGaWxlc0V2ZW50Pigoc3Vic2NyaWJlcikgPT4ge1xuICAgIGNvbnN0IG92ZXJhbGxTdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgY29uc3QgaW5jb21wbGV0ZUZpbGVGaWxlSW5kZXhlcyA9IG5ldyBTZXQ8SW5kZXhOdW1iZXI+KGFsbEZpbGVzLm1hcCgoXywgaW5kZXgpID0+IGluZGV4KSk7XG4gICAgY29uc3QgYWN0aXZlRmlsZUluZGV4ZXMgPSBuZXcgU2V0PEluZGV4TnVtYmVyPigpO1xuICAgIGNvbnN0IGRvbmVGaWxlSW5kZXhlcyA9IG5ldyBTZXQ8SW5kZXhOdW1iZXI+KCk7XG4gICAgbGV0IGxhdGVzdE92ZXJhbGxQcm9ncmVzczogUGVyY2VudE51bWJlciA9IDA7XG5cbiAgICBmdW5jdGlvbiBvblN0YXJ0RmlsZVVwbG9hZChpbmRleDogSW5kZXhOdW1iZXIsIHVwbG9hZEluc3RhbmNlOiBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJJbnN0YW5jZSkge1xuICAgICAgYWN0aXZlRmlsZUluZGV4ZXMuYWRkKGluZGV4KTtcbiAgICAgIGFsbEZpbGVzQW5kRGV0YWlsc1tpbmRleF0uc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbiAgICAgIGFsbEZpbGVzQW5kRGV0YWlsc1tpbmRleF0udXBsb2FkSW5zdGFuY2UgPSB1cGxvYWRJbnN0YW5jZTtcbiAgICAgIGFsbEZpbGVzQW5kRGV0YWlsc1tpbmRleF0uZmlsZVJlZiA9IHVwbG9hZEluc3RhbmNlLnRhc2tSZWY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25TdGFydEZpbGVVcGxvYWRGbGFnZ2VkQ2FuY2VsbGVkKGluZGV4OiBJbmRleE51bWJlcikge1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5zdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAvLyBpbW1lZGlhdGVseSBtYXJrIGl0IGRvbmVcbiAgICAgIF9tYXJrRmlsZVVwbG9hZERvbmUoaW5kZXgsIHRydWUpO1xuXG4gICAgICAvLyBlbWl0IG5ldyBwcm9ncmVzcyBldmVudFxuICAgICAgX2VtaXRFdmVudCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIF9tYXJrRmlsZVVwbG9hZERvbmUoZmlsZUluZGV4OiBJbmRleE51bWJlciwgZXJyb3I/OiBNYXliZTx1bmtub3duPikge1xuICAgICAgZG9uZUZpbGVJbmRleGVzLmFkZChmaWxlSW5kZXgpOyAvLyBhZGQgdG8gZG9uZSBmaWxlIGluZGV4ZXNcbiAgICAgIGFjdGl2ZUZpbGVJbmRleGVzLmRlbGV0ZShmaWxlSW5kZXgpOyAvLyByZW1vdmUgZnJvbSBhY3RpdmUgZmlsZSBpbmRleGVzIGlmIGl0IGV4aXN0c1xuICAgICAgaW5jb21wbGV0ZUZpbGVGaWxlSW5kZXhlcy5kZWxldGUoZmlsZUluZGV4KTsgLy8gcmVtb3ZlIGZyb20gaW5jb21wbGV0ZSBmaWxlIGluZGV4ZXNcblxuICAgICAgLy8gdXBkYXRlIGRldGFpbHNcbiAgICAgIGFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmVuZFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2ZpbGVJbmRleF0uc3VjY2VzcyA9ICFlcnJvcjtcbiAgICAgIGFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmVycm9yID0gZXJyb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlVXBsb2FkUHJvZ3Jlc3MoaW5wdXQ6IFVwZGF0ZVVwbG9hZFByb2dyZXNzSW5wdXQpIHtcbiAgICAgIGNvbnN0IHsgaW5kZXg6IGZpbGVJbmRleCwgbmV4dFByb2dyZXNzLCBmaWxlVXBsb2FkVGFza0RvbmUsIGVycm9yIH0gPSBpbnB1dDtcblxuICAgICAgbGV0IG5leHRPdmVyYWxsUHJvZ3Jlc3MgPSBsYXRlc3RPdmVyYWxsUHJvZ3Jlc3M7XG4gICAgICBjb25zdCBuZXh0UHJvZ3Jlc3NQZXJjZW50ID0gZmlsZVVwbG9hZFRhc2tEb25lID8gMTAwIDogKG5leHRQcm9ncmVzcz8ucHJvZ3Jlc3MgPz8gMCkgKiAxMDA7XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgb3ZlcmFsbCBwcm9ncmVzcyBwZXJjZW50YWdlXG4gICAgICBpZiAobmV4dFByb2dyZXNzUGVyY2VudCkge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIG92ZXJhbGwgcGVyY2VudGFnZVxuICAgICAgICBjb25zdCBwcmV2aW91c1Byb2dyZXNzID0gYWxsRmlsZXNBbmRMYXRlc3RQcm9ncmVzc1tmaWxlSW5kZXhdO1xuICAgICAgICBjb25zdCBwcmV2aW91c1Byb2dyZXNzUGVyY2VudCA9IHByZXZpb3VzUHJvZ3Jlc3M/LnByb2dyZXNzICE9IG51bGwgPyBwcmV2aW91c1Byb2dyZXNzLnByb2dyZXNzICogMTAwIDogMDtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3NQZXJjZW50Q2hhbmdlID0gbmV4dFByb2dyZXNzUGVyY2VudCAtIHByZXZpb3VzUHJvZ3Jlc3NQZXJjZW50O1xuXG4gICAgICAgIC8vIGluY3JlYXNlIG92ZXJhbGwgcHJvZ3Jlc3MgYnkgdGhlIGNoYW5nZVxuICAgICAgICBuZXh0T3ZlcmFsbFByb2dyZXNzICs9IHByb2dyZXNzUGVyY2VudENoYW5nZSAqIG92ZXJhbGxQcm9ncmVzc1BlckNvbXBsZXRlZEZpbGU7XG4gICAgICB9XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgZmlsZSBwcm9ncmVzc1xuICAgICAgaWYgKG5leHRQcm9ncmVzcykge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIGxhdGVzdCBGaWxlUHJvZ3Jlc3NcbiAgICAgICAgYWxsRmlsZXNBbmRMYXRlc3RQcm9ncmVzc1tmaWxlSW5kZXhdID0gbmV4dFByb2dyZXNzO1xuXG4gICAgICAgIC8vIG9ubHkgc2V0IGZpbGVSZWYgb25jZVxuICAgICAgICBpZiAoIWFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmZpbGVSZWYpIHtcbiAgICAgICAgICBhbGxGaWxlc0FuZERldGFpbHNbZmlsZUluZGV4XS5maWxlUmVmID0gbmV4dFByb2dyZXNzLmZpbGVSZWY7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgY29tcGxldGUsIHVwZGF0ZSB0aGUgaW5kZXhlcyBhbmQgZGV0YWlsc1xuICAgICAgaWYgKGZpbGVVcGxvYWRUYXNrRG9uZSkge1xuICAgICAgICBfbWFya0ZpbGVVcGxvYWREb25lKGZpbGVJbmRleCwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyB1cGRhdGUgdGhlIG92ZXJhbGwgcHJvZ3Jlc3NcbiAgICAgIGxhdGVzdE92ZXJhbGxQcm9ncmVzcyA9IG5leHRPdmVyYWxsUHJvZ3Jlc3M7XG5cbiAgICAgIC8vIGVtaXQgdGhlIGV2ZW50IHRvIHNlbmQgaXRcbiAgICAgIF9lbWl0RXZlbnQobmV4dFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfZW1pdEV2ZW50KG5leHRQcm9ncmVzcz86IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcz4pIHtcbiAgICAgIGNvbnN0IGlzQ29tcGxldGUgPSBpbmNvbXBsZXRlRmlsZUZpbGVJbmRleGVzLnNpemUgPT09IDA7XG5cbiAgICAgIGxldCBvdmVyYWxsUHJvZ3Jlc3MgPSBsYXRlc3RPdmVyYWxsUHJvZ3Jlc3M7XG4gICAgICBsZXQgcmVzdWx0OiBNYXliZTxTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRmluYWxSZXN1bHQ+ID0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21wbGV0ZSkge1xuICAgICAgICBvdmVyYWxsUHJvZ3Jlc3MgPSAxMDA7IC8vIHNldCB0byAxMDAlXG4gICAgICAgIGNvbnN0IG92ZXJhbGxFbmRUaW1lID0gbmV3IERhdGUoKTtcblxuICAgICAgICBjb25zdCBmaWxlUmVzdWx0cyA9IGFsbEZpbGVzLm1hcCgoZmlsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQ6IFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNGaW5hbEZpbGVSZXN1bHQgPSB7XG4gICAgICAgICAgICBzdGFydFRpbWU6IGFsbEZpbGVzQW5kRGV0YWlsc1tpbmRleF0uc3RhcnRUaW1lIGFzIERhdGUsXG4gICAgICAgICAgICBlbmRUaW1lOiBhbGxGaWxlc0FuZERldGFpbHNbaW5kZXhdLmVuZFRpbWUgYXMgRGF0ZSxcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICBmaWxlUmVmOiBhbGxGaWxlc0FuZERldGFpbHNbaW5kZXhdLmZpbGVSZWYsXG4gICAgICAgICAgICBzdWNjZXNzOiAhYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5lcnJvcixcbiAgICAgICAgICAgIGVycm9yOiBhbGxGaWxlc0FuZERldGFpbHNbaW5kZXhdLmVycm9yXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHsgaW5jbHVkZWQ6IHN1Y2Nlc3NGaWxlUmVzdWx0cywgZXhjbHVkZWQ6IGVycm9yRmlsZVJlc3VsdHMgfSA9IHNlcGFyYXRlVmFsdWVzKGZpbGVSZXN1bHRzLCAoeCkgPT4geC5zdWNjZXNzKTtcblxuICAgICAgICAvLyBhbGwgYXJlIGRvbmUsIHNldCB0aGUgcmVzdWx0IG9uIHRoZSBuZXh0IGV2ZW50XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICBzdGFydFRpbWU6IG92ZXJhbGxTdGFydFRpbWUsXG4gICAgICAgICAgZW5kVGltZTogb3ZlcmFsbEVuZFRpbWUsXG4gICAgICAgICAgc3VjY2Vzc0ZpbGVSZXN1bHRzLFxuICAgICAgICAgIGVycm9yRmlsZVJlc3VsdHMsXG4gICAgICAgICAgZmlsZVJlc3VsdHNcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dEV2ZW50OiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRXZlbnQgPSB7XG4gICAgICAgIGFsbEZpbGVzLFxuICAgICAgICBpc0NvbXBsZXRlLFxuICAgICAgICBvdmVyYWxsUHJvZ3Jlc3MsXG4gICAgICAgIHVwbG9hZFByb2dyZXNzOiBuZXh0UHJvZ3Jlc3MsXG4gICAgICAgIGluY29tcGxldGVGaWxlQ291bnQ6IGluY29tcGxldGVGaWxlRmlsZUluZGV4ZXMuc2l6ZSxcbiAgICAgICAgYWN0aXZlRmlsZUNvdW50OiBhY3RpdmVGaWxlSW5kZXhlcy5zaXplLFxuICAgICAgICBkb25lRmlsZUNvdW50OiBkb25lRmlsZUluZGV4ZXMuc2l6ZSxcbiAgICAgICAgcmVzdWx0XG4gICAgICB9O1xuXG4gICAgICBzdWJzY3JpYmVyLm5leHQobmV4dEV2ZW50KTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBydW5VcGxvYWRUYXNrRm9yRmlsZShbZmlsZSwgaW5kZXhdOiByZWFkb25seSBbRmlsZSwgSW5kZXhOdW1iZXJdKSB7XG4gICAgICBpZiAoZmxhZ2dlZENhbmNlbCkge1xuICAgICAgICBvblN0YXJ0RmlsZVVwbG9hZEZsYWdnZWRDYW5jZWxsZWQoaW5kZXgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVGaWxlVXBsb2FkUHJvZ3Jlc3MgPSAobmV4dFByb2dyZXNzOiBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVGaWxlUHJvZ3Jlc3MpID0+IHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHByb2dyZXNzXG4gICAgICAgICAgdXBkYXRlVXBsb2FkUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBuZXh0UHJvZ3Jlc3NcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1cGRhdGVGaWxlVXBsb2FkUHJvZ3Jlc3NXaXRoVW5jYXVnaHRFcnJvciA9IChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIC8vIGVycm9yIG9jY3VycmVkLCB1cGRhdGUgdGhlIHByb2dyZXNzIHdpdGggdGhlIGVycm9yXG4gICAgICAgICAgdXBkYXRlVXBsb2FkUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIGZpbGVVcGxvYWRUYXNrRG9uZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gYWx3YXlzIHJlc29sdmUsIG5ldmVyIHJlamVjdFxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjb21wbGV0ZUZpbGVVcGxvYWRQcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgICAgICB1cGRhdGVVcGxvYWRQcm9ncmVzcyh7XG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGZpbGVVcGxvYWRUYXNrRG9uZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHVwbG9hZCB0aGUgZmlsZSwgc3Vic2NyaWJlIHRvIHRoZSBwcm9ncmVzc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHVwbG9hZEhhbmRsZXJcbiAgICAgICAgICAgIC51cGxvYWRGaWxlKGZpbGUpXG4gICAgICAgICAgICAudGhlbigodXBsb2FkSW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgICAgLy8gYWRkIHRvIGFjdGl2ZSBmaWxlIGluZGV4ZXNcbiAgICAgICAgICAgICAgb25TdGFydEZpbGVVcGxvYWQoaW5kZXgsIHVwbG9hZEluc3RhbmNlKTtcblxuICAgICAgICAgICAgICBjb25zdCB1cGxvYWRTdWJzY3JpcHRpb24gPSB1cGxvYWRJbnN0YW5jZS51cGxvYWQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiB1cGRhdGVGaWxlVXBsb2FkUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVwZGF0ZUZpbGVVcGxvYWRQcm9ncmVzc1dpdGhVbmNhdWdodEVycm9yLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZUZpbGVVcGxvYWRQcm9ncmVzc1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBtdWx0aVVwbG9hZHNTdWJzY3JpcHRpb25PYmplY3QuYWRkU3Vicyh1cGxvYWRTdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCh1cGRhdGVGaWxlVXBsb2FkUHJvZ3Jlc3NXaXRoVW5jYXVnaHRFcnJvcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdXBkYXRlRmlsZVVwbG9hZFByb2dyZXNzV2l0aFVuY2F1Z2h0RXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBydW4gdXBsb2FkIHRhc2sgZm9yIGVhY2ggZmlsZVxuICAgIGNvbnN0IGZpbGVUdXBsZXMgPSBhbGxGaWxlcy5tYXAoKGZpbGUsIGluZGV4KSA9PiBbZmlsZSwgaW5kZXhdIGFzIGNvbnN0KTtcblxuICAgIHJ1bkFzeW5jVGFza3NGb3JWYWx1ZXMoZmlsZVR1cGxlcywgcnVuVXBsb2FkVGFza0ZvckZpbGUsIHtcbiAgICAgIG1heFBhcmFsbGVsVGFza3MsXG4gICAgICByZXRyaWVzQWxsb3dlZDogMCAvLyBubyByZXRyaWVzIGFsbG93ZWRcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGFsbCB0YXNrcyBhcmUgZmluaXNoZWQuIENvbXBsZXRlIHRoZSBzdWJzY3JpYmVyLlxuICAgICAgY29uc29sZS5sb2coJ2NvbXBsZXRlJyk7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gIH0pLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuXG4gIGNvbnN0IGluc3RhbmNlOiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzSW5zdGFuY2UgPSB7XG4gICAgY2FuY2VsLFxuICAgIHVwbG9hZFxuICB9O1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbiJdfQ==
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUudXBsb2FkLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2NvbnRhaW5lci9zdG9yYWdlZmlsZS51cGxvYWQuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwRSxPQUFPLEVBQXFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFxRXhEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE1BQXNDO0lBQzdFLE1BQU0sRUFBRSxjQUFjLEVBQUUsOEJBQThCLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFbEUsSUFBSSxTQUFtQyxDQUFDO0lBRXhDLE9BQU87UUFDTCxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUzRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsdUJBQXVCLENBQUM7WUFDaEQsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTdELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFnRCxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNqRixJQUFJLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QyxTQUFTLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUV0RCx5REFBeUQ7b0JBQ3pELFNBQVM7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Y0FBYyxDQUFDLENBQUM7d0JBRXpDLE1BQU0sa0JBQWtCLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7NEJBQ3pELElBQUksRUFBRSx3QkFBd0I7NEJBQzlCLEtBQUssRUFBRSx5Q0FBeUM7NEJBQ2hELFFBQVEsRUFBRSwwQkFBMEI7eUJBQ3JDLENBQUMsQ0FBQzt3QkFFSCw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDN0QsQ0FBQyxDQUFDO3lCQUNELEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YseUNBQXlDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25ELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBVSxDQUFDLENBQUM7UUFFekUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFO1lBQ3ZELGdCQUFnQjtZQUNoQixjQUFjLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtTQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNYLG1EQUFtRDtZQUNuRCxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEIsTUFBTSxRQUFRLEdBQW1DO1FBQy9DLE1BQU07UUFDTixNQUFNO0tBQ1AsQ0FBQztJQUVGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlRmlsZVByb2dyZXNzIH0gZnJvbSAnLi4vc3RvcmUnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JhZ2UvZmlyZWJhc2Uuc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEluZGV4TnVtYmVyLCBNYXliZSwgUGVyY2VudERlY2ltYWwsIFBlcmNlbnROdW1iZXIsIFByb21pc2VPclZhbHVlLCBydW5Bc3luY1Rhc2tzRm9yVmFsdWVzLCBzZXBhcmF0ZVZhbHVlcyB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgTXVsdGlTdWJzY3JpcHRpb25PYmplY3QgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IEZpcmViYXNlU3RvcmFnZUFjY2Vzc29yRmlsZSwgU3RvcmFnZUN1c3RvbU1ldGFkYXRhLCBTdG9yYWdlUGF0aElucHV0LCBTdG9yYWdlVXBsb2FkT3B0aW9ucywgU3RvcmFnZVVwbG9hZFRhc2sgfSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYnNlcnZhYmxlIGZvciB1cGxvYWRpbmcgYSBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJGdW5jdGlvbiA9IChmaWxlOiBGaWxlKSA9PiBQcm9taXNlPFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckluc3RhbmNlPjtcblxuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJJbnN0YW5jZSBleHRlbmRzIFBpY2s8U3RvcmFnZVVwbG9hZFRhc2s8RmlyZWJhc2VTdG9yYWdlQWNjZXNzb3JGaWxlPiwgJ3Rhc2tSZWYnIHwgJ3BhdXNlJyB8ICdyZXN1bWUnIHwgJ2NhbmNlbCc+IHtcbiAgLyoqXG4gICAqIFRoZSB1cGxvYWQgb2JzZXJ2YWJsZS5cbiAgICpcbiAgICogTXVzdCBiZSBzdWJzY3JpYmVkIHRvIGluIG9yZGVyIGZvciB0aGUgdXBsb2FkIHRvIGJlZ2luLlxuICAgKi9cbiAgcmVhZG9ubHkgdXBsb2FkOiBPYnNlcnZhYmxlPERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcz47XG59XG5cbi8qKlxuICogSGFuZGxlcyB1cGxvYWRpbmcgZmlsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUZpbGVVcGxvYWRIYW5kbGVyIHtcbiAgLyoqXG4gICAqIFVwbG9hZHMgYSBmaWxlLCBhbmQgcmV0dXJucyB0aGUgZmlsZSBwcm9ncmVzcyBhcyBpdCBpcyB1cGxvYWRpbmcuXG4gICAqL1xuICByZWFkb25seSB1cGxvYWRGaWxlOiBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNpbmdsZSBmaWxlIHVwbG9hZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRmlsZVVwbG9hZENvbmZpZyB7XG4gIC8qKlxuICAgKiBQYXRoIGZvciB3aGVyZSB0byB1cGxvYWQgdGhlIGZpbGUgdG9cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VQYXRoOiBTdG9yYWdlUGF0aElucHV0O1xuICAvKipcbiAgICogVXBsb2FkIG9wdGlvbnMgZm9yIHRoZSBmaWxlLlxuICAgKlxuICAgKiBSZXN1bWFibGUgaXMgbm90IHN1cHBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHVwbG9hZE9wdGlvbnM/OiBTdG9yYWdlRmlsZVVwbG9hZENvbmZpZ09wdGlvbnM7XG4gIC8qKlxuICAgKiBDdXN0b20gbWV0YWRhdGEgZm9yIHRoZSBmaWxlLlxuICAgKlxuICAgKiBJcyBtZXJnZWQgd2l0aCB1cGxvYWRPcHRpb25zJ3MgbWV0YWRhdGEuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21NZXRhZGF0YT86IFN0b3JhZ2VDdXN0b21NZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBTdG9yYWdlRmlsZVVwbG9hZENvbmZpZyB1cGxvYWQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RvcmFnZUZpbGVVcGxvYWRDb25maWdPcHRpb25zID0gT21pdDxTdG9yYWdlVXBsb2FkT3B0aW9ucywgJ3Jlc3VtYWJsZSc+O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgZmlsZSBuYW1lcyBmb3IgdGhlIHVwbG9hZGVkIGZpbGVzLlxuICpcbiAqIElmIG5vdCBzZXQsIHRoZSBmaWxlIG5hbWUgd2lsbCBiZSB1c2VkIGFzIGlzLlxuICovXG5leHBvcnQgdHlwZSBTdG9yYWdlRmlsZVVwbG9hZENvbmZpZ0ZhY3RvcnkgPSAoZmlsZTogRmlsZSkgPT4gUHJvbWlzZU9yVmFsdWU8U3RvcmFnZUZpbGVVcGxvYWRDb25maWc+O1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlcigpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckNvbmZpZyB7XG4gIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBEYnhGaXJlYmFzZVN0b3JhZ2VTZXJ2aWNlO1xuICByZWFkb25seSBzdG9yYWdlRmlsZVVwbG9hZENvbmZpZ0ZhY3Rvcnk6IFN0b3JhZ2VGaWxlVXBsb2FkQ29uZmlnRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlcihjb25maWc6IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckNvbmZpZyk6IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlciB7XG4gIGNvbnN0IHsgc3RvcmFnZVNlcnZpY2UsIHN0b3JhZ2VGaWxlVXBsb2FkQ29uZmlnRmFjdG9yeSB9ID0gY29uZmlnO1xuXG4gIGxldCByZXN1bWFibGU6IE1heWJlPFN0b3JhZ2VVcGxvYWRUYXNrPjtcblxuICByZXR1cm4ge1xuICAgIHVwbG9hZEZpbGU6IGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yYWdlRmlsZVVwbG9hZENvbmZpZyA9IGF3YWl0IHN0b3JhZ2VGaWxlVXBsb2FkQ29uZmlnRmFjdG9yeShmaWxlKTtcblxuICAgICAgY29uc3QgeyBzdG9yYWdlUGF0aCB9ID0gc3RvcmFnZUZpbGVVcGxvYWRDb25maWc7XG4gICAgICBjb25zdCBzdG9yYWdlQWNjZXNzb3JGaWxlID0gc3RvcmFnZVNlcnZpY2UuZmlsZShzdG9yYWdlUGF0aCk7XG5cbiAgICAgIGNvbnN0IHVwbG9hZCA9IG5ldyBPYnNlcnZhYmxlPERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcz4oKHgpID0+IHtcbiAgICAgICAgaWYgKHN0b3JhZ2VBY2Nlc3NvckZpbGUudXBsb2FkUmVzdW1hYmxlKSB7XG4gICAgICAgICAgcmVzdW1hYmxlID0gc3RvcmFnZUFjY2Vzc29yRmlsZS51cGxvYWRSZXN1bWFibGUoZmlsZSk7XG5cbiAgICAgICAgICAvLyBzdWJzY3JpYmUgdG8gdGhlIGV2ZW50IGJ5IHBpcGluZyB0aGlzIG9ic2VydmFibGUgdG8gaXRcbiAgICAgICAgICByZXN1bWFibGVcbiAgICAgICAgICAgIC5zdHJlYW1TbmFwc2hvdEV2ZW50cygpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgbWFwKCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBieXRlc1RyYW5zZmVycmVkLCB0b3RhbEJ5dGVzIH0gPSB4O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3M6IERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcyA9IHtcbiAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICBmaWxlUmVmOiBzdG9yYWdlQWNjZXNzb3JGaWxlLFxuICAgICAgICAgICAgICAgICAgdXBsb2FkUmVmOiByZXN1bWFibGUsXG4gICAgICAgICAgICAgICAgICBieXRlc1RyYW5zZmVycmVkLFxuICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyxcbiAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBieXRlc1RyYW5zZmVycmVkIC8gdG90YWxCeXRlc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpZiBhbiBlcnJvciBvY2N1cnMsIGNhdGNoIGl0IGFuZCBlbWl0IGl0IGFzIGEgcHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9ncmVzczogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlRmlsZVByb2dyZXNzID0ge1xuICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgIGZpbGVSZWY6IHN0b3JhZ2VBY2Nlc3NvckZpbGUsXG4gICAgICAgICAgICAgICAgICB1cGxvYWRSZWY6IHJlc3VtYWJsZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgZmFpbGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBvZihwcm9ncmVzcyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndXBsb2FkUmVzdW1hYmxlKCkgZnVuY3Rpb24gd2FzIHVuYXZhaWxhYmxlLicpO1xuICAgICAgICB9XG4gICAgICB9KS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICAgICAgY29uc3QgaW5zdGFuY2U6IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckluc3RhbmNlID0ge1xuICAgICAgICB1cGxvYWQsXG4gICAgICAgIHRhc2tSZWY6IHN0b3JhZ2VBY2Nlc3NvckZpbGUsXG4gICAgICAgIHBhdXNlOiAoKSA9PiByZXN1bWFibGU/LnBhdXNlKCkgPz8gZmFsc2UsXG4gICAgICAgIHJlc3VtZTogKCkgPT4gcmVzdW1hYmxlPy5yZXN1bWUoKSA/PyBmYWxzZSxcbiAgICAgICAgY2FuY2VsOiAoKSA9PiByZXN1bWFibGU/LmNhbmNlbCgpID8/IGZhbHNlXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICB9O1xufVxuXG4vLyBNQVJLOiBVcGxvYWQgRmlsZXNcbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0lucHV0IHtcbiAgcmVhZG9ubHkgdXBsb2FkSGFuZGxlcjogU3RvcmFnZUZpbGVVcGxvYWRIYW5kbGVyO1xuICAvKipcbiAgICogRmlsZXMgdG8gdXBsb2FkXG4gICAqL1xuICByZWFkb25seSBmaWxlczogRmlsZVtdO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtYXggcGFyYWxsZWwgdXBsb2FkcyB0byBwZXJmb3JtIGF0IGEgdGltZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gM1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4UGFyYWxsZWxVcGxvYWRzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNJbnN0YW5jZSB7XG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSB1cGxvYWQgb2YgdGhlIHJlbWFpbmluZyBmaWxlcy5cbiAgICovXG4gIGNhbmNlbCgpOiB2b2lkO1xuICAvKipcbiAgICogVGhlIHVwbG9hZCBvYnNlcnZhYmxlLlxuICAgKlxuICAgKiBNdXN0IGJlIHN1YnNjcmliZWQgdG8gaW4gb3JkZXIgZm9yIHRoZSB1cGxvYWQgdG8gYmVnaW4uXG4gICAqL1xuICByZWFkb25seSB1cGxvYWQ6IE9ic2VydmFibGU8U3RvcmFnZUZpbGVVcGxvYWRGaWxlc0V2ZW50Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRXZlbnQge1xuICAvKipcbiAgICogQWxsIGZpbGVzIGJlaW5nIHVwbG9hZGVkXG4gICAqL1xuICByZWFkb25seSBhbGxGaWxlczogRmlsZVtdO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFsbCBmaWxlcyBoYXZlIGJlZW4gdXBsb2FkZWQuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgdmFsdWUgc2hvdWxkIGJlIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ29tcGxldGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVwbG9hZCB3YXMgY2FuY2VsZWQuXG4gICAqL1xuICByZWFkb25seSBpc0NhbmNlbGVkPzogTWF5YmU8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBUaGUgb3ZlcmFsbCBwcm9ncmVzcyBvZiBhbGwgZmlsZXMgYmVpbmcgdXBsb2FkZWQuXG4gICAqL1xuICByZWFkb25seSBvdmVyYWxsUHJvZ3Jlc3M6IFBlcmNlbnROdW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXBsb2FkIHByb2dyZXNzIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZXZlbnQuXG4gICAqL1xuICByZWFkb25seSB1cGxvYWRQcm9ncmVzcz86IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcz47XG4gIC8qKlxuICAgKiBUaGUgZmluYWwgcmVzdWx0LlxuICAgKlxuICAgKiBTZXQgd2hlbiB0aGUgZmluYWwgZmlsZSBoYXMgYmVlbiB1cGxvYWRlZCBvciBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSByZXN1bHQ/OiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRmluYWxSZXN1bHQ7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgYXJlIHN0aWxsIHVwbG9hZGluZyBvciBxdWV1ZWQgZm9yIHVwbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IGluY29tcGxldGVGaWxlQ291bnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBhcmUgYWN0aXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aXZlRmlsZUNvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgYXJlIGRvbmUuXG4gICAqL1xuICByZWFkb25seSBkb25lRmlsZUNvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0ZpbmFsUmVzdWx0IHtcbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuICByZWFkb25seSBlbmRUaW1lOiBEYXRlO1xuICByZWFkb25seSBmaWxlUmVzdWx0czogU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0ZpbmFsRmlsZVJlc3VsdFtdO1xuICByZWFkb25seSBzdWNjZXNzRmlsZVJlc3VsdHM6IFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNGaW5hbEZpbGVSZXN1bHRbXTtcbiAgcmVhZG9ubHkgZXJyb3JGaWxlUmVzdWx0czogU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0ZpbmFsRmlsZVJlc3VsdFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNGaW5hbEZpbGVSZXN1bHQge1xuICAvKipcbiAgICogVGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGZpbGUgdXBsb2FkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuICAvKipcbiAgICogVGhlIGVuZCB0aW1lIG9mIHRoZSBmaWxlIHVwbG9hZCwgb3Igd2hlbiBpdCBmYWlsZWQgb3Igd2FzIGNhbmNlbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kVGltZTogRGF0ZTtcbiAgLyoqXG4gICAqIFRoZSBmaWxlIHRoYXQgd2FzIHVwbG9hZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogRmlsZTtcbiAgLyoqXG4gICAqIFRoZSBhY2Nlc3NvciBmaWxlIGZvciB0aGUgZmlsZSwgaWYgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBJcyBnZW5lcmFsbHkgYXZhaWxhYmxlIGlmIHN1Y2Nlc3MgaXMgdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVSZWY/OiBNYXliZTxGaXJlYmFzZVN0b3JhZ2VBY2Nlc3NvckZpbGU+O1xuICAvKipcbiAgICogVHJ1ZSBpZiB0aGUgZmlsZSB3YXMgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgc3VjY2VzczogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVycm9yIGlmIHRoZSBmaWxlIGZhaWxlZCB0byB1cGxvYWQuXG4gICAqL1xuICByZWFkb25seSBlcnJvcj86IE1heWJlPHVua25vd24+O1xuICAvKipcbiAgICogVHJ1ZSBpZiB0aGUgZmlsZSB1cGxvYWQgd2FzIGNhbmNlbGxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbGVkPzogTWF5YmU8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogVXBsb2FkcyBmaWxlcyB1c2luZyB0aGUgcHJvdmlkZWQgdXBsb2FkIGhhbmRsZXIgYW5kIGZpbGVzLlxuICpcbiAqIEFuIG9ic2VydmFibGUgaXMgcmV0dXJuZWQgdGhhdCBlbWl0cyB0aGUgbGF0ZXN0IGZpbGUgZXZlbnRzIGZyb20gYW55IGZpbGUgdGhhdCBpcyBiZWluZyB1cGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gaW5wdXRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yYWdlRmlsZVVwbG9hZEZpbGVzKGlucHV0OiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzSW5wdXQpOiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzSW5zdGFuY2Uge1xuICBjb25zdCB7IHVwbG9hZEhhbmRsZXIsIGZpbGVzLCBtYXhQYXJhbGxlbFVwbG9hZHM6IGlucHV0TWF4UGFyYWxsZWxVcGxvYWRzIH0gPSBpbnB1dDtcbiAgY29uc3QgbWF4UGFyYWxsZWxUYXNrcyA9IGlucHV0TWF4UGFyYWxsZWxVcGxvYWRzID8/IDM7XG5cbiAgY29uc3QgbXVsdGlVcGxvYWRzU3Vic2NyaXB0aW9uT2JqZWN0ID0gbmV3IE11bHRpU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgLy8gYmVnaW4gdGhlIHVwbG9hZCBmb3IgZWFjaCBmaWxlXG4gIGNvbnN0IGFsbEZpbGVzID0gQXJyYXkuZnJvbShmaWxlcyk7XG5cbiAgLy8gdW5zdWJzY3JpYmUgZnJvbSBhbGwgcHJldmlvdXMgdXBsb2Fkc1xuICBtdWx0aVVwbG9hZHNTdWJzY3JpcHRpb25PYmplY3QudW5zdWIoKTtcblxuICBpbnRlcmZhY2UgVXBkYXRlVXBsb2FkUHJvZ3Jlc3NJbnB1dCB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpbGUgaW5kZXggbnVtYmVyLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGluZGV4OiBJbmRleE51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmV4dCBwcm9ncmVzcyBldmVudCwgaWYgYXBwbGljYWJsZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBuZXh0UHJvZ3Jlc3M/OiBNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVGaWxlUHJvZ3Jlc3M+O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIHRoYXQgb2NjdXJlZCBvdXRzaWRlIG9mIHRoZSBuZXh0UHJvZ3Jlc3MsIGlmIGFwcGxpY2FibGUuXG4gICAgICpcbiAgICAgKiBUaGVzZSBhcmUgdHlwaWNhbGx5IFwidW5jYXVnaHRcIiBlcnJvcnMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbm9uUHJvZ3Jlc3NFcnJvcj86IE1heWJlPHVua25vd24+O1xuICAgIC8qKlxuICAgICAqIFBhc3NlZCBhcyB0cnVlIHdoZW4gdGhlIHVwbG9hZCB0YXNrIGlzIGRvbmUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFsc28gaW5mZXJyZWQgYXMgdHJ1ZSB3aGVuIGEgcHJvZ3Jlc3MgZXJyb3Igb2NjdXJzIGZvciBhbiB1cGxvYWQuXG4gICAgICpcbiAgICAgKiBEb2VzIG5vdCBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1Y2Nlc3Mgd2FzIGFjaGlldmVkIG9yIG5vdC5cbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlVXBsb2FkVGFza0RvbmU/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIHVwbG9hZCB3YXMgY2FuY2VsZWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FuY2VsZWQ/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIEZpbGVVcGxvYWREZXRhaWxzIHtcbiAgICByZWFkb25seSBmaWxlOiBGaWxlO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHVwbG9hZCBpbnN0YW5jZSBmb3IgdGhlIGZpbGUuXG4gICAgICpcbiAgICAgKiBTZXQgaWYgdGhlIGZpbGUgaXMgY3VycmVudGx5IHVwbG9hZGluZy5cbiAgICAgKi9cbiAgICB1cGxvYWRJbnN0YW5jZT86IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckluc3RhbmNlO1xuICAgIGZpbGVSZWY/OiBNYXliZTxGaXJlYmFzZVN0b3JhZ2VBY2Nlc3NvckZpbGU+O1xuICAgIHN0YXJ0VGltZT86IERhdGU7XG4gICAgZW5kVGltZT86IERhdGU7XG4gICAgc3VjY2Vzcz86IGJvb2xlYW47XG4gICAgY2FuY2VsZWQ/OiBNYXliZTxib29sZWFuPjtcbiAgICBlcnJvcj86IE1heWJlPHVua25vd24+O1xuICB9XG5cbiAgY29uc3QgYWxsRmlsZXNBbmRMYXRlc3RQcm9ncmVzczogTWF5YmU8RGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlRmlsZVByb2dyZXNzPltdID0gbmV3IEFycmF5KGFsbEZpbGVzLmxlbmd0aCk7XG4gIGNvbnN0IGFsbEZpbGVzQW5kRGV0YWlsczogRmlsZVVwbG9hZERldGFpbHNbXSA9IGFsbEZpbGVzLm1hcCgoZmlsZSkgPT4gKHsgZmlsZSB9KSk7XG4gIGNvbnN0IG92ZXJhbGxQcm9ncmVzc1BlckNvbXBsZXRlZEZpbGU6IFBlcmNlbnREZWNpbWFsID0gKDEgLyBhbGxGaWxlc0FuZExhdGVzdFByb2dyZXNzLmxlbmd0aCkgYXMgUGVyY2VudERlY2ltYWw7XG5cbiAgLyoqXG4gICAqIE9uY2Ugc2V0LCBhbnkgbmV3IGZpbGUgdXBsb2FkIHRhc2sgdGhhdCBoaXRzIHRoaXMgd2lsbCByZXR1cm4gYW4gY2FuY2VsIGZhaWx1cmUuXG4gICAqL1xuICBsZXQgZmxhZ2dlZENhbmNlbCA9IGZhbHNlO1xuXG4gIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICBmbGFnZ2VkQ2FuY2VsID0gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCB1cGxvYWQgPSBuZXcgT2JzZXJ2YWJsZTxTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRXZlbnQ+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgY29uc3Qgb3ZlcmFsbFN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBpbmNvbXBsZXRlRmlsZUZpbGVJbmRleGVzID0gbmV3IFNldDxJbmRleE51bWJlcj4oYWxsRmlsZXMubWFwKChfLCBpbmRleCkgPT4gaW5kZXgpKTtcbiAgICBjb25zdCBhY3RpdmVGaWxlSW5kZXhlcyA9IG5ldyBTZXQ8SW5kZXhOdW1iZXI+KCk7XG4gICAgY29uc3QgZG9uZUZpbGVJbmRleGVzID0gbmV3IFNldDxJbmRleE51bWJlcj4oKTtcbiAgICBsZXQgbGF0ZXN0T3ZlcmFsbFByb2dyZXNzOiBQZXJjZW50TnVtYmVyID0gMDtcblxuICAgIGZ1bmN0aW9uIG9uU3RhcnRGaWxlVXBsb2FkKGluZGV4OiBJbmRleE51bWJlciwgdXBsb2FkSW5zdGFuY2U6IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckluc3RhbmNlKSB7XG4gICAgICBhY3RpdmVGaWxlSW5kZXhlcy5hZGQoaW5kZXgpO1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5zdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS51cGxvYWRJbnN0YW5jZSA9IHVwbG9hZEluc3RhbmNlO1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5maWxlUmVmID0gdXBsb2FkSW5zdGFuY2UudGFza1JlZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblN0YXJ0RmlsZVVwbG9hZEZsYWdnZWRDYW5jZWxsZWQoaW5kZXg6IEluZGV4TnVtYmVyKSB7XG4gICAgICBhbGxGaWxlc0FuZERldGFpbHNbaW5kZXhdLnN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgIC8vIGltbWVkaWF0ZWx5IG1hcmsgaXQgZG9uZVxuICAgICAgX21hcmtGaWxlVXBsb2FkRG9uZShpbmRleCwgdHJ1ZSk7XG5cbiAgICAgIC8vIGVtaXQgbmV3IHByb2dyZXNzIGV2ZW50XG4gICAgICBfZW1pdEV2ZW50KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX21hcmtGaWxlVXBsb2FkRG9uZShmaWxlSW5kZXg6IEluZGV4TnVtYmVyLCBmaW5hbEVycm9yPzogTWF5YmU8dW5rbm93bj4pIHtcbiAgICAgIGRvbmVGaWxlSW5kZXhlcy5hZGQoZmlsZUluZGV4KTsgLy8gYWRkIHRvIGRvbmUgZmlsZSBpbmRleGVzXG4gICAgICBhY3RpdmVGaWxlSW5kZXhlcy5kZWxldGUoZmlsZUluZGV4KTsgLy8gcmVtb3ZlIGZyb20gYWN0aXZlIGZpbGUgaW5kZXhlcyBpZiBpdCBleGlzdHNcbiAgICAgIGluY29tcGxldGVGaWxlRmlsZUluZGV4ZXMuZGVsZXRlKGZpbGVJbmRleCk7IC8vIHJlbW92ZSBmcm9tIGluY29tcGxldGUgZmlsZSBpbmRleGVzXG5cbiAgICAgIC8vIHVwZGF0ZSBkZXRhaWxzXG4gICAgICBhbGxGaWxlc0FuZERldGFpbHNbZmlsZUluZGV4XS5lbmRUaW1lID0gbmV3IERhdGUoKTtcblxuICAgICAgY29uc3QgZXJyb3IgPSBmaW5hbEVycm9yID8/IGFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmVycm9yO1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2ZpbGVJbmRleF0uc3VjY2VzcyA9ICFlcnJvcjtcbiAgICAgIGFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmVycm9yID0gZXJyb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlVXBsb2FkUHJvZ3Jlc3MoaW5wdXQ6IFVwZGF0ZVVwbG9hZFByb2dyZXNzSW5wdXQpIHtcbiAgICAgIGNvbnN0IHsgaW5kZXg6IGZpbGVJbmRleCwgbmV4dFByb2dyZXNzLCBmaWxlVXBsb2FkVGFza0RvbmU6IGlucHV0RmlsZVVwbG9hZFRhc2tEb25lLCBub25Qcm9ncmVzc0Vycm9yIH0gPSBpbnB1dDtcbiAgICAgIGNvbnN0IGVycm9yID0gbm9uUHJvZ3Jlc3NFcnJvciA/PyBuZXh0UHJvZ3Jlc3M/LmVycm9yO1xuICAgICAgY29uc3QgZmlsZVVwbG9hZFRhc2tEb25lID0gaW5wdXRGaWxlVXBsb2FkVGFza0RvbmUgPz8gQm9vbGVhbihlcnJvcik7XG5cbiAgICAgIC8vIHRoZSB0YXNrIG1heSBhbHJlYWR5IGJlIGRvbmUsIGFzIGFmdGVyIGEgcHJvZ3Jlc3MtcmVsYXRlZCBlcnJvciB0aGUgY29tcGxldGUgdGFzayBjYW4gZ2V0IGNhbGxlZC5cbiAgICAgIGNvbnN0IGlzVGFza0FscmVhZHlEb25lID0gYWxsRmlsZXNBbmREZXRhaWxzW2ZpbGVJbmRleF0uZW5kVGltZSAhPSBudWxsO1xuXG4gICAgICBpZiAoIWlzVGFza0FscmVhZHlEb25lKSB7XG4gICAgICAgIGxldCBuZXh0T3ZlcmFsbFByb2dyZXNzID0gbGF0ZXN0T3ZlcmFsbFByb2dyZXNzO1xuICAgICAgICBjb25zdCBuZXh0UHJvZ3Jlc3NQZXJjZW50ID0gZmlsZVVwbG9hZFRhc2tEb25lID8gMTAwIDogKG5leHRQcm9ncmVzcz8ucHJvZ3Jlc3MgPz8gMCkgKiAxMDA7XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBvdmVyYWxsIHByb2dyZXNzIHBlcmNlbnRhZ2VcbiAgICAgICAgaWYgKG5leHRQcm9ncmVzc1BlcmNlbnQpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIG92ZXJhbGwgcGVyY2VudGFnZVxuICAgICAgICAgIGNvbnN0IHByZXZpb3VzUHJvZ3Jlc3MgPSBhbGxGaWxlc0FuZExhdGVzdFByb2dyZXNzW2ZpbGVJbmRleF07XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNQcm9ncmVzc1BlcmNlbnQgPSBwcmV2aW91c1Byb2dyZXNzPy5wcm9ncmVzcyAhPSBudWxsID8gcHJldmlvdXNQcm9ncmVzcy5wcm9ncmVzcyAqIDEwMCA6IDA7XG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3NQZXJjZW50Q2hhbmdlID0gbmV4dFByb2dyZXNzUGVyY2VudCAtIHByZXZpb3VzUHJvZ3Jlc3NQZXJjZW50O1xuXG4gICAgICAgICAgLy8gaW5jcmVhc2Ugb3ZlcmFsbCBwcm9ncmVzcyBieSB0aGUgY2hhbmdlXG4gICAgICAgICAgbmV4dE92ZXJhbGxQcm9ncmVzcyArPSBwcm9ncmVzc1BlcmNlbnRDaGFuZ2UgKiBvdmVyYWxsUHJvZ3Jlc3NQZXJDb21wbGV0ZWRGaWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBmaWxlIHByb2dyZXNzXG4gICAgICAgIGlmIChuZXh0UHJvZ3Jlc3MpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGxhdGVzdCBGaWxlUHJvZ3Jlc3NcbiAgICAgICAgICBhbGxGaWxlc0FuZExhdGVzdFByb2dyZXNzW2ZpbGVJbmRleF0gPSBuZXh0UHJvZ3Jlc3M7XG5cbiAgICAgICAgICAvLyBvbmx5IHNldCBmaWxlUmVmIG9uY2VcbiAgICAgICAgICBpZiAoIWFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmZpbGVSZWYpIHtcbiAgICAgICAgICAgIGFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmZpbGVSZWYgPSBuZXh0UHJvZ3Jlc3MuZmlsZVJlZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBjb21wbGV0ZSwgdXBkYXRlIHRoZSBpbmRleGVzIGFuZCBkZXRhaWxzXG4gICAgICAgIGlmIChmaWxlVXBsb2FkVGFza0RvbmUpIHtcbiAgICAgICAgICBfbWFya0ZpbGVVcGxvYWREb25lKGZpbGVJbmRleCwgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBvdmVyYWxsIHByb2dyZXNzXG4gICAgICAgIGxhdGVzdE92ZXJhbGxQcm9ncmVzcyA9IG5leHRPdmVyYWxsUHJvZ3Jlc3M7XG5cbiAgICAgICAgLy8gZW1pdCB0aGUgZXZlbnQgdG8gc2VuZCBpdFxuICAgICAgICBfZW1pdEV2ZW50KG5leHRQcm9ncmVzcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2VtaXRFdmVudChuZXh0UHJvZ3Jlc3M/OiBNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVGaWxlUHJvZ3Jlc3M+KSB7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlID0gaW5jb21wbGV0ZUZpbGVGaWxlSW5kZXhlcy5zaXplID09PSAwO1xuXG4gICAgICBsZXQgb3ZlcmFsbFByb2dyZXNzID0gbGF0ZXN0T3ZlcmFsbFByb2dyZXNzO1xuICAgICAgbGV0IHJlc3VsdDogTWF5YmU8U3RvcmFnZUZpbGVVcGxvYWRGaWxlc0ZpbmFsUmVzdWx0PiA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGlzQ29tcGxldGUpIHtcbiAgICAgICAgb3ZlcmFsbFByb2dyZXNzID0gMTAwOyAvLyBzZXQgdG8gMTAwJVxuICAgICAgICBjb25zdCBvdmVyYWxsRW5kVGltZSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgY29uc3QgZmlsZVJlc3VsdHMgPSBhbGxGaWxlcy5tYXAoKGZpbGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0OiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRmluYWxGaWxlUmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRUaW1lOiBhbGxGaWxlc0FuZERldGFpbHNbaW5kZXhdLnN0YXJ0VGltZSBhcyBEYXRlLFxuICAgICAgICAgICAgZW5kVGltZTogYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5lbmRUaW1lIGFzIERhdGUsXG4gICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgZmlsZVJlZjogYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5maWxlUmVmLFxuICAgICAgICAgICAgc3VjY2VzczogIWFsbEZpbGVzQW5kRGV0YWlsc1tpbmRleF0uZXJyb3IsXG4gICAgICAgICAgICBlcnJvcjogYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5lcnJvclxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB7IGluY2x1ZGVkOiBzdWNjZXNzRmlsZVJlc3VsdHMsIGV4Y2x1ZGVkOiBlcnJvckZpbGVSZXN1bHRzIH0gPSBzZXBhcmF0ZVZhbHVlcyhmaWxlUmVzdWx0cywgKHgpID0+IHguc3VjY2Vzcyk7XG5cbiAgICAgICAgLy8gYWxsIGFyZSBkb25lLCBzZXQgdGhlIHJlc3VsdCBvbiB0aGUgbmV4dCBldmVudFxuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgc3RhcnRUaW1lOiBvdmVyYWxsU3RhcnRUaW1lLFxuICAgICAgICAgIGVuZFRpbWU6IG92ZXJhbGxFbmRUaW1lLFxuICAgICAgICAgIHN1Y2Nlc3NGaWxlUmVzdWx0cyxcbiAgICAgICAgICBlcnJvckZpbGVSZXN1bHRzLFxuICAgICAgICAgIGZpbGVSZXN1bHRzXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRFdmVudDogU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0V2ZW50ID0ge1xuICAgICAgICBhbGxGaWxlcyxcbiAgICAgICAgaXNDb21wbGV0ZSxcbiAgICAgICAgb3ZlcmFsbFByb2dyZXNzLFxuICAgICAgICB1cGxvYWRQcm9ncmVzczogbmV4dFByb2dyZXNzLFxuICAgICAgICBpbmNvbXBsZXRlRmlsZUNvdW50OiBpbmNvbXBsZXRlRmlsZUZpbGVJbmRleGVzLnNpemUsXG4gICAgICAgIGFjdGl2ZUZpbGVDb3VudDogYWN0aXZlRmlsZUluZGV4ZXMuc2l6ZSxcbiAgICAgICAgZG9uZUZpbGVDb3VudDogZG9uZUZpbGVJbmRleGVzLnNpemUsXG4gICAgICAgIHJlc3VsdFxuICAgICAgfTtcblxuICAgICAgc3Vic2NyaWJlci5uZXh0KG5leHRFdmVudCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gcnVuVXBsb2FkVGFza0ZvckZpbGUoW2ZpbGUsIGluZGV4XTogcmVhZG9ubHkgW0ZpbGUsIEluZGV4TnVtYmVyXSkge1xuICAgICAgaWYgKGZsYWdnZWRDYW5jZWwpIHtcbiAgICAgICAgb25TdGFydEZpbGVVcGxvYWRGbGFnZ2VkQ2FuY2VsbGVkKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlRmlsZVVwbG9hZFByb2dyZXNzID0gKG5leHRQcm9ncmVzczogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlRmlsZVByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBwcm9ncmVzc1xuICAgICAgICAgIHVwZGF0ZVVwbG9hZFByb2dyZXNzKHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgbmV4dFByb2dyZXNzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdXBkYXRlRmlsZVVwbG9hZFByb2dyZXNzV2l0aFVuY2F1Z2h0RXJyb3IgPSAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAvLyBlcnJvciBvY2N1cnJlZCwgdXBkYXRlIHRoZSBwcm9ncmVzcyB3aXRoIHRoZSBlcnJvclxuICAgICAgICAgIHVwZGF0ZVVwbG9hZFByb2dyZXNzKHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgbm9uUHJvZ3Jlc3NFcnJvcjogZXJyb3IsXG4gICAgICAgICAgICBmaWxlVXBsb2FkVGFza0RvbmU6IHRydWVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIGFsd2F5cyByZXNvbHZlLCBuZXZlciByZWplY3RcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29tcGxldGVGaWxlVXBsb2FkUHJvZ3Jlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgdXBkYXRlVXBsb2FkUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBmaWxlVXBsb2FkVGFza0RvbmU6IHRydWVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyB1cGxvYWQgdGhlIGZpbGUsIHN1YnNjcmliZSB0byB0aGUgcHJvZ3Jlc3NcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB1cGxvYWRIYW5kbGVyXG4gICAgICAgICAgICAudXBsb2FkRmlsZShmaWxlKVxuICAgICAgICAgICAgLnRoZW4oKHVwbG9hZEluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGFkZCB0byBhY3RpdmUgZmlsZSBpbmRleGVzXG4gICAgICAgICAgICAgIG9uU3RhcnRGaWxlVXBsb2FkKGluZGV4LCB1cGxvYWRJbnN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgdXBsb2FkU3Vic2NyaXB0aW9uID0gdXBsb2FkSW5zdGFuY2UudXBsb2FkLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogdXBkYXRlRmlsZVVwbG9hZFByb2dyZXNzLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1cGRhdGVGaWxlVXBsb2FkUHJvZ3Jlc3NXaXRoVW5jYXVnaHRFcnJvcixcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogY29tcGxldGVGaWxlVXBsb2FkUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgbXVsdGlVcGxvYWRzU3Vic2NyaXB0aW9uT2JqZWN0LmFkZFN1YnModXBsb2FkU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2godXBkYXRlRmlsZVVwbG9hZFByb2dyZXNzV2l0aFVuY2F1Z2h0RXJyb3IpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHVwZGF0ZUZpbGVVcGxvYWRQcm9ncmVzc1dpdGhVbmNhdWdodEVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcnVuIHVwbG9hZCB0YXNrIGZvciBlYWNoIGZpbGVcbiAgICBjb25zdCBmaWxlVHVwbGVzID0gYWxsRmlsZXMubWFwKChmaWxlLCBpbmRleCkgPT4gW2ZpbGUsIGluZGV4XSBhcyBjb25zdCk7XG5cbiAgICBydW5Bc3luY1Rhc2tzRm9yVmFsdWVzKGZpbGVUdXBsZXMsIHJ1blVwbG9hZFRhc2tGb3JGaWxlLCB7XG4gICAgICBtYXhQYXJhbGxlbFRhc2tzLFxuICAgICAgcmV0cmllc0FsbG93ZWQ6IDAgLy8gbm8gcmV0cmllcyBhbGxvd2VkXG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAvLyBhbGwgdGFza3MgYXJlIGZpbmlzaGVkLiBDb21wbGV0ZSB0aGUgc3Vic2NyaWJlci5cbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfSkucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgY29uc3QgaW5zdGFuY2U6IFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNJbnN0YW5jZSA9IHtcbiAgICBjYW5jZWwsXG4gICAgdXBsb2FkXG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuIl19
@@ -5462,45 +5462,52 @@ function storageFileUploadFiles(input) {
5462
5462
  // emit new progress event
5463
5463
  _emitEvent();
5464
5464
  }
5465
- function _markFileUploadDone(fileIndex, error) {
5465
+ function _markFileUploadDone(fileIndex, finalError) {
5466
5466
  doneFileIndexes.add(fileIndex); // add to done file indexes
5467
5467
  activeFileIndexes.delete(fileIndex); // remove from active file indexes if it exists
5468
5468
  incompleteFileFileIndexes.delete(fileIndex); // remove from incomplete file indexes
5469
5469
  // update details
5470
5470
  allFilesAndDetails[fileIndex].endTime = new Date();
5471
+ const error = finalError ?? allFilesAndDetails[fileIndex].error;
5471
5472
  allFilesAndDetails[fileIndex].success = !error;
5472
5473
  allFilesAndDetails[fileIndex].error = error;
5473
5474
  }
5474
5475
  function updateUploadProgress(input) {
5475
- const { index: fileIndex, nextProgress, fileUploadTaskDone, error } = input;
5476
- let nextOverallProgress = latestOverallProgress;
5477
- const nextProgressPercent = fileUploadTaskDone ? 100 : (nextProgress?.progress ?? 0) * 100;
5478
- // update the overall progress percentage
5479
- if (nextProgressPercent) {
5480
- // update the overall percentage
5481
- const previousProgress = allFilesAndLatestProgress[fileIndex];
5482
- const previousProgressPercent = previousProgress?.progress != null ? previousProgress.progress * 100 : 0;
5483
- const progressPercentChange = nextProgressPercent - previousProgressPercent;
5484
- // increase overall progress by the change
5485
- nextOverallProgress += progressPercentChange * overallProgressPerCompletedFile;
5486
- }
5487
- // update the file progress
5488
- if (nextProgress) {
5489
- // update the latest FileProgress
5490
- allFilesAndLatestProgress[fileIndex] = nextProgress;
5491
- // only set fileRef once
5492
- if (!allFilesAndDetails[fileIndex].fileRef) {
5493
- allFilesAndDetails[fileIndex].fileRef = nextProgress.fileRef;
5476
+ const { index: fileIndex, nextProgress, fileUploadTaskDone: inputFileUploadTaskDone, nonProgressError } = input;
5477
+ const error = nonProgressError ?? nextProgress?.error;
5478
+ const fileUploadTaskDone = inputFileUploadTaskDone ?? Boolean(error);
5479
+ // the task may already be done, as after a progress-related error the complete task can get called.
5480
+ const isTaskAlreadyDone = allFilesAndDetails[fileIndex].endTime != null;
5481
+ if (!isTaskAlreadyDone) {
5482
+ let nextOverallProgress = latestOverallProgress;
5483
+ const nextProgressPercent = fileUploadTaskDone ? 100 : (nextProgress?.progress ?? 0) * 100;
5484
+ // update the overall progress percentage
5485
+ if (nextProgressPercent) {
5486
+ // update the overall percentage
5487
+ const previousProgress = allFilesAndLatestProgress[fileIndex];
5488
+ const previousProgressPercent = previousProgress?.progress != null ? previousProgress.progress * 100 : 0;
5489
+ const progressPercentChange = nextProgressPercent - previousProgressPercent;
5490
+ // increase overall progress by the change
5491
+ nextOverallProgress += progressPercentChange * overallProgressPerCompletedFile;
5494
5492
  }
5493
+ // update the file progress
5494
+ if (nextProgress) {
5495
+ // update the latest FileProgress
5496
+ allFilesAndLatestProgress[fileIndex] = nextProgress;
5497
+ // only set fileRef once
5498
+ if (!allFilesAndDetails[fileIndex].fileRef) {
5499
+ allFilesAndDetails[fileIndex].fileRef = nextProgress.fileRef;
5500
+ }
5501
+ }
5502
+ // if complete, update the indexes and details
5503
+ if (fileUploadTaskDone) {
5504
+ _markFileUploadDone(fileIndex, error);
5505
+ }
5506
+ // update the overall progress
5507
+ latestOverallProgress = nextOverallProgress;
5508
+ // emit the event to send it
5509
+ _emitEvent(nextProgress);
5495
5510
  }
5496
- // if complete, update the indexes and details
5497
- if (fileUploadTaskDone) {
5498
- _markFileUploadDone(fileIndex, error);
5499
- }
5500
- // update the overall progress
5501
- latestOverallProgress = nextOverallProgress;
5502
- // emit the event to send it
5503
- _emitEvent(nextProgress);
5504
5511
  }
5505
5512
  function _emitEvent(nextProgress) {
5506
5513
  const isComplete = incompleteFileFileIndexes.size === 0;
@@ -5559,7 +5566,7 @@ function storageFileUploadFiles(input) {
5559
5566
  // error occurred, update the progress with the error
5560
5567
  updateUploadProgress({
5561
5568
  index,
5562
- error,
5569
+ nonProgressError: error,
5563
5570
  fileUploadTaskDone: true
5564
5571
  });
5565
5572
  // always resolve, never reject
@@ -5600,7 +5607,6 @@ function storageFileUploadFiles(input) {
5600
5607
  retriesAllowed: 0 // no retries allowed
5601
5608
  }).then(() => {
5602
5609
  // all tasks are finished. Complete the subscriber.
5603
- console.log('complete');
5604
5610
  subscriber.complete();
5605
5611
  });
5606
5612
  }).pipe(shareReplay(1));