UNPKG

ng-yunzai-mobile

Version:

1. 修改wechat.micro.ts

433 lines 33.3 kB
/** * @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=