ng-easycommerce 0.0.689 → 0.0.690

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.
@@ -4,119 +4,275 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { Component, Output, OnInit, ViewChild, ElementRef, Input, Renderer2, Inject, OnChanges, EventEmitter, OnDestroy, TemplateRef } from '@angular/core';
8
- import { ActivatedRoute } from '@angular/router';
9
- import { ComponentHelper } from "../../../classes/component-helper";
10
- import { ConnectionService } from '../../../api/connection.service';
7
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
8
+ import { ComponentHelper } from '../../../classes/component-helper';
11
9
  import { ToastService } from '../../../utils/toast.service';
12
- import { Constants } from '../../../core.consts';
13
10
  import { CartService } from '../../../services/cart.service';
14
- import { DomSanitizer, SafeResourceUrl, SafeUrl } from '@angular/platform-browser';
15
- import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
16
11
  let MobbexEcComponent = class MobbexEcComponent extends ComponentHelper {
17
- constructor(renderer, connection, toastrService, consts, cartService, toastr, activedRoute, sanitizer, modalService) {
12
+ constructor(toastrService, cartService) {
18
13
  super();
19
- this.renderer = renderer;
20
- this.connection = connection;
21
14
  this.toastrService = toastrService;
22
- this.consts = consts;
23
15
  this.cartService = cartService;
24
- this.toastr = toastr;
25
- this.activedRoute = activedRoute;
26
- this.sanitizer = sanitizer;
27
- this.modalService = modalService;
28
16
  this.method = null;
29
17
  this.total_amount = 0;
30
18
  this.user_data = null;
31
19
  this.ready = new EventEmitter();
32
- this.loading = false;
33
- this.isDobleAuth = false;
34
- this.urls = [];
35
- this.closeModal = '';
36
- this.dataRedirect = () => this.consts.getUrlBase() + 'shop-api/' + this.consts.getChannel() + '/redsys/redirect/' + this.cartService.cart_token + '/process-payment';
37
- this.clearStorageState = () => {
38
- sessionStorage.removeItem('state');
39
- localStorage.removeItem('state');
40
- };
41
- this.clickClose = () => {
42
- this.closeModal = 'cancel';
43
- this.modalRef.hide();
44
- this.processError('Se cancelo el pago con mobbex');
45
- };
46
- this.callState = () => {
20
+ this.loading = true;
21
+ this.processing = false;
22
+ this.url = null;
23
+ this.checkoutData = null;
24
+ this.popup = null;
25
+ this.pollTimer = null;
26
+ this.startedAt = 0;
27
+ this.finished = false;
28
+ this.checkoutKey = '';
29
+ this.bc = null;
30
+ this.checkoutRequestInFlight = false;
31
+ this.openCheckout = () => {
32
+ if (!this.url || this.processing || typeof window === 'undefined')
33
+ return;
34
+ this.clearStateKeys();
35
+ this.finished = false;
36
+ this.processing = true;
37
+ this.startedAt = Date.now();
38
+ this.popup = window.open(this.url, '_blank');
39
+ if (!this.popup || this.popup.closed) {
40
+ this.processing = false;
41
+ this.toastrService.show('No se pudo abrir la pasarela de pago. Verifique que su navegador permita nuevas pestañas.');
42
+ return;
43
+ }
47
44
  try {
48
- let state = this.closeModal != '' ? this.closeModal : localStorage.getItem('state');
49
- this.loading = true;
50
- state && console.log(state);
51
- if (state) {
52
- this.loading = false;
53
- sessionStorage.removeItem('state');
54
- localStorage.removeItem('state');
55
- if (state == 'success') {
56
- this.ready.emit(true);
57
- }
58
- if (state == 'cancel') {
59
- return;
60
- }
61
- if (state == 'failure') {
62
- this.processError('');
63
- }
64
- this.modalRef.hide();
65
- return;
66
- }
67
- setTimeout(() => {
68
- this.callState();
69
- }, 5000);
45
+ this.popup.opener = null;
70
46
  }
71
- catch (error) {
72
- console.error(error);
47
+ catch (_a) {
48
+ // Nothing to do.
73
49
  }
50
+ this.startPolling();
74
51
  };
75
- this.processError = (err) => {
76
- this.toastrService.show(err != '' ? err : 'payment-error');
77
- console.log("ERROR ENVIO BACK ", err);
52
+ this.cancelCheckout = () => {
53
+ if (this.finished)
54
+ return;
55
+ this.finishWithState('cancel', true);
78
56
  };
79
57
  this.getCheckoutMobbex = () => {
58
+ if (this.checkoutRequestInFlight)
59
+ return;
80
60
  this.loading = true;
81
- this.paymentServiceInst.getCheckoutMobbex(this.allData).then(res => {
61
+ this.checkoutRequestInFlight = true;
62
+ const payload = this.user_data || this.allData || {};
63
+ this.paymentServiceInst.getCheckoutMobbex(payload).then(res => {
82
64
  var _a, _b, _c, _d;
83
- this.dataMobbex = res;
84
- this.url = ((_b = (_a = res) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.url) && this.sanitizer.bypassSecurityTrustResourceUrl((_d = (_c = res) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.url);
65
+ this.checkoutData = res || null;
66
+ this.checkoutKey = String(((_b = (_a = res) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.id) || this.cartService.cart_token || '');
67
+ this.url = ((_d = (_c = res) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.url) || null;
68
+ this.safeSetStorage('mobbex:checkout-id', this.checkoutKey);
85
69
  this.loading = false;
86
- }, err => {
87
- this.processError('operation-error');
70
+ this.checkoutRequestInFlight = false;
71
+ if (!this.url) {
72
+ this.processError('operation-error');
73
+ }
74
+ }, () => {
88
75
  this.loading = false;
76
+ this.checkoutRequestInFlight = false;
77
+ this.processError('operation-error');
89
78
  });
90
79
  };
80
+ this.onStorage = (event) => {
81
+ var _a;
82
+ if (!((_a = event) === null || _a === void 0 ? void 0 : _a.key) || this.finished)
83
+ return;
84
+ if (!this.getStateKeys().includes(event.key))
85
+ return;
86
+ const state = this.normalizeState(event.newValue);
87
+ if (state) {
88
+ this.finishWithState(state, true);
89
+ }
90
+ };
91
+ this.onMessage = (event) => {
92
+ this.onBroadcastMessage(event);
93
+ };
94
+ this.clearStorageState = () => {
95
+ sessionStorage.removeItem('state');
96
+ localStorage.removeItem('state');
97
+ };
98
+ this.processError = (err) => {
99
+ this.toastrService.show(err !== '' ? err : 'payment-error');
100
+ };
91
101
  this.ecOnConstruct();
92
102
  }
93
103
  ngOnInit() {
94
- this.getCheckoutMobbex();
104
+ if (typeof window !== 'undefined') {
105
+ window.addEventListener('storage', this.onStorage);
106
+ window.addEventListener('message', this.onMessage);
107
+ if (window.BroadcastChannel) {
108
+ this.bc = new BroadcastChannel('mobbex_payment');
109
+ this.bc.onmessage = (event) => this.onBroadcastMessage(event);
110
+ }
111
+ }
112
+ this.loadCheckout();
95
113
  this.ecOnInit();
96
114
  }
97
115
  ngOnDestroy() {
98
- // console.log("SE DESTROZA");
116
+ if (typeof window !== 'undefined') {
117
+ window.removeEventListener('storage', this.onStorage);
118
+ window.removeEventListener('message', this.onMessage);
119
+ }
120
+ if (this.bc) {
121
+ try {
122
+ this.bc.close();
123
+ }
124
+ catch (_a) {
125
+ // Nothing to do.
126
+ }
127
+ this.bc = null;
128
+ }
129
+ this.stopPolling();
130
+ this.closePopup();
131
+ }
132
+ loadCheckout() {
133
+ if (!this.paymentServiceInst || !this.method)
134
+ return;
135
+ if (this.url && !this.loading)
136
+ return;
137
+ this.getCheckoutMobbex();
138
+ }
139
+ startPolling() {
140
+ this.stopPolling();
141
+ this.pollTimer = setInterval(() => {
142
+ var _a, _b, _c, _d, _e, _f;
143
+ if (this.finished) {
144
+ this.stopPolling();
145
+ return;
146
+ }
147
+ const state = this.readState();
148
+ if (state) {
149
+ this.finishWithState(state, true);
150
+ return;
151
+ }
152
+ if ((_a = this.popup) === null || _a === void 0 ? void 0 : _a.closed) {
153
+ this.finishWithState('cancel', true);
154
+ return;
155
+ }
156
+ const rawTimeoutMinutes = Number((_f = (_d = (_c = (_b = this.checkoutData) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.timeout, (_d !== null && _d !== void 0 ? _d : (_e = this.checkoutData) === null || _e === void 0 ? void 0 : _e.timeout)), (_f !== null && _f !== void 0 ? _f : 60)));
157
+ const timeoutMinutes = Number.isFinite(rawTimeoutMinutes) && rawTimeoutMinutes > 0 ? rawTimeoutMinutes : 60;
158
+ const timeoutMs = Math.max(5, timeoutMinutes + 1) * 60 * 1000;
159
+ if (Date.now() - this.startedAt > timeoutMs) {
160
+ this.finishWithState('failure', true, 'Tiempo de espera agotado al procesar el pago con Mobbex.');
161
+ }
162
+ }, 1000);
163
+ }
164
+ onBroadcastMessage(event) {
165
+ var _a;
166
+ const payload = (_a = event) === null || _a === void 0 ? void 0 : _a.data;
167
+ if (!payload || payload.type !== 'mobbex:state' || this.finished)
168
+ return;
169
+ if (this.checkoutKey && payload.checkoutKey && payload.checkoutKey !== this.checkoutKey)
170
+ return;
171
+ const state = this.normalizeState(payload.state);
172
+ if (state) {
173
+ this.finishWithState(state, true);
174
+ }
99
175
  }
100
- ngOnChanges() {
101
- // console.log("SE CAMBIO");
176
+ finishWithState(state, closePopup = false, customMessage = '') {
177
+ if (this.finished)
178
+ return;
179
+ this.finished = true;
180
+ this.processing = false;
181
+ this.stopPolling();
182
+ if (closePopup) {
183
+ this.closePopup();
184
+ }
185
+ this.clearStateKeys();
186
+ if (state === 'success' || state === 'pending') {
187
+ this.ready.emit(true);
188
+ return;
189
+ }
190
+ this.processError(customMessage || (state === 'cancel' ? 'Se canceló el pago con Mobbex' : ''));
102
191
  }
103
- openModal(template) {
192
+ readState() {
193
+ const keys = this.getStateKeys();
194
+ for (const key of keys) {
195
+ const value = this.safeGetStorage(key);
196
+ const normalized = this.normalizeState(value);
197
+ if (normalized)
198
+ return normalized;
199
+ }
200
+ return null;
201
+ }
202
+ normalizeState(value) {
203
+ const raw = String(value || '').toLowerCase();
204
+ if (!raw)
205
+ return null;
206
+ if (raw === '200' || raw === 'ok' || raw === 'success')
207
+ return 'success';
208
+ if (raw === 'pending' || raw === 'in_process' || raw === 'in_review' || raw === 'challenge')
209
+ return 'pending';
210
+ if (raw === 'cancel' || raw === '0' || raw === 'none')
211
+ return 'cancel';
212
+ if (raw === 'failure' || raw === 'error' || raw === 'expired' || raw === '401')
213
+ return 'failure';
214
+ return null;
215
+ }
216
+ getStateKeys() {
217
+ const keys = ['state'];
218
+ if (this.checkoutKey) {
219
+ keys.unshift(`mobbex:state:${this.checkoutKey}`);
220
+ }
221
+ return keys;
222
+ }
223
+ clearStateKeys() {
104
224
  this.clearStorageState();
105
- this.modalRef = this.modalService.show(template, { class: 'modal-lg modal-dialog-centered ', keyboard: false, backdrop: 'static', animated: true });
106
- this.closeModal = '';
107
- this.callState();
225
+ if (this.checkoutKey) {
226
+ this.safeRemoveStorage(`mobbex:state:${this.checkoutKey}`);
227
+ this.safeRemoveStorage('mobbex:checkout-id');
228
+ }
229
+ }
230
+ stopPolling() {
231
+ if (this.pollTimer) {
232
+ clearInterval(this.pollTimer);
233
+ this.pollTimer = null;
234
+ }
235
+ }
236
+ closePopup() {
237
+ if (!this.popup)
238
+ return;
239
+ try {
240
+ if (!this.popup.closed)
241
+ this.popup.close();
242
+ }
243
+ catch (_a) {
244
+ // Nothing to do.
245
+ }
246
+ this.popup = null;
247
+ }
248
+ safeGetStorage(key) {
249
+ try {
250
+ return localStorage.getItem(key);
251
+ }
252
+ catch (_a) {
253
+ return null;
254
+ }
255
+ }
256
+ safeRemoveStorage(key) {
257
+ try {
258
+ localStorage.removeItem(key);
259
+ }
260
+ catch (_a) {
261
+ // Nothing to do.
262
+ }
263
+ }
264
+ safeSetStorage(key, value) {
265
+ try {
266
+ localStorage.setItem(key, value);
267
+ }
268
+ catch (_a) {
269
+ // Nothing to do.
270
+ }
108
271
  }
109
272
  };
110
273
  MobbexEcComponent.ctorParameters = () => [
111
- { type: Renderer2 },
112
- { type: ConnectionService },
113
274
  { type: ToastService },
114
- { type: Constants },
115
- { type: CartService },
116
- { type: ToastService },
117
- { type: ActivatedRoute },
118
- { type: DomSanitizer },
119
- { type: BsModalService }
275
+ { type: CartService }
120
276
  ];
121
277
  __decorate([
122
278
  Input()
@@ -136,16 +292,12 @@ __decorate([
136
292
  __decorate([
137
293
  Output()
138
294
  ], MobbexEcComponent.prototype, "ready", void 0);
139
- __decorate([
140
- ViewChild('template')
141
- ], MobbexEcComponent.prototype, "template", void 0);
142
295
  MobbexEcComponent = __decorate([
143
296
  Component({
144
297
  selector: 'app-mobbex-ec',
145
- template: "<div class=\"text-center\">\n <h3>Continuar con el pago en Mobbex</h3>\n <p *ngIf=\"method\" class=\"px-5\">{{ method?.description }}</p>\n <p *ngIf=\"method\" class=\"px-5\">{{ method?.instructions }}</p>\n <ng-container *ngIf=\"!loading ; else loadingUrl\">\n <button class=\"btn btn-outline-secondary comprar\" (click)=\"openModal(template)\">Pagar</button>\n </ng-container>\n</div>\n\n<ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modalRef.hide(); loading = false;\">\n </button>\n </div>\n <div class=\"modal-body\">\n <iframe [src]=\"url\" frameborder=\"0\" class=\"iframeStyle\"></iframe>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loadingUrl>\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center mt-2\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n</ng-template>",
146
- providers: [BsModalService],
147
- styles: [".half-width{width:49%!important}.ml-1{margin-left:1%}#card-form{height:450px}.iframeStyle{height:800px;width:100%;max-height:800px}"]
298
+ template: "<div class=\"text-center\">\n <h3>Continuar con el pago en Mobbex</h3>\n <p *ngIf=\"method\" class=\"px-5\">{{ method?.description }}</p>\n <p *ngIf=\"method\" class=\"px-5\">{{ method?.instructions }}</p>\n\n <ng-container *ngIf=\"loading; else checkoutReady\">\n <div class=\"d-flex flex-column justify-content-center align-items-center mt-2\">\n <app-loading-full-ec></app-loading-full-ec>\n <p class=\"mt-3 px-5 mobbex-note\">Preparando la pasarela de pago...</p>\n </div>\n </ng-container>\n\n <ng-template #checkoutReady>\n <p class=\"mt-3 px-5 mobbex-note\">\n Se abrir\u00E1 una nueva pesta\u00F1a para completar el pago.\n </p>\n\n <div class=\"d-flex flex-column align-items-center\">\n <button\n class=\"btn btn-outline-secondary comprar\"\n [disabled]=\"processing || !url\"\n (click)=\"openCheckout()\">\n Ir al sitio de Mobbex\n </button>\n\n <a\n *ngIf=\"url\"\n class=\"mt-2 small mobbex-link\"\n [href]=\"url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.preventDefault(); openCheckout()\">\n Si el bot\u00F3n no abre una nueva pesta\u00F1a, toc\u00E1 aqu\u00ED para continuar.\n </a>\n\n <button\n *ngIf=\"processing\"\n type=\"button\"\n class=\"btn btn-link text-secondary mt-2\"\n (click)=\"cancelCheckout()\">\n Cancelar pago\n </button>\n\n <p *ngIf=\"!url\" class=\"mt-2 px-5 text-danger\">\n No fue posible preparar la pasarela de pago.\n </p>\n </div>\n </ng-template>\n</div>\n",
299
+ styles: [".mobbex-note{color:#6c757d}"]
148
300
  })
149
301
  ], MobbexEcComponent);
150
302
  export { MobbexEcComponent };
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9iYmV4LWVjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9lYy1jb21wb25lbnQvd2lkZ2V0cy1lYy9tb2JiZXgtZWMvbW9iYmV4LWVjLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUosT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBU2pFLElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWtCLFNBQVEsZUFBZTtJQW9CbEQsWUFBbUIsUUFBbUIsRUFDM0IsVUFBNkIsRUFDN0IsYUFBMkIsRUFDM0IsTUFBaUIsRUFDakIsV0FBd0IsRUFDeEIsTUFBb0IsRUFDcEIsWUFBNEIsRUFDNUIsU0FBdUIsRUFDdkIsWUFBNEI7UUFDbkMsS0FBSyxFQUFFLENBQUM7UUFUTyxh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QixFQUFFLENBQUE7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsaUNBQWlDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BKLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUNwQixDQUFDO0NBZ0VKLENBQUE7O1lBL0ZnQyxTQUFTO1lBQ2YsaUJBQWlCO1lBQ2QsWUFBWTtZQUNuQixTQUFTO1lBQ0osV0FBVztZQUNoQixZQUFZO1lBQ04sY0FBYztZQUNqQixZQUFZO1lBQ1QsY0FBYzs7QUExQjlCO0lBQVIsS0FBSyxFQUFFOzZEQUFvQjtBQUNuQjtJQUFSLEtBQUssRUFBRTtpREFBZTtBQUNkO0lBQVIsS0FBSyxFQUFFO3VEQUFrQjtBQUNqQjtJQUFSLEtBQUssRUFBRTtrREFBUztBQUNSO0lBQVIsS0FBSyxFQUFFO29EQUFrQjtBQUNoQjtJQUFULE1BQU0sRUFBRTtnREFBNEI7QUFDZDtJQUF0QixTQUFTLENBQUMsVUFBVSxDQUFDO21EQUFzQztBQVJuRCxpQkFBaUI7SUFON0IsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGVBQWU7UUFDekIsc2hDQUF1QztRQUV2QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7O0tBQzlCLENBQUM7R0FDVyxpQkFBaUIsQ0FtSDdCO1NBbkhZLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT3V0cHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsIFJlbmRlcmVyMiwgSW5qZWN0LCBPbkNoYW5nZXMsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSBcIi4uLy4uLy4uL2NsYXNzZXMvY29tcG9uZW50LWhlbHBlclwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcGkvY29ubmVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwsIFNhZmVVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEJzTW9kYWxSZWYsIEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5kZWNsYXJlIHZhciAkIDogYW55IFxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1tb2JiZXgtZWMnLFxuICAgIHRlbXBsYXRlVXJsOiAnbW9iYmV4LWVjLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnbW9iYmV4LWVjLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbQnNNb2RhbFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIE1vYmJleEVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgICBASW5wdXQoKSBwYXltZW50U2VydmljZUluc3Q7XG4gICAgQElucHV0KCkgbWV0aG9kID0gbnVsbDtcbiAgICBASW5wdXQoKSB0b3RhbF9hbW91bnQgPSAwO1xuICAgIEBJbnB1dCgpIGFsbERhdGE7XG4gICAgQElucHV0KCkgdXNlcl9kYXRhID0gbnVsbDtcbiAgICBAT3V0cHV0KCkgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQFZpZXdDaGlsZCgndGVtcGxhdGUnKSBwcm90ZWN0ZWQgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgcHJvdGVjdGVkIG1vZGFsUmVmOiBCc01vZGFsUmVmIHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgZGF0YU1vYmJleDtcblxuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGlzRG9ibGVBdXRoID0gZmFsc2U7XG4gICAgcHVibGljIHVybHMgPSBbXTtcbiAgICBwdWJsaWMgdXJsO1xuICAgIHB1YmxpYyBjbG9zZU1vZGFsID0gJydcbiAgICBwdWJsaWMgdmVudGFuYVxuICAgIHByb3RlY3RlZCBkYXRhUmVkaXJlY3QgPSAoKSA9PiB0aGlzLmNvbnN0cy5nZXRVcmxCYXNlKCkgKydzaG9wLWFwaS8nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJy9yZWRzeXMvcmVkaXJlY3QvJyArIHRoaXMuY2FydFNlcnZpY2UuY2FydF90b2tlbiArICcvcHJvY2Vzcy1wYXltZW50JztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwdWJsaWMgY29ubmVjdGlvbjogQ29ubmVjdGlvblNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyB0b2FzdHJTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjb25zdHM6IENvbnN0YW50cyxcbiAgICAgICAgcHVibGljIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcbiAgICAgICAgcHVibGljIHRvYXN0cjogVG9hc3RTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgYWN0aXZlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgICAgICBwdWJsaWMgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmdldENoZWNrb3V0TW9iYmV4KClcbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiU0UgREVTVFJPWkFcIik7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiU0UgQ0FNQklPXCIpO1xuICAgIH1cblxuICAgIG9wZW5Nb2RhbCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgICAgICB0aGlzLmNsZWFyU3RvcmFnZVN0YXRlKClcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHsgY2xhc3M6ICdtb2RhbC1sZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQgJywga2V5Ym9hcmQ6IGZhbHNlLCBiYWNrZHJvcDogJ3N0YXRpYycsIGFuaW1hdGVkOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmNsb3NlTW9kYWwgPSAnJ1xuICAgICAgICB0aGlzLmNhbGxTdGF0ZSgpXG4gICAgfVxuXG4gICAgY2xlYXJTdG9yYWdlU3RhdGUgPSAoKSA9PiB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ3N0YXRlJylcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3N0YXRlJylcbiAgICB9XG5cbiAgICBjbGlja0Nsb3NlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlTW9kYWwgPSAnY2FuY2VsJ1xuICAgICAgICB0aGlzLm1vZGFsUmVmLmhpZGUoKVxuICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcignU2UgY2FuY2VsbyBlbCBwYWdvIGNvbiBtb2JiZXgnKVxuICAgIH1cblxuXG4gICAgY2FsbFN0YXRlID0gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5jbG9zZU1vZGFsICE9ICcnID8gdGhpcy5jbG9zZU1vZGFsIDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0YXRlJylcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgIHN0YXRlICYmIGNvbnNvbGUubG9nKHN0YXRlKTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnc3RhdGUnKVxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdzdGF0ZScpXG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWR5LmVtaXQodHJ1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICdjYW5jZWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKCcnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsUmVmLmhpZGUoKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGUoKVxuICAgICAgICAgICAgfSwgNTAwMCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIFxuICAgICAgICB9ICAgXG4gICAgfVxuXG4gICAgcHJvY2Vzc0Vycm9yID0gKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdyhlcnIgIT0gJycgPyBlcnIgOiAncGF5bWVudC1lcnJvcicpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVSUk9SIEVOVklPIEJBQ0sgIFwiLCBlcnIpO1xuICAgIH1cblxuICAgIGdldENoZWNrb3V0TW9iYmV4ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICAgIHRoaXMucGF5bWVudFNlcnZpY2VJbnN0LmdldENoZWNrb3V0TW9iYmV4KHRoaXMuYWxsRGF0YSkudGhlbihcbiAgICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhTW9iYmV4ID0gcmVzO1xuICAgICAgICAgICAgICAgIHRoaXMudXJsID0gcmVzPy5kYXRhPy51cmwgJiYgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHJlcz8uZGF0YT8udXJsKVxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcignb3BlcmF0aW9uLWVycm9yJylcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxufVxuXG4iXX0=
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9iYmV4LWVjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9lYy1jb21wb25lbnQvd2lkZ2V0cy1lYy9tb2JiZXgtZWMvbW9iYmV4LWVjLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQVM3RCxJQUFhLGlCQUFpQixHQUE5QixNQUFhLGlCQUFrQixTQUFRLGVBQWU7SUFzQmxELFlBQ1csYUFBMkIsRUFDM0IsV0FBd0I7UUFFL0IsS0FBSyxFQUFFLENBQUM7UUFIRCxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQXJCMUIsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRWpCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDaEIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFOUIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsUUFBRyxHQUFrQixJQUFJLENBQUM7UUFFekIsaUJBQVksR0FBUSxJQUFJLENBQUM7UUFDekIsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFDNUIsY0FBUyxHQUFRLElBQUksQ0FBQztRQUN0QixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixPQUFFLEdB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QUMsV0FBTTtZQUNKLGlCQUFpQjtTQUNwQjtJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDN0MsSUFBSTtZQUNBLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO1FBQUMsV0FBTTtZQUNKLGlCQUFpQjtTQUNwQjtJQUNMLENBQUM7Q0FDSixDQUFBOztZQWhRNkIsWUFBWTtZQUNkLFdBQVc7O0FBdEIxQjtJQUFSLEtBQUssRUFBRTs2REFBb0I7QUFDbkI7SUFBUixLQUFLLEVBQUU7aURBQWU7QUFDZDtJQUFSLEtBQUssRUFBRTt1REFBa0I7QUFDakI7SUFBUixLQUFLLEVBQUU7a0RBQVM7QUFDUjtJQUFSLEtBQUssRUFBRTtvREFBa0I7QUFDaEI7SUFBVCxNQUFNLEVBQUU7Z0RBQTRCO0FBUDVCLGlCQUFpQjtJQUw3QixTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsZUFBZTtRQUN6Qix3MURBQXVDOztLQUUxQyxDQUFDO0dBQ1csaUJBQWlCLENBdVI3QjtTQXZSWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcblxudHlwZSBQYXltZW50U3RhdGUgPSAnc3VjY2VzcycgfCAncGVuZGluZycgfCAnZmFpbHVyZScgfCAnY2FuY2VsJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtbW9iYmV4LWVjJyxcbiAgICB0ZW1wbGF0ZVVybDogJ21vYmJleC1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ21vYmJleC1lYy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1vYmJleEVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgcGF5bWVudFNlcnZpY2VJbnN0O1xuICAgIEBJbnB1dCgpIG1ldGhvZCA9IG51bGw7XG4gICAgQElucHV0KCkgdG90YWxfYW1vdW50ID0gMDtcbiAgICBASW5wdXQoKSBhbGxEYXRhO1xuICAgIEBJbnB1dCgpIHVzZXJfZGF0YSA9IG51bGw7XG4gICAgQE91dHB1dCgpIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIGxvYWRpbmcgPSB0cnVlO1xuICAgIHB1YmxpYyBwcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgcHVibGljIHVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIGNoZWNrb3V0RGF0YTogYW55ID0gbnVsbDtcbiAgICBwcml2YXRlIHBvcHVwOiBXaW5kb3cgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHBvbGxUaW1lcjogYW55ID0gbnVsbDtcbiAgICBwcml2YXRlIHN0YXJ0ZWRBdCA9IDA7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2hlY2tvdXRLZXkgPSAnJztcbiAgICBwcml2YXRlIGJjOiBCcm9hZGNhc3RDaGFubmVsIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBjaGVja291dFJlcXVlc3RJbkZsaWdodCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyB0b2FzdHJTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZWNPbkNvbnN0cnVjdCgpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcy5vblN0b3JhZ2UgYXMgYW55KTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5vbk1lc3NhZ2UgYXMgYW55KTtcbiAgICAgICAgICAgIGlmICgod2luZG93IGFzIGFueSkuQnJvYWRjYXN0Q2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmMgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbCgnbW9iYmV4X3BheW1lbnQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJjLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB0aGlzLm9uQnJvYWRjYXN0TWVzc2FnZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkQ2hlY2tvdXQoKTtcbiAgICAgICAgdGhpcy5lY09uSW5pdCgpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcy5vblN0b3JhZ2UgYXMgYW55KTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5vbk1lc3NhZ2UgYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYykge1xuICAgICAgICAgICAgdHJ5IHsgdGhpcy5iYy5jbG9zZSgpOyB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iYyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcbiAgICB9XG5cbiAgICBvcGVuQ2hlY2tvdXQgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy51cmwgfHwgdGhpcy5wcm9jZXNzaW5nIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jbGVhclN0YXRlS2V5cygpO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICB0aGlzLnBvcHVwID0gd2luZG93Lm9wZW4odGhpcy51cmwsICdfYmxhbmsnKTtcblxuICAgICAgICBpZiAoIXRoaXMucG9wdXAgfHwgdGhpcy5wb3B1cC5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ05vIHNlIHB1ZG8gYWJyaXIgbGEgcGFzYXJlbGEgZGUgcGFnby4gVmVyaWZpcXVlIHF1ZSBzdSBuYXZlZ2Fkb3IgcGVybWl0YSBudWV2YXMgcGVzdGHDsWFzLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucG9wdXAub3BlbmVyID0gbnVsbDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLlxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGFydFBvbGxpbmcoKTtcbiAgICB9XG5cbiAgICBjYW5jZWxDaGVja291dCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5maW5pc2hXaXRoU3RhdGUoJ2NhbmNlbCcsIHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2hlY2tvdXRNb2JiZXggPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0UmVxdWVzdEluRmxpZ2h0KSByZXR1cm47XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRSZXF1ZXN0SW5GbGlnaHQgPSB0cnVlO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy51c2VyX2RhdGEgfHwgdGhpcy5hbGxEYXRhIHx8IHt9O1xuICAgICAgICB0aGlzLnBheW1lbnRTZXJ2aWNlSW5zdC5nZXRDaGVja291dE1vYmJleChwYXlsb2FkKS50aGVuKFxuICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0RGF0YSA9IHJlcyB8fCBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRLZXkgPSBTdHJpbmcocmVzPy5kYXRhPy5pZCB8fCB0aGlzLmNhcnRTZXJ2aWNlLmNhcnRfdG9rZW4gfHwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMudXJsID0gcmVzPy5kYXRhPy51cmwgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnNhZmVTZXRTdG9yYWdlKCdtb2JiZXg6Y2hlY2tvdXQtaWQnLCB0aGlzLmNoZWNrb3V0S2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0UmVxdWVzdEluRmxpZ2h0ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKCdvcGVyYXRpb24tZXJyb3InKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRSZXF1ZXN0SW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcignb3BlcmF0aW9uLWVycm9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkQ2hlY2tvdXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5wYXltZW50U2VydmljZUluc3QgfHwgIXRoaXMubWV0aG9kKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnVybCAmJiAhdGhpcy5sb2FkaW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2V0Q2hlY2tvdXRNb2JiZXgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0UG9sbGluZygpIHtcbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuXG4gICAgICAgIHRoaXMucG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMucmVhZFN0YXRlKCk7XG4gICAgICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFdpdGhTdGF0ZShzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5wb3B1cD8uY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5pc2hXaXRoU3RhdGUoJ2NhbmNlbCcsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmF3VGltZW91dE1pbnV0ZXMgPSBOdW1iZXIodGhpcy5jaGVja291dERhdGE/LmRhdGE/LnRpbWVvdXQgPz8gdGhpcy5jaGVja291dERhdGE/LnRpbWVvdXQgPz8gNjApO1xuICAgICAgICAgICAgY29uc3QgdGltZW91dE1pbnV0ZXMgPSBOdW1iZXIuaXNGaW5pdGUocmF3VGltZW91dE1pbnV0ZXMpICYmIHJhd1RpbWVvdXRNaW51dGVzID4gMCA/IHJhd1RpbWVvdXRNaW51dGVzIDogNjA7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSBNYXRoLm1heCg1LCB0aW1lb3V0TWludXRlcyArIDEpICogNjAgKiAxMDAwO1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLnN0YXJ0ZWRBdCA+IHRpbWVvdXRNcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoV2l0aFN0YXRlKCdmYWlsdXJlJywgdHJ1ZSwgJ1RpZW1wbyBkZSBlc3BlcmEgYWdvdGFkbyBhbCBwcm9jZXNhciBlbCBwYWdvIGNvbiBNb2JiZXguJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25TdG9yYWdlID0gKGV2ZW50OiBTdG9yYWdlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFldmVudD8ua2V5IHx8IHRoaXMuZmluaXNoZWQpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKGV2ZW50LmtleSkpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLm5vcm1hbGl6ZVN0YXRlKGV2ZW50Lm5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmlzaFdpdGhTdGF0ZShzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25Ccm9hZGNhc3RNZXNzYWdlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQnJvYWRjYXN0TWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBldmVudD8uZGF0YTtcbiAgICAgICAgaWYgKCFwYXlsb2FkIHx8IHBheWxvYWQudHlwZSAhPT0gJ21vYmJleDpzdGF0ZScgfHwgdGhpcy5maW5pc2hlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEtleSAmJiBwYXlsb2FkLmNoZWNrb3V0S2V5ICYmIHBheWxvYWQuY2hlY2tvdXRLZXkgIT09IHRoaXMuY2hlY2tvdXRLZXkpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLm5vcm1hbGl6ZVN0YXRlKHBheWxvYWQuc3RhdGUpO1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoV2l0aFN0YXRlKHN0YXRlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZmluaXNoV2l0aFN0YXRlKHN0YXRlOiBQYXltZW50U3RhdGUsIGNsb3NlUG9wdXAgPSBmYWxzZSwgY3VzdG9tTWVzc2FnZSA9ICcnKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuXG4gICAgICAgIGlmIChjbG9zZVBvcHVwKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTdGF0ZUtleXMoKTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09ICdzdWNjZXNzJyB8fCBzdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWR5LmVtaXQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihjdXN0b21NZXNzYWdlIHx8IChzdGF0ZSA9PT0gJ2NhbmNlbCcgPyAnU2UgY2FuY2Vsw7MgZWwgcGFnbyBjb24gTW9iYmV4JyA6ICcnKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkU3RhdGUoKTogUGF5bWVudFN0YXRlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGtleXMgPSB0aGlzLmdldFN0YXRlS2V5cygpO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zYWZlR2V0U3RvcmFnZShrZXkpO1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplU3RhdGUodmFsdWUpO1xuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWQpIHJldHVybiBub3JtYWxpemVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemVTdGF0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFBheW1lbnRTdGF0ZSB8IG51bGwge1xuICAgICAgICBjb25zdCByYXcgPSBTdHJpbmcodmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHJhdyA9PT0gJzIwMCcgfHwgcmF3ID09PSAnb2snIHx8IHJhdyA9PT0gJ3N1Y2Nlc3MnKSByZXR1cm4gJ3N1Y2Nlc3MnO1xuICAgICAgICBpZiAocmF3ID09PSAncGVuZGluZycgfHwgcmF3ID09PSAnaW5fcHJvY2VzcycgfHwgcmF3ID09PSAnaW5fcmV2aWV3JyB8fCByYXcgPT09ICdjaGFsbGVuZ2UnKSByZXR1cm4gJ3BlbmRpbmcnO1xuICAgICAgICBpZiAocmF3ID09PSAnY2FuY2VsJyB8fCByYXcgPT09ICcwJyB8fCByYXcgPT09ICdub25lJykgcmV0dXJuICdjYW5jZWwnO1xuICAgICAgICBpZiAocmF3ID09PSAnZmFpbHVyZScgfHwgcmF3ID09PSAnZXJyb3InIHx8IHJhdyA9PT0gJ2V4cGlyZWQnIHx8IHJhdyA9PT0gJzQwMScpIHJldHVybiAnZmFpbHVyZSc7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3RhdGVLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IFsnc3RhdGUnXTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRLZXkpIHtcbiAgICAgICAgICAgIGtleXMudW5zaGlmdChgbW9iYmV4OnN0YXRlOiR7dGhpcy5jaGVja291dEtleX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5cztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyU3RvcmFnZVN0YXRlID0gKCkgPT4ge1xuICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdzdGF0ZScpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc3RhdGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyU3RhdGVLZXlzKCkge1xuICAgICAgICB0aGlzLmNsZWFyU3RvcmFnZVN0YXRlKCk7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0S2V5KSB7XG4gICAgICAgICAgICB0aGlzLnNhZmVSZW1vdmVTdG9yYWdlKGBtb2JiZXg6c3RhdGU6JHt0aGlzLmNoZWNrb3V0S2V5fWApO1xuICAgICAgICAgICAgdGhpcy5zYWZlUmVtb3ZlU3RvcmFnZSgnbW9iYmV4OmNoZWNrb3V0LWlkJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NFcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coZXJyICE9PSAnJyA/IGVyciA6ICdwYXltZW50LWVycm9yJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9wUG9sbGluZygpIHtcbiAgICAgICAgaWYgKHRoaXMucG9sbFRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucG9sbFRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMucG9sbFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VQb3B1cCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBvcHVwKSByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucG9wdXAuY2xvc2VkKSB0aGlzLnBvcHVwLmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBkby5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcHVwID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNhZmVHZXRTdG9yYWdlKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2FmZVJlbW92ZVN0b3JhZ2Uoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBkby5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2FmZVNldFN0b3JhZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8uXG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=