1 | (function (global, factory) {
|
2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('class-transformer'), require('@angular/router'), require('@ubud/storage'), require('rxjs'), require('rxjs/internal/observable/fromPromise'), require('rxjs/internal/operators'), require('@angular/common/http'), require('@angular/common'), require('rxjs-compat/observable/ErrorObservable')) :
|
3 | typeof define === 'function' && define.amd ? define('@naker/naco', ['exports', '@angular/core', 'class-transformer', '@angular/router', '@ubud/storage', 'rxjs', 'rxjs/internal/observable/fromPromise', 'rxjs/internal/operators', '@angular/common/http', '@angular/common', 'rxjs-compat/observable/ErrorObservable'], factory) :
|
4 | (factory((global.naker = global.naker || {}, global.naker.naco = {}),global.ng.core,null,global.ng.router,null,global.rxjs,global.rxjs['internal/observable/fromPromise'],global.rxjs['internal/operators'],global.ng.common.http,global.ng.common,null));
|
5 | }(this, (function (exports,core,classTransformer,router,storage,rxjs,fromPromise,operators,http,common,ErrorObservable) { 'use strict';
|
6 |
|
7 | /*! *****************************************************************************
|
8 | Copyright (c) Microsoft Corporation. All rights reserved.
|
9 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
10 | this file except in compliance with the License. You may obtain a copy of the
|
11 | License at http://www.apache.org/licenses/LICENSE-2.0
|
12 |
|
13 | THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14 | KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
|
15 | WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
|
16 | MERCHANTABLITY OR NON-INFRINGEMENT.
|
17 |
|
18 | See the Apache Version 2.0 License for specific language governing permissions
|
19 | and limitations under the License.
|
20 | ***************************************************************************** */
|
21 | var __assign = function () {
|
22 | __assign = Object.assign || function __assign(t) {
|
23 | for (var s, i = 1, n = arguments.length; i < n; i++) {
|
24 | s = arguments[i];
|
25 | for (var p in s)
|
26 | if (Object.prototype.hasOwnProperty.call(s, p))
|
27 | t[p] = s[p];
|
28 | }
|
29 | return t;
|
30 | };
|
31 | return __assign.apply(this, arguments);
|
32 | };
|
33 | function __decorate(decorators, target, key, desc) {
|
34 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
35 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
36 | r = Reflect.decorate(decorators, target, key, desc);
|
37 | else
|
38 | for (var i = decorators.length - 1; i >= 0; i--)
|
39 | if (d = decorators[i])
|
40 | r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
41 | return c > 3 && r && Object.defineProperty(target, key, r), r;
|
42 | }
|
43 | function __metadata(metadataKey, metadataValue) {
|
44 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
45 | return Reflect.metadata(metadataKey, metadataValue);
|
46 | }
|
47 | function __awaiter(thisArg, _arguments, P, generator) {
|
48 | return new (P || (P = Promise))(function (resolve, reject) {
|
49 | function fulfilled(value) { try {
|
50 | step(generator.next(value));
|
51 | }
|
52 | catch (e) {
|
53 | reject(e);
|
54 | } }
|
55 | function rejected(value) { try {
|
56 | step(generator["throw"](value));
|
57 | }
|
58 | catch (e) {
|
59 | reject(e);
|
60 | } }
|
61 | function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
62 | step((generator = generator.apply(thisArg, _arguments || [])).next());
|
63 | });
|
64 | }
|
65 | function __generator(thisArg, body) {
|
66 | var _ = { label: 0, sent: function () { if (t[0] & 1)
|
67 | throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
68 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
|
69 | function verb(n) { return function (v) { return step([n, v]); }; }
|
70 | function step(op) {
|
71 | if (f)
|
72 | throw new TypeError("Generator is already executing.");
|
73 | while (_)
|
74 | try {
|
75 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
|
76 | return t;
|
77 | if (y = 0, t)
|
78 | op = [op[0] & 2, t.value];
|
79 | switch (op[0]) {
|
80 | case 0:
|
81 | case 1:
|
82 | t = op;
|
83 | break;
|
84 | case 4:
|
85 | _.label++;
|
86 | return { value: op[1], done: false };
|
87 | case 5:
|
88 | _.label++;
|
89 | y = op[1];
|
90 | op = [0];
|
91 | continue;
|
92 | case 7:
|
93 | op = _.ops.pop();
|
94 | _.trys.pop();
|
95 | continue;
|
96 | default:
|
97 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
98 | _ = 0;
|
99 | continue;
|
100 | }
|
101 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
|
102 | _.label = op[1];
|
103 | break;
|
104 | }
|
105 | if (op[0] === 6 && _.label < t[1]) {
|
106 | _.label = t[1];
|
107 | t = op;
|
108 | break;
|
109 | }
|
110 | if (t && _.label < t[2]) {
|
111 | _.label = t[2];
|
112 | _.ops.push(op);
|
113 | break;
|
114 | }
|
115 | if (t[2])
|
116 | _.ops.pop();
|
117 | _.trys.pop();
|
118 | continue;
|
119 | }
|
120 | op = body.call(thisArg, _);
|
121 | }
|
122 | catch (e) {
|
123 | op = [6, e];
|
124 | y = 0;
|
125 | }
|
126 | finally {
|
127 | f = t = 0;
|
128 | }
|
129 | if (op[0] & 5)
|
130 | throw op[1];
|
131 | return { value: op[0] ? op[1] : void 0, done: true };
|
132 | }
|
133 | }
|
134 | function __values(o) {
|
135 | var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
|
136 | if (m)
|
137 | return m.call(o);
|
138 | return {
|
139 | next: function () {
|
140 | if (o && i >= o.length)
|
141 | o = void 0;
|
142 | return { value: o && o[i++], done: !o };
|
143 | }
|
144 | };
|
145 | }
|
146 |
|
147 | /**
|
148 | * @fileoverview added by tsickle
|
149 | * @suppress {checkTypes} checked by tsc
|
150 | */
|
151 | var Config = /** @class */ (function () {
|
152 | function Config(data) {
|
153 | this.endpoint = 'https://account.kemnaker.go.id';
|
154 | Object.assign(this, data);
|
155 | }
|
156 | return Config;
|
157 | }());
|
158 |
|
159 | /**
|
160 | * @fileoverview added by tsickle
|
161 | * @suppress {checkTypes} checked by tsc
|
162 | */
|
163 | var User = /** @class */ (function () {
|
164 | function User() {
|
165 | }
|
166 | __decorate([
|
167 | classTransformer.Type(/** @type {?} */ (core.forwardRef(function () { return Date; }))),
|
168 | __metadata("design:type", Date)
|
169 | ], User.prototype, "updatedAt", void 0);
|
170 | return User;
|
171 | }());
|
172 |
|
173 | /**
|
174 | * @fileoverview added by tsickle
|
175 | * @suppress {checkTypes} checked by tsc
|
176 | */
|
177 | var NacoService = /** @class */ (function () {
|
178 | function NacoService(config, router$$1, storage$$1, http$$1, location) {
|
179 | this.config = config;
|
180 | this.router = router$$1;
|
181 | this.storage = storage$$1;
|
182 | this.http = http$$1;
|
183 | this.location = location;
|
184 | this.VERSION = 'v1';
|
185 | this.signature = null;
|
186 | this.user = null;
|
187 | this.refreshToken = null;
|
188 | this.clientSecret = null;
|
189 | }
|
190 | /**
|
191 | * @param {?} user
|
192 | * @return {?}
|
193 | */
|
194 | NacoService.prototype.setUser = /**
|
195 | * @param {?} user
|
196 | * @return {?}
|
197 | */
|
198 | function (user) {
|
199 | this.user = user;
|
200 | this.storage.set('user', user);
|
201 | };
|
202 | /**
|
203 | * @return {?}
|
204 | */
|
205 | NacoService.prototype.getUser = /**
|
206 | * @return {?}
|
207 | */
|
208 | function () {
|
209 | var _this = this;
|
210 | if (null !== this.user) {
|
211 | return rxjs.of(this.user);
|
212 | }
|
213 | return fromPromise.fromPromise(this.storage.get('user')).pipe(operators.switchMap(function (user) {
|
214 | if (null !== user) {
|
215 | return rxjs.of(user);
|
216 | }
|
217 | var /** @type {?} */ uri = _this.getUri('/users/me');
|
218 | return fromPromise.fromPromise(_this.getSignature()).pipe(operators.switchMap(function (signature) {
|
219 | if (null === signature) {
|
220 | return rxjs.of(null);
|
221 | }
|
222 | var /** @type {?} */ options = {
|
223 | headers: {
|
224 | Authorization: signature.type + " " + signature.token,
|
225 | },
|
226 | };
|
227 | return _this.http.get(uri, options).pipe(operators.map(function (res) {
|
228 | if (res.data) {
|
229 | return res.data;
|
230 | }
|
231 | throw new Error('There are no body to be transformed');
|
232 | }), operators.map(function (data) {
|
233 | var /** @type {?} */ authUser = classTransformer.plainToClass(User, data);
|
234 | _this.setUser(authUser);
|
235 | return authUser;
|
236 | }), operators.catchError(function (e) {
|
237 | if (401 === e.status) {
|
238 | return _this.refreshUser().pipe(operators.switchMap(function (refreshUser) {
|
239 | if (refreshUser) {
|
240 | return rxjs.of(refreshUser);
|
241 | }
|
242 | return ErrorObservable.ErrorObservable.create(e);
|
243 | }));
|
244 | }
|
245 | return ErrorObservable.ErrorObservable.create(e);
|
246 | }));
|
247 | }));
|
248 | }));
|
249 | };
|
250 | /**
|
251 | * @return {?}
|
252 | */
|
253 | NacoService.prototype.getSignature = /**
|
254 | * @return {?}
|
255 | */
|
256 | function () {
|
257 | if (null !== this.signature) {
|
258 | return Promise.resolve(this.signature);
|
259 | }
|
260 | return this.storage.get('signature');
|
261 | };
|
262 | /**
|
263 | * @param {?} signature
|
264 | * @return {?}
|
265 | */
|
266 | NacoService.prototype.setSignature = /**
|
267 | * @param {?} signature
|
268 | * @return {?}
|
269 | */
|
270 | function (signature) {
|
271 | this.signature = signature;
|
272 | this.storage.set('signature', signature);
|
273 | };
|
274 | /**
|
275 | * @param {?} secret
|
276 | * @return {?}
|
277 | */
|
278 | NacoService.prototype.setClientSecret = /**
|
279 | * @param {?} secret
|
280 | * @return {?}
|
281 | */
|
282 | function (secret) {
|
283 | this.clientSecret = secret;
|
284 | this.storage.set('client_secret', secret);
|
285 | };
|
286 | /**
|
287 | * @param {?} refreshToken
|
288 | * @return {?}
|
289 | */
|
290 | NacoService.prototype.setRefreshToken = /**
|
291 | * @param {?} refreshToken
|
292 | * @return {?}
|
293 | */
|
294 | function (refreshToken) {
|
295 | this.refreshToken = refreshToken;
|
296 | this.storage.set('refresh_token', refreshToken);
|
297 | };
|
298 | /**
|
299 | * @param {?=} scopes
|
300 | * @return {?}
|
301 | */
|
302 | NacoService.prototype.refreshUser = /**
|
303 | * @param {?=} scopes
|
304 | * @return {?}
|
305 | */
|
306 | function (scopes) {
|
307 | var _this = this;
|
308 | this.setUser(null);
|
309 | this.setSignature(null);
|
310 | return rxjs.forkJoin(this.getRefreshToken(), this.getClientSecret()).pipe(operators.switchMap(function (results) {
|
311 | var /** @type {?} */ refreshToken = results[0];
|
312 | var /** @type {?} */ clientSecret = results[1];
|
313 | if (refreshToken && clientSecret) {
|
314 | return _this.refreshWithRefreshToken(clientSecret, refreshToken.token, scopes);
|
315 | }
|
316 | return _this.refreshWithSilentAuth();
|
317 | }));
|
318 | };
|
319 | /**
|
320 | * @param {?} clientSecret
|
321 | * @param {?} refreshToken
|
322 | * @param {?=} scopes
|
323 | * @return {?}
|
324 | */
|
325 | NacoService.prototype.refreshWithRefreshToken = /**
|
326 | * @param {?} clientSecret
|
327 | * @param {?} refreshToken
|
328 | * @param {?=} scopes
|
329 | * @return {?}
|
330 | */
|
331 | function (clientSecret, refreshToken, scopes) {
|
332 | var _this = this;
|
333 | var /** @type {?} */ request = this.http.post(this.getUri('/tokens'), {
|
334 | grant_type: 'refresh_token',
|
335 | scopes: scopes || 'basic email',
|
336 | client_id: this.config.clientId,
|
337 | client_secret: clientSecret,
|
338 | refresh_token: refreshToken,
|
339 | });
|
340 | return request.pipe(operators.tap(function (tokens) {
|
341 | if (tokens && tokens.data) {
|
342 | _this.setSignature({
|
343 | expiresIn: tokens.data.expires_in,
|
344 | type: tokens.data.token_type,
|
345 | token: tokens.data.access_token,
|
346 | });
|
347 | _this.setRefreshToken({
|
348 | type: tokens.data.token_type,
|
349 | token: tokens.data.refresh_token,
|
350 | });
|
351 | }
|
352 | }), operators.map(function (tokens) { return tokens && tokens.data; }), operators.switchMap(function (hasToken) {
|
353 | if (hasToken) {
|
354 | return _this.getUser();
|
355 | }
|
356 | return rxjs.of(null);
|
357 | }));
|
358 | };
|
359 | /**
|
360 | * @return {?}
|
361 | */
|
362 | NacoService.prototype.refreshWithSilentAuth = /**
|
363 | * @return {?}
|
364 | */
|
365 | function () {
|
366 | var _this = this;
|
367 | return new rxjs.Observable(function (observer) {
|
368 | var /** @type {?} */ redirectUri = _this.getCurrentOrigin('auth/silent');
|
369 | var /** @type {?} */ uri = _this.login('basic email', redirectUri);
|
370 | var /** @type {?} */ iframe = document.createElement('iframe');
|
371 | iframe.setAttribute('src', uri);
|
372 | iframe.style.display = 'none';
|
373 | iframe.addEventListener('load', function () {
|
374 | return __awaiter(_this, void 0, void 0, function () {
|
375 | var e_1, _a, queryString, queryParts, params, queryParts_1, queryParts_1_1, item, itemParts, state, _b, user, e_2;
|
376 | return __generator(this, function (_c) {
|
377 | switch (_c.label) {
|
378 | case 0:
|
379 | _c.trys.push([0, 6, , 7]);
|
380 | queryString = iframe.contentWindow.location.search.substring(1);
|
381 | iframe.parentNode.removeChild(iframe);
|
382 | if (!queryString)
|
383 | return [3 /*break*/, 5];
|
384 | queryParts = queryString.split('&');
|
385 | params = {};
|
386 | try {
|
387 | for (queryParts_1 = __values(queryParts), queryParts_1_1 = queryParts_1.next(); !queryParts_1_1.done; queryParts_1_1 = queryParts_1.next()) {
|
388 | item = queryParts_1_1.value;
|
389 | itemParts = item.split('=');
|
390 | params[itemParts[0]] = itemParts[1];
|
391 | }
|
392 | }
|
393 | catch (e_1_1) {
|
394 | e_1 = { error: e_1_1 };
|
395 | }
|
396 | finally {
|
397 | try {
|
398 | if (queryParts_1_1 && !queryParts_1_1.done && (_a = queryParts_1.return))
|
399 | _a.call(queryParts_1);
|
400 | }
|
401 | finally {
|
402 | if (e_1)
|
403 | throw e_1.error;
|
404 | }
|
405 | }
|
406 | if (!params.hasOwnProperty('access_token'))
|
407 | return [3 /*break*/, 3];
|
408 | state = params['state'] || null;
|
409 | _b = state;
|
410 | return [4 /*yield*/, this.getState()];
|
411 | case 1:
|
412 | if (_b !== (_c.sent())) {
|
413 | observer.next(null);
|
414 | return [2 /*return*/];
|
415 | }
|
416 | this.setSignature({
|
417 | token: params['access_token'],
|
418 | type: params['token_type'],
|
419 | expiresIn: params['ttl'],
|
420 | });
|
421 | return [4 /*yield*/, this.getUser().toPromise()];
|
422 | case 2:
|
423 | user = _c.sent();
|
424 | if (user) {
|
425 | this.setUser(user);
|
426 | }
|
427 | observer.next(user);
|
428 | return [3 /*break*/, 4];
|
429 | case 3:
|
430 | observer.next(null);
|
431 | _c.label = 4;
|
432 | case 4: return [2 /*return*/];
|
433 | case 5:
|
434 | observer.next(null);
|
435 | return [3 /*break*/, 7];
|
436 | case 6:
|
437 | e_2 = _c.sent();
|
438 | observer.next(null);
|
439 | return [3 /*break*/, 7];
|
440 | case 7: return [2 /*return*/];
|
441 | }
|
442 | });
|
443 | });
|
444 | }, false);
|
445 | document.body.appendChild(iframe);
|
446 | });
|
447 | };
|
448 | /**
|
449 | * @param {?} scopes
|
450 | * @param {?=} redirectUri
|
451 | * @return {?}
|
452 | */
|
453 | NacoService.prototype.login = /**
|
454 | * @param {?} scopes
|
455 | * @param {?=} redirectUri
|
456 | * @return {?}
|
457 | */
|
458 | function (scopes, redirectUri) {
|
459 | if (!redirectUri) {
|
460 | redirectUri = this.router.url;
|
461 | }
|
462 | var /** @type {?} */ state = this.generateState();
|
463 | this.storage.set('state', state);
|
464 | var /** @type {?} */ query = this.buildQueryString({
|
465 | 'response_type': 'token',
|
466 | 'scopes': scopes,
|
467 | 'client': this.config.clientId,
|
468 | 'state': state,
|
469 | 'continue': redirectUri,
|
470 | });
|
471 | return this.config.endpoint + '/auth?' + query;
|
472 | };
|
473 | /**
|
474 | * @param {?=} redirectUri
|
475 | * @return {?}
|
476 | */
|
477 | NacoService.prototype.logout = /**
|
478 | * @param {?=} redirectUri
|
479 | * @return {?}
|
480 | */
|
481 | function (redirectUri) {
|
482 | var _this = this;
|
483 | this.signature = null;
|
484 | this.user = null;
|
485 | return new Promise(function (resolve) {
|
486 | Promise.all([
|
487 | _this.storage.remove('signature'),
|
488 | _this.storage.remove('user'),
|
489 | ]).then(function () {
|
490 | var /** @type {?} */ endpoint = _this.config.endpoint + '/auth/logout';
|
491 | if (redirectUri) {
|
492 | endpoint += '?continue=' + redirectUri;
|
493 | }
|
494 | resolve(endpoint);
|
495 | });
|
496 | });
|
497 | };
|
498 | /**
|
499 | * @return {?}
|
500 | */
|
501 | NacoService.prototype.getState = /**
|
502 | * @return {?}
|
503 | */
|
504 | function () {
|
505 | return this.storage.get('state');
|
506 | };
|
507 | /**
|
508 | * @param {?} route
|
509 | * @return {?}
|
510 | */
|
511 | NacoService.prototype.buildNestedUri = /**
|
512 | * @param {?} route
|
513 | * @return {?}
|
514 | */
|
515 | function (route) {
|
516 | var _this = this;
|
517 | var /** @type {?} */ uri = '';
|
518 | if (route.routeConfig && route.routeConfig.path) {
|
519 | uri += '/' + route.routeConfig.path;
|
520 | }
|
521 | if (route.children) {
|
522 | route.children.forEach(function (item) {
|
523 | uri += _this.buildNestedUri(item);
|
524 | });
|
525 | }
|
526 | return uri;
|
527 | };
|
528 | /**
|
529 | * @return {?}
|
530 | */
|
531 | NacoService.prototype.getRefreshToken = /**
|
532 | * @return {?}
|
533 | */
|
534 | function () {
|
535 | if (null !== this.refreshToken) {
|
536 | return Promise.resolve(this.refreshToken);
|
537 | }
|
538 | return this.storage.get('refresh_token');
|
539 | };
|
540 | /**
|
541 | * @return {?}
|
542 | */
|
543 | NacoService.prototype.getClientSecret = /**
|
544 | * @return {?}
|
545 | */
|
546 | function () {
|
547 | if (null !== this.clientSecret) {
|
548 | return Promise.resolve(this.clientSecret);
|
549 | }
|
550 | return this.storage.get('client_secret');
|
551 | };
|
552 | /**
|
553 | * @param {?} path
|
554 | * @return {?}
|
555 | */
|
556 | NacoService.prototype.getUri = /**
|
557 | * @param {?} path
|
558 | * @return {?}
|
559 | */
|
560 | function (path) {
|
561 | return this.config.endpoint + '/api/' + this.VERSION + path;
|
562 | };
|
563 | /**
|
564 | * @param {?=} path
|
565 | * @return {?}
|
566 | */
|
567 | NacoService.prototype.getCurrentOrigin = /**
|
568 | * @param {?=} path
|
569 | * @return {?}
|
570 | */
|
571 | function (path) {
|
572 | return window.location.origin + this.location.prepareExternalUrl(path || '');
|
573 | };
|
574 | /**
|
575 | * @return {?}
|
576 | */
|
577 | NacoService.prototype.generateState = /**
|
578 | * @return {?}
|
579 | */
|
580 | function () {
|
581 | var /** @type {?} */ possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
582 | var /** @type {?} */ text = '';
|
583 | for (var /** @type {?} */ i = 0; i < 5; i++) {
|
584 | text += possible.charAt(Math.floor(Math.random() * possible.length));
|
585 | }
|
586 | return text;
|
587 | };
|
588 | /**
|
589 | * @param {?} params
|
590 | * @return {?}
|
591 | */
|
592 | NacoService.prototype.buildQueryString = /**
|
593 | * @param {?} params
|
594 | * @return {?}
|
595 | */
|
596 | function (params) {
|
597 | var /** @type {?} */ queryParams = Object.keys(params).map(function (key) {
|
598 | return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
|
599 | });
|
600 | return queryParams.join('&');
|
601 | };
|
602 | NacoService.decorators = [
|
603 | { type: core.Injectable },
|
604 | ];
|
605 | /** @nocollapse */
|
606 | NacoService.ctorParameters = function () {
|
607 | return [
|
608 | { type: Config },
|
609 | { type: router.Router },
|
610 | { type: storage.Storage },
|
611 | { type: http.HttpClient },
|
612 | { type: common.Location }
|
613 | ];
|
614 | };
|
615 | return NacoService;
|
616 | }());
|
617 |
|
618 | /**
|
619 | * @fileoverview added by tsickle
|
620 | * @suppress {checkTypes} checked by tsc
|
621 | */
|
622 | var Signature = /** @class */ (function () {
|
623 | function Signature() {
|
624 | }
|
625 | return Signature;
|
626 | }());
|
627 |
|
628 | /**
|
629 | * @fileoverview added by tsickle
|
630 | * @suppress {checkTypes} checked by tsc
|
631 | */
|
632 | var AuthenticatedGuard = /** @class */ (function () {
|
633 | function AuthenticatedGuard(naco, storage$$1) {
|
634 | this.naco = naco;
|
635 | this.storage = storage$$1;
|
636 | }
|
637 | /**
|
638 | * @param {?} route
|
639 | * @return {?}
|
640 | */
|
641 | AuthenticatedGuard.prototype.canActivate = /**
|
642 | * @param {?} route
|
643 | * @return {?}
|
644 | */
|
645 | function (route) {
|
646 | var _this = this;
|
647 | return this.naco.getUser().pipe(operators.first(), operators.map(function (user) {
|
648 | if (null === user) {
|
649 | var /** @type {?} */ uri = _this.naco.buildNestedUri(route.root);
|
650 | var /** @type {?} */ next = _this.naco.getCurrentOrigin('/' + _this.ltrim(uri));
|
651 | _this.storage.set('naco_intended_url', next).then(function () {
|
652 | window.location.href = _this.naco.login('basic email', _this.naco.getCurrentOrigin('/auth'));
|
653 | });
|
654 | }
|
655 | return !!user;
|
656 | }));
|
657 | };
|
658 | /**
|
659 | * @param {?} route
|
660 | * @return {?}
|
661 | */
|
662 | AuthenticatedGuard.prototype.canActivateChild = /**
|
663 | * @param {?} route
|
664 | * @return {?}
|
665 | */
|
666 | function (route) {
|
667 | return this.canActivate(route);
|
668 | };
|
669 | /**
|
670 | * @param {?} text
|
671 | * @return {?}
|
672 | */
|
673 | AuthenticatedGuard.prototype.ltrim = /**
|
674 | * @param {?} text
|
675 | * @return {?}
|
676 | */
|
677 | function (text) {
|
678 | return text.replace(/^\/+/, '');
|
679 | };
|
680 | /**
|
681 | * @param {?} text
|
682 | * @return {?}
|
683 | */
|
684 | AuthenticatedGuard.prototype.rtrim = /**
|
685 | * @param {?} text
|
686 | * @return {?}
|
687 | */
|
688 | function (text) {
|
689 | return text.replace(/\/+$/, '');
|
690 | };
|
691 | AuthenticatedGuard.decorators = [
|
692 | { type: core.Injectable },
|
693 | ];
|
694 | /** @nocollapse */
|
695 | AuthenticatedGuard.ctorParameters = function () {
|
696 | return [
|
697 | { type: NacoService },
|
698 | { type: storage.Storage }
|
699 | ];
|
700 | };
|
701 | return AuthenticatedGuard;
|
702 | }());
|
703 |
|
704 | /**
|
705 | * @fileoverview added by tsickle
|
706 | * @suppress {checkTypes} checked by tsc
|
707 | */
|
708 | var AuthInterceptor = /** @class */ (function () {
|
709 | function AuthInterceptor(naco) {
|
710 | this.naco = naco;
|
711 | }
|
712 | /**
|
713 | * @param {?} req
|
714 | * @param {?} next
|
715 | * @return {?}
|
716 | */
|
717 | AuthInterceptor.prototype.intercept = /**
|
718 | * @param {?} req
|
719 | * @param {?} next
|
720 | * @return {?}
|
721 | */
|
722 | function (req, next) {
|
723 | var _this = this;
|
724 | return fromPromise.fromPromise(this.naco.getSignature()).pipe(operators.switchMap(function (signature) {
|
725 | if (!signature) {
|
726 | return next.handle(req);
|
727 | }
|
728 | return next
|
729 | .handle(req.clone({
|
730 | setHeaders: {
|
731 | Authorization: signature.type + " " + signature.token,
|
732 | },
|
733 | }))
|
734 | .pipe(operators.catchError(function (error) {
|
735 | if (error.status === 401) {
|
736 | return _this.naco.refreshUser().pipe(operators.switchMap(function (user) {
|
737 | if (user) {
|
738 | return fromPromise.fromPromise(_this.naco.getSignature()).pipe(operators.switchMap(function (newSignature) {
|
739 | return next.handle(req.clone({
|
740 | setHeaders: {
|
741 | Authorization: newSignature.type + " " + newSignature.token,
|
742 | },
|
743 | }));
|
744 | }));
|
745 | }
|
746 | return ErrorObservable.ErrorObservable.create(error);
|
747 | }));
|
748 | }
|
749 | return ErrorObservable.ErrorObservable.create(error);
|
750 | }));
|
751 | }));
|
752 | };
|
753 | AuthInterceptor.decorators = [
|
754 | { type: core.Injectable },
|
755 | ];
|
756 | /** @nocollapse */
|
757 | AuthInterceptor.ctorParameters = function () {
|
758 | return [
|
759 | { type: NacoService }
|
760 | ];
|
761 | };
|
762 | return AuthInterceptor;
|
763 | }());
|
764 |
|
765 | /**
|
766 | * @fileoverview added by tsickle
|
767 | * @suppress {checkTypes} checked by tsc
|
768 | */
|
769 | /**
|
770 | * @param {?} config
|
771 | * @param {?} router
|
772 | * @param {?} storage
|
773 | * @param {?} http
|
774 | * @param {?} location
|
775 | * @return {?}
|
776 | */
|
777 | function nacoFactory(config, router$$1, storage$$1, http$$1, location) {
|
778 | return new NacoService(new Config(__assign({}, config)), router$$1, storage$$1, http$$1, location);
|
779 | }
|
780 | var /** @type {?} */ NACO_CONFIG = new core.InjectionToken('NACO_CONFIG');
|
781 |
|
782 | /**
|
783 | * @fileoverview added by tsickle
|
784 | * @suppress {checkTypes} checked by tsc
|
785 | */
|
786 | var AuthPage = /** @class */ (function () {
|
787 | function AuthPage(route, naco, storage$$1) {
|
788 | var _this = this;
|
789 | this.route = route;
|
790 | this.naco = naco;
|
791 | this.storage = storage$$1;
|
792 | this.message = 'Authenticating...';
|
793 | this.route.queryParams.subscribe(function (params) { return _this.handle(params); });
|
794 | }
|
795 | /**
|
796 | * @param {?} params
|
797 | * @return {?}
|
798 | */
|
799 | AuthPage.prototype.handle = /**
|
800 | * @param {?} params
|
801 | * @return {?}
|
802 | */
|
803 | function (params) {
|
804 | var _this = this;
|
805 | if (params["state"]) {
|
806 | this.naco.getState().then(function (state) {
|
807 | if (state !== params["state"]) {
|
808 | _this.message = 'Invalid CSRF';
|
809 | return;
|
810 | }
|
811 | _this.authenticate(params);
|
812 | });
|
813 | }
|
814 | else {
|
815 | this.authenticate(params);
|
816 | }
|
817 | };
|
818 | /**
|
819 | * @param {?} params
|
820 | * @return {?}
|
821 | */
|
822 | AuthPage.prototype.authenticate = /**
|
823 | * @param {?} params
|
824 | * @return {?}
|
825 | */
|
826 | function (params) {
|
827 | var _this = this;
|
828 | var /** @type {?} */ signature = {
|
829 | expiresIn: params["expires_in"],
|
830 | type: params["token_type"],
|
831 | token: params["access_token"],
|
832 | };
|
833 | this.naco.setSignature(signature);
|
834 | this.naco.getUser().subscribe(function (user) {
|
835 | if (null !== user) {
|
836 | _this.storage.get('naco_intended_url').then(function (url) {
|
837 | _this.storage.remove('naco_intended_url').then(function () {
|
838 | window.location.href = url ? url : '/';
|
839 | });
|
840 | });
|
841 | return;
|
842 | }
|
843 | _this.message = 'Unauthenticated!';
|
844 | });
|
845 | };
|
846 | AuthPage.decorators = [
|
847 | { type: core.Component, args: [{
|
848 | selector: 'naker-auth-page',
|
849 | template: '{{ message }}',
|
850 | },] },
|
851 | ];
|
852 | /** @nocollapse */
|
853 | AuthPage.ctorParameters = function () {
|
854 | return [
|
855 | { type: router.ActivatedRoute },
|
856 | { type: NacoService },
|
857 | { type: storage.Storage }
|
858 | ];
|
859 | };
|
860 | return AuthPage;
|
861 | }());
|
862 |
|
863 | /**
|
864 | * @fileoverview added by tsickle
|
865 | * @suppress {checkTypes} checked by tsc
|
866 | */
|
867 | var AuthSilentPage = /** @class */ (function () {
|
868 | function AuthSilentPage() {
|
869 | }
|
870 | AuthSilentPage.decorators = [
|
871 | { type: core.Component, args: [{
|
872 | selector: 'naker-auth-silent',
|
873 | template: 'Processing silent auth...',
|
874 | },] },
|
875 | ];
|
876 | return AuthSilentPage;
|
877 | }());
|
878 |
|
879 | /**
|
880 | * @fileoverview added by tsickle
|
881 | * @suppress {checkTypes} checked by tsc
|
882 | */
|
883 | var /** @type {?} */ routes = [
|
884 | {
|
885 | path: 'auth',
|
886 | component: AuthPage
|
887 | },
|
888 | {
|
889 | path: 'auth/silent',
|
890 | component: AuthSilentPage
|
891 | },
|
892 | ];
|
893 | var /** @type {?} */ AUTH_ROUTING = router.RouterModule.forChild(routes);
|
894 |
|
895 | /**
|
896 | * @fileoverview added by tsickle
|
897 | * @suppress {checkTypes} checked by tsc
|
898 | */
|
899 | var NacoViewModule = /** @class */ (function () {
|
900 | function NacoViewModule() {
|
901 | }
|
902 | NacoViewModule.decorators = [
|
903 | { type: core.NgModule, args: [{
|
904 | imports: [
|
905 | AUTH_ROUTING,
|
906 | ],
|
907 | declarations: [
|
908 | AuthPage,
|
909 | AuthSilentPage,
|
910 | ],
|
911 | },] },
|
912 | ];
|
913 | return NacoViewModule;
|
914 | }());
|
915 |
|
916 | /**
|
917 | * @fileoverview added by tsickle
|
918 | * @suppress {checkTypes} checked by tsc
|
919 | */
|
920 | var NacoModule = /** @class */ (function () {
|
921 | function NacoModule() {
|
922 | }
|
923 | /**
|
924 | * @param {?} config
|
925 | * @return {?}
|
926 | */
|
927 | NacoModule.forRoot = /**
|
928 | * @param {?} config
|
929 | * @return {?}
|
930 | */
|
931 | function (config) {
|
932 | return {
|
933 | ngModule: NacoModule,
|
934 | providers: [
|
935 | {
|
936 | provide: NACO_CONFIG,
|
937 | useValue: config,
|
938 | },
|
939 | {
|
940 | provide: NacoService,
|
941 | useFactory: nacoFactory,
|
942 | deps: [NACO_CONFIG, router.Router, storage.Storage, http.HttpClient, common.Location],
|
943 | },
|
944 | AuthenticatedGuard,
|
945 | ],
|
946 | };
|
947 | };
|
948 | NacoModule.decorators = [
|
949 | { type: core.NgModule, args: [{
|
950 | imports: [
|
951 | storage.UbudStorageModule,
|
952 | NacoViewModule,
|
953 | ],
|
954 | },] },
|
955 | ];
|
956 | return NacoModule;
|
957 | }());
|
958 |
|
959 | /**
|
960 | * @fileoverview added by tsickle
|
961 | * @suppress {checkTypes} checked by tsc
|
962 | */
|
963 |
|
964 | /**
|
965 | * @fileoverview added by tsickle
|
966 | * @suppress {checkTypes} checked by tsc
|
967 | */
|
968 |
|
969 | exports.NacoService = NacoService;
|
970 | exports.User = User;
|
971 | exports.Signature = Signature;
|
972 | exports.Config = Config;
|
973 | exports.AuthenticatedGuard = AuthenticatedGuard;
|
974 | exports.AuthInterceptor = AuthInterceptor;
|
975 | exports.NacoModule = NacoModule;
|
976 | exports.ɵf = NACO_CONFIG;
|
977 | exports.ɵe = nacoFactory;
|
978 | exports.ɵa = NacoViewModule;
|
979 | exports.ɵd = AuthSilentPage;
|
980 | exports.ɵc = AuthPage;
|
981 | exports.ɵb = AUTH_ROUTING;
|
982 |
|
983 | Object.defineProperty(exports, '__esModule', { value: true });
|
984 |
|
985 | })));
|
986 |
|
987 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFrZXItbmFjby51bWQuanMubWFwIiwic291cmNlcyI6W251bGwsIm5nOi8vQG5ha2VyL25hY28vZG9tYWlucy92YWx1ZXMvY29uZmlnLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9kb21haW5zL21vZGVscy91c2VyLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZS50cyIsIm5nOi8vQG5ha2VyL25hY28vZG9tYWlucy92YWx1ZXMvc2lnbmF0dXJlLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9ndWFyZHMvYXV0aGVudGljYXRlZC5ndWFyZC50cyIsIm5nOi8vQG5ha2VyL25hY28vaW50ZXJjZXB0b3JzL2F1dGguaW50ZXJjZXB0b3IudHMiLCJuZzovL0BuYWtlci9uYWNvL2ZhY3Rvcmllcy9uYWNvLWZhY3RvcnkudHMiLCJuZzovL0BuYWtlci9uYWNvL3ZpZXdzL3BhZ2VzL2F1dGgucGFnZS50cyIsIm5nOi8vQG5ha2VyL25hY28vdmlld3MvcGFnZXMvYXV0aC1zaWxlbnQucGFnZS50cyIsIm5nOi8vQG5ha2VyL25hY28vdmlld3Mvcm91dGVzLnRzIiwibmc6Ly9AbmFrZXIvbmFjby92aWV3cy9tb2R1bGUudHMiLCJuZzovL0BuYWtlci9uYWNvL25hY28ubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMClcclxuICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgcHVibGljIGVuZHBvaW50OiBzdHJpbmcgPSAnaHR0cHM6Ly9hY2NvdW50LmtlbW5ha2VyLmdvLmlkJztcbiAgICBwdWJsaWMgY2xpZW50SWQ6IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogUGFydGlhbDxDb25maWc+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcblxuZXhwb3J0IGNsYXNzIFVzZXIge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyB1c2VybmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBlbWFpbD86IHN0cmluZztcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0dXM6IG51bWJlcjtcblxuICAgIEBUeXBlKGZvcndhcmRSZWYoKCkgPT4gRGF0ZSkgYXMgYW55KVxuICAgIHB1YmxpYyB1cGRhdGVkQXQ6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0B1YnVkL3N0b3JhZ2UnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vdmFsdWVzL2NvbmZpZyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vbW9kZWxzL3VzZXInO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIE9ic2VydmVyLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2lnbmF0dXJlIH0gZnJvbSAnLi4vdmFsdWVzL3NpZ25hdHVyZSc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcGxhaW5Ub0NsYXNzIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBFcnJvck9ic2VydmFibGUgfSBmcm9tICdyeGpzLWNvbXBhdC9vYnNlcnZhYmxlL0Vycm9yT2JzZXJ2YWJsZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOYWNvU2VydmljZSB7XG4gICAgcHVibGljIHJlYWRvbmx5IFZFUlNJT04gPSAndjEnO1xuXG4gICAgcHJpdmF0ZSBzaWduYXR1cmU6IFNpZ25hdHVyZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgdXNlcjogVXNlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuOiBTaWduYXR1cmUgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGNsaWVudFNlY3JldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IENvbmZpZywgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uKSB7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFVzZXIodXNlcjogVXNlciB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgndXNlcicsIHVzZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVc2VyKCk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcbiAgICAgICAgaWYgKG51bGwgIT09IHRoaXMudXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMudXNlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnJvbVByb21pc2UodGhpcy5zdG9yYWdlLmdldCgndXNlcicpKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCh1c2VyOiBVc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSB1c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih1c2VyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1cmkgPSB0aGlzLmdldFVyaSgnL3VzZXJzL21lJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbVByb21pc2UodGhpcy5nZXRTaWduYXR1cmUoKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKChzaWduYXR1cmU6IFNpZ25hdHVyZSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBzaWduYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgJHtzaWduYXR1cmUudHlwZX0gJHtzaWduYXR1cmUudG9rZW59YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55Pih1cmksIG9wdGlvbnMpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgYXJlIG5vIGJvZHkgdG8gYmUgdHJhbnNmb3JtZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRoVXNlcjogYW55ID0gcGxhaW5Ub0NsYXNzKFVzZXIsIGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VXNlcihhdXRoVXNlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1dGhVc2VyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg0MDEgPT09IGUuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoVXNlcigpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKChyZWZyZXNoVXNlcjogVXNlciB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZnJlc2hVc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YocmVmcmVzaFVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yT2JzZXJ2YWJsZS5jcmVhdGUoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yT2JzZXJ2YWJsZS5jcmVhdGUoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpZ25hdHVyZSgpOiBQcm9taXNlPFNpZ25hdHVyZSB8IG51bGw+IHtcbiAgICAgICAgaWYgKG51bGwgIT09IHRoaXMuc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuc2lnbmF0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0KCdzaWduYXR1cmUnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2lnbmF0dXJlKHNpZ25hdHVyZTogU2lnbmF0dXJlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdzaWduYXR1cmUnLCBzaWduYXR1cmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDbGllbnRTZWNyZXQoc2VjcmV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGllbnRTZWNyZXQgPSBzZWNyZXQ7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ2NsaWVudF9zZWNyZXQnLCBzZWNyZXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuOiBTaWduYXR1cmUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW47XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ3JlZnJlc2hfdG9rZW4nLCByZWZyZXNoVG9rZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWZyZXNoVXNlcihzY29wZXM/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVzZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuc2V0VXNlcihudWxsKTtcbiAgICAgICAgdGhpcy5zZXRTaWduYXR1cmUobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKHRoaXMuZ2V0UmVmcmVzaFRva2VuKCksIHRoaXMuZ2V0Q2xpZW50U2VjcmV0KCkpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbjogU2lnbmF0dXJlID0gcmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRTZWNyZXQ6IHN0cmluZyA9IHJlc3VsdHNbMV07XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmcmVzaFRva2VuICYmIGNsaWVudFNlY3JldCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoV2l0aFJlZnJlc2hUb2tlbihjbGllbnRTZWNyZXQsIHJlZnJlc2hUb2tlbi50b2tlbiwgc2NvcGVzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoV2l0aFNpbGVudEF1dGgoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWZyZXNoV2l0aFJlZnJlc2hUb2tlbihjbGllbnRTZWNyZXQ6IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZyk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuaHR0cC5wb3N0KHRoaXMuZ2V0VXJpKCcvdG9rZW5zJyksIHtcbiAgICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgICAgIHNjb3Blczogc2NvcGVzIHx8ICdiYXNpYyBlbWFpbCcsXG4gICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMuY29uZmlnLmNsaWVudElkLFxuICAgICAgICAgICAgY2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0LFxuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVxdWVzdC5waXBlKFxuICAgICAgICAgICAgdGFwKCh0b2tlbnM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbnMgJiYgdG9rZW5zLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTaWduYXR1cmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlc0luOiB0b2tlbnMuZGF0YS5leHBpcmVzX2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW5zLmRhdGEudG9rZW5fdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiB0b2tlbnMuZGF0YS5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVmcmVzaFRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRva2Vucy5kYXRhLnRva2VuX3R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogdG9rZW5zLmRhdGEucmVmcmVzaF90b2tlbixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAoKHRva2VuczogYW55KSA9PiB0b2tlbnMgJiYgdG9rZW5zLmRhdGEpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChoYXNUb2tlbjogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChoYXNUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRVc2VyKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2hXaXRoU2lsZW50QXV0aCgpOiBPYnNlcnZhYmxlPFVzZXIgfCBudWxsPiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxVc2VyIHwgbnVsbD4oKG9ic2VydmVyOiBPYnNlcnZlcjxVc2VyIHwgbnVsbD4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gdGhpcy5nZXRDdXJyZW50T3JpZ2luKCdhdXRoL3NpbGVudCcpO1xuICAgICAgICAgICAgY29uc3QgdXJpID0gdGhpcy5sb2dpbignYmFzaWMgZW1haWwnLCByZWRpcmVjdFVyaSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3JjJywgdXJpKTtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFydHMgPSBxdWVyeVN0cmluZy5zcGxpdCgnJicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBxdWVyeVBhcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVBhcnRzID0gaXRlbS5zcGxpdCgnPScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2l0ZW1QYXJ0c1swXV0gPSBpdGVtUGFydHNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ2FjY2Vzc190b2tlbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwYXJhbXNbJ3N0YXRlJ10gfHwgbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2lnbmF0dXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IHBhcmFtc1snYWNjZXNzX3Rva2VuJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtc1sndG9rZW5fdHlwZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzSW46IHBhcmFtc1sndHRsJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKCkudG9Qcm9taXNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFVzZXIodXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2dpbihzY29wZXM6IHN0cmluZywgcmVkaXJlY3RVcmk/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXJlZGlyZWN0VXJpKSB7XG4gICAgICAgICAgICByZWRpcmVjdFVyaSA9IHRoaXMucm91dGVyLnVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZW5lcmF0ZVN0YXRlKCk7XG5cbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgnc3RhdGUnLCBzdGF0ZSk7XG5cbiAgICAgICAgY29uc3QgcXVlcnk6IHN0cmluZyA9IHRoaXMuYnVpbGRRdWVyeVN0cmluZyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAncmVzcG9uc2VfdHlwZSc6ICd0b2tlbicsXG4gICAgICAgICAgICAgICAgJ3Njb3Blcyc6IHNjb3BlcyxcbiAgICAgICAgICAgICAgICAnY2xpZW50JzogdGhpcy5jb25maWcuY2xpZW50SWQsXG4gICAgICAgICAgICAgICAgJ3N0YXRlJzogc3RhdGUsXG4gICAgICAgICAgICAgICAgJ2NvbnRpbnVlJzogcmVkaXJlY3RVcmksXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5lbmRwb2ludCArICcvYXV0aD8nICsgcXVlcnk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvZ291dChyZWRpcmVjdFVyaT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHRoaXMuc2lnbmF0dXJlID0gbnVsbDtcbiAgICAgICAgdGhpcy51c2VyID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSgnc2lnbmF0dXJlJyksXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSgndXNlcicpLFxuICAgICAgICAgICAgXSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZHBvaW50ID0gdGhpcy5jb25maWcuZW5kcG9pbnQgKyAnL2F1dGgvbG9nb3V0JztcblxuICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdFVyaSkge1xuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCArPSAnP2NvbnRpbnVlPScgKyByZWRpcmVjdFVyaTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKGVuZHBvaW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RhdGUoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0KCdzdGF0ZScpO1xuICAgIH1cblxuICAgIHB1YmxpYyBidWlsZE5lc3RlZFVyaShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB1cmkgPSAnJztcblxuICAgICAgICBpZiAocm91dGUucm91dGVDb25maWcgJiYgcm91dGUucm91dGVDb25maWcucGF0aCkge1xuICAgICAgICAgICAgdXJpICs9ICcvJyArIHJvdXRlLnJvdXRlQ29uZmlnLnBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJvdXRlLmNoaWxkcmVuLmZvckVhY2goKGl0ZW06IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpID0+IHtcbiAgICAgICAgICAgICAgICB1cmkgKz0gdGhpcy5idWlsZE5lc3RlZFVyaShpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJlZnJlc2hUb2tlbigpOiBQcm9taXNlPFNpZ25hdHVyZSB8IG51bGw+IHtcbiAgICAgICAgaWYgKG51bGwgIT09IHRoaXMucmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMucmVmcmVzaFRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0KCdyZWZyZXNoX3Rva2VuJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDbGllbnRTZWNyZXQoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIGlmIChudWxsICE9PSB0aGlzLmNsaWVudFNlY3JldCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmNsaWVudFNlY3JldCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldCgnY2xpZW50X3NlY3JldCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VXJpKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5lbmRwb2ludCArICcvYXBpLycgKyB0aGlzLlZFUlNJT04gKyBwYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50T3JpZ2luKHBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHRoaXMubG9jYXRpb24ucHJlcGFyZUV4dGVybmFsVXJsKHBhdGggfHwgJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVTdGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwb3NzaWJsZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgICAgICAgIHRleHQgKz0gcG9zc2libGUuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHBvc3NpYmxlLmxlbmd0aCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZFF1ZXJ5U3RyaW5nKHBhcmFtczogb2JqZWN0KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChwYXJhbXNba2V5XSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBxdWVyeVBhcmFtcy5qb2luKCcmJyk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNpZ25hdHVyZSB7XG4gICAgcHVibGljIGV4cGlyZXNJbj86IG51bWJlcjtcbiAgICBwdWJsaWMgdG9rZW46IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FuQWN0aXZhdGUsIENhbkFjdGl2YXRlQ2hpbGQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTmFjb1NlcnZpY2UgfSBmcm9tICcuLi9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZSc7XG5pbXBvcnQgeyBmaXJzdCwgbWFwIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL2RvbWFpbnMvbW9kZWxzL3VzZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0B1YnVkL3N0b3JhZ2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlci9zcmMvcm91dGVyX3N0YXRlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0ZWRHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBuYWNvOiBOYWNvU2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlKSB7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hY28uZ2V0VXNlcigpLnBpcGUoXG4gICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgbWFwKCh1c2VyOiBVc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChudWxsID09PSB1c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVyaSA9IHRoaXMubmFjby5idWlsZE5lc3RlZFVyaShyb3V0ZS5yb290KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMubmFjby5nZXRDdXJyZW50T3JpZ2luKCcvJyArIHRoaXMubHRyaW0odXJpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgnbmFjb19pbnRlbmRlZF91cmwnLCBuZXh0KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5uYWNvLmxvZ2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYXNpYyBlbWFpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYWNvLmdldEN1cnJlbnRPcmlnaW4oJy9hdXRoJyksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gISF1c2VyO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkFjdGl2YXRlQ2hpbGQocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuQWN0aXZhdGUocm91dGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbHRyaW0odGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXlxcLysvLCcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJ0cmltKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcLyskLywnJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cEhhbmRsZXIsIEh0dHBJbnRlcmNlcHRvciwgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOYWNvU2VydmljZSB9IGZyb20gJy4uL2RvbWFpbnMvc2VydmljZXMvbmFjby5zZXJ2aWNlJztcbmltcG9ydCB7IGZyb21Qcm9taXNlIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlJztcbmltcG9ydCB7IFNpZ25hdHVyZSB9IGZyb20gJy4uL2RvbWFpbnMvdmFsdWVzL3NpZ25hdHVyZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL2ludGVybmFsL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFcnJvck9ic2VydmFibGUgfSBmcm9tICdyeGpzLWNvbXBhdC9vYnNlcnZhYmxlL0Vycm9yT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG5hY286IE5hY29TZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgcHVibGljIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgICAgICByZXR1cm4gZnJvbVByb21pc2UodGhpcy5uYWNvLmdldFNpZ25hdHVyZSgpKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChzaWduYXR1cmU6IFNpZ25hdHVyZSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFxuICAgICAgICAgICAgICAgICAgICAuaGFuZGxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmNsb25lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGAke3NpZ25hdHVyZS50eXBlfSAke3NpZ25hdHVyZS50b2tlbn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYWNvLnJlZnJlc2hVc2VyKCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgodXNlcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKHRoaXMubmFjby5nZXRTaWduYXR1cmUoKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgobmV3U2lnbmF0dXJlOiBTaWduYXR1cmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5jbG9uZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYCR7bmV3U2lnbmF0dXJlLnR5cGV9ICR7bmV3U2lnbmF0dXJlLnRva2VufWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yT2JzZXJ2YWJsZS5jcmVhdGUoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yT2JzZXJ2YWJsZS5jcmVhdGUoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBOYWNvU2VydmljZSB9IGZyb20gJy4uL2RvbWFpbnMvc2VydmljZXMvbmFjby5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2RvbWFpbnMvdmFsdWVzL2NvbmZpZyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0B1YnVkL3N0b3JhZ2UnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBuYWNvRmFjdG9yeShjb25maWc6IG9iamVjdCwgcm91dGVyOiBSb3V0ZXIsIHN0b3JhZ2U6IFN0b3JhZ2UsIGh0dHA6IEh0dHBDbGllbnQsIGxvY2F0aW9uOiBMb2NhdGlvbikge1xuICAgIHJldHVybiBuZXcgTmFjb1NlcnZpY2UoXG4gICAgICAgIG5ldyBDb25maWcoeyAuLi5jb25maWcgfSksXG4gICAgICAgIHJvdXRlcixcbiAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgaHR0cCxcbiAgICAgICAgbG9jYXRpb25cbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgTkFDT19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48b2JqZWN0PignTkFDT19DT05GSUcnKTtcbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOYWNvU2VydmljZSB9IGZyb20gJy4uLy4uL2RvbWFpbnMvc2VydmljZXMvbmFjby5zZXJ2aWNlJztcbmltcG9ydCB7IFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL2RvbWFpbnMvdmFsdWVzL3NpZ25hdHVyZSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vZG9tYWlucy9tb2RlbHMvdXNlcic7XG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSAnQHVidWQvc3RvcmFnZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmFrZXItYXV0aC1wYWdlJyxcbiAgICB0ZW1wbGF0ZTogJ3t7IG1lc3NhZ2UgfX0nLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoUGFnZSB7XG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZyA9ICdBdXRoZW50aWNhdGluZy4uLic7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByaXZhdGUgbmFjbzogTmFjb1NlcnZpY2UsIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSkge1xuICAgICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHRoaXMuaGFuZGxlKHBhcmFtcykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGUocGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKHBhcmFtcy5zdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5uYWNvLmdldFN0YXRlKCkudGhlbigoc3RhdGU6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IHBhcmFtcy5zdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnSW52YWxpZCBDU1JGJztcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGUocGFyYW1zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGUocGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXV0aGVudGljYXRlKHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZTogU2lnbmF0dXJlID0ge1xuICAgICAgICAgICAgZXhwaXJlc0luOiBwYXJhbXMuZXhwaXJlc19pbixcbiAgICAgICAgICAgIHR5cGU6IHBhcmFtcy50b2tlbl90eXBlLFxuICAgICAgICAgICAgdG9rZW46IHBhcmFtcy5hY2Nlc3NfdG9rZW4sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5uYWNvLnNldFNpZ25hdHVyZShzaWduYXR1cmUpO1xuXG4gICAgICAgIHRoaXMubmFjby5nZXRVc2VyKCkuc3Vic2NyaWJlKCh1c2VyOiBVc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UuZ2V0KCduYWNvX2ludGVuZGVkX3VybCcpLnRoZW4oKHVybDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoJ25hY29faW50ZW5kZWRfdXJsJykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybCA/IHVybCA6ICcvJztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICdVbmF1dGhlbnRpY2F0ZWQhJztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYWtlci1hdXRoLXNpbGVudCcsXG4gICAgdGVtcGxhdGU6ICdQcm9jZXNzaW5nIHNpbGVudCBhdXRoLi4uJyxcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFNpbGVudFBhZ2Uge1xufVxuIiwiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlLCBSb3V0ZXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQXV0aFBhZ2UgfSBmcm9tICcuL3BhZ2VzL2F1dGgucGFnZSc7XG5pbXBvcnQgeyBBdXRoU2lsZW50UGFnZSB9IGZyb20gJy4vcGFnZXMvYXV0aC1zaWxlbnQucGFnZSc7XG5cbmNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICAgIHtcbiAgICAgICAgcGF0aDogJ2F1dGgnLFxuICAgICAgICBjb21wb25lbnQ6IEF1dGhQYWdlXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICdhdXRoL3NpbGVudCcsXG4gICAgICAgIGNvbXBvbmVudDogQXV0aFNpbGVudFBhZ2VcbiAgICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IEFVVEhfUk9VVElORzogTW9kdWxlV2l0aFByb3ZpZGVycyA9IFJvdXRlck1vZHVsZS5mb3JDaGlsZChyb3V0ZXMpO1xuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFVVEhfUk9VVElORyB9IGZyb20gJy4vcm91dGVzJztcbmltcG9ydCB7IEF1dGhQYWdlIH0gZnJvbSAnLi9wYWdlcy9hdXRoLnBhZ2UnO1xuaW1wb3J0IHsgQXV0aFNpbGVudFBhZ2UgfSBmcm9tICcuL3BhZ2VzL2F1dGgtc2lsZW50LnBhZ2UnO1xuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQVVUSF9ST1VUSU5HLFxuICAgIF0sXG4gICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgIEF1dGhQYWdlLFxuICAgICAgICBBdXRoU2lsZW50UGFnZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOYWNvVmlld01vZHVsZSB7XG59XG4iLCJpbXBvcnQgeyBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmFjb1NlcnZpY2UgfSBmcm9tICcuL2RvbWFpbnMvc2VydmljZXMvbmFjby5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRHdWFyZCB9IGZyb20gJy4vZ3VhcmRzL2F1dGhlbnRpY2F0ZWQuZ3VhcmQnO1xuaW1wb3J0IHsgTkFDT19DT05GSUcsIG5hY29GYWN0b3J5IH0gZnJvbSAnLi9mYWN0b3JpZXMvbmFjby1mYWN0b3J5JztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdG9yYWdlLCBVYnVkU3RvcmFnZU1vZHVsZSB9IGZyb20gJ0B1YnVkL3N0b3JhZ2UnO1xuaW1wb3J0IHsgTmFjb1ZpZXdNb2R1bGUgfSBmcm9tICcuL3ZpZXdzL21vZHVsZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtcbiAgICAgICAgVWJ1ZFN0b3JhZ2VNb2R1bGUsXG4gICAgICAgIE5hY29WaWV3TW9kdWxlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5hY29Nb2R1bGUge1xuICAgIHB1YmxpYyBzdGF0aWMgZm9yUm9vdChjb25maWc6IHsgY2xpZW50SWQ6IHN0cmluZywgZW5kcG9pbnQ/OiBzdHJpbmcgfSk6IE1vZHVsZVdpdGhQcm92aWRlcnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmdNb2R1bGU6IE5hY29Nb2R1bGUsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE5BQ09fQ09ORklHLFxuICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBOYWNvU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogbmFjb0ZhY3RvcnksXG4gICAgICAgICAgICAgICAgICAgIGRlcHM6IFtOQUNPX0NPTkZJRywgUm91dGVyLCBTdG9yYWdlLCBIdHRwQ2xpZW50LCBMb2NhdGlvbl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGVkR3VhcmQsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJUeXBlIiwiZm9yd2FyZFJlZiIsInJvdXRlciIsInN0b3JhZ2UiLCJodHRwIiwib2YiLCJmcm9tUHJvbWlzZSIsInN3aXRjaE1hcCIsIm1hcCIsInBsYWluVG9DbGFzcyIsImNhdGNoRXJyb3IiLCJFcnJvck9ic2VydmFibGUiLCJmb3JrSm9pbiIsInRhcCIsIk9ic2VydmFibGUiLCJ0c2xpYl8xLl9fdmFsdWVzIiwiSW5qZWN0YWJsZSIsIlJvdXRlciIsIlN0b3JhZ2UiLCJIdHRwQ2xpZW50IiwiTG9jYXRpb24iLCJmaXJzdCIsIkluamVjdGlvblRva2VuIiwiQ29tcG9uZW50IiwiQWN0aXZhdGVkUm91dGUiLCJSb3V0ZXJNb2R1bGUiLCJOZ01vZHVsZSIsIlVidWRTdG9yYWdlTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7SUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFjQSxJQWVPLElBQUksUUFBUSxHQUFHO1FBQ2xCLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLGtCQUFrQixDQUFDO1lBQzNDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNqRCxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixLQUFLLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsT0FBTyxDQUFDLENBQUM7U0FDWixDQUFBO1FBQ0QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUE7QUFFRCx3QkFVMkIsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSTtRQUNwRCxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0gsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFVBQVU7WUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQzs7WUFDMUgsS0FBSyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFBRSxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEosT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7QUFFRCx3QkFJMkIsV0FBVyxFQUFFLGFBQWE7UUFDakQsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFVBQVU7WUFBRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ25JLENBQUM7QUFFRCx1QkFBMEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUztRQUN2RCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNO1lBQ3JELG1CQUFtQixLQUFLLElBQUksSUFBSTtnQkFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQUU7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFBRSxFQUFFO1lBQzNGLGtCQUFrQixLQUFLLElBQUksSUFBSTtnQkFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFBRTtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUFFLEVBQUU7WUFDOUYsY0FBYyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO1lBQy9JLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN6RSxDQUFDLENBQUM7SUFDUCxDQUFDO0FBRUQseUJBQTRCLE9BQU8sRUFBRSxJQUFJO1FBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqSCxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsY0FBYSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekosY0FBYyxDQUFDLElBQUksT0FBTyxVQUFVLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ2xFLGNBQWMsRUFBRTtZQUNaLElBQUksQ0FBQztnQkFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDOUQsT0FBTyxDQUFDO2dCQUFFLElBQUk7b0JBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJO3dCQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUM3SixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNULEtBQUssQ0FBQyxDQUFDO3dCQUFDLEtBQUssQ0FBQzs0QkFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUFDLE1BQU07d0JBQzlCLEtBQUssQ0FBQzs0QkFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO3dCQUN4RCxLQUFLLENBQUM7NEJBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQUMsU0FBUzt3QkFDakQsS0FBSyxDQUFDOzRCQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQUMsU0FBUzt3QkFDakQ7NEJBQ0ksSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dDQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQUMsU0FBUzs2QkFBRTs0QkFDNUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQUMsTUFBTTs2QkFBRTs0QkFDdEYsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0NBQUMsTUFBTTs2QkFBRTs0QkFDckUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFD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 |
\ | No newline at end of file |