ng-yunzai-mobile
Version:
1. 修改wechat.micro.ts
433 lines • 33.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: devices/wechat.micro.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { BaseDevice } from "./base.device";
import { from } from "rxjs";
import { TokenService } from "../token/token.service";
import { UserService } from "../user/user.service";
import { HttpClient } from "@angular/common/http";
import { BASE_CLIENT } from "../client/base.client";
import { Inject, Injectable } from "@angular/core";
import { preloaderFinished } from "../auth/preloader";
import { Title } from "@angular/platform-browser";
import * as i0 from "@angular/core";
import * as i1 from "../token/token.service";
import * as i2 from "@angular/common/http";
import * as i3 from "../user/user.service";
import * as i4 from "@angular/platform-browser";
import * as i5 from "../client/base.client";
/** @type {?} */
const apis = [
"updateAppMessageShareData",
"updateTimelineShareData",
"onMenuShareTimeline",
"onMenuShareAppMessage",
"onMenuShareQQ",
"onMenuShareWeibo",
"onMenuShareQZone",
"startRecord",
"stopRecord",
"onVoiceRecordEnd",
"playVoice",
"pauseVoice",
"stopVoice",
"onVoicePlayEnd",
"uploadVoice",
"downloadVoice",
"chooseImage",
"previewImage",
"uploadImage",
"downloadImage",
"translateVoice",
"getNetworkType",
"openLocation",
"getLocation",
"hideOptionMenu",
"showOptionMenu",
"hideMenuItems",
"showMenuItems",
"hideAllNonBaseMenuItem",
"showAllNonBaseMenuItem",
"closeWindow",
"scanQRCode",
"chooseWXPay",
"openProductSpecificView",
"addCard",
"chooseCard",
"openCard",
];
/** @type {?} */
const openTags = [
'wx-open-launch-weapp',
'wx-open-launch-app',
'wx-open-subscribe',
'wx-open-audio'
];
export class WechatMicro extends BaseDevice {
/**
* @param {?} tokenService
* @param {?} http
* @param {?} user
* @param {?} title
* @param {?} baseclient
*/
constructor(tokenService, http, user, title, baseclient) {
super();
this.tokenService = tokenService;
this.http = http;
this.user = user;
this.title = title;
this.baseclient = baseclient;
}
/**
* @return {?}
*/
auth() {
if (this.baseclient.wechatMicro && this.baseclient.wechatMicro.auth === false) {
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
preloaderFinished();
resolve(true);
}));
}
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
/** @type {?} */
const tokenInfo = {};
tokenInfo.account = this.getUrlParam('account');
tokenInfo.accessToken = this.getUrlParam('accessToken');
tokenInfo.userId = this.getUrlParam('userId');
tokenInfo.tokenType = 'bearer';
this.tokenService.set((/** @type {?} */ (tokenInfo)));
this.http
.get(`${this.baseclient.gateway}/auth/user`)
.subscribe((/**
* @param {?} response
* @return {?}
*/
(response) => {
// 设置user
this.user.set(response.principal);
this.generateWechatConfig();
// 加载结束
preloaderFinished();
resolve(true);
}));
}));
}
/**
* @return {?}
*/
generateWechatConfig() {
this.http
.get(`${this.baseclient.gateway}/wechat/mp/jssdk?url=${encodeURIComponent(window.location.href)}`)
.subscribe((/**
* @param {?} response
* @return {?}
*/
(response) => {
wx.config({
debug: false,
// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: response.appId,
// 必填,公众号的唯一标识
timestamp: response.timestamp,
// 必填,生成签名的时间戳
nonceStr: response.nonceStr,
// 必填,生成签名的随机串
signature: response.signature,
// 必填,签名
jsApiList: apis,
// 必填,需要使用的JS接口列表
openTagList: openTags // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']
});
}));
wx.ready((/**
* @return {?}
*/
() => {
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
// 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
console.log('微信jssdk初始化完成.');
}));
wx.error((/**
* @param {?} res
* @return {?}
*/
(res) => {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
console.log('微信jssdk初始化失败:', res);
}));
}
/**
* @param {?} iwindow
* @return {?}
*/
openWindow(iwindow) {
window.location.href = iwindow.url;
}
/**
* @param {?} ititle
* @return {?}
*/
setTitle(ititle) {
this.title.setTitle(ititle.title);
}
/**
* @param {?} navigationBar
* @return {?}
*/
setNavigationBar(navigationBar) {
alert("小程序暂不支持放置按钮,请在APP中使用此功能!");
}
/**
* @param {?} ishare
* @return {?}
*/
share(ishare) {
alert("小程序暂不支持分享,请在APP中使用此功能!");
}
/**
* @return {?}
*/
getToken() {
/** @type {?} */
const itoken = {
accessToken: this.tokenService.get().accessToken,
tokenType: null,
tokenDataLine: null,
scope: null,
};
return itoken;
}
/**
* @return {?}
*/
scanCode() {
/** @type {?} */
const p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
wx.scanQRCode({
needResult: 1,
scanType: ['qrCode', 'barCode'],
success: (/**
* @param {?} res
* @return {?}
*/
(res) => {
resolve(res.resultStr);
}),
});
}));
return from(p);
}
/**
* @return {?}
*/
userLocation() {
/** @type {?} */
const p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
wx.getLocation({
type: 'wgs84',
// 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
/**
* @param {?} res
* @return {?}
*/
success(res) {
if (res.errMsg === 'getLocation:ok') {
/** @type {?} */
const latitude = res.latitude;
// 纬度,浮点数,范围为90 ~ -90
/** @type {?} */
const longitude = res.longitude;
// 经度,浮点数,范围为180 ~ -180。
/** @type {?} */
const address = '微信无address';
resolve({ latitude, longitude, address });
}
},
});
}));
return from(p);
}
/**
* @param {?} bssids
* @return {?}
*/
validateInWifi(bssids) {
alert("小程序暂不支持WIFI验证,请在APP中使用此功能!");
return undefined;
}
/**
* @return {?}
*/
getWifiMac() {
alert("小程序暂不支持获取MAC地址,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} count
* @return {?}
*/
chooseContacts(count) {
alert("小程序暂不支持获取联系人,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} targetUserId
* @return {?}
*/
contactDetails(targetUserId) {
alert("小程序暂不支持查询联系人详细信息,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} count
* @param {?} sourceType
* @return {?}
*/
uploadImage(count, sourceType) {
alert("小程序暂不支持图片上传,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} url
* @param {?} openType
* @param {?} title
* @param {?} id
* @param {?} type
* @return {?}
*/
openReadWithTimer(url, openType, title, id, type) {
alert("小程序暂不支持读物时间统计,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} limitMinute
* @return {?}
*/
uploadMovie(limitMinute) {
alert("小程序暂不支持视频上传,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} url
* @param {?} title
* @return {?}
*/
fileBrowser(url, title) {
alert("小程序暂不支持此功能,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} ticket
* @param {?} callback
* @return {?}
*/
startSearchBeacons(ticket, callback) {
wx.startSearchBeacons({
ticket: ticket,
complete: callback,
});
}
/**
* @param {?} callback
* @return {?}
*/
stopSearchBeacons(callback) {
wx.stopSearchBeacons({
complete: callback,
});
}
/**
* @param {?} callback
* @return {?}
*/
onSearchBeacons(callback) {
wx.onSearchBeacons({
complete: callback,
});
}
// 封装方法: 获取url中的参数
/**
* @private
* @param {?} name
* @return {?}
*/
getUrlParam(name) {
// 构造一个含有目标参数的正则表达式对象
/** @type {?} */
const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
/** @type {?} */
const strings = window.location.href.split('?');
// 匹配目标参数
/** @type {?} */
const r = strings[strings.length - 1].match(reg);
if (r != null) {
return unescape(r[2]);
}
return null;
}
}
WechatMicro.decorators = [
{ type: Injectable, args: [{
providedIn: "root",
},] }
];
/** @nocollapse */
WechatMicro.ctorParameters = () => [
{ type: TokenService },
{ type: HttpClient },
{ type: UserService },
{ type: Title },
{ type: undefined, decorators: [{ type: Inject, args: [BASE_CLIENT,] }] }
];
/** @nocollapse */ WechatMicro.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function WechatMicro_Factory() { return new WechatMicro(i0.ɵɵinject(i1.TokenService), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.UserService), i0.ɵɵinject(i4.Title), i0.ɵɵinject(i5.BASE_CLIENT)); }, token: WechatMicro, providedIn: "root" });
if (false) {
/**
* @type {?}
* @private
*/
WechatMicro.prototype.tokenService;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.http;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.user;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.title;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.baseclient;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0Lm1pY3JvLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImRldmljZXMvd2VjaGF0Lm1pY3JvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsSUFBSSxFQUFrQixNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFjLE1BQU0sdUJBQXVCLENBQUM7QUFDaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7OztNQUU1QyxJQUFJLEdBQUc7SUFDWCwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsYUFBYTtJQUNiLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixlQUFlO0lBQ2YsYUFBYTtJQUNiLGNBQWM7SUFDZCxhQUFhO0lBQ2IsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLHdCQUF3QjtJ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Y0FFaEIsR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsZUFBZSxDQUFDOztjQUNsRCxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzs7O2NBRXpDLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNiLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzs7WUFyTUYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7O1lBM0RRLFlBQVk7WUFFWixVQUFVO1lBRFYsV0FBVztZQUtYLEtBQUs7NENBNERULE1BQU0sU0FBQyxXQUFXOzs7Ozs7OztJQUpuQixtQ0FBa0M7Ozs7O0lBQ2xDLDJCQUF3Qjs7Ozs7SUFDeEIsMkJBQXlCOzs7OztJQUN6Qiw0QkFBb0I7Ozs7O0lBQ3BCLGlDQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VEZXZpY2UgfSBmcm9tIFwiLi9iYXNlLmRldmljZVwiO1xyXG5pbXBvcnQgeyBJU2hhcmUsIElUaXRsZSwgSVdpbmRvdywgTmF2aWdhdGlvbkJhciwgVXNlckxvY2F0aW9uIH0gZnJvbSBcIi4vbW9kZWxcIjtcclxuaW1wb3J0IHsgSXRva2VuIH0gZnJvbSBcIi4uL2F1dGhcIjtcclxuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gXCIuLi91c2VyL3VzZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEJBU0VfQ0xJRU5ULCBCYXNlQ2xpZW50IH0gZnJvbSBcIi4uL2NsaWVudC9iYXNlLmNsaWVudFwiO1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBwcmVsb2FkZXJGaW5pc2hlZCB9IGZyb20gXCIuLi9hdXRoL3ByZWxvYWRlclwiO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcblxyXG5jb25zdCBhcGlzID0gW1xyXG4gIFwidXBkYXRlQXBwTWVzc2FnZVNoYXJlRGF0YVwiLFxyXG4gIFwidXBkYXRlVGltZWxpbmVTaGFyZURhdGFcIixcclxuICBcIm9uTWVudVNoYXJlVGltZWxpbmVcIixcclxuICBcIm9uTWVudVNoYXJlQXBwTWVzc2FnZVwiLFxyXG4gIFwib25NZW51U2hhcmVRUVwiLFxyXG4gIFwib25NZW51U2hhcmVXZWlib1wiLFxyXG4gIFwib25NZW51U2hhcmVRWm9uZVwiLFxyXG4gIFwic3RhcnRSZWNvcmRcIixcclxuICBcInN0b3BSZWNvcmRcIixcclxuICBcIm9uVm9pY2VSZWNvcmRFbmRcIixcclxuICBcInBsYXlWb2ljZVwiLFxyXG4gIFwicGF1c2VWb2ljZVwiLFxyXG4gIFwic3RvcFZvaWNlXCIsXHJcbiAgXCJvblZvaWNlUGxheUVuZFwiLFxyXG4gIFwidXBsb2FkVm9pY2VcIixcclxuICBcImRvd25sb2FkVm9pY2VcIixcclxuICBcImNob29zZUltYWdlXCIsXHJcbiAgXCJwcmV2aWV3SW1hZ2VcIixcclxuICBcInVwbG9hZEltYWdlXCIsXHJcbiAgXCJkb3dubG9hZEltYWdlXCIsXHJcbiAgXCJ0cmFuc2xhdGVWb2ljZVwiLFxyXG4gIFwiZ2V0TmV0d29ya1R5cGVcIixcclxuICBcIm9wZW5Mb2NhdGlvblwiLFxyXG4gIFwiZ2V0TG9jYXRpb25cIixcclxuICBcImhpZGVPcHRpb25NZW51XCIsXHJcbiAgXCJzaG93T3B0aW9uTWVudVwiLFxyXG4gIFwiaGlkZU1lbnVJdGVtc1wiLFxyXG4gIFwic2hvd01lbnVJdGVtc1wiLFxyXG4gIFwiaGlkZUFsbE5vbkJhc2VNZW51SXRlbVwiLFxyXG4gIFwic2hvd0FsbE5vbkJhc2VNZW51SXRlbVwiLFxyXG4gIFwiY2xvc2VXaW5kb3dcIixcclxuICBcInNjYW5RUkNvZGVcIixcclxuICBcImNob29zZVdYUGF5XCIsXHJcbiAgXCJvcGVuUHJvZHVjdFNwZWNpZmljVmlld1wiLFxyXG4gIFwiYWRkQ2FyZFwiLFxyXG4gIFwiY2hvb3NlQ2FyZFwiLFxyXG4gIFwib3BlbkNhcmRcIixcclxuXTtcclxuXHJcbmNvbnN0IG9wZW5UYWdzID0gW1xyXG4gICd3eC1vcGVuLWxhdW5jaC13ZWFwcCcsXHJcbiAgJ3d4LW9wZW4tbGF1bmNoLWFwcCcsXHJcbiAgJ3d4LW9wZW4tc3Vic2NyaWJlJyxcclxuICAnd3gtb3Blbi1hdWRpbydcclxuXTtcclxuXHJcbmRlY2xhcmUgbGV0IHd4O1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgV2VjaGF0TWljcm8gZXh0ZW5kcyBCYXNlRGV2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIHVzZXI6IFVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0aXRsZTogVGl0bGUsXHJcbiAgICBASW5qZWN0KEJBU0VfQ0xJRU5UKSBwcml2YXRlIGJhc2VjbGllbnQ6IEJhc2VDbGllbnRcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBhdXRoKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodGhpcy5iYXNlY2xpZW50LndlY2hhdE1pY3JvICYmIHRoaXMuYmFzZWNsaWVudC53ZWNoYXRNaWNyby5hdXRoID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgcHJlbG9hZGVyRmluaXNoZWQoKTtcclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgdG9rZW5JbmZvOiBhbnkgPSB7fTtcclxuICAgICAgdG9rZW5JbmZvLmFjY291bnQgPSB0aGlzLmdldFVybFBhcmFtKCdhY2NvdW50Jyk7XHJcbiAgICAgIHRva2VuSW5mby5hY2Nlc3NUb2tlbiA9IHRoaXMuZ2V0VXJsUGFyYW0oJ2FjY2Vzc1Rva2VuJyk7XHJcbiAgICAgIHRva2VuSW5mby51c2VySWQgPSB0aGlzLmdldFVybFBhcmFtKCd1c2VySWQnKTtcclxuICAgICAgdG9rZW5JbmZvLnRva2VuVHlwZSA9ICdiZWFyZXInO1xyXG4gICAgICB0aGlzLnRva2VuU2VydmljZS5zZXQodG9rZW5JbmZvIGFzIGFueSk7XHJcbiAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgIC5nZXQoYCR7dGhpcy5iYXNlY2xpZW50LmdhdGV3YXl9L2F1dGgvdXNlcmApXHJcbiAgICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8g6K6+572udXNlclxyXG4gICAgICAgICAgdGhpcy51c2VyLnNldChyZXNwb25zZS5wcmluY2lwYWwpO1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZVdlY2hhdENvbmZpZygpO1xyXG4gICAgICAgICAgLy8g5Yqg6L2957uT5p2fXHJcbiAgICAgICAgICBwcmVsb2FkZXJGaW5pc2hlZCgpO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVXZWNoYXRDb25maWcoKTogdm9pZCB7XHJcbiAgICB0aGlzLmh0dHBcclxuICAgICAgLmdldChgJHt0aGlzLmJhc2VjbGllbnQuZ2F0ZXdheX0vd2VjaGF0L21wL2pzc2RrP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZil9YClcclxuICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIHd4LmNvbmZpZyh7XHJcbiAgICAgICAgICBkZWJ1ZzogZmFsc2UsIC8vIOW8gOWQr+iwg+ivleaooeW8jyzosIPnlKjnmoTmiYDmnIlhcGnnmoTov5Tlm57lgLzkvJrlnKjlrqLmiLfnq69hbGVydOWHuuadpe+8jOiLpeimgeafpeeci+S8oOWFpeeahOWPguaVsO+8jOWPr+S7peWcqHBj56uv5omT5byA77yM5Y+C5pWw5L+h5oGv5Lya6YCa6L+HbG9n5omT5Ye677yM5LuF5ZyocGPnq6/ml7bmiY3kvJrmiZPljbDjgIJcclxuICAgICAgICAgIGFwcElkOiByZXNwb25zZS5hcHBJZCwgLy8g5b+F5aGr77yM5YWs5LyX5Y+355qE5ZSv5LiA5qCH6K+GXHJcbiAgICAgICAgICB0aW1lc3RhbXA6IHJlc3BvbnNlLnRpbWVzdGFtcCwgLy8g5b+F5aGr77yM55Sf5oiQ562+5ZCN55qE5pe26Ze05oizXHJcbiAgICAgICAgICBub25jZVN0cjogcmVzcG9uc2Uubm9uY2VTdHIsIC8vIOW/heWhq++8jOeUn+aIkOetvuWQjeeahOmaj+acuuS4slxyXG4gICAgICAgICAgc2lnbmF0dXJlOiByZXNwb25zZS5zaWduYXR1cmUsIC8vIOW/heWhq++8jOetvuWQjVxyXG4gICAgICAgICAganNBcGlMaXN0OiBhcGlzLCAvLyDlv4XloavvvIzpnIDopoHkvb/nlKjnmoRKU+aOpeWPo+WIl+ihqFxyXG4gICAgICAgICAgb3BlblRhZ0xpc3Q6IG9wZW5UYWdzIC8vIOWPr+mAie+8jOmcgOimgeS9v+eUqOeahOW8gOaUvuagh+etvuWIl+ihqO+8jOS+i+Wmglsnd3gtb3Blbi1sYXVuY2gtYXBwJ11cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB3eC5yZWFkeSgoKSA9PiB7XHJcbiAgICAgIC8vIGNvbmZpZ+S/oeaBr+mqjOivgeWQjuS8muaJp+ihjHJlYWR55pa55rOV77yM5omA5pyJ5o6l5Y+j6LCD55So6YO95b+F6aG75ZyoY29uZmln5o6l5Y+j6I635b6X57uT5p6c5LmL5ZCO77yMY29uZmln5piv5LiA5Liq5a6i5oi356uv55qE5byC5q2l5pON5L2c77yMXHJcbiAgICAgIC8vIOaJgOS7peWmguaenOmcgOimgeWcqOmhtemdouWKoOi9veaXtuWwseiwg+eUqOebuOWFs+aOpeWPo++8jOWImemhu+aKiuebuOWFs+aOpeWPo+aUvuWcqHJlYWR55Ye95pWw5Lit6LCD55So5p2l56Gu5L+d5q2j56Gu5omn6KGM44CC5a+55LqO55So5oi36Kem5Y+R5pe25omN6LCD55So55qE5o6l5Y+j77yM5YiZ5Y+v5Lul55u05o6l6LCD55So77yM5LiN6ZyA6KaB5pS+5ZyocmVhZHnlh73mlbDkuK3jgIJcclxuICAgICAgY29uc29sZS5sb2coJ+W+ruS/oWpzc2Rr5Yid5aeL5YyW5a6M5oiQLicpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgd3guZXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAvLyBjb25maWfkv6Hmga/pqozor4HlpLHotKXkvJrmiafooYxlcnJvcuWHveaVsO+8jOWmguetvuWQjei/h+acn+WvvOiHtOmqjOivgeWksei0pe+8jOWFt+S9k+mUmeivr+S/oeaBr+WPr+S7peaJk+W8gGNvbmZpZ+eahGRlYnVn5qih5byP5p+l55yL77yM5Lmf5Y+v5Lul5Zyo6L+U5Zue55qEcmVz5Y+C5pWw5Lit5p+l55yL77yM5a+55LqOU1BB5Y+v5Lul5Zyo6L+Z6YeM5pu05paw562+5ZCN44CCXHJcbiAgICAgIGNvbnNvbGUubG9nKCflvq7kv6Fqc3Nka+WIneWni+WMluWksei0pTonLCByZXMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvcGVuV2luZG93KGl3aW5kb3c6IElXaW5kb3cpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaXdpbmRvdy51cmw7XHJcbiAgfVxyXG5cclxuICBzZXRUaXRsZShpdGl0bGU6IElUaXRsZSk6IHZvaWQge1xyXG4gICAgdGhpcy50aXRsZS5zZXRUaXRsZShpdGl0bGUudGl0bGUpO1xyXG4gIH1cclxuXHJcbiAgc2V0TmF2aWdhdGlvbkJhcihuYXZpZ2F0aW9uQmFyOiBOYXZpZ2F0aW9uQmFyKTogdm9pZCB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeaUvue9ruaMiemSrizor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gIH1cclxuXHJcbiAgc2hhcmUoaXNoYXJlOiBJU2hhcmUpOiB2b2lkIHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB5YiG5LqrLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgfVxyXG5cclxuICBnZXRUb2tlbigpOiBJdG9rZW4ge1xyXG4gICAgY29uc3QgaXRva2VuOiBJdG9rZW4gPSB7XHJcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLnRva2VuU2VydmljZS5nZXQoKS5hY2Nlc3NUb2tlbixcclxuICAgICAgdG9rZW5UeXBlOiBudWxsLFxyXG4gICAgICB0b2tlbkRhdGFMaW5lOiBudWxsLFxyXG4gICAgICBzY29wZTogbnVsbCxcclxuICAgIH07XHJcbiAgICByZXR1cm4gaXRva2VuO1xyXG4gIH1cclxuXHJcbiAgc2NhbkNvZGUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgd3guc2NhblFSQ29kZSh7XHJcbiAgICAgICAgbmVlZFJlc3VsdDogMSxcclxuICAgICAgICBzY2FuVHlwZTogWydxckNvZGUnLCAnYmFyQ29kZSddLFxyXG4gICAgICAgIHN1Y2Nlc3M6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXMucmVzdWx0U3RyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZyb20ocCk7XHJcbiAgfVxyXG5cclxuICB1c2VyTG9jYXRpb24oKTogT2JzZXJ2YWJsZTxVc2VyTG9jYXRpb24+IHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZTxVc2VyTG9jYXRpb24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgd3guZ2V0TG9jYXRpb24oe1xyXG4gICAgICAgIHR5cGU6ICd3Z3M4NCcsIC8vIOm7mOiupOS4undnczg055qEZ3Bz5Z2Q5qCH77yM5aaC5p6c6KaB6L+U5Zue55u05o6l57uZb3BlbkxvY2F0aW9u55So55qE54Gr5pif5Z2Q5qCH77yM5Y+v5Lyg5YWlJ2djajAyJ1xyXG4gICAgICAgIHN1Y2Nlc3MocmVzOiBhbnkpIHtcclxuICAgICAgICAgIGlmIChyZXMuZXJyTXNnID09PSAnZ2V0TG9jYXRpb246b2snKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhdGl0dWRlID0gcmVzLmxhdGl0dWRlOyAvLyDnuqzluqbvvIzmta7ngrnmlbDvvIzojIPlm7TkuLo5MCB+IC05MFxyXG4gICAgICAgICAgICBjb25zdCBsb25naXR1ZGUgPSByZXMubG9uZ2l0dWRlOyAvLyDnu4/luqbvvIzmta7ngrnmlbDvvIzojIPlm7TkuLoxODAgfiAtMTgw44CCXHJcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3MgPSAn5b6u5L+h5pegYWRkcmVzcyc7XHJcbiAgICAgICAgICAgIHJlc29sdmUoe2xhdGl0dWRlLCBsb25naXR1ZGUsIGFkZHJlc3N9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZyb20ocCk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZUluV2lmaShic3NpZHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgVdJRknpqozor4Es6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRXaWZpTWFjKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeiOt+WPlk1BQ+WcsOWdgCzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGNob29zZUNvbnRhY3RzKGNvdW50OiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHojrflj5bogZTns7vkuros6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBjb250YWN0RGV0YWlscyh0YXJnZXRVc2VySWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeafpeivouiBlOezu+S6uuivpue7huS/oeaBryzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHVwbG9hZEltYWdlKGNvdW50OiBudW1iZXIsIHNvdXJjZVR5cGU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeWbvueJh+S4iuS8oCzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIG9wZW5SZWFkV2l0aFRpbWVyKFxyXG4gICAgdXJsOiBhbnksXHJcbiAgICBvcGVuVHlwZTogYW55LFxyXG4gICAgdGl0bGU6IGFueSxcclxuICAgIGlkOiBhbnksXHJcbiAgICB0eXBlOiBhbnlcclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHor7vnianml7bpl7Tnu5/orqEs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRNb3ZpZShsaW1pdE1pbnV0ZTogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB6KeG6aKR5LiK5LygLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZmlsZUJyb3dzZXIodXJsOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHmraTlip/og70s6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBzdGFydFNlYXJjaEJlYWNvbnModGlja2V0OiBzdHJpbmcsIGNhbGxiYWNrOiAoYXJndjogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB3eC5zdGFydFNlYXJjaEJlYWNvbnMoe1xyXG4gICAgICB0aWNrZXQ6IHRpY2tldCxcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHN0b3BTZWFyY2hCZWFjb25zKGNhbGxiYWNrOiAoYXJndjogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB3eC5zdG9wU2VhcmNoQmVhY29ucyh7XHJcbiAgICAgIGNvbXBsZXRlOiBjYWxsYmFjayxcclxuICAgIH0pO1xyXG4gIH1cclxuICBvblNlYXJjaEJlYWNvbnMoY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4Lm9uU2VhcmNoQmVhY29ucyh7XHJcbiAgICAgIGNvbXBsZXRlOiBjYWxsYmFjayxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5bCB6KOF5pa55rOVOiDojrflj5Z1cmzkuK3nmoTlj4LmlbBcclxuICBwcml2YXRlIGdldFVybFBhcmFtKG5hbWUpOiBzdHJpbmcge1xyXG4gICAgLy8g5p6E6YCg5LiA5Liq5ZCr5pyJ55uu5qCH5Y+C5pWw55qE5q2j5YiZ6KGo6L6+5byP5a+56LGhXHJcbiAgICBjb25zdCByZWcgPSBuZXcgUmVnRXhwKCcoXnwmKScgKyBuYW1lICsgJz0oW14mXSopKCZ8JCknKTtcclxuICAgIGNvbnN0IHN0cmluZ3MgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnPycpO1xyXG4gICAgLy8g5Yy56YWN55uu5qCH5Y+C5pWwXHJcbiAgICBjb25zdCByID0gc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdLm1hdGNoKHJlZyk7XHJcbiAgICBpZiAociAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB1bmVzY2FwZShyWzJdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=