@cartanova/qgrid-cli 2.7.4 → 2.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +7 -3
- package/bundle/dist/application/qgrid/qgrid.frame.js +27 -11
- package/bundle/dist/application/qgrid/qgrid.types.js +2 -1
- package/bundle/dist/application/qgrid/token-subscriber.js +19 -1
- package/bundle/dist/application/qgrid/token-window-keepalive.js +153 -0
- package/bundle/dist/application/setting/setting.constant.js +11 -1
- package/bundle/dist/application/token/token.model.js +18 -1
- package/bundle/dist/migrations/20260819102011_alter_tokens_alter1.js +13 -0
- package/bundle/dist/sonamu.config.js +9 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +7 -4
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +11 -3
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +51 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +14 -4
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +58 -0
- package/bundle/src/application/qgrid/qgrid.frame.ts +39 -12
- package/bundle/src/application/qgrid/qgrid.types.ts +2 -0
- package/bundle/src/application/qgrid/token-subscriber.test.ts +112 -0
- package/bundle/src/application/qgrid/token-subscriber.ts +35 -0
- package/bundle/src/application/qgrid/token-window-keepalive.test.ts +223 -0
- package/bundle/src/application/qgrid/token-window-keepalive.ts +227 -0
- package/bundle/src/application/setting/setting.constant.test.ts +10 -0
- package/bundle/src/application/setting/setting.constant.ts +11 -1
- package/bundle/src/application/sonamu.generated.http +2 -0
- package/bundle/src/application/token/token.entity.json +8 -1
- package/bundle/src/application/token/token.model.test.ts +37 -0
- package/bundle/src/application/token/token.model.ts +20 -0
- package/bundle/src/migrations/20260819102011_alter_tokens_alter1.ts +13 -0
- package/bundle/src/sonamu.config.ts +14 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +46 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +13 -4
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +2 -0
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +30 -0
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +17 -1
- package/bundle/web-dist/client/assets/index-BbOyk01G.js +106 -0
- package/bundle/web-dist/client/assets/{logs-UlTjUAUB.js → logs-B7Pc88bf.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-CVNZnd8j.js → monit-CzMV4lZf.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-CF7Jlmfi.js → routes-COWTRxZo.js} +1 -1
- package/bundle/web-dist/client/assets/settings-Dpaosy-o.js +1 -0
- package/bundle/web-dist/client/assets/{show-CGhg0fbn.js → show-YvdybkKd.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-DaEtcsoL.js → tokens-DynVDx0c.js} +1 -1
- package/bundle/web-dist/client/assets/{use-oauth-login-flow-Eovfx07A.js → use-oauth-login-flow-OzmHElsE.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/assets/{settings-nCv71sax.js → settings-CIYR7h3G.js} +1 -0
- package/bundle/web-dist/server/entry-server.generated.js +96 -51
- package/package.json +3 -2
- package/bundle/web-dist/client/assets/index-CPYQIUqO.js +0 -106
- package/bundle/web-dist/client/assets/settings-N-8sXHl6.js +0 -1
|
@@ -97,6 +97,23 @@ var TokenModelClass = class extends BaseModelClass {
|
|
|
97
97
|
debug: false
|
|
98
98
|
})).rows;
|
|
99
99
|
}
|
|
100
|
+
async findActiveByProviderAndName(subset, provider, name) {
|
|
101
|
+
const { qb } = this.getSubsetQueries(subset);
|
|
102
|
+
qb.where("tokens.active", true);
|
|
103
|
+
qb.where("tokens.provider", provider);
|
|
104
|
+
qb.where("tokens.name", name);
|
|
105
|
+
const enhancers = this.createEnhancers({ A: (row) => ({ ...row }) });
|
|
106
|
+
return (await this.executeSubsetQuery({
|
|
107
|
+
subset,
|
|
108
|
+
qb,
|
|
109
|
+
params: {
|
|
110
|
+
num: 1,
|
|
111
|
+
page: 1
|
|
112
|
+
},
|
|
113
|
+
enhancers,
|
|
114
|
+
debug: false
|
|
115
|
+
})).rows[0];
|
|
116
|
+
}
|
|
100
117
|
/**
|
|
101
118
|
* 라우팅에서 빠진 토큰들. 세션 만료로 자동 비활성화된 것과 수동으로 끈 것이 섞여 있다 —
|
|
102
119
|
* 둘 다 "재로그인하면 살아나는" 상태라 알림 대상으로는 같게 본다.
|
|
@@ -257,4 +274,4 @@ const TokenModel = new TokenModelClass();
|
|
|
257
274
|
//#endregion
|
|
258
275
|
export { TokenModel };
|
|
259
276
|
|
|
260
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQge1xuICBhcGksXG4gIGFzQXJyYXksXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEJhc2VNb2RlbENsYXNzLFxuICBleGhhdXN0aXZlLFxuICB0eXBlIExpc3RSZXN1bHQsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0S2V5LCB0eXBlIFRva2VuU3Vic2V0TWFwcGluZyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0b2tlbkxvYWRlclF1ZXJpZXMsIHRva2VuU3Vic2V0UXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlbkxpc3RQYXJhbXMsIHR5cGUgVG9rZW5TYXZlUGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW5cIl0pO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gYXBwbHlDcmVhdGVEZWZhdWx0cyhzcDogVG9rZW5TYXZlUGFyYW1zKTogVG9rZW5TYXZlUGFyYW1zIHtcbiAgaWYgKHNwLmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBzcDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zcCxcbiAgICAuLi4oc3AucXVvdGFfdGhyZXNob2xkID09PSB1bmRlZmluZWQgPyB7IHF1b3RhX3RocmVzaG9sZDogREVGQVVMVF9RVU9UQV9USFJFU0hPTEQgfSA6IHt9KSxcbiAgICAuLi4oc3Aud2VpZ2h0ID09PSB1bmRlZmluZWQgPyB7IHdlaWdodDogREVGQVVMVF9XRUlHSFQgfSA6IHt9KSxcbiAgfTtcbn1cblxuY2xhc3MgVG9rZW5Nb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFRva2VuU3Vic2V0S2V5LFxuICBUb2tlblN1YnNldE1hcHBpbmcsXG4gIHR5cGVvZiB0b2tlblN1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiB0b2tlbkxvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlRva2VuXCIsIHRva2VuU3Vic2V0UXVlcmllcywgdG9rZW5Mb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiVG9rZW5cIiB9KVxuICBhc3luYyBmaW5kQnlJZDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwgeyBpZCwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJUb2tlblwiLCBpZCkpO1xuICAgIH1cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogVG9rZW5MaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IC4uLmxpc3RQYXJhbXMsIG51bTogMSwgcGFnZTogMSB9KTtcbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlbnNcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgVG9rZW5TdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcIm9yZC1hc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBUb2tlbkxpc3RQYXJhbXM7XG5cbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwidG9rZW5zLmlkXCIsIGFzQXJyYXkocGFyYW1zLmlkKSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLm9yZGVyQnkpIHtcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJpZC1kZXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImRlc2NcIik7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcIm9yZC1hc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm9yZFwiLCBcImFzY1wiKTtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImFzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7IHN1YnNldCwgcWIsIHBhcmFtcywgZW5oYW5jZXJzLCBkZWJ1ZzogZmFsc2UgfSk7XG4gIH1cblxuICBhc3luYyBmaW5kQnlBY2NvdW50SWRlbnRpZmllcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGpzb25LZXkgPSBwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIiA/IFwiYWNjb3VudFV1aWRcIiA6IFwiYWNjb3VudElkXCI7XG4gICAgcWIud2hlcmVSYXcoYHRva2Vucy5jcmVkZW50aWFscy0+Picke2pzb25LZXl9JyA9ID9gLCBbYWNjb3VudElkXSk7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlQnlQcm92aWRlcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnByb3ZpZGVyXCIsIHByb3ZpZGVyKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiDrnbzsmrDtjIXsl5DshJwg67mg7KeEIO2GoO2BsOuTpC4g7IS47IWYIOunjOujjOuhnCDsnpDrj5kg67mE7Zmc7ISx7ZmU65CcIOqyg+qzvCDsiJjrj5nsnLzroZwg64GIIOqyg+ydtCDshJ7sl6wg7J6I64ukIOKAlFxuICAgKiDrkZgg64ukIFwi7J6s66Gc6re47J247ZWY66m0IOyCtOyVhOuCmOuKlFwiIOyDge2DnOudvCDslYzrprwg64yA7IOB7Jy866Gc64qUIOqwmeqyjCDrs7jri6QuXG4gICAqL1xuICBhc3luYyBmaW5kSW5hY3RpdmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQpOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIGZhbHNlKTtcbiAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm5hbWVcIiwgXCJhc2NcIik7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBzYXZlKHNwYTogVG9rZW5TYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBzcGEuZm9yRWFjaCgoc3ApID0+IHtcbiAgICAgIHdkYi51YlJlZ2lzdGVyKFwidG9rZW5zXCIsIGFwcGx5Q3JlYXRlRGVmYXVsdHMoc3ApKTtcbiAgICB9KTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIHJldHVybiB0cngudWJVcHNlcnQoXCJ0b2tlbnNcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVGaWVsZHMoaWQ6IG51bWJlciwgZmllbGRzOiBUb2tlblVwZGF0ZUZpZWxkcyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKCh0cngpID0+IHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZShcImlkXCIsIGlkKS51cGRhdGUoZmllbGRzKSk7XG4gIH1cblxuICAvKipcbiAgICog7IS47IWYIOunjOujjCDthqDtgbDsnYQg65287Jqw7YyF7JeQ7IScIOygnOyZuO2VnOuLpC4gYGFjdGl2ZT10cnVlYCDsobDqsbTrtoAg6rCx7Iug7J2066+A66GcIOqzteycoCBEQiDrpbwg7JOw64qUXG4gICAqIOyXrOufrCDsnbjsiqTthLTsiqTqsIAg64+Z7Iuc7JeQIOqwmeydgCDrp4zro4zrpbwg6rCQ7KeA7ZW064+EIHRydWUg66W8IOuwm+uKlCDtlITroZzshLjsiqTripQg7ZWY64KY67+Q7J2064ukXG4gICAqICjtmLjstpzrtoDsnZgg7JWM66a8IOuwnOyGoSDqsozsnbTtirgpLlxuICAgKlxuICAgKiDri6gsIOuMgOyDgeydtCDtlbTri7kgcHJvdmlkZXIg7J2YIOuniOyngOuniSDtmZzshLEg7Yag7YGw7J2066m0IOqwseyLoO2VmOyngCDslYrqs6AgZmFsc2Ug66W8IOuwmO2ZmO2VnOuLpC5cbiAgICogY2xpZW50X2lkIOy3qOyGjOuCmCBPQXV0aCDqs4Tslb0g67OA6rK97LKY65+8IOyghCDthqDtgbDsnbQg64+Z7Iuc7JeQIOyLpO2MqO2VmOuKlCDsg4Htmansl5DshJwg7ZKA7J20XG4gICAqIO2GteynuOuhnCDruYTripQg6rKD7J2EIOunieuKlCDslYjsoITtjJDsnbTri6QuXG4gICAqL1xuICAvKipcbiAgICog6rCZ7J2AIOqzhOygleydmCDquLDsobQg7Yag7YGw7J2EIOyngOyasOqzoCDsg4jroZwg7KCA7J6l7ZWc64ukKOuhnOq3uOyduMK37J6s66Gc6re47J24IOqzte2GtSDqsr3roZwpLlxuICAgKlxuICAgKiBwcm92aWRlciDsnZHri7Xsl5Ag6rOE7KCVIOyLneuzhOyekOqwgCDsl4bsnLzrqbQgZGVkdXAg7J6Q7LK06rCAIOu2iOqwgOuKpe2VmOuvgOuhnCDqsr3qs6Drp4wg64Ko6riw6rOgXG4gICAqIOykkeuztSDsoJzqsbAg7JeG7J20IOyggOyepe2VnOuLpCjso73snYAgcm93IOqwgCDrgqjripTri6QpLlxuICAgKi9cbiAgYXN5bmMgcmVwbGFjZUJ5QWNjb3VudChcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNhdmVQYXJhbXM6IFRva2VuU2F2ZVBhcmFtcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IHRoaXMuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXCJBXCIsIHByb3ZpZGVyLCBhY2NvdW50SWQpO1xuICAgICAgaWYgKG9sZEVudHJpZXMubGVuZ3RoID4gMCkgYXdhaXQgdGhpcy5kZWwob2xkRW50cmllcy5tYXAoKG8pID0+IG8uaWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGAke3Byb3ZpZGVyfSBsb2dpbiB3aXRob3V0IGFjY291bnQgaWRlbnRpZmllcjogZGVkdXAgc2tpcHBlZCBmb3IgJHtzYXZlUGFyYW1zLm5hbWUgPz8gXCJ1bm5hbWVkXCJ9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlKFtzYXZlUGFyYW1zXSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYGRlYWN0aXZhdGVkYCDripQg7J20IO2YuOy2nOydtCDsi6TsoJzroZwg67mE7Zmc7ISx7ZmU66W8IOyImO2Wie2WiOuKlOyngCDigJQg7Zi47Lac67aA7J2YIOyVjOumvFxuICAgKiAgIOqyjOydtO2KuOuLpC4gYGtlcHRBc0xhc3RBY3RpdmVgIOuKlCDrp4jsp4Drp4kg7Zmc7ISxIO2GoO2BsOydtOudvCDqsbDrtoDtlZwg6rK97Jqw66GcLCDsgqzrp50g7J6Q7LK064qUXG4gICAqICAg7IKs7Iuk7J207KeA66eMIO2SgOydhCDruYTsmrDsp4Ag7JWK7Jy866Ck6rOgIOyCtOugpOuRlCDsg4Htg5zri6Qoc3lzdGVtaWMg7Iuk7YyoIOyLoO2YuCkuXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlSWZBY3RpdmUoXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRlYWN0aXZhdGVkOiBib29sZWFuOyBrZXB0QXNMYXN0QWN0aXZlOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8g7Zmc7ISxIOyXrOu2gOyZgCBcIuuniOyngOuniSDrgqjsnYAg7Yag7YGw7J246rCAXCLrpbwg7ZWcIHN0YXRlbWVudCDslYjsl5DshJwg7YyQ7KCV7ZWc64ukLiDrkZAg7KGw6rG07J2EXG4gICAgLy8g65Sw66GcIOydveqzoCDrgpjspJHsl5Ag6rCx7Iug7ZWY66m0IOq3uCDsgqzsnbTsl5Ag64uk66W4IOyduOyKpO2EtOyKpOqwgCDqsJnsnYAgcHJvdmlkZXIg7J2YIO2GoO2BsOydhFxuICAgIC8vIOu5hO2ZnOyEse2ZlO2VtCDtkoDsnbQg7Ya17Ke466GcIOu5jCDsiJgg7J6I64ukLlxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB3ZGIua25leC5yYXc8eyByb3dDb3VudDogbnVtYmVyIH0+KFxuICAgICAgYFVQREFURSB0b2tlbnMgU0VUIGFjdGl2ZSA9IGZhbHNlXG4gICAgICAgV0hFUkUgaWQgPSA/IEFORCBhY3RpdmUgPSB0cnVlXG4gICAgICAgICBBTkQgKFNFTEVDVCBjb3VudCgqKSBGUk9NIHRva2VucyBwZWVyXG4gICAgICAgICAgICAgIFdIRVJFIHBlZXIucHJvdmlkZXIgPSB0b2tlbnMucHJvdmlkZXIgQU5EIHBlZXIuYWN0aXZlKSA+IDFgLFxuICAgICAgW2lkXSxcbiAgICApO1xuICAgIGlmICgodXBkYXRlZC5yb3dDb3VudCA/PyAwKSA+IDApIHJldHVybiB7IGRlYWN0aXZhdGVkOiB0cnVlLCBrZXB0QXNMYXN0QWN0aXZlOiBmYWxzZSB9O1xuXG4gICAgLy8g6rCx7Iug65CY7KeAIOyViuydgCDsnbTsnKDripQg65GYIOykkSDtlZjrgpjri6Q6IOydtOuvuCDruYTtmZzshLHsnbTqsbDrgpgo7KCV7IOBIOqyveyfgSDqsrDqs7wpLCDrp4jsp4Drp4lcbiAgICAvLyDtmZzshLEg7Yag7YGw7J206rGw64KYLiDtm4TsnpDripQgc3lzdGVtaWMg7Iuk7YyoIOyLoO2YuOudvCDrgqjqsqjslbwg7ZWY66+A66GcIOydtOuVjOunjCDtlZwg67KIIOuNlCDsnb3ripTri6QuXG4gICAgY29uc3Qgc3Vydml2b3IgPSAoXG4gICAgICBhd2FpdCB3ZGIua25leC5yYXc8eyByb3dzOiB7IHByb3ZpZGVyOiBzdHJpbmcgfVtdIH0+KFxuICAgICAgICBcIlNFTEVDVCBwcm92aWRlciBGUk9NIHRva2VucyBXSEVSRSBpZCA9ID8gQU5EIGFjdGl2ZSA9IHRydWVcIixcbiAgICAgICAgW2lkXSxcbiAgICAgIClcbiAgICApLnJvd3NbMF07XG4gICAgaWYgKHN1cnZpdm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGByZWZ1c2luZyB0byBhdXRvLWRlYWN0aXZhdGUgdG9rZW4gJHtpZH06IGxhc3QgYWN0aXZlICR7c3Vydml2b3IucHJvdmlkZXJ9IHRva2VuIOKAlCBgICtcbiAgICAgICAgICBgc3lzdGVtaWMgcmVmcmVzaCBmYWlsdXJlIHN1c3BlY3RlZCwga2VlcGluZyB0aGUgcG9vbCBub24tZW1wdHlgLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IGRlYWN0aXZhdGVkOiBmYWxzZSwga2VwdEFzTGFzdEFjdGl2ZTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBkZWFjdGl2YXRlZDogZmFsc2UsIGtlcHRBc0xhc3RBY3RpdmU6IGZhbHNlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcmVvcmRlcihpZHM6IG51bWJlcltdKTogUHJvbWlzZTx7IGRvbmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGF3YWl0IHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZShcImlkXCIsIGlkc1tpXSEpLnVwZGF0ZSh7IG9yZDogaSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBkb25lOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZGVsKGlkczogbnVtYmVyW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIHJldHVybiB0cngudGFibGUoXCJ0b2tlbnNcIikud2hlcmVJbihcInRva2Vucy5pZFwiLCBpZHMpLmRlbGV0ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBUb2tlbk1vZGVsID0gbmV3IFRva2VuTW9kZWxDbGFzcygpO1xu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
|
|
277
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQge1xuICBhcGksXG4gIGFzQXJyYXksXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEJhc2VNb2RlbENsYXNzLFxuICBleGhhdXN0aXZlLFxuICB0eXBlIExpc3RSZXN1bHQsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0S2V5LCB0eXBlIFRva2VuU3Vic2V0TWFwcGluZyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0b2tlbkxvYWRlclF1ZXJpZXMsIHRva2VuU3Vic2V0UXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlbkxpc3RQYXJhbXMsIHR5cGUgVG9rZW5TYXZlUGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW5cIl0pO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gYXBwbHlDcmVhdGVEZWZhdWx0cyhzcDogVG9rZW5TYXZlUGFyYW1zKTogVG9rZW5TYXZlUGFyYW1zIHtcbiAgaWYgKHNwLmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBzcDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zcCxcbiAgICAuLi4oc3AucXVvdGFfdGhyZXNob2xkID09PSB1bmRlZmluZWQgPyB7IHF1b3RhX3RocmVzaG9sZDogREVGQVVMVF9RVU9UQV9USFJFU0hPTEQgfSA6IHt9KSxcbiAgICAuLi4oc3Aud2VpZ2h0ID09PSB1bmRlZmluZWQgPyB7IHdlaWdodDogREVGQVVMVF9XRUlHSFQgfSA6IHt9KSxcbiAgfTtcbn1cblxuY2xhc3MgVG9rZW5Nb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFRva2VuU3Vic2V0S2V5LFxuICBUb2tlblN1YnNldE1hcHBpbmcsXG4gIHR5cGVvZiB0b2tlblN1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiB0b2tlbkxvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlRva2VuXCIsIHRva2VuU3Vic2V0UXVlcmllcywgdG9rZW5Mb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiVG9rZW5cIiB9KVxuICBhc3luYyBmaW5kQnlJZDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwgeyBpZCwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJUb2tlblwiLCBpZCkpO1xuICAgIH1cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogVG9rZW5MaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IC4uLmxpc3RQYXJhbXMsIG51bTogMSwgcGFnZTogMSB9KTtcbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlbnNcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgVG9rZW5TdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcIm9yZC1hc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBUb2tlbkxpc3RQYXJhbXM7XG5cbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwidG9rZW5zLmlkXCIsIGFzQXJyYXkocGFyYW1zLmlkKSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLm9yZGVyQnkpIHtcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJpZC1kZXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImRlc2NcIik7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcIm9yZC1hc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm9yZFwiLCBcImFzY1wiKTtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImFzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7IHN1YnNldCwgcWIsIHBhcmFtcywgZW5oYW5jZXJzLCBkZWJ1ZzogZmFsc2UgfSk7XG4gIH1cblxuICBhc3luYyBmaW5kQnlBY2NvdW50SWRlbnRpZmllcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGpzb25LZXkgPSBwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIiA/IFwiYWNjb3VudFV1aWRcIiA6IFwiYWNjb3VudElkXCI7XG4gICAgcWIud2hlcmVSYXcoYHRva2Vucy5jcmVkZW50aWFscy0+Picke2pzb25LZXl9JyA9ID9gLCBbYWNjb3VudElkXSk7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlQnlQcm92aWRlcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnByb3ZpZGVyXCIsIHByb3ZpZGVyKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIGZpbmRBY3RpdmVCeVByb3ZpZGVyQW5kTmFtZTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF0gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5hY3RpdmVcIiwgdHJ1ZSk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLm5hbWVcIiwgbmFtZSk7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxLCBwYWdlOiAxIH0sXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIOudvOyasO2MheyXkOyEnCDruaDsp4Qg7Yag7YGw65OkLiDshLjshZgg66eM66OM66GcIOyekOuPmSDruYTtmZzshLHtmZTrkJwg6rKD6rO8IOyImOuPmeycvOuhnCDrgYgg6rKD7J20IOyEnuyXrCDsnojri6Qg4oCUXG4gICAqIOuRmCDri6QgXCLsnqzroZzqt7jsnbjtlZjrqbQg7IK07JWE64KY64qUXCIg7IOB7YOc6528IOyVjOumvCDrjIDsg4HsnLzroZzripQg6rCZ6rKMIOuzuOuLpC5cbiAgICovXG4gIGFzeW5jIGZpbmRJbmFjdGl2ZTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KHN1YnNldDogVCk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdW10+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5hY3RpdmVcIiwgZmFsc2UpO1xuICAgIHFiLm9yZGVyQnkoXCJ0b2tlbnMubmFtZVwiLCBcImFzY1wiKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIGZpbmRBY3RpdmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQpOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHsgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zOiB7IG51bTogMTAwLCBwYWdlOiAxIH0sXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHNhdmUoc3BhOiBUb2tlblNhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJ0b2tlbnNcIiwgYXBwbHlDcmVhdGVEZWZhdWx0cyhzcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC51YlVwc2VydChcInRva2Vuc1wiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkcyhpZDogbnVtYmVyLCBmaWVsZHM6IFRva2VuVXBkYXRlRmllbGRzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oKHRyeCkgPT4gdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWQpLnVwZGF0ZShmaWVsZHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshLjshZgg66eM66OMIO2GoO2BsOydhCDrnbzsmrDtjIXsl5DshJwg7KCc7Jm47ZWc64ukLiBgYWN0aXZlPXRydWVgIOyhsOqxtOu2gCDqsLHsi6DsnbTrr4DroZwg6rO17JygIERCIOulvCDsk7DripRcbiAgICog7Jes65+sIOyduOyKpO2EtOyKpOqwgCDrj5nsi5zsl5Ag6rCZ7J2AIOunjOujjOulvCDqsJDsp4DtlbTrj4QgdHJ1ZSDrpbwg67Cb64qUIO2UhOuhnOyEuOyKpOuKlCDtlZjrgpjrv5DsnbTri6RcbiAgICogKO2YuOy2nOu2gOydmCDslYzrprwg67Cc7IahIOqyjOydtO2KuCkuXG4gICAqXG4gICAqIOuLqCwg64yA7IOB7J20IO2VtOuLuSBwcm92aWRlciDsnZgg66eI7KeA66eJIO2ZnOyEsSDthqDtgbDsnbTrqbQg6rCx7Iug7ZWY7KeAIOyViuqzoCBmYWxzZSDrpbwg67CY7ZmY7ZWc64ukLlxuICAgKiBjbGllbnRfaWQg7Leo7IaM64KYIE9BdXRoIOqzhOyVvSDrs4Dqsr3sspjrn7wg7KCEIO2GoO2BsOydtCDrj5nsi5zsl5Ag7Iuk7Yyo7ZWY64qUIOyDge2ZqeyXkOyEnCDtkoDsnbRcbiAgICog7Ya17Ke466GcIOu5hOuKlCDqsoPsnYQg66eJ64qUIOyViOyghO2MkOydtOuLpC5cbiAgICovXG4gIC8qKlxuICAgKiDqsJnsnYAg6rOE7KCV7J2YIOq4sOyhtCDthqDtgbDsnYQg7KeA7Jqw6rOgIOyDiOuhnCDsoIDsnqXtlZzri6Qo66Gc6re47J24wrfsnqzroZzqt7jsnbgg6rO17Ya1IOqyveuhnCkuXG4gICAqXG4gICAqIHByb3ZpZGVyIOydkeuLteyXkCDqs4TsoJUg7Iud67OE7J6Q6rCAIOyXhuycvOuptCBkZWR1cCDsnpDssrTqsIAg67aI6rCA64ql7ZWY66+A66GcIOqyveqzoOunjCDrgqjquLDqs6BcbiAgICog7KSR67O1IOygnOqxsCDsl4bsnbQg7KCA7J6l7ZWc64ukKOyjveydgCByb3cg6rCAIOuCqOuKlOuLpCkuXG4gICAqL1xuICBhc3luYyByZXBsYWNlQnlBY2NvdW50KFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2F2ZVBhcmFtczogVG9rZW5TYXZlUGFyYW1zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYWNjb3VudElkKSB7XG4gICAgICBjb25zdCBvbGRFbnRyaWVzID0gYXdhaXQgdGhpcy5maW5kQnlBY2NvdW50SWRlbnRpZmllcihcIkFcIiwgcHJvdmlkZXIsIGFjY291bnRJZCk7XG4gICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSBhd2FpdCB0aGlzLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYCR7cHJvdmlkZXJ9IGxvZ2luIHdpdGhvdXQgYWNjb3VudCBpZGVudGlmaWVyOiBkZWR1cCBza2lwcGVkIGZvciAke3NhdmVQYXJhbXMubmFtZSA/PyBcInVubmFtZWRcIn1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoW3NhdmVQYXJhbXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBgZGVhY3RpdmF0ZWRgIOuKlCDsnbQg7Zi47Lac7J20IOyLpOygnOuhnCDruYTtmZzshLHtmZTrpbwg7IiY7ZaJ7ZaI64qU7KeAIOKAlCDtmLjstpzrtoDsnZgg7JWM66a8XG4gICAqICAg6rKM7J207Yq464ukLiBga2VwdEFzTGFzdEFjdGl2ZWAg64qUIOuniOyngOuniSDtmZzshLEg7Yag7YGw7J206528IOqxsOu2gO2VnCDqsr3smrDroZwsIOyCrOunnSDsnpDssrTripRcbiAgICogICDsgqzsi6TsnbTsp4Drp4wg7ZKA7J2EIOu5hOyasOyngCDslYrsnLzroKTqs6Ag7IK066Ck65GUIOyDge2DnOuLpChzeXN0ZW1pYyDsi6TtjKgg7Iug7Zi4KS5cbiAgICovXG4gIGFzeW5jIGRlYWN0aXZhdGVJZkFjdGl2ZShcbiAgICBpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGVhY3RpdmF0ZWQ6IGJvb2xlYW47IGtlcHRBc0xhc3RBY3RpdmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyDtmZzshLEg7Jes67aA7JmAIFwi66eI7KeA66eJIOuCqOydgCDthqDtgbDsnbjqsIBcIuulvCDtlZwgc3RhdGVtZW50IOyViOyXkOyEnCDtjJDsoJXtlZzri6QuIOuRkCDsobDqsbTsnYRcbiAgICAvLyDrlLDroZwg7J296rOgIOuCmOykkeyXkCDqsLHsi6DtlZjrqbQg6re4IOyCrOydtOyXkCDri6Trpbgg7J247Iqk7YS07Iqk6rCAIOqwmeydgCBwcm92aWRlciDsnZgg7Yag7YGw7J2EXG4gICAgLy8g67mE7Zmc7ISx7ZmU7ZW0IO2SgOydtCDthrXsp7jroZwg67mMIOyImCDsnojri6QuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHdkYi5rbmV4LnJhdzx7IHJvd0NvdW50OiBudW1iZXIgfT4oXG4gICAgICBgVVBEQVRFIHRva2VucyBTRVQgYWN0aXZlID0gZmFsc2VcbiAgICAgICBXSEVSRSBpZCA9ID8gQU5EIGFjdGl2ZSA9IHRydWVcbiAgICAgICAgIEFORCAoU0VMRUNUIGNvdW50KCopIEZST00gdG9rZW5zIHBlZXJcbiAgICAgICAgICAgICAgV0hFUkUgcGVlci5wcm92aWRlciA9IHRva2Vucy5wcm92aWRlciBBTkQgcGVlci5hY3RpdmUpID4gMWAsXG4gICAgICBbaWRdLFxuICAgICk7XG4gICAgaWYgKCh1cGRhdGVkLnJvd0NvdW50ID8/IDApID4gMCkgcmV0dXJuIHsgZGVhY3RpdmF0ZWQ6IHRydWUsIGtlcHRBc0xhc3RBY3RpdmU6IGZhbHNlIH07XG5cbiAgICAvLyDqsLHsi6DrkJjsp4Ag7JWK7J2AIOydtOycoOuKlCDrkZgg7KSRIO2VmOuCmOuLpDog7J2066+4IOu5hO2ZnOyEseydtOqxsOuCmCjsoJXsg4Eg6rK97J+BIOqysOqzvCksIOuniOyngOuniVxuICAgIC8vIO2ZnOyEsSDthqDtgbDsnbTqsbDrgpguIO2bhOyekOuKlCBzeXN0ZW1pYyDsi6TtjKgg7Iug7Zi46528IOuCqOqyqOyVvCDtlZjrr4DroZwg7J2065WM66eMIO2VnCDrsogg642UIOydveuKlOuLpC5cbiAgICBjb25zdCBzdXJ2aXZvciA9IChcbiAgICAgIGF3YWl0IHdkYi5rbmV4LnJhdzx7IHJvd3M6IHsgcHJvdmlkZXI6IHN0cmluZyB9W10gfT4oXG4gICAgICAgIFwiU0VMRUNUIHByb3ZpZGVyIEZST00gdG9rZW5zIFdIRVJFIGlkID0gPyBBTkQgYWN0aXZlID0gdHJ1ZVwiLFxuICAgICAgICBbaWRdLFxuICAgICAgKVxuICAgICkucm93c1swXTtcbiAgICBpZiAoc3Vydml2b3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYHJlZnVzaW5nIHRvIGF1dG8tZGVhY3RpdmF0ZSB0b2tlbiAke2lkfTogbGFzdCBhY3RpdmUgJHtzdXJ2aXZvci5wcm92aWRlcn0gdG9rZW4g4oCUIGAgK1xuICAgICAgICAgIGBzeXN0ZW1pYyByZWZyZXNoIGZhaWx1cmUgc3VzcGVjdGVkLCBrZWVwaW5nIHRoZSBwb29sIG5vbi1lbXB0eWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgZGVhY3RpdmF0ZWQ6IGZhbHNlLCBrZXB0QXNMYXN0QWN0aXZlOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGRlYWN0aXZhdGVkOiBmYWxzZSwga2VwdEFzTGFzdEFjdGl2ZTogZmFsc2UgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW9yZGVyKGlkczogbnVtYmVyW10pOiBQcm9taXNlPHsgZG9uZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXdhaXQgdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWRzW2ldISkudXBkYXRlKHsgb3JkOiBpIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZUluKFwidG9rZW5zLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFRva2VuTW9kZWwgPSBuZXcgVG9rZW5Nb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFnQkEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLE9BQU8sQ0FBQztBQUUzQyxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGlCQUFpQjtBQVF2QixTQUFTLG9CQUFvQixJQUFzQztDQUNqRSxJQUFJLEdBQUcsT0FBTyxRQUFXLE9BQU87Q0FDaEMsT0FBTztFQUNMLEdBQUc7RUFDSCxHQUFJLEdBQUcsb0JBQW9CLFNBQVksRUFBRSxpQkFBaUIsd0JBQXdCLElBQUksQ0FBQztFQUN2RixHQUFJLEdBQUcsV0FBVyxTQUFZLEVBQUUsUUFBUSxlQUFlLElBQUksQ0FB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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/migrations/20260819102011_alter_tokens_alter1.ts
|
|
2
|
+
async function up(knex) {
|
|
3
|
+
await knex.raw(`CREATE UNIQUE INDEX tokens_provider_name_unique ON tokens USING btree(provider ASC NULLS LAST, name ASC NULLS LAST) NULLS DISTINCT;`);
|
|
4
|
+
}
|
|
5
|
+
async function down(knex) {
|
|
6
|
+
await knex.schema.alterTable("tokens", (table) => {
|
|
7
|
+
table.dropIndex(["provider", "name"], "tokens_provider_name_unique");
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { down, up };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA4MTkxMDIwMTFfYWx0ZXJfdG9rZW5zX2FsdGVyMS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9ucy8yMDI2MDgxOTEwMjAxMV9hbHRlcl90b2tlbnNfYWx0ZXIxLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtuZXgucmF3KFxuICAgIGBDUkVBVEUgVU5JUVVFIElOREVYIHRva2Vuc19wcm92aWRlcl9uYW1lX3VuaXF1ZSBPTiB0b2tlbnMgVVNJTkcgYnRyZWUocHJvdmlkZXIgQVNDIE5VTExTIExBU1QsIG5hbWUgQVNDIE5VTExTIExBU1QpIE5VTExTIERJU1RJTkNUO2AsXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcInRva2Vuc1wiLCAodGFibGUpID0+IHtcbiAgICB0YWJsZS5kcm9wSW5kZXgoW1wicHJvdmlkZXJcIiwgXCJuYW1lXCJdLCBcInRva2Vuc19wcm92aWRlcl9uYW1lX3VuaXF1ZVwiKTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFFQSxlQUFzQixHQUFHLE1BQTJCO0NBQ2xELE1BQU0sS0FBSyxJQUNULHFJQUNGO0FBQ0Y7QUFFQSxlQUFzQixLQUFLLE1BQTJCO0NBQ3BELE1BQU0sS0FBSyxPQUFPLFdBQVcsV0FBVyxVQUFVO0VBQ2hELE1BQU0sVUFBVSxDQUFDLFlBQVksTUFBTSxHQUFHLDZCQUE2QjtDQUNyRSxDQUFDO0FBQ0gifQ==
|
|
@@ -5,6 +5,7 @@ import { rescheduleExpiredTokenReminder, startExpiredTokenReminder, stopExpiredT
|
|
|
5
5
|
import { QgridFrame } from "./application/qgrid/qgrid.frame.js";
|
|
6
6
|
import { TokenSubscriber } from "./application/qgrid/token-subscriber.js";
|
|
7
7
|
import { ensureTokensTrigger } from "./application/qgrid/token-trigger-setup.js";
|
|
8
|
+
import { rescheduleTokenWindowKeepalive, startTokenWindowKeepalive, stopTokenWindowKeepalive } from "./application/qgrid/token-window-keepalive.js";
|
|
8
9
|
import { handleServerError } from "./server-error-handler.js";
|
|
9
10
|
import { AnthropicDispatcher } from "./utils/providers/anthropic/anthropic-dispatcher.js";
|
|
10
11
|
import { OpenAIDispatcher } from "./utils/providers/openai/openai-dispatcher.js";
|
|
@@ -139,6 +140,7 @@ var sonamu_config_default = defineConfig({
|
|
|
139
140
|
await loadSettings();
|
|
140
141
|
setSettingChangeHandler((key) => {
|
|
141
142
|
if (key === "slack.expiryReminderMinutes" || key === "slack.remindersEnabled") rescheduleExpiredTokenReminder();
|
|
143
|
+
if (key === "qgrid.tokenWindowKeepaliveEnabled") rescheduleTokenWindowKeepalive();
|
|
142
144
|
});
|
|
143
145
|
let triggerReady = true;
|
|
144
146
|
try {
|
|
@@ -168,7 +170,11 @@ var sonamu_config_default = defineConfig({
|
|
|
168
170
|
QgridDispatcher.startupState.anthropic = "failed";
|
|
169
171
|
log.warn(`anthropic dispatcher failed: ${e.message}`);
|
|
170
172
|
}
|
|
173
|
+
subscriber.setTokenChangeHandler(() => {
|
|
174
|
+
rescheduleTokenWindowKeepalive();
|
|
175
|
+
});
|
|
171
176
|
startExpiredTokenReminder();
|
|
177
|
+
startTokenWindowKeepalive();
|
|
172
178
|
const anthropicCount = QgridDispatcher.anthropicDispatcher?.tokenCount ?? 0;
|
|
173
179
|
const openaiCount = QgridDispatcher.openaiDispatcher?.tokenCount ?? 0;
|
|
174
180
|
log.info(`listening on http://${host}:${port}`);
|
|
@@ -179,7 +185,9 @@ var sonamu_config_default = defineConfig({
|
|
|
179
185
|
onShutdown: async () => {
|
|
180
186
|
const log = getLogger(["qgrid", "startup"]);
|
|
181
187
|
stopExpiredTokenReminder();
|
|
188
|
+
stopTokenWindowKeepalive();
|
|
182
189
|
setSettingChangeHandler(null);
|
|
190
|
+
QgridDispatcher.subscriber?.setTokenChangeHandler(null);
|
|
183
191
|
if (QgridDispatcher.openaiDispatcher) await QgridDispatcher.openaiDispatcher.stop();
|
|
184
192
|
if (QgridDispatcher.anthropicDispatcher) await QgridDispatcher.anthropicDispatcher.stop();
|
|
185
193
|
if (QgridDispatcher.subscriber) await QgridDispatcher.subscriber.stop();
|
|
@@ -194,4 +202,4 @@ var sonamu_config_default = defineConfig({
|
|
|
194
202
|
//#endregion
|
|
195
203
|
export { sonamu_config_default as default };
|
|
196
204
|
|
|
197
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHtcbiAgcmVzY2hlZHVsZUV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdGFydEV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdG9wRXhwaXJlZFRva2VuUmVtaW5kZXIsXG59IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL2V4cGlyZWQtdG9rZW4tcmVtaW5kZXJcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFFncmlkRnJhbWUgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiO1xuaW1wb3J0IHsgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgZW5zdXJlVG9rZW5zVHJpZ2dlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXRyaWdnZXItc2V0dXBcIjtcbmltcG9ydCB7IGxvYWRTZXR0aW5ncywgc2V0U2V0dGluZ0NoYW5nZUhhbmRsZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9zZXR0aW5nL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7IGhhbmRsZVNlcnZlckVycm9yIH0gZnJvbSBcIi4vc2VydmVyLWVycm9yLWhhbmRsZXJcIjtcbmltcG9ydCB7IEFudGhyb3BpY0Rpc3BhdGNoZXIgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBPcGVuQUlEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuXG5jb25zdCBob3N0ID0gcHJvY2Vzcy5lbnYuSE9TVCA/PyBcImxvY2FsaG9zdFwiO1xuY29uc3QgcG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUID8/IDQ0OTAwKTtcblxuY29uc3QgY29ubkNvbmZpZyA9IHtcbiAgaG9zdDogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX0hPU1QgPz8gXCJsb2NhbGhvc3RcIixcbiAgcG9ydDogTnVtYmVyKHByb2Nlc3MuZW52LlNPTkFNVV9EQl9QT1JUID8/IDU0MzIpLFxuICB1c2VyOiBwcm9jZXNzLmVudi5TT05BTVVfREJfVVNFUiA/PyBcInBvc3RncmVzXCIsXG4gIHBhc3N3b3JkOiBwcm9jZXNzLmVudi5TT05BTVVfREJfUEFTU1dPUkQgPz8gXCJwb3N0Z3Jlc1wiLFxuICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX05BTUUgPz8gXCJxZ3JpZFwiLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgcHJvamVjdE5hbWU6IHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSA/PyBcIlFncmlkXCIsXG4gIGRhdGFiYXNlOiB7XG4gICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXlNaWxsaXM6IDEwMDAwLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBhcGk6IHtcbiAgICBkaXI6IFwiYXBpXCIsXG4gICAgdGltZXpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIHJvdXRlOiB7XG4gICAgICBwcmVmaXg6IFwiL2FwaVwiLFxuICAgIH0sXG4gIH0sXG4gIGkxOG46IHtcbiAgICBkZWZhdWx0TG9jYWxlOiBcImtvXCIsXG4gICAgc3VwcG9ydGVkTG9jYWxlczogW1wia29cIiwgXCJlblwiXSxcbiAgfSxcbiAgc3luYzoge1xuICAgIHRhcmdldHM6IFtcIndlYlwiXSxcbiAgfSxcbiAgdGVzdDoge1xuICAgIHBhcmFsbGVsOiB0cnVlLFxuICAgIG1heFdvcmtlcnM6IDQsXG4gICAgZGV2UnVubmVyOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgfSxcbiAgbG9nZ2luZzoge1xuICAgIHNpbmtzOiB7XG4gICAgICBjb25zb2xlOiBnZXRDb25zb2xlU2luayh7XG4gICAgICAgIGZvcm1hdHRlcjogZ2V0UHJldHR5Rm9ybWF0dGVyKHtcbiAgICAgICAgICB0aW1lc3RhbXA6IFwidGltZVwiLFxuICAgICAgICAgIGNhdGVnb3J5V2lkdGg6IDIwLFxuICAgICAgICAgIGNhdGVnb3J5VHJ1bmNhdGU6IFwibWlkZGxlXCIsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgICAvLyBNb25pdCDtg63smqkgaW4tbWVtb3J5IHJpbmcgYnVmZmVyLiDtj6zrp7fsnYAgc2luayDrs4Qg4oCUIOy9mOyGlCDstpzroKXsnYAg6re464yA66Gc64ukLlxuICAgICAgbW9uaXQ6IG1vbml0TG9nU2luayxcbiAgICB9LFxuICAgIGxvZ2dlcnM6IFtcbiAgICAgIC8vIHFncmlkIOuhnOq3uCAo7JqU7LKtIOu2hOuwsCwgb2F1dGgvdXNhZ2UgQVBJKVxuICAgICAgeyBjYXRlZ29yeTogW1wicWdyaWRcIl0sIHNpbmtzOiBbXCJjb25zb2xlXCIsIFwibW9uaXRcIl0sIGxvd2VzdExldmVsOiBcImluZm9cIiB9LFxuICAgICAgLy8gc29uYW11IOuhnOq3uOuKlCB3YXJuaW5nIOydtOyDgeunjFxuICAgICAgeyBjYXRlZ29yeTogW1wic29uYW11XCJdLCBzaW5rczogW1wiY29uc29sZVwiLCBcIm1vbml0XCJdLCBsb3dlc3RMZXZlbDogXCJ3YXJuaW5nXCIgfSxcbiAgICAgIC8vIGZhc3RpZnkg66Gc6re4IOywqOuLqFxuICAgICAgeyBjYXRlZ29yeTogW1wiZmFzdGlmeVwiXSwgc2lua3M6IFtdLCBsb3dlc3RMZXZlbDogXCJmYXRhbFwiIH0sXG4gICAgXSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgbGlzdGVuOiB7IHBvcnQsIGhvc3QgfSxcbiAgICBmYXN0aWZ5OiB7XG4gICAgICBib2R5TGltaXQ6IDEwICogMTAyNCAqIDEwMjQsXG4gICAgfSxcbiAgICBwbHVnaW5zOiB7XG4gICAgICBmb3JtYm9keTogdHJ1ZSxcbiAgICAgIHFzOiB0cnVlLFxuICAgICAgc3NlOiB0cnVlLFxuICAgICAgbXVsdGlwYXJ0OiB7IGxpbWl0czogeyBmaWxlU2l6ZTogMTAyNCAqIDEwMjQgKiAzMCB9IH0sXG4gICAgICBzdGF0aWM6IHtcbiAgICAgICAgcm9vdDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLy4uL1wiLCBcInB1YmxpY1wiKSxcbiAgICAgICAgcHJlZml4OiBcIi9hcGkvcHVibGljXCIsXG4gICAgICB9LFxuICAgICAgY3VzdG9tOiAoc2VydmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IG9hdXRoQ2FsbGJhY2sgPSBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGNvZGUsIHN0YXRlIH0gPSByZXF1ZXN0LnF1ZXJ5IGFzIHsgY29kZT86IHN0cmluZzsgc3RhdGU/OiBzdHJpbmcgfTtcbiAgICAgICAgICBpZiAoIWNvZGUgfHwgIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1taXNzaW5nX3BhcmFtc1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBRZ3JpZEZyYW1lLmhhbmRsZU9BdXRoQ2FsbGJhY2soY29kZSwgc3RhdGUsIHJlcGx5KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWNhbGxiYWNrX2ZhaWxlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNlcnZlci5nZXQoXCIvY2FsbGJhY2tcIiwgb2F1dGhDYWxsYmFjayk7XG4gICAgICAgIHNlcnZlci5nZXQoXCIvYXV0aC9jYWxsYmFja1wiLCBvYXV0aENhbGxiYWNrKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhcGlDb25maWc6IHtcbiAgICAgIGNvbnRleHRQcm92aWRlcjogKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmYXVsdENvbnRleHQsXG4gICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgYm9keTogcmVxdWVzdC5ib2R5LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGd1YXJkSGFuZGxlcjogKCkgPT4ge30sXG4gICAgICBjYWNoZUNvbnRyb2xIYW5kbGVyOiAocmVxKSA9PiB7XG4gICAgICAgIHN3aXRjaCAocmVxLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYXNzZXRzXCI6XG4gICAgICAgICAgICAvLyBIYXNoIO2PrO2VqOuQnCDtjIzsnbw6IOyYgeq1rCDsupDsi5xcbiAgICAgICAgICAgIGlmIChyZXEucGF0aC5tYXRjaCgvLVthLWYwLTldK1xcLi8pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5sb25nTGl2ZWQ7XG5cbiAgICAgICAgICBjYXNlIFwiYXBpXCI6XG4gICAgICAgICAgICAvLyBHRVQg7JqU7LKt66eMIOy6kOyLsSDqs6DroKRcbiAgICAgICAgICAgIGlmIChyZXEubWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICAgIC8vIO2KueyglSDqsr3roZzripQg7Ken7J2AIOy6kOyLnFxuICAgICAgICAgICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChcIi9hcGkvc3RhdGljLWRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3Rlcm1zXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5tZWRpdW1MaXZlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6riw67O4OiDsupDsi5wg7JeG7J2MXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm5vQ2FjaGU7XG5cbiAgICAgICAgICBjYXNlIFwic3NyXCI6XG4gICAgICAgICAgICAvLyBTU1Ig7Y6Y7J207KeAOiAxMOy0iCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc3NyO1xuXG4gICAgICAgICAgY2FzZSBcImNzclwiOlxuICAgICAgICAgICAgLy8gQ1NSIGZhbGxiYWNrIChpbmRleC5odG1sKTogMeu2hCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm5vQ2FjaGU7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FjaGU6IHtcbiAgICAgIGRlZmF1bHQ6IFwibWFpblwiLFxuICAgICAgc3RvcmVzOiB7XG4gICAgICAgIG1haW46IHN0b3JlKCkudXNlTDFMYXllcihjYWNoZURyaXZlcnMubWVtb3J5KHsgbWF4U2l6ZTogXCI1MG1iXCIgfSkpLFxuICAgICAgfSxcbiAgICAgIHR0bDogXCI1bVwiLFxuICAgICAgcHJlZml4OiBcIlwiLFxuICAgIH0sXG4gICAgbGlmZWN5Y2xlOiB7XG4gICAgICBvblN0YXJ0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuXG4gICAgICAgIC8vIGRpc3BhdGNoZXIg6rCAIOyDneyEseyekOyXkOyEnCDsm4zsu6Qg7ISk7KCV7J2EIOydveycvOuvgOuhnCDqt7gg7KCE7JeQIOyYrOugpOyVvCDtlZzri6QuXG4gICAgICAgIGF3YWl0IGxvYWRTZXR0aW5ncygpO1xuICAgICAgICAvLyDrn7Dtg4DsnoQg7ISk7KCVIOyGjOu5hOyekOulvCDsg4HsnIQg6rOE7Li17JeQ7IScIOyXsOqysO2VtCBzZXR0aW5nIOuqqOuTiOydtCBxZ3JpZCDrpbwg7Jet7LC47KGw7ZWY7KeAIOyViuqyjCDtlZzri6QuXG4gICAgICAgIHNldFNldHRpbmdDaGFuZ2VIYW5kbGVyKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcInNsYWNrLmV4cGlyeVJlbWluZGVyTWludXRlc1wiIHx8IGtleSA9PT0gXCJzbGFjay5yZW1pbmRlcnNFbmFibGVkXCIpIHtcbiAgICAgICAgICAgIHJlc2NoZWR1bGVFeHBpcmVkVG9rZW5SZW1pbmRlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHRyaWdnZXJSZWFkeSA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlVG9rZW5zVHJpZ2dlcihjb25uQ29uZmlnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgIGxvZy53YXJuKGB0cmlnZ2VyIHNldHVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBuZXcgVG9rZW5TdWJzY3JpYmVyKGNvbm5Db25maWcsIFFncmlkRGlzcGF0Y2hlcik7XG4gICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcblxuICAgICAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgc3Vic2NyaWJlci5zdGFydCgpO1xuXG4gICAgICAgIC8vIOq4sOuPmSDsg4Htg5zrpbwg64Ko6ri064ukIOKAlCBIVFRQIOuKlCDsnbTrr7gg7Je066CkIOyeiOyWtOyEnCwg7KSA67mEIOyghCDsmpTssq3snbQgXCLsnqDsi5wg7ZuEIOuQmOuKlOyngFwiXG4gICAgICAgIC8vIFwi7J6s7Iuc64+E7ZW064+EIOyViCDrkJjripTsp4BcIuulvCDqtazrtoTtlbQg7J2R64u17ZW07JW8IO2VnOuLpCg1MDMgdnMgNTAwKS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvcGVuYWlEaXNwYXRjaGVyID0gbmV3IE9wZW5BSURpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIgPSBvcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUub3BlbmFpID0gXCJyZWFkeVwiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5vcGVuYWkgPSBcImZhaWxlZFwiO1xuICAgICAgICAgIGxvZy53YXJuKGBvcGVuYWkgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFudGhyb3BpY0Rpc3BhdGNoZXIgPSBuZXcgQW50aHJvcGljRGlzcGF0Y2hlcigpO1xuICAgICAgICAgIGF3YWl0IGFudGhyb3BpY0Rpc3BhdGNoZXIuc3RhcnQoKTtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlciA9IGFudGhyb3BpY0Rpc3BhdGNoZXI7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5hbnRocm9waWMgPSBcInJlYWR5XCI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLmFudGhyb3BpYyA9IFwiZmFpbGVkXCI7XG4gICAgICAgICAgbG9nLndhcm4oYGFudGhyb3BpYyBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0RXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcblxuICAgICAgICBjb25zdCBhbnRocm9waWNDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG4gICAgICAgIGNvbnN0IG9wZW5haUNvdW50ID0gUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LnRva2VuQ291bnQgPz8gMDtcblxuICAgICAgICBsb2cuaW5mbyhgbGlzdGVuaW5nIG9uIGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgbG9nLmluZm8oYGFudGhyb3BpYzogJHthbnRocm9waWNDb3VudH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKGBvcGVuYWk6ICR7b3BlbmFpQ291bnR9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgc3Vic2NyaWJlcjogJHtzdGFydGVkID8gXCJMSVNURU4gYWN0aXZlXCIgOiBcImRlZ3JhZGVkXCJ9JHt0cmlnZ2VyUmVhZHkgPyBcIlwiIDogXCIsIHRyaWdnZXIgZmFpbGVkXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblNodXRkb3duOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuICAgICAgICBzdG9wRXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgc2V0U2V0dGluZ0NoYW5nZUhhbmRsZXIobnVsbCk7XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKFwiZ3JhY2VmdWwgc2h1dGRvd25cIik7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGVycm9yLCBfcmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgaGFuZGxlU2VydmVyRXJyb3IoZXJyb3IsIHJlcGx5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
|
|
205
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHtcbiAgcmVzY2hlZHVsZUV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdGFydEV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdG9wRXhwaXJlZFRva2VuUmVtaW5kZXIsXG59IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL2V4cGlyZWQtdG9rZW4tcmVtaW5kZXJcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFFncmlkRnJhbWUgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiO1xuaW1wb3J0IHsgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgZW5zdXJlVG9rZW5zVHJpZ2dlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXRyaWdnZXItc2V0dXBcIjtcbmltcG9ydCB7XG4gIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RvcFRva2VuV2luZG93S2VlcGFsaXZlLFxufSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5pbXBvcnQgeyBsb2FkU2V0dGluZ3MsIHNldFNldHRpbmdDaGFuZ2VIYW5kbGVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnN0b3JlXCI7XG5pbXBvcnQgeyBoYW5kbGVTZXJ2ZXJFcnJvciB9IGZyb20gXCIuL3NlcnZlci1lcnJvci1oYW5kbGVyXCI7XG5pbXBvcnQgeyBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5TT05BTVVfREJfUE9SVCA/PyA1NDMyKSxcbiAgdXNlcjogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9OQU1FID8/IFwicWdyaWRcIixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHByb2plY3ROYW1lOiBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgPz8gXCJRZ3JpZFwiLFxuICBkYXRhYmFzZToge1xuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMDAwMCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgLy8gTW9uaXQg7YOt7JqpIGluLW1lbW9yeSByaW5nIGJ1ZmZlci4g7Y+s66e37J2AIHNpbmsg67OEIOKAlCDsvZjshpQg7Lac66Cl7J2AIOq3uOuMgOuhnOuLpC5cbiAgICAgIG1vbml0OiBtb25pdExvZ1NpbmssXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiLCBcIm1vbml0XCJdLCBsb3dlc3RMZXZlbDogXCJpbmZvXCIgfSxcbiAgICAgIC8vIHNvbmFtdSDroZzqt7jripQgd2FybmluZyDsnbTsg4Hrp4xcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInNvbmFtdVwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgZmFzdGlmeToge1xuICAgICAgYm9keUxpbWl0OiAxMCAqIDEwMjQgKiAxMDI0LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICBjb25zdCBvYXV0aENhbGxiYWNrID0gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1jYWxsYmFja19mYWlsZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2NhbGxiYWNrXCIsIG9hdXRoQ2FsbGJhY2spO1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2F1dGgvY2FsbGJhY2tcIiwgb2F1dGhDYWxsYmFjayk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICAvLyBkaXNwYXRjaGVyIOqwgCDsg53shLHsnpDsl5DshJwg7JuM7LukIOyEpOygleydhCDsnb3snLzrr4DroZwg6re4IOyghOyXkCDsmKzroKTslbwg7ZWc64ukLlxuICAgICAgICBhd2FpdCBsb2FkU2V0dGluZ3MoKTtcbiAgICAgICAgLy8g65+w7YOA7J6EIOyEpOyglSDshozruYTsnpDrpbwg7IOB7JyEIOqzhOy4teyXkOyEnCDsl7DqsrDtlbQgc2V0dGluZyDrqqjrk4jsnbQgcWdyaWQg66W8IOyXreywuOyhsO2VmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcigoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJzbGFjay5leHBpcnlSZW1pbmRlck1pbnV0ZXNcIiB8fCBrZXkgPT09IFwic2xhY2sucmVtaW5kZXJzRW5hYmxlZFwiKSB7XG4gICAgICAgICAgICByZXNjaGVkdWxlRXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIikge1xuICAgICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB0cmlnZ2VyUmVhZHkgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZVRva2Vuc1RyaWdnZXIoY29ubkNvbmZpZyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyUmVhZHkgPSBmYWxzZTtcbiAgICAgICAgICBsb2cud2FybihgdHJpZ2dlciBzZXR1cCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gbmV3IFRva2VuU3Vic2NyaWJlcihjb25uQ29uZmlnLCBRZ3JpZERpc3BhdGNoZXIpO1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRlZCA9IGF3YWl0IHN1YnNjcmliZXIuc3RhcnQoKTtcblxuICAgICAgICAvLyDquLDrj5kg7IOB7YOc66W8IOuCqOq4tOuLpCDigJQgSFRUUCDripQg7J2066+4IOyXtOugpCDsnojslrTshJwsIOykgOu5hCDsoIQg7JqU7LKt7J20IFwi7J6g7IucIO2bhCDrkJjripTsp4BcIlxuICAgICAgICAvLyBcIuyerOyLnOuPhO2VtOuPhCDslYgg65CY64qU7KeAXCLrpbwg6rWs67aE7ZW0IOydkeuLte2VtOyVvCDtlZzri6QoNTAzIHZzIDUwMCkuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IG5ldyBPcGVuQUlEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyID0gb3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLm9wZW5haSA9IFwicmVhZHlcIjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUub3BlbmFpID0gXCJmYWlsZWRcIjtcbiAgICAgICAgICBsb2cud2Fybihgb3BlbmFpIGRpc3BhdGNoZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhbnRocm9waWNEaXNwYXRjaGVyID0gbmV3IEFudGhyb3BpY0Rpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBhbnRocm9waWNEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIgPSBhbnRocm9waWNEaXNwYXRjaGVyO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUuYW50aHJvcGljID0gXCJyZWFkeVwiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5hbnRocm9waWMgPSBcImZhaWxlZFwiO1xuICAgICAgICAgIGxvZy53YXJuKGBhbnRocm9waWMgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJzY3JpYmVyLnNldFRva2VuQ2hhbmdlSGFuZGxlcigoKSA9PiB7XG4gICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXJ0RXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgdm9pZCBzdGFydFRva2VuV2luZG93S2VlcGFsaXZlKCk7XG5cbiAgICAgICAgY29uc3QgYW50aHJvcGljQ291bnQgPSBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8udG9rZW5Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG5cbiAgICAgICAgbG9nLmluZm8oYGxpc3RlbmluZyBvbiBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgIGxvZy5pbmZvKGBhbnRocm9waWM6ICR7YW50aHJvcGljQ291bnR9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhgb3BlbmFpOiAke29wZW5haUNvdW50fSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYHN1YnNjcmliZXI6ICR7c3RhcnRlZCA/IFwiTElTVEVOIGFjdGl2ZVwiIDogXCJkZWdyYWRlZFwifSR7dHJpZ2dlclJlYWR5ID8gXCJcIiA6IFwiLCB0cmlnZ2VyIGZhaWxlZFwifWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25TaHV0ZG93bjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcbiAgICAgICAgc3RvcEV4cGlyZWRUb2tlblJlbWluZGVyKCk7XG4gICAgICAgIHN0b3BUb2tlbldpbmRvd0tlZXBhbGl2ZSgpO1xuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnNldFRva2VuQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oXCJncmFjZWZ1bCBzaHV0ZG93blwiKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZXJyb3IsIF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBoYW5kbGVTZXJ2ZXJFcnJvcihlcnJvciwgcmVwbHkpO1xuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtBQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLElBQUksUUFBUSxLQUFLO0FBRTdDLE1BQU0sYUFBYTtDQUNqQixNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsTUFBTSxPQUFPLFFBQVEsSUFBSSxrQkFBa0IsSUFBSTtDQUMvQyxNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsVUFBVSxRQUFRLElBQUksc0JBQXNCO0NBQzVDLFVBQVUsUUFBUSxJQUFJLGtCQUFrQjtBQUMxQztBQUVBLElBQUEsd0JBQWUsYUFBYTtDQUMxQixhQUFhLFFBQVEsSUFBSSxn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
|
|
@@ -91,8 +91,10 @@ var AnthropicDispatcher = class {
|
|
|
91
91
|
this.tokenPool.delete(id);
|
|
92
92
|
this.weightedSelector.removeToken(id);
|
|
93
93
|
}
|
|
94
|
-
async selectToken() {
|
|
95
|
-
const
|
|
94
|
+
async selectToken(preferredTokenId) {
|
|
95
|
+
const preferred = preferredTokenId === void 0 ? void 0 : this.tokenPool.get(preferredTokenId);
|
|
96
|
+
if (preferredTokenId !== void 0 && !preferred) throw new Error(`Preferred anthropic token ${preferredTokenId} is not available`);
|
|
97
|
+
const rows = preferred ? [preferred] : [...this.tokenPool.values()];
|
|
96
98
|
if (rows.length === 0) return null;
|
|
97
99
|
const { eligible, overThresholdTokens } = await this.filterEligibleTokens(rows);
|
|
98
100
|
if (eligible.length === 0) {
|
|
@@ -105,6 +107,7 @@ var AnthropicDispatcher = class {
|
|
|
105
107
|
});
|
|
106
108
|
throw new QuotaThresholdExceededError(quotaThresholdExceededMessage("anthropic", overThresholdTokens));
|
|
107
109
|
}
|
|
110
|
+
if (preferred) return preferred;
|
|
108
111
|
const selectedId = this.weightedSelector.select(new Set(eligible.map((token) => token.id)));
|
|
109
112
|
if (selectedId === null) return null;
|
|
110
113
|
return this.tokenPool.get(selectedId) ?? null;
|
|
@@ -199,7 +202,7 @@ var AnthropicDispatcher = class {
|
|
|
199
202
|
assertSupportedOneMillionSuffix(req.model);
|
|
200
203
|
const model = canonicalAnthropicModel(req.model);
|
|
201
204
|
const jsonSchema = serializeAndValidateDispatchSchema(req.outputSchema, "anthropic");
|
|
202
|
-
const token = await this.selectToken();
|
|
205
|
+
const token = await this.selectToken(req.preferredTokenId);
|
|
203
206
|
if (!token) throw new Error("No anthropic tokens available");
|
|
204
207
|
const exec = async () => {
|
|
205
208
|
let accessToken = token.credentials.accessToken;
|
|
@@ -259,4 +262,4 @@ var AnthropicDispatcher = class {
|
|
|
259
262
|
//#endregion
|
|
260
263
|
export { AnthropicDispatcher };
|
|
261
264
|
|
|
262
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbnRocm9waWNEaXNwYXRjaGVyXG4gKlxuICogT3BlbkFJRGlzcGF0Y2hlcuyZgCDri6zrpqwsIHdvcmtlciBwb29s7J2EIOuRkOuKlCDrjIDsi6Ag7JqU7LKt67OEIGZyZXNoIHNwYXduXG4gKiDthqDtgbDsnYAg7J2466mU66qo66asKE1BUCnsnLzroZwg6rSA66as7ZWY6rOgIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDsnLzroZwg6rOg66W464ukXG4gKlxuICogLSDrqqjrk6Ag7JqU7LKt7J2AIGZyZXNoIGAtLXNlc3Npb24taWRgIOuhnCDsi6TtlolcbiAqIC0g66mA7Yuw7YS0IOusuOunpeydgCDtgbTrnbzsnbTslrjtirjqsIAg66ekIO2YuOy2nCDrs7TrgrTripQgZnVsbCBoaXN0b3J5IOulvCDtj4ntg4TtmZTtlbQg7KCE64us7ZWc64ukLlxuICogLSDrsJzquIntlZwgc2Vzc2lvbi1pZCDrpbwgR2VuZXJhdGVSZXN1bHQudGhyZWFkQ29vcmQodGhyZWFkSWQ9c2Vzc2lvbi1pZCwgd29ya2VySWQ9dG9rZW5JZCxcbiAqICAgZXBvY2g9MCnroZwg7Jis66CkLCDsg4HsnIQoaXNzdWVDb252Q29udGV4dCnqsIAg7YG065287JeQIO2ajOyGoe2VoCDsooztkZzrpbwg66eM65Og64ukLiDri6TsnYwgdHVybiDsnbQg7KKM7ZGc66W8XG4gKiAgIO2ajOyGoe2VtOuPhCBBbnRocm9waWMg65287Jqw7YyF7JeQ64qUIOyTsOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBnZXRFeHBpcmVzQXQsIGdldFJlZnJlc2hUb2tlbiB9IGZyb20gXCIuLi9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hIH0gZnJvbSBcIi4uL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIH0gZnJvbSBcIi4uL2NvbW1vbi9zbW9vdGgtd2VpZ2h0ZWQtcm91bmQtcm9iaW5cIjtcbmltcG9ydCB7IGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgsIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIH0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEFudGhyb3BpY1F1b3RhVXNhZ2UsIHR5cGUgQW50aHJvcGljUXVvdGFVc2FnZVJlc3VsdCB9IGZyb20gXCIuL2FudGhyb3BpYy1xdW90YVwiO1xuaW1wb3J0IHsgbWFrZUFudGhyb3BpY1dvcmtlcklkLCBydW5DbGF1ZGVTZXNzaW9uIH0gZnJvbSBcIi4vY2xhdWRlLXNlc3Npb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiYW50aHJvcGljLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyAxTSBjb250ZXh0IOygleyDgSDsg53shLHsnYAg7Iuk7Lih7IOBIDEwMHMr6rmM7KeAIOqwhOuLpC4gMjQwc+uKlCDsmYTstqkg7J6l7LmY7J28IOu/kCxcbi8vIOqxsOu2gCvqsbDrjIAgc3lzdGVtIOyerOyDneyEsSDsp4Dsl7DsnYQg7JmE7KCE7Z6IIO2VtOqysO2VmOuKlCDqsJLsnYAg7JWE64uI64ukLlxuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMjQwXzAwMDtcbi8vIGFjY2VzcyB0b2tlbiDrp4zro4wg7J6E67CVIOyehOqzhCDigJQg6riw7KG0IHN0YW5kYWxvbmUg6rK966GcKHFncmlkLmRpc3BhdGNoZXIudHMp7JmAIOuPmeydvCg2MHMpLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmludGVyZmFjZSBQb29sZWRUb2tlbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcbiAgcHJvdmlkZXI6IHN0cmluZyxcbiAgdG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9Pixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRldGFpbHMgPSB0b2tlbnNcbiAgICAubWFwKCh0b2tlbikgPT4gYCR7dG9rZW4udG9rZW5OYW1lfSAodGhyZXNob2xkICR7dG9rZW4udGhyZXNob2xkfSUpYClcbiAgICAuam9pbihcIiwgXCIpO1xuICByZXR1cm4gZGV0YWlscy5sZW5ndGggPiAwXG4gICAgPyBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGQ6ICR7ZGV0YWlsc31gXG4gICAgOiBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGRgO1xufVxuXG5leHBvcnQgY2xhc3MgQW50aHJvcGljRGlzcGF0Y2hlciBpbXBsZW1lbnRzIFByb3ZpZGVyRGlzcGF0Y2hlciB7XG4gIC8vIHRva2VuSWQg4oaSIO2SgCDtla3rqqkuIHN0YXJ0KCkvdG9rZW4g7J2067Kk7Yq466GcIOyxhOybgFxuICBwcml2YXRlIHRva2VuUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBQb29sZWRUb2tlbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE9wZW5BSURpc3BhdGNoZXIuc3RhcnQoKSDsmYAg64+Z7J287ZWY6rKMIERCIOyXkOyEnCDquLDsobQgYW50aHJvcGljIO2GoO2BsOydhCBzZWxmLWJvb3RzdHJhcCDtlZzri6QuXG4gICAgLy8gKOyEnOuyhCDsnqzsi5zsnpEg7IucIE5PVElGWSDqsIAg7JWIIOyYpOuvgOuhnCDrtoDtirjsiqTtirjrnqnsnbQg7JeG7Jy866m0IO2SgOydtCDruYgg7LGE66GcIOuCqOuKlOuLpC4pXG4gICAgLy8g7J207ZuEIOuzgOqyveu2hOydgCB0b2tlbi1zdWJzY3JpYmVyIOqwgCBvblRva2VuQWRkZWQvVXBkYXRlZC9SZW1vdmVkIOuhnCDsoITri6ztlZzri6QuXG4gICAgLy8gZmluZEFjdGl2ZUJ5UHJvdmlkZXIg6rCAIGFjdGl2ZT10cnVlICsgcHJvdmlkZXIg7ZWE7YSw66W8IERCIOyXkOyEnCDsspjrpqwg4oaSIGluYWN0aXZlIOuKlCDslaDstIjsl5Ag7JWIIOyYqOuLpC5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmVCeVByb3ZpZGVyKFwiQVwiLCBcImFudGhyb3BpY1wiKTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdG9rZW5zKSB7XG4gICAgICB0aGlzLnRva2VuUG9vbC5zZXQodC5pZCwge1xuICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogdC5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHQud2VpZ2h0LFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4odC5pZCwgdC53ZWlnaHQpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3QubmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuSWRzID0gWy4uLnRoaXMudG9rZW5Qb29sLmtleXMoKV07XG4gICAgZm9yIChjb25zdCBpZCBvZiB0b2tlbklkcykgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLnRva2VuUG9vbC5jbGVhcigpO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2SgOydmCDthqDtgbAg7IiYKHN0YXJ0dXAg66Gc6re4L2hlYWx0aCDsmqkpLlxuICBnZXQgdG9rZW5Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuUG9vbC5zaXplO1xuICB9XG5cbiAgLy8g7KeA6riIIOyLpO2WiSDspJHsnbggQ2xhdWRlIENvZGUg7ZSE66Gc7IS47IqkIOyImCDigJQgZnJlc2gtc3Bhd24g7J206528IOydtOqyjCDqs6cg64+Z7IucIOyalOyyrSDsiJjri6QuXG4gIHByaXZhdGUgaW5GbGlnaHRDb3VudCA9IDA7XG4gIGdldCBpbkZsaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmluRmxpZ2h0Q291bnQ7XG4gIH1cblxuICAvLyBNb25pdCDtkZzsi5zsmqkg4oCUIO2SgOyXkCDsnojripQg7Yag7YGwIOydtOumhCDsiqTrg4Xsg7cgKOydtOumhOyInCDsoJXroKwpXG4gIGdldCB0b2tlbk5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5Qb29sLnZhbHVlcygpXS5tYXAoKHRva2VuKSA9PiB0b2tlbi5uYW1lKS50b1NvcnRlZCgpO1xuICB9XG5cbiAgLy8gREIgYWN0aXZlIGFudGhyb3BpYyDthqDtgbAg66qp66Gd7Jy866GcIO2SgOydhCDsnqzrj5nquLDtmZTtlZzri6QocGVyaW9kaWMgcmVjb25jaWxlL+yerOyXsOqysOyaqSkuXG4gIC8vIExJU1RFTi9OT1RJRlkg6rCAIOuBiuq4tCDrj5nslYgg7Jyg7Iuk65CcIOy2lOqwgC/sgq3soJwv67mE7Zmc7ISx7ZmU66W8IERCIOq4sOykgOycvOuhnCDri6Tsi5wg66ee7LaY64ukLlxuICAvLyDsnbTrsqTtirgg7ZW465Ok65+s66W8IOyerOyCrOyaqe2VtCDtkoAg6rCx7Iug7J20IOydvOq0gOuQmOqyjCDsoIHsmqnrkJjrj4TroZ0g7ZWc64ukOlxuICAvLyAgLSBEQiDsl5Ag7JeG64qU642wIO2SgOyXkCDsnojripQg7Yag7YGwIOKGkiBvblRva2VuUmVtb3ZlZFxuICAvLyAgLSBEQiDsl5Ag7J6I64qUIO2GoO2BsCDihpIg7Iug6rec66m0IG9uVG9rZW5BZGRlZCwg6riw7KG07J2066m0IG9uVG9rZW5VcGRhdGVkXG4gIHJlcGxhY2VUb2tlbnMoXG4gICAgcm93czogQXJyYXk8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscztcbiAgICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHdlaWdodDogbnVtYmVyO1xuICAgIH0+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChyb3dzLm1hcCgocikgPT4gci5pZCkpO1xuICAgIC8vIG9uVG9rZW5SZW1vdmVkIOqwgCB0b2tlblBvb2wg7J2EIGRlbGV0ZSDtlZjrr4DroZwg7Iic7ZqMIOykkSDsiJjsoJXsnYQg7ZS87ZWY66CkIO2CpOulvCDrqLzsoIAg7Iqk64OF7IO37ZWc64ukLlxuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBBcnJheS5mcm9tKHRoaXMudG9rZW5Qb29sLmtleXMoKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBjdXJyZW50SWRzKSB7XG4gICAgICBpZiAoIW5leHQuaGFzKGlkKSkgdGhpcy5vblRva2VuUmVtb3ZlZChpZCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy50b2tlblBvb2wuaGFzKHIuaWQpKSB7XG4gICAgICAgIHRoaXMub25Ub2tlblVwZGF0ZWQoci5pZCwgci5uYW1lLCByLmNyZWRlbnRpYWxzLCByLnF1b3RhVGhyZXNob2xkLCByLndlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uVG9rZW5BZGRlZChyLmlkLCByLm5hbWUsIHIuY3JlZGVudGlhbHMsIHIucXVvdGFUaHJlc2hvbGQsIHIud2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyB0b2tlbiBldmVudHMgKHRva2VuLXN1YnNjcmliZXIg6rCAIO2YuOy2nClcbiAgb25Ub2tlbkFkZGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuc2V0KGlkLCB7IGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLnNldChpZCwgeyBpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQgfSk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNldFRva2VuKGlkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgfVxuXG4gIC8vIHF1b3RhIO2GteqzvCDtm4Trs7Trp4zsnLzroZwg7JqU7LKt66eI64ukIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDshKDtg53tlZzri6QuXG4gIHByaXZhdGUgYXN5bmMgc2VsZWN0VG9rZW4oKTogUHJvbWlzZTxQb29sZWRUb2tlbiB8IG51bGw+IHtcbiAgICBjb25zdCByb3dzID0gWy4uLnRoaXMudG9rZW5Qb29sLnZhbHVlcygpXTtcbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHsgZWxpZ2libGUsIG92ZXJUaHJlc2hvbGRUb2tlbnMgfSA9IGF3YWl0IHRoaXMuZmlsdGVyRWxpZ2libGVUb2tlbnMocm93cyk7XG4gICAgaWYgKGVsaWdpYmxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogYWxsX2V4Y2VlZGVkXCIsIHtcbiAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgIHRva2VuQ291bnQ6IHJvd3MubGVuZ3RoLFxuICAgICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IHJvd3MuZmlsdGVyKChyKSA9PiB0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHIpKS5sZW5ndGgsXG4gICAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICAgIHJlYXNvbjogXCJhbGxfZXhjZWVkZWRcIixcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgICAgcXVvdGFUaHJlc2hvbGRFeGNlZWRlZE1lc3NhZ2UoXCJhbnRocm9waWNcIiwgb3ZlclRocmVzaG9sZFRva2VucyksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQoZWxpZ2libGUubWFwKCh0b2tlbikgPT4gdG9rZW4uaWQpKSk7XG4gICAgaWYgKHNlbGVjdGVkSWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnRva2VuUG9vbC5nZXQoc2VsZWN0ZWRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmlsdGVyRWxpZ2libGVUb2tlbnMocm93czogUG9vbGVkVG9rZW5bXSk6IFByb21pc2U8e1xuICAgIGVsaWdpYmxlOiBQb29sZWRUb2tlbltdO1xuICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+O1xuICB9PiB7XG4gICAgY29uc3QgdGhyZXNob2xkZWQgPSByb3dzLmZpbHRlcigodG9rZW4pID0+IHRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW4pKTtcbiAgICBpZiAodGhyZXNob2xkZWQubGVuZ3RoID09PSAwKSByZXR1cm4geyBlbGlnaWJsZTogcm93cywgb3ZlclRocmVzaG9sZFRva2VuczogW10gfTtcblxuICAgIGNvbnN0IGVsaWdpYmxlSWRzID0gbmV3IFNldChcbiAgICAgIHJvd3MuZmlsdGVyKCh0b2tlbikgPT4gIXRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW4pKS5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCksXG4gICAgKTtcbiAgICBjb25zdCBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IGNoZWNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRocmVzaG9sZGVkLm1hcChhc3luYyAodG9rZW4pID0+ICh7XG4gICAgICAgIHRva2VuLFxuICAgICAgICByZXN1bHQ6IGF3YWl0IHJlYWRBbnRocm9waWNRdW90YVVzYWdlKHRva2VuLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuKSxcbiAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgY2hlY2tzLmZvckVhY2goKGNoZWNrLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGNoZWNrLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhyZXNob2xkZWRbaW5kZXhdO1xuICAgICAgICBpZiAoIXRva2VuKSByZXR1cm47XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbiwgU3RyaW5nKGNoZWNrLnJlYXNvbikpO1xuICAgICAgICBlbGlnaWJsZUlkcy5hZGQodG9rZW4uaWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gY2hlY2sudmFsdWUudG9rZW47XG4gICAgICBjb25zdCByZXN1bHQgPSBjaGVjay52YWx1ZS5yZXN1bHQ7XG4gICAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC51dGlsaXphdGlvblBjdCA+PSB0b2tlbi5xdW90YVRocmVzaG9sZCkge1xuICAgICAgICB0aGlzLmxvZ1F1b3RhT3ZlclRocmVzaG9sZCh0b2tlbiwgcmVzdWx0KTtcbiAgICAgICAgb3ZlclRocmVzaG9sZFRva2Vucy5wdXNoKHsgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLCB0aHJlc2hvbGQ6IHRva2VuLnF1b3RhVGhyZXNob2xkIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBlbGlnaWJsZTogcm93cy5maWx0ZXIoKHRva2VuKSA9PiBlbGlnaWJsZUlkcy5oYXModG9rZW4uaWQpKSwgb3ZlclRocmVzaG9sZFRva2VucyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNRdW90YVRocmVzaG9sZCh0b2tlbjogUG9vbGVkVG9rZW4pOiB0b2tlbiBpcyBQb29sZWRUb2tlbiAmIHsgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB9IHtcbiAgICByZXR1cm4gdG9rZW4ucXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiB0b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFPdmVyVGhyZXNob2xkKFxuICAgIHRva2VuOiBQb29sZWRUb2tlbiAmIHsgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB9LFxuICAgIHJlc3VsdDogRXh0cmFjdDxBbnRocm9waWNRdW90YVVzYWdlUmVzdWx0LCB7IGtpbmQ6IFwib2tcIiB9PixcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGRcIiwge1xuICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQsXG4gICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgY2FjaGVBZ2U6IHJlc3VsdC5jYWNoZUFnZU1zLFxuICAgICAgcmVhc29uOiBcIm92ZXJfdGhyZXNob2xkXCIsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhTG9va3VwRmFpbE9wZW4oXG4gICAgdG9rZW46IFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0sXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGxvb2t1cF9mYWlsX29wZW5cIiwge1xuICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW4ocmVxLCAoKSA9PiB7fSk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZVN0cmVhbShyZXE6IEdlbmVyYXRlUmVxdWVzdCwgY2I6IEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuKHJlcSwgY2Iub25EZWx0YSwgeyBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiB0cnVlIH0pO1xuICAgICAgY2Iub25UaHJlYWRJZD8uKHJlc3VsdC50aHJlYWRDb29yZC50aHJlYWRJZCk7XG4gICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2Iub25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvLyBnZW5lcmF0ZS9nZW5lcmF0ZVN0cmVhbSDqs7XthrUg7Iuk7ZaJLiBvbkRlbHRhIOuKlCDsiqTtirjrprzsnbTrqbQg7KCQ7KeEIOuwqey2nCwg67mE7Iqk7Yq466a87J2066m0IG5vLW9wLlxuICBwcml2YXRlIGFzeW5jIHJ1biguLi5hcmdzOiBQYXJhbWV0ZXJzPEFudGhyb3BpY0Rpc3BhdGNoZXJbXCJydW5Jbm5lclwiXT4pOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgdGhpcy5pbkZsaWdodENvdW50Kys7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bklubmVyKC4uLmFyZ3MpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluRmxpZ2h0Q291bnQtLTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bklubmVyKFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIG9uRGVsdGE6ICh0OiBzdHJpbmcpID0+IHZvaWQsXG4gICAgb3B0cz86IHsgaW5jbHVkZVBhcnRpYWxNZXNzYWdlcz86IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgT3BlbkFJIOqyveuhnCDsoITsmqkuIEFudGhyb3BpYyDrnbzsmrDtjIXsl5Ag7J2066+47KeAIO2UjOuemOq3uOqwgFxuICAgIC8vIOuPhOuLrO2VmOuptCDsobDsmqntnogg7YWN7Iqk7Yq466GcIO2PtOuwse2VmOyngCDslYrqs6Ag66qF7Iuc7KCB7Jy866GcIOqxsOu2gO2VnOuLpC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW1hZ2UgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBBbnRocm9waWMgcm91dGVcIik7XG4gICAgfVxuICAgIC8vIG1vZGVsIOygleq3nO2ZlOulvCBkaXNwYXRjaGVyIOynhOyeheygkOyXkOyEnCDtlZwg67KIIO2VnOuLpDogcmVzdWx0Lm1vZGVsIC8gcnVuQ2xhdWRlU2Vzc2lvbiDsoITrtoBcbiAgICAvLyBjYW5vbmljYWwocHJlZml4IOyXhuuKlCBjb3N0IO2CpCkg7J2EIOyTsOqyjCDthrXsnbwuIOuvuOyngOygleydtOuptCBBTlRIUk9QSUNfREVGQVVMVF9NT0RFTCDigJQgcWdyaWQuZGlzcGF0Y2hlclxuICAgIC8vIOydmCBcInNvbm5ldFwiIOuzhOy5rSDsmrDtmowg7LCo64uoLiDsoJXqt5ztmZQg6rec7LmZ7J2AIGZhbGxiYWNrIOqyveuhnOyZgCDqs7XsnKAoY2Fub25pY2FsQW50aHJvcGljTW9kZWwpLlxuICAgIGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgocmVxLm1vZGVsKTtcbiAgICBjb25zdCBtb2RlbCA9IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKHJlcS5tb2RlbCk7XG4gICAgY29uc3QganNvblNjaGVtYSA9IHNlcmlhbGl6ZUFuZFZhbGlkYXRlRGlzcGF0Y2hTY2hlbWEocmVxLm91dHB1dFNjaGVtYSwgXCJhbnRocm9waWNcIik7XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuc2VsZWN0VG9rZW4oKTtcbiAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBhbnRocm9waWMgdG9rZW5zIGF2YWlsYWJsZVwiKTtcblxuICAgIGNvbnN0IGV4ZWMgPSBhc3luYyAoKTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4gPT4ge1xuICAgICAgLy8g66eM66OMIOyehOuwlSDthqDtgbAgcHJlZW1wdGl2ZSByZWZyZXNoKOq4sOyhtCBzdGFuZGFsb25lIOqyveuhnOyZgCDrj5nsnbwpLiDsi6TtjKjtlbTrj4Qg7KeE7ZaJLlxuICAgICAgbGV0IGFjY2Vzc1Rva2VuID0gdG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW47XG4gICAgICBjb25zdCBleHBpcmVzQXQgPSBnZXRFeHBpcmVzQXQodG9rZW4uY3JlZGVudGlhbHMpO1xuICAgICAgaWYgKFxuICAgICAgICBleHBpcmVzQXQgJiZcbiAgICAgICAgZXhwaXJlc0F0IC0gRGF0ZS5ub3coKSA8IFJFRlJFU0hfU0FGRVRZX01TICYmXG4gICAgICAgIGdldFJlZnJlc2hUb2tlbih0b2tlbi5jcmVkZW50aWFscylcbiAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgUWdyaWRGcmFtZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIik7XG4gICAgICAgICAgLy8gcHJvdmlkZXIg66W8IOuwmOuTnOyLnCDssYTsm4zslbwgcmVmcmVzaFRva2VuIOuCtOu2gCBUb2tlbk1vZGVsLnNhdmUg6rCAIOyEseqzte2VnOuLpC5cbiAgICAgICAgICAvLyByZWZyZXNoVG9rZW4oVG9rZW5TdWJzZXRBKSDripQgaWQvcHJvdmlkZXIvY3JlZGVudGlhbHMvbmFtZSDrp4wg7IKs7Jqp7ZWY66+A66GcIOq3uCA06rCc66eMIOuEmOq4tOuLpC5cbiAgICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IFFncmlkRnJhbWUucmVmcmVzaFRva2VuKHtcbiAgICAgICAgICAgIGlkOiB0b2tlbi5pZCxcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB0b2tlbi5jcmVkZW50aWFscyxcbiAgICAgICAgICB9IGFzIFBhcmFtZXRlcnM8dHlwZW9mIFFncmlkRnJhbWUucmVmcmVzaFRva2VuPlswXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3Rva2VuLm5hbWV9IChtb2RlbDogJHttb2RlbH0pYCk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgcnVuQ2xhdWRlU2Vzc2lvbihcbiAgICAgICAge1xuICAgICAgICAgIHRva2VuSWQ6IHRva2VuLmlkLFxuICAgICAgICAgIHRva2VuOiBhY2Nlc3NUb2tlbixcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBzeXN0ZW06IHJlcS5zeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAganNvblNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IHJlcS5lZmZvcnQsXG4gICAgICAgICAgdGltZW91dE1zOiByZXEudGltZW91dE1zID8/IERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIGlucHV0OiByZXEuY29sZElucHV0LFxuICAgICAgICAgIGFib3J0U2lnbmFsOiByZXEuYWJvcnRTaWduYWwsXG4gICAgICAgICAgaW5jbHVkZVBhcnRpYWxNZXNzYWdlczogb3B0cz8uaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyxcbiAgICAgICAgfSxcbiAgICAgICAgb25EZWx0YSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChzZXNzaW9uLnF1b3RhRXhoYXVzdGVkKSB0aHJvdyBuZXcgRXJyb3IoYHF1b3RhIGV4aGF1c3RlZCAoJHt0b2tlbi5uYW1lfSlgKTtcbiAgICAgIGlmIChzZXNzaW9uLmlzRXJyb3IpIHtcbiAgICAgICAgLy8g7KeE64uoKFNPTi00OTUpOiBpc0Vycm9yIO2MkOyglSDsgqzsnKAoc3VidHlwZS90ZXJtaW5hbF9yZWFzb24p66W8IOuplOyLnOyngCDslZ7sl5Ag65Oc65+s64K464ukLlxuICAgICAgICAvLyDqt7jrj5nslYggZGV0YWlsIOydtCBzZXNzaW9uLnRleHQo7JmE7KCE7ZWcIEpTT04g67O466y4Keu/kOydtOudvCBcInNjaGVtYSDsnITrsJjsnbjsp4AgLyBtYXggcmV0cmllcyDsnbjsp4AgL1xuICAgICAgICAvLyBtYXggdHVybnMg7J247KeAXCLrpbwg6rWs67aE7ZWgIOyImCDsl4bsl4jri6QuIHRleHQg64qUIOynhOuLqOyXkCDtlYTsmpTtlZwg66eM7YG866eMIOyemOudvCDrjafrtpnsnbjri6QuXG4gICAgICAgIGNvbnN0IHJlYXNvbiA9XG4gICAgICAgICAgc2Vzc2lvbi5zdWJ0eXBlID8/IHNlc3Npb24udGVybWluYWxSZWFzb24gPz8gKHNlc3Npb24uaXNFcnJvciA/IFwiaXNfZXJyb3JcIiA6IFwidW5rbm93blwiKTtcbiAgICAgICAgY29uc3QgYm9keSA9IHNlc3Npb24udGV4dFxuICAgICAgICAgID8gc2Vzc2lvbi50ZXh0Lmxlbmd0aCA+IDUwMFxuICAgICAgICAgICAgPyBgJHtzZXNzaW9uLnRleHQuc2xpY2UoMCwgNTAwKX3igKYoJHtzZXNzaW9uLnRleHQubGVuZ3RofSBjaGFycylgXG4gICAgICAgICAgICA6IHNlc3Npb24udGV4dFxuICAgICAgICAgIDogYGVtcHR5IHRleHQsIG91dHB1dFRva2Vucz0ke3Nlc3Npb24udXNhZ2Uub3V0cHV0VG9rZW5zfWA7XG4gICAgICAgIGNvbnN0IHJlZnVzYWwgPSBzZXNzaW9uLnJlZnVzYWwgPyBgIHJlZnVzYWw9JHtKU09OLnN0cmluZ2lmeShzZXNzaW9uLnJlZnVzYWwpfWAgOiBcIlwiO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNsYXVkZSBlcnJvciAoJHt0b2tlbi5uYW1lfSkgWyR7cmVhc29ufV06ICR7Ym9keX0ke3JlZnVzYWx9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHQ6IHNlc3Npb24udGV4dCxcbiAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICB1c2FnZTogc2Vzc2lvbi51c2FnZSxcbiAgICAgICAgZHVyYXRpb25Nczogc2Vzc2lvbi5kdXJhdGlvbk1zLFxuICAgICAgICB0dGZ0TXM6IHNlc3Npb24udHRmdE1zLFxuICAgICAgICBjb3N0VXNkOiBzZXNzaW9uLmNvc3RVc2QsXG4gICAgICAgIC8vIENsYXVkZSBDb2RlIOuKlCBGYWJsZSByZWZ1c2FsIOydhCBPcHVzIOuhnCDsnpDrj5kgZmFsbGJhY2sg7ZWgIOyImCDsnojri6QuIOyalOyyrSDrqqjrjbjsnYRcbiAgICAgICAgLy8g6re464yA66GcIHNlcnZpbmcgbW9kZWwg66GcIOq4sOuhne2VmOuptCDruYTsmqkv6rCQ7IKsIOuhnOq3uOqwgCDrqqjrkZAg7YuA7Ja07KeA66+A66GcIOuRmOydhCDqtazrtoTtlZzri6QuXG4gICAgICAgIG1vZGVsOiBzZXNzaW9uLnNlcnZlZE1vZGVsID8/IG1vZGVsLFxuICAgICAgICByZXF1ZXN0ZWRNb2RlbDogbW9kZWwsXG4gICAgICAgIG1vZGVsRmFsbGJhY2tzOiBzZXNzaW9uLm1vZGVsRmFsbGJhY2tzLFxuICAgICAgICAvLyBzeXN0ZW1IYXNoIOuKlCDsg4HsnIQgaXNzdWVDb252Q29udGV4dCDqsIAg7LGE7Jq064ukKOyXrOq4sOyEoCDruYTsmrTri6QpLlxuICAgICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICAgIHdvcmtlcklkOiBtYWtlQW50aHJvcGljV29ya2VySWQodG9rZW4uaWQpLFxuICAgICAgICAgIHRocmVhZElkOiBzZXNzaW9uLnNlc3Npb25JZCxcbiAgICAgICAgICBlcG9jaDogMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBleGVjKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMs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
|
|
265
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbnRocm9waWNEaXNwYXRjaGVyXG4gKlxuICogT3BlbkFJRGlzcGF0Y2hlcuyZgCDri6zrpqwsIHdvcmtlciBwb29s7J2EIOuRkOuKlCDrjIDsi6Ag7JqU7LKt67OEIGZyZXNoIHNwYXduXG4gKiDthqDtgbDsnYAg7J2466mU66qo66asKE1BUCnsnLzroZwg6rSA66as7ZWY6rOgIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDsnLzroZwg6rOg66W464ukXG4gKlxuICogLSDrqqjrk6Ag7JqU7LKt7J2AIGZyZXNoIGAtLXNlc3Npb24taWRgIOuhnCDsi6TtlolcbiAqIC0g66mA7Yuw7YS0IOusuOunpeydgCDtgbTrnbzsnbTslrjtirjqsIAg66ekIO2YuOy2nCDrs7TrgrTripQgZnVsbCBoaXN0b3J5IOulvCDtj4ntg4TtmZTtlbQg7KCE64us7ZWc64ukLlxuICogLSDrsJzquIntlZwgc2Vzc2lvbi1pZCDrpbwgR2VuZXJhdGVSZXN1bHQudGhyZWFkQ29vcmQodGhyZWFkSWQ9c2Vzc2lvbi1pZCwgd29ya2VySWQ9dG9rZW5JZCxcbiAqICAgZXBvY2g9MCnroZwg7Jis66CkLCDsg4HsnIQoaXNzdWVDb252Q29udGV4dCnqsIAg7YG065287JeQIO2ajOyGoe2VoCDsooztkZzrpbwg66eM65Og64ukLiDri6TsnYwgdHVybiDsnbQg7KKM7ZGc66W8XG4gKiAgIO2ajOyGoe2VtOuPhCBBbnRocm9waWMg65287Jqw7YyF7JeQ64qUIOyTsOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBnZXRFeHBpcmVzQXQsIGdldFJlZnJlc2hUb2tlbiB9IGZyb20gXCIuLi9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hIH0gZnJvbSBcIi4uL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIH0gZnJvbSBcIi4uL2NvbW1vbi9zbW9vdGgtd2VpZ2h0ZWQtcm91bmQtcm9iaW5cIjtcbmltcG9ydCB7IGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgsIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIH0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEFudGhyb3BpY1F1b3RhVXNhZ2UsIHR5cGUgQW50aHJvcGljUXVvdGFVc2FnZVJlc3VsdCB9IGZyb20gXCIuL2FudGhyb3BpYy1xdW90YVwiO1xuaW1wb3J0IHsgbWFrZUFudGhyb3BpY1dvcmtlcklkLCBydW5DbGF1ZGVTZXNzaW9uIH0gZnJvbSBcIi4vY2xhdWRlLXNlc3Npb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiYW50aHJvcGljLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyAxTSBjb250ZXh0IOygleyDgSDsg53shLHsnYAg7Iuk7Lih7IOBIDEwMHMr6rmM7KeAIOqwhOuLpC4gMjQwc+uKlCDsmYTstqkg7J6l7LmY7J28IOu/kCxcbi8vIOqxsOu2gCvqsbDrjIAgc3lzdGVtIOyerOyDneyEsSDsp4Dsl7DsnYQg7JmE7KCE7Z6IIO2VtOqysO2VmOuKlCDqsJLsnYAg7JWE64uI64ukLlxuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMjQwXzAwMDtcbi8vIGFjY2VzcyB0b2tlbiDrp4zro4wg7J6E67CVIOyehOqzhCDigJQg6riw7KG0IHN0YW5kYWxvbmUg6rK966GcKHFncmlkLmRpc3BhdGNoZXIudHMp7JmAIOuPmeydvCg2MHMpLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmludGVyZmFjZSBQb29sZWRUb2tlbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcbiAgcHJvdmlkZXI6IHN0cmluZyxcbiAgdG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9Pixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRldGFpbHMgPSB0b2tlbnNcbiAgICAubWFwKCh0b2tlbikgPT4gYCR7dG9rZW4udG9rZW5OYW1lfSAodGhyZXNob2xkICR7dG9rZW4udGhyZXNob2xkfSUpYClcbiAgICAuam9pbihcIiwgXCIpO1xuICByZXR1cm4gZGV0YWlscy5sZW5ndGggPiAwXG4gICAgPyBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGQ6ICR7ZGV0YWlsc31gXG4gICAgOiBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGRgO1xufVxuXG5leHBvcnQgY2xhc3MgQW50aHJvcGljRGlzcGF0Y2hlciBpbXBsZW1lbnRzIFByb3ZpZGVyRGlzcGF0Y2hlciB7XG4gIC8vIHRva2VuSWQg4oaSIO2SgCDtla3rqqkuIHN0YXJ0KCkvdG9rZW4g7J2067Kk7Yq466GcIOyxhOybgFxuICBwcml2YXRlIHRva2VuUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBQb29sZWRUb2tlbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE9wZW5BSURpc3BhdGNoZXIuc3RhcnQoKSDsmYAg64+Z7J287ZWY6rKMIERCIOyXkOyEnCDquLDsobQgYW50aHJvcGljIO2GoO2BsOydhCBzZWxmLWJvb3RzdHJhcCDtlZzri6QuXG4gICAgLy8gKOyEnOuyhCDsnqzsi5zsnpEg7IucIE5PVElGWSDqsIAg7JWIIOyYpOuvgOuhnCDrtoDtirjsiqTtirjrnqnsnbQg7JeG7Jy866m0IO2SgOydtCDruYgg7LGE66GcIOuCqOuKlOuLpC4pXG4gICAgLy8g7J207ZuEIOuzgOqyveu2hOydgCB0b2tlbi1zdWJzY3JpYmVyIOqwgCBvblRva2VuQWRkZWQvVXBkYXRlZC9SZW1vdmVkIOuhnCDsoITri6ztlZzri6QuXG4gICAgLy8gZmluZEFjdGl2ZUJ5UHJvdmlkZXIg6rCAIGFjdGl2ZT10cnVlICsgcHJvdmlkZXIg7ZWE7YSw66W8IERCIOyXkOyEnCDsspjrpqwg4oaSIGluYWN0aXZlIOuKlCDslaDstIjsl5Ag7JWIIOyYqOuLpC5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmVCeVByb3ZpZGVyKFwiQVwiLCBcImFudGhyb3BpY1wiKTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdG9rZW5zKSB7XG4gICAgICB0aGlzLnRva2VuUG9vbC5zZXQodC5pZCwge1xuICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogdC5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHQud2VpZ2h0LFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4odC5pZCwgdC53ZWlnaHQpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3QubmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuSWRzID0gWy4uLnRoaXMudG9rZW5Qb29sLmtleXMoKV07XG4gICAgZm9yIChjb25zdCBpZCBvZiB0b2tlbklkcykgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLnRva2VuUG9vbC5jbGVhcigpO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2SgOydmCDthqDtgbAg7IiYKHN0YXJ0dXAg66Gc6re4L2hlYWx0aCDsmqkpLlxuICBnZXQgdG9rZW5Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuUG9vbC5zaXplO1xuICB9XG5cbiAgLy8g7KeA6riIIOyLpO2WiSDspJHsnbggQ2xhdWRlIENvZGUg7ZSE66Gc7IS47IqkIOyImCDigJQgZnJlc2gtc3Bhd24g7J206528IOydtOqyjCDqs6cg64+Z7IucIOyalOyyrSDsiJjri6QuXG4gIHByaXZhdGUgaW5GbGlnaHRDb3VudCA9IDA7XG4gIGdldCBpbkZsaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmluRmxpZ2h0Q291bnQ7XG4gIH1cblxuICAvLyBNb25pdCDtkZzsi5zsmqkg4oCUIO2SgOyXkCDsnojripQg7Yag7YGwIOydtOumhCDsiqTrg4Xsg7cgKOydtOumhOyInCDsoJXroKwpXG4gIGdldCB0b2tlbk5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5Qb29sLnZhbHVlcygpXS5tYXAoKHRva2VuKSA9PiB0b2tlbi5uYW1lKS50b1NvcnRlZCgpO1xuICB9XG5cbiAgLy8gREIgYWN0aXZlIGFudGhyb3BpYyDthqDtgbAg66qp66Gd7Jy866GcIO2SgOydhCDsnqzrj5nquLDtmZTtlZzri6QocGVyaW9kaWMgcmVjb25jaWxlL+yerOyXsOqysOyaqSkuXG4gIC8vIExJU1RFTi9OT1RJRlkg6rCAIOuBiuq4tCDrj5nslYgg7Jyg7Iuk65CcIOy2lOqwgC/sgq3soJwv67mE7Zmc7ISx7ZmU66W8IERCIOq4sOykgOycvOuhnCDri6Tsi5wg66ee7LaY64ukLlxuICAvLyDsnbTrsqTtirgg7ZW465Ok65+s66W8IOyerOyCrOyaqe2VtCDtkoAg6rCx7Iug7J20IOydvOq0gOuQmOqyjCDsoIHsmqnrkJjrj4TroZ0g7ZWc64ukOlxuICAvLyAgLSBEQiDsl5Ag7JeG64qU642wIO2SgOyXkCDsnojripQg7Yag7YGwIOKGkiBvblRva2VuUmVtb3ZlZFxuICAvLyAgLSBEQiDsl5Ag7J6I64qUIO2GoO2BsCDihpIg7Iug6rec66m0IG9uVG9rZW5BZGRlZCwg6riw7KG07J2066m0IG9uVG9rZW5VcGRhdGVkXG4gIHJlcGxhY2VUb2tlbnMoXG4gICAgcm93czogQXJyYXk8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscztcbiAgICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHdlaWdodDogbnVtYmVyO1xuICAgIH0+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChyb3dzLm1hcCgocikgPT4gci5pZCkpO1xuICAgIC8vIG9uVG9rZW5SZW1vdmVkIOqwgCB0b2tlblBvb2wg7J2EIGRlbGV0ZSDtlZjrr4DroZwg7Iic7ZqMIOykkSDsiJjsoJXsnYQg7ZS87ZWY66CkIO2CpOulvCDrqLzsoIAg7Iqk64OF7IO37ZWc64ukLlxuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBBcnJheS5mcm9tKHRoaXMudG9rZW5Qb29sLmtleXMoKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBjdXJyZW50SWRzKSB7XG4gICAgICBpZiAoIW5leHQuaGFzKGlkKSkgdGhpcy5vblRva2VuUmVtb3ZlZChpZCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy50b2tlblBvb2wuaGFzKHIuaWQpKSB7XG4gICAgICAgIHRoaXMub25Ub2tlblVwZGF0ZWQoci5pZCwgci5uYW1lLCByLmNyZWRlbnRpYWxzLCByLnF1b3RhVGhyZXNob2xkLCByLndlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uVG9rZW5BZGRlZChyLmlkLCByLm5hbWUsIHIuY3JlZGVudGlhbHMsIHIucXVvdGFUaHJlc2hvbGQsIHIud2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyB0b2tlbiBldmVudHMgKHRva2VuLXN1YnNjcmliZXIg6rCAIO2YuOy2nClcbiAgb25Ub2tlbkFkZGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuc2V0KGlkLCB7IGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLnNldChpZCwgeyBpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQgfSk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNldFRva2VuKGlkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgfVxuXG4gIC8vIOyngOyglSDsmpTssq3snYAg7ZW064u5IO2GoO2BsOunjCBxdW90YSDtjJDsoJXtlZjqs6Agd2VpZ2h0ZWQg7IOB7YOc66W8IOqxtOuTnOumrOyngCDslYrripTri6QuXG4gIC8vIOuvuOyngOyglSDsmpTssq3rp4wgcXVvdGEg7Ya16rO8IO2bhOuztOuhnCBzbW9vdGggd2VpZ2h0ZWQgcm91bmQtcm9iaW4g7J2EIOynhO2Wie2VnOuLpC5cbiAgcHJpdmF0ZSBhc3luYyBzZWxlY3RUb2tlbihwcmVmZXJyZWRUb2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxQb29sZWRUb2tlbiB8IG51bGw+IHtcbiAgICBjb25zdCBwcmVmZXJyZWQgPVxuICAgICAgcHJlZmVycmVkVG9rZW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy50b2tlblBvb2wuZ2V0KHByZWZlcnJlZFRva2VuSWQpO1xuICAgIGlmIChwcmVmZXJyZWRUb2tlbklkICE9PSB1bmRlZmluZWQgJiYgIXByZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcmVmZXJyZWQgYW50aHJvcGljIHRva2VuICR7cHJlZmVycmVkVG9rZW5JZH0gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSBwcmVmZXJyZWQgPyBbcHJlZmVycmVkXSA6IFsuLi50aGlzLnRva2VuUG9vbC52YWx1ZXMoKV07XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IGVsaWdpYmxlLCBvdmVyVGhyZXNob2xkVG9rZW5zIH0gPSBhd2FpdCB0aGlzLmZpbHRlckVsaWdpYmxlVG9rZW5zKHJvd3MpO1xuICAgIGlmIChlbGlnaWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGFsbF9leGNlZWRlZFwiLCB7XG4gICAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgICB0b2tlbkNvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50OiByb3dzLmZpbHRlcigocikgPT4gdGhpcy5oYXNRdW90YVRocmVzaG9sZChyKSkubGVuZ3RoLFxuICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLFxuICAgICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IoXG4gICAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwiYW50aHJvcGljXCIsIG92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJlZmVycmVkKSByZXR1cm4gcHJlZmVycmVkO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZWxlY3QobmV3IFNldChlbGlnaWJsZS5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCkpKTtcbiAgICBpZiAoc2VsZWN0ZWRJZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Qb29sLmdldChzZWxlY3RlZElkKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaWx0ZXJFbGlnaWJsZVRva2Vucyhyb3dzOiBQb29sZWRUb2tlbltdKTogUHJvbWlzZTx7XG4gICAgZWxpZ2libGU6IFBvb2xlZFRva2VuW107XG4gICAgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT47XG4gIH0+IHtcbiAgICBjb25zdCB0aHJlc2hvbGRlZCA9IHJvd3MuZmlsdGVyKCh0b2tlbikgPT4gdGhpcy5oYXNRdW90YVRocmVzaG9sZCh0b2tlbikpO1xuICAgIGlmICh0aHJlc2hvbGRlZC5sZW5ndGggPT09IDApIHJldHVybiB7IGVsaWdpYmxlOiByb3dzLCBvdmVyVGhyZXNob2xkVG9rZW5zOiBbXSB9O1xuXG4gICAgY29uc3QgZWxpZ2libGVJZHMgPSBuZXcgU2V0KFxuICAgICAgcm93cy5maWx0ZXIoKHRva2VuKSA9PiAhdGhpcy5oYXNRdW90YVRocmVzaG9sZCh0b2tlbikpLm1hcCgodG9rZW4pID0+IHRva2VuLmlkKSxcbiAgICApO1xuICAgIGNvbnN0IG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3QgY2hlY2tzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhyZXNob2xkZWQubWFwKGFzeW5jICh0b2tlbikgPT4gKHtcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIHJlc3VsdDogYXdhaXQgcmVhZEFudGhyb3BpY1F1b3RhVXNhZ2UodG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4pLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2hlY2suc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aHJlc2hvbGRlZFtpbmRleF07XG4gICAgICAgIGlmICghdG9rZW4pIHJldHVybjtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuLCBTdHJpbmcoY2hlY2sucmVhc29uKSk7XG4gICAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBjaGVjay52YWx1ZS50b2tlbjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrLnZhbHVlLnJlc3VsdDtcbiAgICAgIGlmIChyZXN1bHQua2luZCA9PT0gXCJsb29rdXBfZmFpbGVkXCIpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuLCByZXN1bHQucmVhc29uKTtcbiAgICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRva2VuLnF1b3RhVGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMubG9nUXVvdGFPdmVyVGhyZXNob2xkKHRva2VuLCByZXN1bHQpO1xuICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLnB1c2goeyB0b2tlbk5hbWU6IHRva2VuLm5hbWUsIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGVsaWdpYmxlOiByb3dzLmZpbHRlcigodG9rZW4pID0+IGVsaWdpYmxlSWRzLmhhcyh0b2tlbi5pZCkpLCBvdmVyVGhyZXNob2xkVG9rZW5zIH07XG4gIH1cblxuICBwcml2YXRlIGhhc1F1b3RhVGhyZXNob2xkKHRva2VuOiBQb29sZWRUb2tlbik6IHRva2VuIGlzIFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0ge1xuICAgIHJldHVybiB0b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRva2VuLnF1b3RhVGhyZXNob2xkICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YU92ZXJUaHJlc2hvbGQoXG4gICAgdG9rZW46IFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0sXG4gICAgcmVzdWx0OiBFeHRyYWN0PEFudGhyb3BpY1F1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBvdmVyX3RocmVzaG9sZFwiLCB7XG4gICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgIGNhY2hlZFV0aWxpemF0aW9uOiByZXN1bHQudXRpbGl6YXRpb25QY3QsXG4gICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICByZWFzb246IFwib3Zlcl90aHJlc2hvbGRcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3BlbihcbiAgICB0b2tlbjogUG9vbGVkVG9rZW4gJiB7IHF1b3RhVGhyZXNob2xkOiBudW1iZXIgfSxcbiAgICByZWFzb246IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgIHJlYXNvbjogXCJsb29rdXBfZmFpbF9vcGVuXCIsXG4gICAgICBsb29rdXBSZWFzb246IHJlYXNvbixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bihyZXEsICgpID0+IHt9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW4ocmVxLCBjYi5vbkRlbHRhLCB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IHRydWUgfSk7XG4gICAgICBjYi5vblRocmVhZElkPy4ocmVzdWx0LnRocmVhZENvb3JkLnRocmVhZElkKTtcbiAgICAgIGNiLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYi5vbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdlbmVyYXRlL2dlbmVyYXRlU3RyZWFtIOqzte2GtSDsi6TtlokuIG9uRGVsdGEg64qUIOyKpO2KuOumvOydtOuptCDsoJDsp4Qg67Cp7LacLCDruYTsiqTtirjrprzsnbTrqbQgbm8tb3AuXG4gIHByaXZhdGUgYXN5bmMgcnVuKC4uLmFyZ3M6IFBhcmFtZXRlcnM8QW50aHJvcGljRGlzcGF0Y2hlcltcInJ1bklubmVyXCJdPik6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmluRmxpZ2h0Q291bnQrKztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuSW5uZXIoLi4uYXJncyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaW5GbGlnaHRDb3VudC0tO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuSW5uZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgb25EZWx0YTogKHQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBvcHRzPzogeyBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgLy8g7J2066+47KeAIOyDneyEseydgCBPcGVuQUkg6rK966GcIOyghOyaqS4gQW50aHJvcGljIOudvOyasO2MheyXkCDsnbTrr7jsp4Ag7ZSM656Y6re46rCAXG4gICAgLy8g64+E64us7ZWY66m0IOyhsOyaqe2eiCDthY3siqTtirjroZwg7Y+067Cx7ZWY7KeAIOyViuqzoCDrqoXsi5zsoIHsnLzroZwg6rGw67aA7ZWc64ukLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIEFudGhyb3BpYyByb3V0ZVwiKTtcbiAgICB9XG4gICAgLy8gbW9kZWwg7KCV6rec7ZmU66W8IGRpc3BhdGNoZXIg7KeE7J6F7KCQ7JeQ7IScIO2VnCDrsogg7ZWc64ukOiByZXN1bHQubW9kZWwgLyBydW5DbGF1ZGVTZXNzaW9uIOyghOu2gFxuICAgIC8vIGNhbm9uaWNhbChwcmVmaXgg7JeG64qUIGNvc3Qg7YKkKSDsnYQg7JOw6rKMIO2GteydvC4g66+47KeA7KCV7J2066m0IEFOVEhST1BJQ19ERUZBVUxUX01PREVMIOKAlCBxZ3JpZC5kaXNwYXRjaGVyXG4gICAgLy8g7J2YIFwic29ubmV0XCIg67OE7LmtIOyasO2ajCDssKjri6guIOygleq3nO2ZlCDqt5zsuZnsnYAgZmFsbGJhY2sg6rK966Gc7JmAIOqzteycoChjYW5vbmljYWxBbnRocm9waWNNb2RlbCkuXG4gICAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICAgIGNvbnN0IG1vZGVsID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwocmVxLm1vZGVsKTtcbiAgICBjb25zdCBqc29uU2NoZW1hID0gc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYShyZXEub3V0cHV0U2NoZW1hLCBcImFudGhyb3BpY1wiKTtcblxuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5zZWxlY3RUb2tlbihyZXEucHJlZmVycmVkVG9rZW5JZCk7XG4gICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gYW50aHJvcGljIHRva2VucyBhdmFpbGFibGVcIik7XG5cbiAgICBjb25zdCBleGVjID0gYXN5bmMgKCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+ID0+IHtcbiAgICAgIC8vIOunjOujjCDsnoTrsJUg7Yag7YGwIHByZWVtcHRpdmUgcmVmcmVzaCjquLDsobQgc3RhbmRhbG9uZSDqsr3roZzsmYAg64+Z7J28KS4g7Iuk7Yyo7ZW064+EIOynhO2WiS5cbiAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IHRva2VuLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuO1xuICAgICAgY29uc3QgZXhwaXJlc0F0ID0gZ2V0RXhwaXJlc0F0KHRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICAgIGlmIChcbiAgICAgICAgZXhwaXJlc0F0ICYmXG4gICAgICAgIGV4cGlyZXNBdCAtIERhdGUubm93KCkgPCBSRUZSRVNIX1NBRkVUWV9NUyAmJlxuICAgICAgICBnZXRSZWZyZXNoVG9rZW4odG9rZW4uY3JlZGVudGlhbHMpXG4gICAgICApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IFFncmlkRnJhbWUgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lXCIpO1xuICAgICAgICAgIC8vIHByb3ZpZGVyIOulvCDrsJjrk5zsi5wg7LGE7JuM7JW8IHJlZnJlc2hUb2tlbiDrgrTrtoAgVG9rZW5Nb2RlbC5zYXZlIOqwgCDshLHqs7XtlZzri6QuXG4gICAgICAgICAgLy8gcmVmcmVzaFRva2VuKFRva2VuU3Vic2V0QSkg64qUIGlkL3Byb3ZpZGVyL2NyZWRlbnRpYWxzL25hbWUg66eMIOyCrOyaqe2VmOuvgOuhnCDqt7ggNOqwnOunjCDrhJjquLTri6QuXG4gICAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbih7XG4gICAgICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogdG9rZW4uY3JlZGVudGlhbHMsXG4gICAgICAgICAgfSBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbj5bMF0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke3Rva2VuLm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt0b2tlbi5uYW1lfSAobW9kZWw6ICR7bW9kZWx9KWApO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHJ1bkNsYXVkZVNlc3Npb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgICAgICB0b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgc3lzdGVtOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIGpzb25TY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiByZXEuZWZmb3J0LFxuICAgICAgICAgIHRpbWVvdXRNczogcmVxLnRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBpbnB1dDogcmVxLmNvbGRJbnB1dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbDogcmVxLmFib3J0U2lnbmFsLFxuICAgICAgICAgIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IG9wdHM/LmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMsXG4gICAgICAgIH0sXG4gICAgICAgIG9uRGVsdGEsXG4gICAgICApO1xuXG4gICAgICBpZiAoc2Vzc2lvbi5xdW90YUV4aGF1c3RlZCkgdGhyb3cgbmV3IEVycm9yKGBxdW90YSBleGhhdXN0ZWQgKCR7dG9rZW4ubmFtZX0pYCk7XG4gICAgICBpZiAoc2Vzc2lvbi5pc0Vycm9yKSB7XG4gICAgICAgIC8vIOynhOuLqChTT04tNDk1KTogaXNFcnJvciDtjJDsoJUg7IKs7JygKHN1YnR5cGUvdGVybWluYWxfcmVhc29uKeulvCDrqZTsi5zsp4Ag7JWe7JeQIOuTnOufrOuCuOuLpC5cbiAgICAgICAgLy8g6re464+Z7JWIIGRldGFpbCDsnbQgc2Vzc2lvbi50ZXh0KOyZhOyghO2VnCBKU09OIOuzuOusuCnrv5DsnbTrnbwgXCJzY2hlbWEg7JyE67CY7J247KeAIC8gbWF4IHJldHJpZXMg7J247KeAIC9cbiAgICAgICAgLy8gbWF4IHR1cm5zIOyduOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG7JeI64ukLiB0ZXh0IOuKlCDsp4Tri6jsl5Ag7ZWE7JqU7ZWcIOunjO2BvOunjCDsnpjrnbwg642n67aZ7J2464ukLlxuICAgICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICAgIHNlc3Npb24uc3VidHlwZSA/PyBzZXNzaW9uLnRlcm1pbmFsUmVhc29uID8/IChzZXNzaW9uLmlzRXJyb3IgPyBcImlzX2Vycm9yXCIgOiBcInVua25vd25cIik7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBzZXNzaW9uLnRleHRcbiAgICAgICAgICA/IHNlc3Npb24udGV4dC5sZW5ndGggPiA1MDBcbiAgICAgICAgICAgID8gYCR7c2Vzc2lvbi50ZXh0LnNsaWNlKDAsIDUwMCl94oCmKCR7c2Vzc2lvbi50ZXh0Lmxlbmd0aH0gY2hhcnMpYFxuICAgICAgICAgICAgOiBzZXNzaW9uLnRleHRcbiAgICAgICAgICA6IGBlbXB0eSB0ZXh0LCBvdXRwdXRUb2tlbnM9JHtzZXNzaW9uLnVzYWdlLm91dHB1dFRva2Vuc31gO1xuICAgICAgICBjb25zdCByZWZ1c2FsID0gc2Vzc2lvbi5yZWZ1c2FsID8gYCByZWZ1c2FsPSR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbi5yZWZ1c2FsKX1gIDogXCJcIjtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjbGF1ZGUgZXJyb3IgKCR7dG9rZW4ubmFtZX0pIFske3JlYXNvbn1dOiAke2JvZHl9JHtyZWZ1c2FsfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0OiBzZXNzaW9uLnRleHQsXG4gICAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgdXNhZ2U6IHNlc3Npb24udXNhZ2UsXG4gICAgICAgIGR1cmF0aW9uTXM6IHNlc3Npb24uZHVyYXRpb25NcyxcbiAgICAgICAgdHRmdE1zOiBzZXNzaW9uLnR0ZnRNcyxcbiAgICAgICAgY29zdFVzZDogc2Vzc2lvbi5jb3N0VXNkLFxuICAgICAgICAvLyBDbGF1ZGUgQ29kZSDripQgRmFibGUgcmVmdXNhbCDsnYQgT3B1cyDroZwg7J6Q64+ZIGZhbGxiYWNrIO2VoCDsiJgg7J6I64ukLiDsmpTssq0g66qo64247J2EXG4gICAgICAgIC8vIOq3uOuMgOuhnCBzZXJ2aW5nIG1vZGVsIOuhnCDquLDroZ3tlZjrqbQg67mE7JqpL+qwkOyCrCDroZzqt7jqsIAg66qo65GQIO2LgOyWtOyngOuvgOuhnCDrkZjsnYQg6rWs67aE7ZWc64ukLlxuICAgICAgICBtb2RlbDogc2Vzc2lvbi5zZXJ2ZWRNb2RlbCA/PyBtb2RlbCxcbiAgICAgICAgcmVxdWVzdGVkTW9kZWw6IG1vZGVsLFxuICAgICAgICBtb2RlbEZhbGxiYWNrczogc2Vzc2lvbi5tb2RlbEZhbGxiYWNrcyxcbiAgICAgICAgLy8gc3lzdGVtSGFzaCDripQg7IOB7JyEIGlzc3VlQ29udkNvbnRleHQg6rCAIOyxhOyatOuLpCjsl6zquLDshKAg67mE7Jq064ukKS5cbiAgICAgICAgdGhyZWFkQ29vcmQ6IHtcbiAgICAgICAgICB3b3JrZXJJZDogbWFrZUFudGhyb3BpY1dvcmtlcklkKHRva2VuLmlkKSxcbiAgICAgICAgICB0aHJlYWRJZDogc2Vzc2lvbi5zZXNzaW9uSWQsXG4gICAgICAgICAgZXBvY2g6IDAsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gZXhlYygpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLHNCQUFzQixDQUFDO0FBSTFELE1BQU0scUJBQXFCO0FBRTNCLE1BQU0sb0JBQW9CO0FBVTFCLFNBQVMsOEJBQ1AsVUFDQSxRQUNRO0NBQ1IsTUFBTSxVQUFVLE9BQ2IsS0FBSyxVQUFVLEdBQUcsTUFBTSxVQUFVLGNBQWMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUNwRSxLQUFLLElBQUk7Q0FDWixPQUFPLFFBQVEsU0FBUyxJQUNwQixPQUFPLFNBQVMsb0NBQW9DLFlBQ3BELE9BQU8sU0FBUztBQUN0QjtBQUVBLElBQWEsc0JBQWIsTUFBK0Q7Q0FFN0QsNEJBQW9CLElBQUksSUFBeUI7Q0FDakQsbUJBQW9DLElBQUkseUJBQXlCO0NBRWpFLE1BQU0sUUFBdUI7RUFLM0IsTUFBTSxTQUFTLE1BQU0sV0FBVyxxQkFBcUIsS0FBSyxXQUFXO0VBQ3JFLEtBQUssTUFBTSxLQUFLLFFBQVE7R0FDdEIsS0FBSyxVQUFVLElBQUksRUFBRSxJQUFJ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
|