@cdktn/provider-azuread 15.0.0
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/.jsii +112042 -0
- package/LICENSE +355 -0
- package/README.md +94 -0
- package/lib/access-package/index.d.ts +151 -0
- package/lib/access-package/index.js +354 -0
- package/lib/access-package-assignment-policy/index.d.ts +1098 -0
- package/lib/access-package-assignment-policy/index.js +2711 -0
- package/lib/access-package-catalog/index.d.ts +152 -0
- package/lib/access-package-catalog/index.js +357 -0
- package/lib/access-package-catalog-role-assignment/index.d.ts +140 -0
- package/lib/access-package-catalog-role-assignment/index.js +333 -0
- package/lib/access-package-resource-catalog-association/index.d.ts +131 -0
- package/lib/access-package-resource-catalog-association/index.js +307 -0
- package/lib/access-package-resource-package-association/index.d.ts +132 -0
- package/lib/access-package-resource-package-association/index.js +310 -0
- package/lib/administrative-unit/index.d.ts +165 -0
- package/lib/administrative-unit/index.js +385 -0
- package/lib/administrative-unit-member/index.d.ts +123 -0
- package/lib/administrative-unit-member/index.js +295 -0
- package/lib/administrative-unit-role-member/index.d.ts +131 -0
- package/lib/administrative-unit-role-member/index.js +307 -0
- package/lib/app-role-assignment/index.d.ts +134 -0
- package/lib/app-role-assignment/index.js +319 -0
- package/lib/application/index.d.ts +1352 -0
- package/lib/application/index.js +3262 -0
- package/lib/application-api-access/index.d.ts +152 -0
- package/lib/application-api-access/index.js +357 -0
- package/lib/application-app-role/index.d.ts +171 -0
- package/lib/application-app-role/index.js +390 -0
- package/lib/application-certificate/index.d.ts +196 -0
- package/lib/application-certificate/index.js +441 -0
- package/lib/application-fallback-public-client/index.d.ts +122 -0
- package/lib/application-fallback-public-client/index.js +292 -0
- package/lib/application-federated-identity-credential/index.d.ts +172 -0
- package/lib/application-federated-identity-credential/index.js +394 -0
- package/lib/application-flexible-federated-identity-credential/index.d.ts +172 -0
- package/lib/application-flexible-federated-identity-credential/index.js +394 -0
- package/lib/application-from-template/index.d.ts +134 -0
- package/lib/application-from-template/index.js +334 -0
- package/lib/application-identifier-uri/index.d.ts +121 -0
- package/lib/application-identifier-uri/index.js +289 -0
- package/lib/application-known-clients/index.d.ts +130 -0
- package/lib/application-known-clients/index.js +315 -0
- package/lib/application-optional-claims/index.d.ts +381 -0
- package/lib/application-optional-claims/index.js +918 -0
- package/lib/application-owner/index.d.ts +121 -0
- package/lib/application-owner/index.js +289 -0
- package/lib/application-password/index.d.ts +185 -0
- package/lib/application-password/index.js +410 -0
- package/lib/application-permission-scope/index.d.ts +193 -0
- package/lib/application-permission-scope/index.js +432 -0
- package/lib/application-pre-authorized/index.d.ts +140 -0
- package/lib/application-pre-authorized/index.js +333 -0
- package/lib/application-redirect-uris/index.d.ts +140 -0
- package/lib/application-redirect-uris/index.js +333 -0
- package/lib/application-registration/index.d.ts +278 -0
- package/lib/application-registration/index.js +610 -0
- package/lib/authentication-strength-policy/index.d.ts +141 -0
- package/lib/authentication-strength-policy/index.js +336 -0
- package/lib/claims-mapping-policy/index.d.ts +130 -0
- package/lib/claims-mapping-policy/index.js +315 -0
- package/lib/conditional-access-policy/index.d.ts +959 -0
- package/lib/conditional-access-policy/index.js +2705 -0
- package/lib/custom-directory-role/index.d.ts +216 -0
- package/lib/custom-directory-role/index.js +505 -0
- package/lib/data-azuread-access-package/index.d.ts +118 -0
- package/lib/data-azuread-access-package/index.js +272 -0
- package/lib/data-azuread-access-package-catalog/index.d.ts +108 -0
- package/lib/data-azuread-access-package-catalog/index.js +258 -0
- package/lib/data-azuread-access-package-catalog-role/index.d.ts +107 -0
- package/lib/data-azuread-access-package-catalog-role/index.js +254 -0
- package/lib/data-azuread-administrative-unit/index.d.ts +135 -0
- package/lib/data-azuread-administrative-unit/index.js +336 -0
- package/lib/data-azuread-application/index.d.ts +654 -0
- package/lib/data-azuread-application/index.js +1606 -0
- package/lib/data-azuread-application-published-app-ids/index.d.ts +85 -0
- package/lib/data-azuread-application-published-app-ids/index.js +206 -0
- package/lib/data-azuread-application-template/index.d.ts +111 -0
- package/lib/data-azuread-application-template/index.js +270 -0
- package/lib/data-azuread-client-config/index.d.ts +86 -0
- package/lib/data-azuread-client-config/index.js +216 -0
- package/lib/data-azuread-directory-object/index.d.ts +94 -0
- package/lib/data-azuread-directory-object/index.js +223 -0
- package/lib/data-azuread-directory-role-templates/index.d.ts +120 -0
- package/lib/data-azuread-directory-role-templates/index.js +293 -0
- package/lib/data-azuread-directory-roles/index.d.ts +122 -0
- package/lib/data-azuread-directory-roles/index.js +301 -0
- package/lib/data-azuread-domains/index.d.ts +190 -0
- package/lib/data-azuread-domains/index.js +435 -0
- package/lib/data-azuread-group/index.d.ts +207 -0
- package/lib/data-azuread-group/index.js +506 -0
- package/lib/data-azuread-group-role-management-policy/index.d.ts +105 -0
- package/lib/data-azuread-group-role-management-policy/index.js +248 -0
- package/lib/data-azuread-groups/index.d.ts +160 -0
- package/lib/data-azuread-groups/index.js +348 -0
- package/lib/data-azuread-named-location/index.d.ts +163 -0
- package/lib/data-azuread-named-location/index.js +398 -0
- package/lib/data-azuread-service-principal/index.d.ts +325 -0
- package/lib/data-azuread-service-principal/index.js +817 -0
- package/lib/data-azuread-service-principals/index.d.ts +183 -0
- package/lib/data-azuread-service-principals/index.js +430 -0
- package/lib/data-azuread-user/index.d.ts +177 -0
- package/lib/data-azuread-user/index.js +465 -0
- package/lib/data-azuread-users/index.d.ts +204 -0
- package/lib/data-azuread-users/index.js +468 -0
- package/lib/directory-role/index.d.ts +125 -0
- package/lib/directory-role/index.js +306 -0
- package/lib/directory-role-assignment/index.d.ts +143 -0
- package/lib/directory-role-assignment/index.js +331 -0
- package/lib/directory-role-eligibility-schedule-request/index.d.ts +141 -0
- package/lib/directory-role-eligibility-schedule-request/index.js +325 -0
- package/lib/directory-role-member/index.d.ts +123 -0
- package/lib/directory-role-member/index.js +295 -0
- package/lib/group/index.d.ts +392 -0
- package/lib/group/index.js +872 -0
- package/lib/group-member/index.d.ts +121 -0
- package/lib/group-member/index.js +289 -0
- package/lib/group-role-management-policy/index.d.ts +1043 -0
- package/lib/group-role-management-policy/index.js +2775 -0
- package/lib/group-without-members/index.d.ts +381 -0
- package/lib/group-without-members/index.js +851 -0
- package/lib/index.d.ts +79 -0
- package/lib/index.js +85 -0
- package/lib/invitation/index.d.ts +203 -0
- package/lib/invitation/index.js +490 -0
- package/lib/lazy-index.d.ts +4 -0
- package/lib/lazy-index.js +82 -0
- package/lib/named-location/index.d.ts +212 -0
- package/lib/named-location/index.js +571 -0
- package/lib/privileged-access-group-assignment-schedule/index.d.ts +218 -0
- package/lib/privileged-access-group-assignment-schedule/index.js +484 -0
- package/lib/privileged-access-group-eligibility-schedule/index.d.ts +218 -0
- package/lib/privileged-access-group-eligibility-schedule/index.js +484 -0
- package/lib/provider/index.d.ts +289 -0
- package/lib/provider/index.js +549 -0
- package/lib/service-principal/index.d.ts +547 -0
- package/lib/service-principal/index.js +1305 -0
- package/lib/service-principal-certificate/index.d.ts +187 -0
- package/lib/service-principal-certificate/index.js +415 -0
- package/lib/service-principal-claims-mapping-policy-assignment/index.d.ts +121 -0
- package/lib/service-principal-claims-mapping-policy-assignment/index.js +289 -0
- package/lib/service-principal-delegated-permission-grant/index.d.ts +151 -0
- package/lib/service-principal-delegated-permission-grant/index.js +354 -0
- package/lib/service-principal-password/index.d.ts +176 -0
- package/lib/service-principal-password/index.js +384 -0
- package/lib/service-principal-token-signing-certificate/index.d.ts +137 -0
- package/lib/service-principal-token-signing-certificate/index.js +329 -0
- package/lib/synchronization-job/index.d.ts +177 -0
- package/lib/synchronization-job/index.js +424 -0
- package/lib/synchronization-job-provision-on-demand/index.d.ts +254 -0
- package/lib/synchronization-job-provision-on-demand/index.js +590 -0
- package/lib/synchronization-secret/index.d.ts +184 -0
- package/lib/synchronization-secret/index.js +449 -0
- package/lib/user/index.d.ts +517 -0
- package/lib/user/index.js +1084 -0
- package/lib/user-flow-attribute/index.d.ts +141 -0
- package/lib/user-flow-attribute/index.js +340 -0
- package/package.json +155 -0
|
@@ -0,0 +1,2705 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ConditionalAccessPolicy = exports.ConditionalAccessPolicyTimeoutsOutputReference = exports.ConditionalAccessPolicySessionControlsOutputReference = exports.ConditionalAccessPolicyGrantControlsOutputReference = exports.ConditionalAccessPolicyConditionsOutputReference = exports.ConditionalAccessPolicyConditionsUsersOutputReference = exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList = exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference = exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList = exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference = exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList = exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference = exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList = exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference = exports.ConditionalAccessPolicyConditionsPlatformsOutputReference = exports.ConditionalAccessPolicyConditionsLocationsOutputReference = exports.ConditionalAccessPolicyConditionsDevicesOutputReference = exports.ConditionalAccessPolicyConditionsDevicesFilterOutputReference = exports.ConditionalAccessPolicyConditionsClientApplicationsOutputReference = exports.ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference = exports.ConditionalAccessPolicyConditionsApplicationsOutputReference = void 0;
|
|
5
|
+
exports.conditionalAccessPolicyConditionsApplicationsToTerraform = conditionalAccessPolicyConditionsApplicationsToTerraform;
|
|
6
|
+
exports.conditionalAccessPolicyConditionsApplicationsToHclTerraform = conditionalAccessPolicyConditionsApplicationsToHclTerraform;
|
|
7
|
+
exports.conditionalAccessPolicyConditionsClientApplicationsFilterToTerraform = conditionalAccessPolicyConditionsClientApplicationsFilterToTerraform;
|
|
8
|
+
exports.conditionalAccessPolicyConditionsClientApplicationsFilterToHclTerraform = conditionalAccessPolicyConditionsClientApplicationsFilterToHclTerraform;
|
|
9
|
+
exports.conditionalAccessPolicyConditionsClientApplicationsToTerraform = conditionalAccessPolicyConditionsClientApplicationsToTerraform;
|
|
10
|
+
exports.conditionalAccessPolicyConditionsClientApplicationsToHclTerraform = conditionalAccessPolicyConditionsClientApplicationsToHclTerraform;
|
|
11
|
+
exports.conditionalAccessPolicyConditionsDevicesFilterToTerraform = conditionalAccessPolicyConditionsDevicesFilterToTerraform;
|
|
12
|
+
exports.conditionalAccessPolicyConditionsDevicesFilterToHclTerraform = conditionalAccessPolicyConditionsDevicesFilterToHclTerraform;
|
|
13
|
+
exports.conditionalAccessPolicyConditionsDevicesToTerraform = conditionalAccessPolicyConditionsDevicesToTerraform;
|
|
14
|
+
exports.conditionalAccessPolicyConditionsDevicesToHclTerraform = conditionalAccessPolicyConditionsDevicesToHclTerraform;
|
|
15
|
+
exports.conditionalAccessPolicyConditionsLocationsToTerraform = conditionalAccessPolicyConditionsLocationsToTerraform;
|
|
16
|
+
exports.conditionalAccessPolicyConditionsLocationsToHclTerraform = conditionalAccessPolicyConditionsLocationsToHclTerraform;
|
|
17
|
+
exports.conditionalAccessPolicyConditionsPlatformsToTerraform = conditionalAccessPolicyConditionsPlatformsToTerraform;
|
|
18
|
+
exports.conditionalAccessPolicyConditionsPlatformsToHclTerraform = conditionalAccessPolicyConditionsPlatformsToHclTerraform;
|
|
19
|
+
exports.conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToTerraform = conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToTerraform;
|
|
20
|
+
exports.conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToHclTerraform = conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToHclTerraform;
|
|
21
|
+
exports.conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToTerraform = conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToTerraform;
|
|
22
|
+
exports.conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToHclTerraform = conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToHclTerraform;
|
|
23
|
+
exports.conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToTerraform = conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToTerraform;
|
|
24
|
+
exports.conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToHclTerraform = conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToHclTerraform;
|
|
25
|
+
exports.conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToTerraform = conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToTerraform;
|
|
26
|
+
exports.conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToHclTerraform = conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToHclTerraform;
|
|
27
|
+
exports.conditionalAccessPolicyConditionsUsersToTerraform = conditionalAccessPolicyConditionsUsersToTerraform;
|
|
28
|
+
exports.conditionalAccessPolicyConditionsUsersToHclTerraform = conditionalAccessPolicyConditionsUsersToHclTerraform;
|
|
29
|
+
exports.conditionalAccessPolicyConditionsToTerraform = conditionalAccessPolicyConditionsToTerraform;
|
|
30
|
+
exports.conditionalAccessPolicyConditionsToHclTerraform = conditionalAccessPolicyConditionsToHclTerraform;
|
|
31
|
+
exports.conditionalAccessPolicyGrantControlsToTerraform = conditionalAccessPolicyGrantControlsToTerraform;
|
|
32
|
+
exports.conditionalAccessPolicyGrantControlsToHclTerraform = conditionalAccessPolicyGrantControlsToHclTerraform;
|
|
33
|
+
exports.conditionalAccessPolicySessionControlsToTerraform = conditionalAccessPolicySessionControlsToTerraform;
|
|
34
|
+
exports.conditionalAccessPolicySessionControlsToHclTerraform = conditionalAccessPolicySessionControlsToHclTerraform;
|
|
35
|
+
exports.conditionalAccessPolicyTimeoutsToTerraform = conditionalAccessPolicyTimeoutsToTerraform;
|
|
36
|
+
exports.conditionalAccessPolicyTimeoutsToHclTerraform = conditionalAccessPolicyTimeoutsToHclTerraform;
|
|
37
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
38
|
+
const cdktn = require("cdktn");
|
|
39
|
+
function conditionalAccessPolicyConditionsApplicationsToTerraform(struct) {
|
|
40
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
41
|
+
return struct;
|
|
42
|
+
}
|
|
43
|
+
if (cdktn.isComplexElement(struct)) {
|
|
44
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
excluded_applications: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedApplications),
|
|
48
|
+
included_applications: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedApplications),
|
|
49
|
+
included_user_actions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedUserActions),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function conditionalAccessPolicyConditionsApplicationsToHclTerraform(struct) {
|
|
53
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
54
|
+
return struct;
|
|
55
|
+
}
|
|
56
|
+
if (cdktn.isComplexElement(struct)) {
|
|
57
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
58
|
+
}
|
|
59
|
+
const attrs = {
|
|
60
|
+
excluded_applications: {
|
|
61
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedApplications),
|
|
62
|
+
isBlock: false,
|
|
63
|
+
type: "list",
|
|
64
|
+
storageClassType: "stringList",
|
|
65
|
+
},
|
|
66
|
+
included_applications: {
|
|
67
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedApplications),
|
|
68
|
+
isBlock: false,
|
|
69
|
+
type: "list",
|
|
70
|
+
storageClassType: "stringList",
|
|
71
|
+
},
|
|
72
|
+
included_user_actions: {
|
|
73
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedUserActions),
|
|
74
|
+
isBlock: false,
|
|
75
|
+
type: "list",
|
|
76
|
+
storageClassType: "stringList",
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
// remove undefined attributes
|
|
80
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
81
|
+
}
|
|
82
|
+
class ConditionalAccessPolicyConditionsApplicationsOutputReference extends cdktn.ComplexObject {
|
|
83
|
+
/**
|
|
84
|
+
* @param terraformResource The parent resource
|
|
85
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
86
|
+
*/
|
|
87
|
+
constructor(terraformResource, terraformAttribute) {
|
|
88
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
89
|
+
this.isEmptyObject = false;
|
|
90
|
+
}
|
|
91
|
+
get internalValue() {
|
|
92
|
+
let hasAnyValues = this.isEmptyObject;
|
|
93
|
+
const internalValueResult = {};
|
|
94
|
+
if (this._excludedApplications !== undefined) {
|
|
95
|
+
hasAnyValues = true;
|
|
96
|
+
internalValueResult.excludedApplications = this._excludedApplications;
|
|
97
|
+
}
|
|
98
|
+
if (this._includedApplications !== undefined) {
|
|
99
|
+
hasAnyValues = true;
|
|
100
|
+
internalValueResult.includedApplications = this._includedApplications;
|
|
101
|
+
}
|
|
102
|
+
if (this._includedUserActions !== undefined) {
|
|
103
|
+
hasAnyValues = true;
|
|
104
|
+
internalValueResult.includedUserActions = this._includedUserActions;
|
|
105
|
+
}
|
|
106
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
107
|
+
}
|
|
108
|
+
set internalValue(value) {
|
|
109
|
+
if (value === undefined) {
|
|
110
|
+
this.isEmptyObject = false;
|
|
111
|
+
this._excludedApplications = undefined;
|
|
112
|
+
this._includedApplications = undefined;
|
|
113
|
+
this._includedUserActions = undefined;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
117
|
+
this._excludedApplications = value.excludedApplications;
|
|
118
|
+
this._includedApplications = value.includedApplications;
|
|
119
|
+
this._includedUserActions = value.includedUserActions;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
get excludedApplications() {
|
|
123
|
+
return this.getListAttribute('excluded_applications');
|
|
124
|
+
}
|
|
125
|
+
set excludedApplications(value) {
|
|
126
|
+
this._excludedApplications = value;
|
|
127
|
+
}
|
|
128
|
+
resetExcludedApplications() {
|
|
129
|
+
this._excludedApplications = undefined;
|
|
130
|
+
}
|
|
131
|
+
// Temporarily expose input value. Use with caution.
|
|
132
|
+
get excludedApplicationsInput() {
|
|
133
|
+
return this._excludedApplications;
|
|
134
|
+
}
|
|
135
|
+
get includedApplications() {
|
|
136
|
+
return this.getListAttribute('included_applications');
|
|
137
|
+
}
|
|
138
|
+
set includedApplications(value) {
|
|
139
|
+
this._includedApplications = value;
|
|
140
|
+
}
|
|
141
|
+
resetIncludedApplications() {
|
|
142
|
+
this._includedApplications = undefined;
|
|
143
|
+
}
|
|
144
|
+
// Temporarily expose input value. Use with caution.
|
|
145
|
+
get includedApplicationsInput() {
|
|
146
|
+
return this._includedApplications;
|
|
147
|
+
}
|
|
148
|
+
get includedUserActions() {
|
|
149
|
+
return this.getListAttribute('included_user_actions');
|
|
150
|
+
}
|
|
151
|
+
set includedUserActions(value) {
|
|
152
|
+
this._includedUserActions = value;
|
|
153
|
+
}
|
|
154
|
+
resetIncludedUserActions() {
|
|
155
|
+
this._includedUserActions = undefined;
|
|
156
|
+
}
|
|
157
|
+
// Temporarily expose input value. Use with caution.
|
|
158
|
+
get includedUserActionsInput() {
|
|
159
|
+
return this._includedUserActions;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.ConditionalAccessPolicyConditionsApplicationsOutputReference = ConditionalAccessPolicyConditionsApplicationsOutputReference;
|
|
163
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
164
|
+
ConditionalAccessPolicyConditionsApplicationsOutputReference[_a] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsApplicationsOutputReference", version: "15.0.0" };
|
|
165
|
+
function conditionalAccessPolicyConditionsClientApplicationsFilterToTerraform(struct) {
|
|
166
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
167
|
+
return struct;
|
|
168
|
+
}
|
|
169
|
+
if (cdktn.isComplexElement(struct)) {
|
|
170
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
mode: cdktn.stringToTerraform(struct.mode),
|
|
174
|
+
rule: cdktn.stringToTerraform(struct.rule),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function conditionalAccessPolicyConditionsClientApplicationsFilterToHclTerraform(struct) {
|
|
178
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
179
|
+
return struct;
|
|
180
|
+
}
|
|
181
|
+
if (cdktn.isComplexElement(struct)) {
|
|
182
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
183
|
+
}
|
|
184
|
+
const attrs = {
|
|
185
|
+
mode: {
|
|
186
|
+
value: cdktn.stringToHclTerraform(struct.mode),
|
|
187
|
+
isBlock: false,
|
|
188
|
+
type: "simple",
|
|
189
|
+
storageClassType: "string",
|
|
190
|
+
},
|
|
191
|
+
rule: {
|
|
192
|
+
value: cdktn.stringToHclTerraform(struct.rule),
|
|
193
|
+
isBlock: false,
|
|
194
|
+
type: "simple",
|
|
195
|
+
storageClassType: "string",
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
// remove undefined attributes
|
|
199
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
200
|
+
}
|
|
201
|
+
class ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference extends cdktn.ComplexObject {
|
|
202
|
+
/**
|
|
203
|
+
* @param terraformResource The parent resource
|
|
204
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
205
|
+
*/
|
|
206
|
+
constructor(terraformResource, terraformAttribute) {
|
|
207
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
208
|
+
this.isEmptyObject = false;
|
|
209
|
+
}
|
|
210
|
+
get internalValue() {
|
|
211
|
+
let hasAnyValues = this.isEmptyObject;
|
|
212
|
+
const internalValueResult = {};
|
|
213
|
+
if (this._mode !== undefined) {
|
|
214
|
+
hasAnyValues = true;
|
|
215
|
+
internalValueResult.mode = this._mode;
|
|
216
|
+
}
|
|
217
|
+
if (this._rule !== undefined) {
|
|
218
|
+
hasAnyValues = true;
|
|
219
|
+
internalValueResult.rule = this._rule;
|
|
220
|
+
}
|
|
221
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
222
|
+
}
|
|
223
|
+
set internalValue(value) {
|
|
224
|
+
if (value === undefined) {
|
|
225
|
+
this.isEmptyObject = false;
|
|
226
|
+
this._mode = undefined;
|
|
227
|
+
this._rule = undefined;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
231
|
+
this._mode = value.mode;
|
|
232
|
+
this._rule = value.rule;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
get mode() {
|
|
236
|
+
return this.getStringAttribute('mode');
|
|
237
|
+
}
|
|
238
|
+
set mode(value) {
|
|
239
|
+
this._mode = value;
|
|
240
|
+
}
|
|
241
|
+
// Temporarily expose input value. Use with caution.
|
|
242
|
+
get modeInput() {
|
|
243
|
+
return this._mode;
|
|
244
|
+
}
|
|
245
|
+
get rule() {
|
|
246
|
+
return this.getStringAttribute('rule');
|
|
247
|
+
}
|
|
248
|
+
set rule(value) {
|
|
249
|
+
this._rule = value;
|
|
250
|
+
}
|
|
251
|
+
// Temporarily expose input value. Use with caution.
|
|
252
|
+
get ruleInput() {
|
|
253
|
+
return this._rule;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference = ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference;
|
|
257
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
258
|
+
ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference[_b] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference", version: "15.0.0" };
|
|
259
|
+
function conditionalAccessPolicyConditionsClientApplicationsToTerraform(struct) {
|
|
260
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
261
|
+
return struct;
|
|
262
|
+
}
|
|
263
|
+
if (cdktn.isComplexElement(struct)) {
|
|
264
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
excluded_service_principals: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedServicePrincipals),
|
|
268
|
+
included_service_principals: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedServicePrincipals),
|
|
269
|
+
filter: conditionalAccessPolicyConditionsClientApplicationsFilterToTerraform(struct.filter),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function conditionalAccessPolicyConditionsClientApplicationsToHclTerraform(struct) {
|
|
273
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
274
|
+
return struct;
|
|
275
|
+
}
|
|
276
|
+
if (cdktn.isComplexElement(struct)) {
|
|
277
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
278
|
+
}
|
|
279
|
+
const attrs = {
|
|
280
|
+
excluded_service_principals: {
|
|
281
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedServicePrincipals),
|
|
282
|
+
isBlock: false,
|
|
283
|
+
type: "list",
|
|
284
|
+
storageClassType: "stringList",
|
|
285
|
+
},
|
|
286
|
+
included_service_principals: {
|
|
287
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedServicePrincipals),
|
|
288
|
+
isBlock: false,
|
|
289
|
+
type: "list",
|
|
290
|
+
storageClassType: "stringList",
|
|
291
|
+
},
|
|
292
|
+
filter: {
|
|
293
|
+
value: conditionalAccessPolicyConditionsClientApplicationsFilterToHclTerraform(struct.filter),
|
|
294
|
+
isBlock: true,
|
|
295
|
+
type: "list",
|
|
296
|
+
storageClassType: "ConditionalAccessPolicyConditionsClientApplicationsFilterList",
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
// remove undefined attributes
|
|
300
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
301
|
+
}
|
|
302
|
+
class ConditionalAccessPolicyConditionsClientApplicationsOutputReference extends cdktn.ComplexObject {
|
|
303
|
+
/**
|
|
304
|
+
* @param terraformResource The parent resource
|
|
305
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
306
|
+
*/
|
|
307
|
+
constructor(terraformResource, terraformAttribute) {
|
|
308
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
309
|
+
this.isEmptyObject = false;
|
|
310
|
+
// filter - computed: false, optional: true, required: false
|
|
311
|
+
this._filter = new ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference(this, "filter");
|
|
312
|
+
}
|
|
313
|
+
get internalValue() {
|
|
314
|
+
let hasAnyValues = this.isEmptyObject;
|
|
315
|
+
const internalValueResult = {};
|
|
316
|
+
if (this._excludedServicePrincipals !== undefined) {
|
|
317
|
+
hasAnyValues = true;
|
|
318
|
+
internalValueResult.excludedServicePrincipals = this._excludedServicePrincipals;
|
|
319
|
+
}
|
|
320
|
+
if (this._includedServicePrincipals !== undefined) {
|
|
321
|
+
hasAnyValues = true;
|
|
322
|
+
internalValueResult.includedServicePrincipals = this._includedServicePrincipals;
|
|
323
|
+
}
|
|
324
|
+
if (this._filter?.internalValue !== undefined) {
|
|
325
|
+
hasAnyValues = true;
|
|
326
|
+
internalValueResult.filter = this._filter?.internalValue;
|
|
327
|
+
}
|
|
328
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
329
|
+
}
|
|
330
|
+
set internalValue(value) {
|
|
331
|
+
if (value === undefined) {
|
|
332
|
+
this.isEmptyObject = false;
|
|
333
|
+
this._excludedServicePrincipals = undefined;
|
|
334
|
+
this._includedServicePrincipals = undefined;
|
|
335
|
+
this._filter.internalValue = undefined;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
339
|
+
this._excludedServicePrincipals = value.excludedServicePrincipals;
|
|
340
|
+
this._includedServicePrincipals = value.includedServicePrincipals;
|
|
341
|
+
this._filter.internalValue = value.filter;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
get excludedServicePrincipals() {
|
|
345
|
+
return this.getListAttribute('excluded_service_principals');
|
|
346
|
+
}
|
|
347
|
+
set excludedServicePrincipals(value) {
|
|
348
|
+
this._excludedServicePrincipals = value;
|
|
349
|
+
}
|
|
350
|
+
resetExcludedServicePrincipals() {
|
|
351
|
+
this._excludedServicePrincipals = undefined;
|
|
352
|
+
}
|
|
353
|
+
// Temporarily expose input value. Use with caution.
|
|
354
|
+
get excludedServicePrincipalsInput() {
|
|
355
|
+
return this._excludedServicePrincipals;
|
|
356
|
+
}
|
|
357
|
+
get includedServicePrincipals() {
|
|
358
|
+
return this.getListAttribute('included_service_principals');
|
|
359
|
+
}
|
|
360
|
+
set includedServicePrincipals(value) {
|
|
361
|
+
this._includedServicePrincipals = value;
|
|
362
|
+
}
|
|
363
|
+
resetIncludedServicePrincipals() {
|
|
364
|
+
this._includedServicePrincipals = undefined;
|
|
365
|
+
}
|
|
366
|
+
// Temporarily expose input value. Use with caution.
|
|
367
|
+
get includedServicePrincipalsInput() {
|
|
368
|
+
return this._includedServicePrincipals;
|
|
369
|
+
}
|
|
370
|
+
get filter() {
|
|
371
|
+
return this._filter;
|
|
372
|
+
}
|
|
373
|
+
putFilter(value) {
|
|
374
|
+
this._filter.internalValue = value;
|
|
375
|
+
}
|
|
376
|
+
resetFilter() {
|
|
377
|
+
this._filter.internalValue = undefined;
|
|
378
|
+
}
|
|
379
|
+
// Temporarily expose input value. Use with caution.
|
|
380
|
+
get filterInput() {
|
|
381
|
+
return this._filter.internalValue;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
exports.ConditionalAccessPolicyConditionsClientApplicationsOutputReference = ConditionalAccessPolicyConditionsClientApplicationsOutputReference;
|
|
385
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
386
|
+
ConditionalAccessPolicyConditionsClientApplicationsOutputReference[_c] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsClientApplicationsOutputReference", version: "15.0.0" };
|
|
387
|
+
function conditionalAccessPolicyConditionsDevicesFilterToTerraform(struct) {
|
|
388
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
389
|
+
return struct;
|
|
390
|
+
}
|
|
391
|
+
if (cdktn.isComplexElement(struct)) {
|
|
392
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
393
|
+
}
|
|
394
|
+
return {
|
|
395
|
+
mode: cdktn.stringToTerraform(struct.mode),
|
|
396
|
+
rule: cdktn.stringToTerraform(struct.rule),
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
function conditionalAccessPolicyConditionsDevicesFilterToHclTerraform(struct) {
|
|
400
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
401
|
+
return struct;
|
|
402
|
+
}
|
|
403
|
+
if (cdktn.isComplexElement(struct)) {
|
|
404
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
405
|
+
}
|
|
406
|
+
const attrs = {
|
|
407
|
+
mode: {
|
|
408
|
+
value: cdktn.stringToHclTerraform(struct.mode),
|
|
409
|
+
isBlock: false,
|
|
410
|
+
type: "simple",
|
|
411
|
+
storageClassType: "string",
|
|
412
|
+
},
|
|
413
|
+
rule: {
|
|
414
|
+
value: cdktn.stringToHclTerraform(struct.rule),
|
|
415
|
+
isBlock: false,
|
|
416
|
+
type: "simple",
|
|
417
|
+
storageClassType: "string",
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
// remove undefined attributes
|
|
421
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
422
|
+
}
|
|
423
|
+
class ConditionalAccessPolicyConditionsDevicesFilterOutputReference extends cdktn.ComplexObject {
|
|
424
|
+
/**
|
|
425
|
+
* @param terraformResource The parent resource
|
|
426
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
427
|
+
*/
|
|
428
|
+
constructor(terraformResource, terraformAttribute) {
|
|
429
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
430
|
+
this.isEmptyObject = false;
|
|
431
|
+
}
|
|
432
|
+
get internalValue() {
|
|
433
|
+
let hasAnyValues = this.isEmptyObject;
|
|
434
|
+
const internalValueResult = {};
|
|
435
|
+
if (this._mode !== undefined) {
|
|
436
|
+
hasAnyValues = true;
|
|
437
|
+
internalValueResult.mode = this._mode;
|
|
438
|
+
}
|
|
439
|
+
if (this._rule !== undefined) {
|
|
440
|
+
hasAnyValues = true;
|
|
441
|
+
internalValueResult.rule = this._rule;
|
|
442
|
+
}
|
|
443
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
444
|
+
}
|
|
445
|
+
set internalValue(value) {
|
|
446
|
+
if (value === undefined) {
|
|
447
|
+
this.isEmptyObject = false;
|
|
448
|
+
this._mode = undefined;
|
|
449
|
+
this._rule = undefined;
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
453
|
+
this._mode = value.mode;
|
|
454
|
+
this._rule = value.rule;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
get mode() {
|
|
458
|
+
return this.getStringAttribute('mode');
|
|
459
|
+
}
|
|
460
|
+
set mode(value) {
|
|
461
|
+
this._mode = value;
|
|
462
|
+
}
|
|
463
|
+
// Temporarily expose input value. Use with caution.
|
|
464
|
+
get modeInput() {
|
|
465
|
+
return this._mode;
|
|
466
|
+
}
|
|
467
|
+
get rule() {
|
|
468
|
+
return this.getStringAttribute('rule');
|
|
469
|
+
}
|
|
470
|
+
set rule(value) {
|
|
471
|
+
this._rule = value;
|
|
472
|
+
}
|
|
473
|
+
// Temporarily expose input value. Use with caution.
|
|
474
|
+
get ruleInput() {
|
|
475
|
+
return this._rule;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
exports.ConditionalAccessPolicyConditionsDevicesFilterOutputReference = ConditionalAccessPolicyConditionsDevicesFilterOutputReference;
|
|
479
|
+
_d = JSII_RTTI_SYMBOL_1;
|
|
480
|
+
ConditionalAccessPolicyConditionsDevicesFilterOutputReference[_d] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsDevicesFilterOutputReference", version: "15.0.0" };
|
|
481
|
+
function conditionalAccessPolicyConditionsDevicesToTerraform(struct) {
|
|
482
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
483
|
+
return struct;
|
|
484
|
+
}
|
|
485
|
+
if (cdktn.isComplexElement(struct)) {
|
|
486
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
487
|
+
}
|
|
488
|
+
return {
|
|
489
|
+
filter: conditionalAccessPolicyConditionsDevicesFilterToTerraform(struct.filter),
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
function conditionalAccessPolicyConditionsDevicesToHclTerraform(struct) {
|
|
493
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
494
|
+
return struct;
|
|
495
|
+
}
|
|
496
|
+
if (cdktn.isComplexElement(struct)) {
|
|
497
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
498
|
+
}
|
|
499
|
+
const attrs = {
|
|
500
|
+
filter: {
|
|
501
|
+
value: conditionalAccessPolicyConditionsDevicesFilterToHclTerraform(struct.filter),
|
|
502
|
+
isBlock: true,
|
|
503
|
+
type: "list",
|
|
504
|
+
storageClassType: "ConditionalAccessPolicyConditionsDevicesFilterList",
|
|
505
|
+
},
|
|
506
|
+
};
|
|
507
|
+
// remove undefined attributes
|
|
508
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
509
|
+
}
|
|
510
|
+
class ConditionalAccessPolicyConditionsDevicesOutputReference extends cdktn.ComplexObject {
|
|
511
|
+
/**
|
|
512
|
+
* @param terraformResource The parent resource
|
|
513
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
514
|
+
*/
|
|
515
|
+
constructor(terraformResource, terraformAttribute) {
|
|
516
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
517
|
+
this.isEmptyObject = false;
|
|
518
|
+
// filter - computed: false, optional: true, required: false
|
|
519
|
+
this._filter = new ConditionalAccessPolicyConditionsDevicesFilterOutputReference(this, "filter");
|
|
520
|
+
}
|
|
521
|
+
get internalValue() {
|
|
522
|
+
let hasAnyValues = this.isEmptyObject;
|
|
523
|
+
const internalValueResult = {};
|
|
524
|
+
if (this._filter?.internalValue !== undefined) {
|
|
525
|
+
hasAnyValues = true;
|
|
526
|
+
internalValueResult.filter = this._filter?.internalValue;
|
|
527
|
+
}
|
|
528
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
529
|
+
}
|
|
530
|
+
set internalValue(value) {
|
|
531
|
+
if (value === undefined) {
|
|
532
|
+
this.isEmptyObject = false;
|
|
533
|
+
this._filter.internalValue = undefined;
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
537
|
+
this._filter.internalValue = value.filter;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
get filter() {
|
|
541
|
+
return this._filter;
|
|
542
|
+
}
|
|
543
|
+
putFilter(value) {
|
|
544
|
+
this._filter.internalValue = value;
|
|
545
|
+
}
|
|
546
|
+
resetFilter() {
|
|
547
|
+
this._filter.internalValue = undefined;
|
|
548
|
+
}
|
|
549
|
+
// Temporarily expose input value. Use with caution.
|
|
550
|
+
get filterInput() {
|
|
551
|
+
return this._filter.internalValue;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
exports.ConditionalAccessPolicyConditionsDevicesOutputReference = ConditionalAccessPolicyConditionsDevicesOutputReference;
|
|
555
|
+
_e = JSII_RTTI_SYMBOL_1;
|
|
556
|
+
ConditionalAccessPolicyConditionsDevicesOutputReference[_e] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsDevicesOutputReference", version: "15.0.0" };
|
|
557
|
+
function conditionalAccessPolicyConditionsLocationsToTerraform(struct) {
|
|
558
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
559
|
+
return struct;
|
|
560
|
+
}
|
|
561
|
+
if (cdktn.isComplexElement(struct)) {
|
|
562
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
563
|
+
}
|
|
564
|
+
return {
|
|
565
|
+
excluded_locations: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedLocations),
|
|
566
|
+
included_locations: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedLocations),
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
function conditionalAccessPolicyConditionsLocationsToHclTerraform(struct) {
|
|
570
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
571
|
+
return struct;
|
|
572
|
+
}
|
|
573
|
+
if (cdktn.isComplexElement(struct)) {
|
|
574
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
575
|
+
}
|
|
576
|
+
const attrs = {
|
|
577
|
+
excluded_locations: {
|
|
578
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedLocations),
|
|
579
|
+
isBlock: false,
|
|
580
|
+
type: "list",
|
|
581
|
+
storageClassType: "stringList",
|
|
582
|
+
},
|
|
583
|
+
included_locations: {
|
|
584
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedLocations),
|
|
585
|
+
isBlock: false,
|
|
586
|
+
type: "list",
|
|
587
|
+
storageClassType: "stringList",
|
|
588
|
+
},
|
|
589
|
+
};
|
|
590
|
+
// remove undefined attributes
|
|
591
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
592
|
+
}
|
|
593
|
+
class ConditionalAccessPolicyConditionsLocationsOutputReference extends cdktn.ComplexObject {
|
|
594
|
+
/**
|
|
595
|
+
* @param terraformResource The parent resource
|
|
596
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
597
|
+
*/
|
|
598
|
+
constructor(terraformResource, terraformAttribute) {
|
|
599
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
600
|
+
this.isEmptyObject = false;
|
|
601
|
+
}
|
|
602
|
+
get internalValue() {
|
|
603
|
+
let hasAnyValues = this.isEmptyObject;
|
|
604
|
+
const internalValueResult = {};
|
|
605
|
+
if (this._excludedLocations !== undefined) {
|
|
606
|
+
hasAnyValues = true;
|
|
607
|
+
internalValueResult.excludedLocations = this._excludedLocations;
|
|
608
|
+
}
|
|
609
|
+
if (this._includedLocations !== undefined) {
|
|
610
|
+
hasAnyValues = true;
|
|
611
|
+
internalValueResult.includedLocations = this._includedLocations;
|
|
612
|
+
}
|
|
613
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
614
|
+
}
|
|
615
|
+
set internalValue(value) {
|
|
616
|
+
if (value === undefined) {
|
|
617
|
+
this.isEmptyObject = false;
|
|
618
|
+
this._excludedLocations = undefined;
|
|
619
|
+
this._includedLocations = undefined;
|
|
620
|
+
}
|
|
621
|
+
else {
|
|
622
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
623
|
+
this._excludedLocations = value.excludedLocations;
|
|
624
|
+
this._includedLocations = value.includedLocations;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
get excludedLocations() {
|
|
628
|
+
return this.getListAttribute('excluded_locations');
|
|
629
|
+
}
|
|
630
|
+
set excludedLocations(value) {
|
|
631
|
+
this._excludedLocations = value;
|
|
632
|
+
}
|
|
633
|
+
resetExcludedLocations() {
|
|
634
|
+
this._excludedLocations = undefined;
|
|
635
|
+
}
|
|
636
|
+
// Temporarily expose input value. Use with caution.
|
|
637
|
+
get excludedLocationsInput() {
|
|
638
|
+
return this._excludedLocations;
|
|
639
|
+
}
|
|
640
|
+
get includedLocations() {
|
|
641
|
+
return this.getListAttribute('included_locations');
|
|
642
|
+
}
|
|
643
|
+
set includedLocations(value) {
|
|
644
|
+
this._includedLocations = value;
|
|
645
|
+
}
|
|
646
|
+
// Temporarily expose input value. Use with caution.
|
|
647
|
+
get includedLocationsInput() {
|
|
648
|
+
return this._includedLocations;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
exports.ConditionalAccessPolicyConditionsLocationsOutputReference = ConditionalAccessPolicyConditionsLocationsOutputReference;
|
|
652
|
+
_f = JSII_RTTI_SYMBOL_1;
|
|
653
|
+
ConditionalAccessPolicyConditionsLocationsOutputReference[_f] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsLocationsOutputReference", version: "15.0.0" };
|
|
654
|
+
function conditionalAccessPolicyConditionsPlatformsToTerraform(struct) {
|
|
655
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
656
|
+
return struct;
|
|
657
|
+
}
|
|
658
|
+
if (cdktn.isComplexElement(struct)) {
|
|
659
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
660
|
+
}
|
|
661
|
+
return {
|
|
662
|
+
excluded_platforms: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedPlatforms),
|
|
663
|
+
included_platforms: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedPlatforms),
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
function conditionalAccessPolicyConditionsPlatformsToHclTerraform(struct) {
|
|
667
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
668
|
+
return struct;
|
|
669
|
+
}
|
|
670
|
+
if (cdktn.isComplexElement(struct)) {
|
|
671
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
672
|
+
}
|
|
673
|
+
const attrs = {
|
|
674
|
+
excluded_platforms: {
|
|
675
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedPlatforms),
|
|
676
|
+
isBlock: false,
|
|
677
|
+
type: "list",
|
|
678
|
+
storageClassType: "stringList",
|
|
679
|
+
},
|
|
680
|
+
included_platforms: {
|
|
681
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedPlatforms),
|
|
682
|
+
isBlock: false,
|
|
683
|
+
type: "list",
|
|
684
|
+
storageClassType: "stringList",
|
|
685
|
+
},
|
|
686
|
+
};
|
|
687
|
+
// remove undefined attributes
|
|
688
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
689
|
+
}
|
|
690
|
+
class ConditionalAccessPolicyConditionsPlatformsOutputReference extends cdktn.ComplexObject {
|
|
691
|
+
/**
|
|
692
|
+
* @param terraformResource The parent resource
|
|
693
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
694
|
+
*/
|
|
695
|
+
constructor(terraformResource, terraformAttribute) {
|
|
696
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
697
|
+
this.isEmptyObject = false;
|
|
698
|
+
}
|
|
699
|
+
get internalValue() {
|
|
700
|
+
let hasAnyValues = this.isEmptyObject;
|
|
701
|
+
const internalValueResult = {};
|
|
702
|
+
if (this._excludedPlatforms !== undefined) {
|
|
703
|
+
hasAnyValues = true;
|
|
704
|
+
internalValueResult.excludedPlatforms = this._excludedPlatforms;
|
|
705
|
+
}
|
|
706
|
+
if (this._includedPlatforms !== undefined) {
|
|
707
|
+
hasAnyValues = true;
|
|
708
|
+
internalValueResult.includedPlatforms = this._includedPlatforms;
|
|
709
|
+
}
|
|
710
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
711
|
+
}
|
|
712
|
+
set internalValue(value) {
|
|
713
|
+
if (value === undefined) {
|
|
714
|
+
this.isEmptyObject = false;
|
|
715
|
+
this._excludedPlatforms = undefined;
|
|
716
|
+
this._includedPlatforms = undefined;
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
720
|
+
this._excludedPlatforms = value.excludedPlatforms;
|
|
721
|
+
this._includedPlatforms = value.includedPlatforms;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
get excludedPlatforms() {
|
|
725
|
+
return this.getListAttribute('excluded_platforms');
|
|
726
|
+
}
|
|
727
|
+
set excludedPlatforms(value) {
|
|
728
|
+
this._excludedPlatforms = value;
|
|
729
|
+
}
|
|
730
|
+
resetExcludedPlatforms() {
|
|
731
|
+
this._excludedPlatforms = undefined;
|
|
732
|
+
}
|
|
733
|
+
// Temporarily expose input value. Use with caution.
|
|
734
|
+
get excludedPlatformsInput() {
|
|
735
|
+
return this._excludedPlatforms;
|
|
736
|
+
}
|
|
737
|
+
get includedPlatforms() {
|
|
738
|
+
return this.getListAttribute('included_platforms');
|
|
739
|
+
}
|
|
740
|
+
set includedPlatforms(value) {
|
|
741
|
+
this._includedPlatforms = value;
|
|
742
|
+
}
|
|
743
|
+
// Temporarily expose input value. Use with caution.
|
|
744
|
+
get includedPlatformsInput() {
|
|
745
|
+
return this._includedPlatforms;
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
exports.ConditionalAccessPolicyConditionsPlatformsOutputReference = ConditionalAccessPolicyConditionsPlatformsOutputReference;
|
|
749
|
+
_g = JSII_RTTI_SYMBOL_1;
|
|
750
|
+
ConditionalAccessPolicyConditionsPlatformsOutputReference[_g] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsPlatformsOutputReference", version: "15.0.0" };
|
|
751
|
+
function conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToTerraform(struct) {
|
|
752
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
753
|
+
return struct;
|
|
754
|
+
}
|
|
755
|
+
if (cdktn.isComplexElement(struct)) {
|
|
756
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
757
|
+
}
|
|
758
|
+
return {
|
|
759
|
+
members: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.members),
|
|
760
|
+
membership_kind: cdktn.stringToTerraform(struct.membershipKind),
|
|
761
|
+
};
|
|
762
|
+
}
|
|
763
|
+
function conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToHclTerraform(struct) {
|
|
764
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
765
|
+
return struct;
|
|
766
|
+
}
|
|
767
|
+
if (cdktn.isComplexElement(struct)) {
|
|
768
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
769
|
+
}
|
|
770
|
+
const attrs = {
|
|
771
|
+
members: {
|
|
772
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.members),
|
|
773
|
+
isBlock: false,
|
|
774
|
+
type: "list",
|
|
775
|
+
storageClassType: "stringList",
|
|
776
|
+
},
|
|
777
|
+
membership_kind: {
|
|
778
|
+
value: cdktn.stringToHclTerraform(struct.membershipKind),
|
|
779
|
+
isBlock: false,
|
|
780
|
+
type: "simple",
|
|
781
|
+
storageClassType: "string",
|
|
782
|
+
},
|
|
783
|
+
};
|
|
784
|
+
// remove undefined attributes
|
|
785
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
786
|
+
}
|
|
787
|
+
class ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference extends cdktn.ComplexObject {
|
|
788
|
+
/**
|
|
789
|
+
* @param terraformResource The parent resource
|
|
790
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
791
|
+
* @param complexObjectIndex the index of this item in the list
|
|
792
|
+
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
793
|
+
*/
|
|
794
|
+
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
795
|
+
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
796
|
+
this.isEmptyObject = false;
|
|
797
|
+
}
|
|
798
|
+
get internalValue() {
|
|
799
|
+
if (this.resolvableValue) {
|
|
800
|
+
return this.resolvableValue;
|
|
801
|
+
}
|
|
802
|
+
let hasAnyValues = this.isEmptyObject;
|
|
803
|
+
const internalValueResult = {};
|
|
804
|
+
if (this._members !== undefined) {
|
|
805
|
+
hasAnyValues = true;
|
|
806
|
+
internalValueResult.members = this._members;
|
|
807
|
+
}
|
|
808
|
+
if (this._membershipKind !== undefined) {
|
|
809
|
+
hasAnyValues = true;
|
|
810
|
+
internalValueResult.membershipKind = this._membershipKind;
|
|
811
|
+
}
|
|
812
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
813
|
+
}
|
|
814
|
+
set internalValue(value) {
|
|
815
|
+
if (value === undefined) {
|
|
816
|
+
this.isEmptyObject = false;
|
|
817
|
+
this.resolvableValue = undefined;
|
|
818
|
+
this._members = undefined;
|
|
819
|
+
this._membershipKind = undefined;
|
|
820
|
+
}
|
|
821
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
822
|
+
this.isEmptyObject = false;
|
|
823
|
+
this.resolvableValue = value;
|
|
824
|
+
}
|
|
825
|
+
else {
|
|
826
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
827
|
+
this.resolvableValue = undefined;
|
|
828
|
+
this._members = value.members;
|
|
829
|
+
this._membershipKind = value.membershipKind;
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
get members() {
|
|
833
|
+
return this.getListAttribute('members');
|
|
834
|
+
}
|
|
835
|
+
set members(value) {
|
|
836
|
+
this._members = value;
|
|
837
|
+
}
|
|
838
|
+
resetMembers() {
|
|
839
|
+
this._members = undefined;
|
|
840
|
+
}
|
|
841
|
+
// Temporarily expose input value. Use with caution.
|
|
842
|
+
get membersInput() {
|
|
843
|
+
return this._members;
|
|
844
|
+
}
|
|
845
|
+
get membershipKind() {
|
|
846
|
+
return this.getStringAttribute('membership_kind');
|
|
847
|
+
}
|
|
848
|
+
set membershipKind(value) {
|
|
849
|
+
this._membershipKind = value;
|
|
850
|
+
}
|
|
851
|
+
// Temporarily expose input value. Use with caution.
|
|
852
|
+
get membershipKindInput() {
|
|
853
|
+
return this._membershipKind;
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference = ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference;
|
|
857
|
+
_h = JSII_RTTI_SYMBOL_1;
|
|
858
|
+
ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference[_h] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference", version: "15.0.0" };
|
|
859
|
+
class ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList extends cdktn.ComplexList {
|
|
860
|
+
/**
|
|
861
|
+
* @param terraformResource The parent resource
|
|
862
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
863
|
+
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
864
|
+
*/
|
|
865
|
+
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
866
|
+
super(terraformResource, terraformAttribute, wrapsSet);
|
|
867
|
+
this.terraformResource = terraformResource;
|
|
868
|
+
this.terraformAttribute = terraformAttribute;
|
|
869
|
+
this.wrapsSet = wrapsSet;
|
|
870
|
+
}
|
|
871
|
+
/**
|
|
872
|
+
* @param index the index of the item to return
|
|
873
|
+
*/
|
|
874
|
+
get(index) {
|
|
875
|
+
return new ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList = ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList;
|
|
879
|
+
_j = JSII_RTTI_SYMBOL_1;
|
|
880
|
+
ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList[_j] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList", version: "15.0.0" };
|
|
881
|
+
function conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToTerraform(struct) {
|
|
882
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
883
|
+
return struct;
|
|
884
|
+
}
|
|
885
|
+
if (cdktn.isComplexElement(struct)) {
|
|
886
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
887
|
+
}
|
|
888
|
+
return {
|
|
889
|
+
guest_or_external_user_types: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.guestOrExternalUserTypes),
|
|
890
|
+
external_tenants: cdktn.listMapper(conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToTerraform, true)(struct.externalTenants),
|
|
891
|
+
};
|
|
892
|
+
}
|
|
893
|
+
function conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToHclTerraform(struct) {
|
|
894
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
895
|
+
return struct;
|
|
896
|
+
}
|
|
897
|
+
if (cdktn.isComplexElement(struct)) {
|
|
898
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
899
|
+
}
|
|
900
|
+
const attrs = {
|
|
901
|
+
guest_or_external_user_types: {
|
|
902
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.guestOrExternalUserTypes),
|
|
903
|
+
isBlock: false,
|
|
904
|
+
type: "list",
|
|
905
|
+
storageClassType: "stringList",
|
|
906
|
+
},
|
|
907
|
+
external_tenants: {
|
|
908
|
+
value: cdktn.listMapperHcl(conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToHclTerraform, true)(struct.externalTenants),
|
|
909
|
+
isBlock: true,
|
|
910
|
+
type: "list",
|
|
911
|
+
storageClassType: "ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList",
|
|
912
|
+
},
|
|
913
|
+
};
|
|
914
|
+
// remove undefined attributes
|
|
915
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
916
|
+
}
|
|
917
|
+
class ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference extends cdktn.ComplexObject {
|
|
918
|
+
/**
|
|
919
|
+
* @param terraformResource The parent resource
|
|
920
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
921
|
+
* @param complexObjectIndex the index of this item in the list
|
|
922
|
+
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
923
|
+
*/
|
|
924
|
+
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
925
|
+
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
926
|
+
this.isEmptyObject = false;
|
|
927
|
+
// external_tenants - computed: false, optional: true, required: false
|
|
928
|
+
this._externalTenants = new ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList(this, "external_tenants", false);
|
|
929
|
+
}
|
|
930
|
+
get internalValue() {
|
|
931
|
+
if (this.resolvableValue) {
|
|
932
|
+
return this.resolvableValue;
|
|
933
|
+
}
|
|
934
|
+
let hasAnyValues = this.isEmptyObject;
|
|
935
|
+
const internalValueResult = {};
|
|
936
|
+
if (this._guestOrExternalUserTypes !== undefined) {
|
|
937
|
+
hasAnyValues = true;
|
|
938
|
+
internalValueResult.guestOrExternalUserTypes = this._guestOrExternalUserTypes;
|
|
939
|
+
}
|
|
940
|
+
if (this._externalTenants?.internalValue !== undefined) {
|
|
941
|
+
hasAnyValues = true;
|
|
942
|
+
internalValueResult.externalTenants = this._externalTenants?.internalValue;
|
|
943
|
+
}
|
|
944
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
945
|
+
}
|
|
946
|
+
set internalValue(value) {
|
|
947
|
+
if (value === undefined) {
|
|
948
|
+
this.isEmptyObject = false;
|
|
949
|
+
this.resolvableValue = undefined;
|
|
950
|
+
this._guestOrExternalUserTypes = undefined;
|
|
951
|
+
this._externalTenants.internalValue = undefined;
|
|
952
|
+
}
|
|
953
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
954
|
+
this.isEmptyObject = false;
|
|
955
|
+
this.resolvableValue = value;
|
|
956
|
+
}
|
|
957
|
+
else {
|
|
958
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
959
|
+
this.resolvableValue = undefined;
|
|
960
|
+
this._guestOrExternalUserTypes = value.guestOrExternalUserTypes;
|
|
961
|
+
this._externalTenants.internalValue = value.externalTenants;
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
get guestOrExternalUserTypes() {
|
|
965
|
+
return this.getListAttribute('guest_or_external_user_types');
|
|
966
|
+
}
|
|
967
|
+
set guestOrExternalUserTypes(value) {
|
|
968
|
+
this._guestOrExternalUserTypes = value;
|
|
969
|
+
}
|
|
970
|
+
// Temporarily expose input value. Use with caution.
|
|
971
|
+
get guestOrExternalUserTypesInput() {
|
|
972
|
+
return this._guestOrExternalUserTypes;
|
|
973
|
+
}
|
|
974
|
+
get externalTenants() {
|
|
975
|
+
return this._externalTenants;
|
|
976
|
+
}
|
|
977
|
+
putExternalTenants(value) {
|
|
978
|
+
this._externalTenants.internalValue = value;
|
|
979
|
+
}
|
|
980
|
+
resetExternalTenants() {
|
|
981
|
+
this._externalTenants.internalValue = undefined;
|
|
982
|
+
}
|
|
983
|
+
// Temporarily expose input value. Use with caution.
|
|
984
|
+
get externalTenantsInput() {
|
|
985
|
+
return this._externalTenants.internalValue;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference = ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference;
|
|
989
|
+
_k = JSII_RTTI_SYMBOL_1;
|
|
990
|
+
ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference[_k] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference", version: "15.0.0" };
|
|
991
|
+
class ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList extends cdktn.ComplexList {
|
|
992
|
+
/**
|
|
993
|
+
* @param terraformResource The parent resource
|
|
994
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
995
|
+
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
996
|
+
*/
|
|
997
|
+
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
998
|
+
super(terraformResource, terraformAttribute, wrapsSet);
|
|
999
|
+
this.terraformResource = terraformResource;
|
|
1000
|
+
this.terraformAttribute = terraformAttribute;
|
|
1001
|
+
this.wrapsSet = wrapsSet;
|
|
1002
|
+
}
|
|
1003
|
+
/**
|
|
1004
|
+
* @param index the index of the item to return
|
|
1005
|
+
*/
|
|
1006
|
+
get(index) {
|
|
1007
|
+
return new ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList = ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList;
|
|
1011
|
+
_l = JSII_RTTI_SYMBOL_1;
|
|
1012
|
+
ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList[_l] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList", version: "15.0.0" };
|
|
1013
|
+
function conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToTerraform(struct) {
|
|
1014
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1015
|
+
return struct;
|
|
1016
|
+
}
|
|
1017
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1018
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1019
|
+
}
|
|
1020
|
+
return {
|
|
1021
|
+
members: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.members),
|
|
1022
|
+
membership_kind: cdktn.stringToTerraform(struct.membershipKind),
|
|
1023
|
+
};
|
|
1024
|
+
}
|
|
1025
|
+
function conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToHclTerraform(struct) {
|
|
1026
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1027
|
+
return struct;
|
|
1028
|
+
}
|
|
1029
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1030
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1031
|
+
}
|
|
1032
|
+
const attrs = {
|
|
1033
|
+
members: {
|
|
1034
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.members),
|
|
1035
|
+
isBlock: false,
|
|
1036
|
+
type: "list",
|
|
1037
|
+
storageClassType: "stringList",
|
|
1038
|
+
},
|
|
1039
|
+
membership_kind: {
|
|
1040
|
+
value: cdktn.stringToHclTerraform(struct.membershipKind),
|
|
1041
|
+
isBlock: false,
|
|
1042
|
+
type: "simple",
|
|
1043
|
+
storageClassType: "string",
|
|
1044
|
+
},
|
|
1045
|
+
};
|
|
1046
|
+
// remove undefined attributes
|
|
1047
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1048
|
+
}
|
|
1049
|
+
class ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference extends cdktn.ComplexObject {
|
|
1050
|
+
/**
|
|
1051
|
+
* @param terraformResource The parent resource
|
|
1052
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1053
|
+
* @param complexObjectIndex the index of this item in the list
|
|
1054
|
+
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
1055
|
+
*/
|
|
1056
|
+
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
1057
|
+
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
1058
|
+
this.isEmptyObject = false;
|
|
1059
|
+
}
|
|
1060
|
+
get internalValue() {
|
|
1061
|
+
if (this.resolvableValue) {
|
|
1062
|
+
return this.resolvableValue;
|
|
1063
|
+
}
|
|
1064
|
+
let hasAnyValues = this.isEmptyObject;
|
|
1065
|
+
const internalValueResult = {};
|
|
1066
|
+
if (this._members !== undefined) {
|
|
1067
|
+
hasAnyValues = true;
|
|
1068
|
+
internalValueResult.members = this._members;
|
|
1069
|
+
}
|
|
1070
|
+
if (this._membershipKind !== undefined) {
|
|
1071
|
+
hasAnyValues = true;
|
|
1072
|
+
internalValueResult.membershipKind = this._membershipKind;
|
|
1073
|
+
}
|
|
1074
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
1075
|
+
}
|
|
1076
|
+
set internalValue(value) {
|
|
1077
|
+
if (value === undefined) {
|
|
1078
|
+
this.isEmptyObject = false;
|
|
1079
|
+
this.resolvableValue = undefined;
|
|
1080
|
+
this._members = undefined;
|
|
1081
|
+
this._membershipKind = undefined;
|
|
1082
|
+
}
|
|
1083
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
1084
|
+
this.isEmptyObject = false;
|
|
1085
|
+
this.resolvableValue = value;
|
|
1086
|
+
}
|
|
1087
|
+
else {
|
|
1088
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1089
|
+
this.resolvableValue = undefined;
|
|
1090
|
+
this._members = value.members;
|
|
1091
|
+
this._membershipKind = value.membershipKind;
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
get members() {
|
|
1095
|
+
return this.getListAttribute('members');
|
|
1096
|
+
}
|
|
1097
|
+
set members(value) {
|
|
1098
|
+
this._members = value;
|
|
1099
|
+
}
|
|
1100
|
+
resetMembers() {
|
|
1101
|
+
this._members = undefined;
|
|
1102
|
+
}
|
|
1103
|
+
// Temporarily expose input value. Use with caution.
|
|
1104
|
+
get membersInput() {
|
|
1105
|
+
return this._members;
|
|
1106
|
+
}
|
|
1107
|
+
get membershipKind() {
|
|
1108
|
+
return this.getStringAttribute('membership_kind');
|
|
1109
|
+
}
|
|
1110
|
+
set membershipKind(value) {
|
|
1111
|
+
this._membershipKind = value;
|
|
1112
|
+
}
|
|
1113
|
+
// Temporarily expose input value. Use with caution.
|
|
1114
|
+
get membershipKindInput() {
|
|
1115
|
+
return this._membershipKind;
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference = ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference;
|
|
1119
|
+
_m = JSII_RTTI_SYMBOL_1;
|
|
1120
|
+
ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference[_m] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference", version: "15.0.0" };
|
|
1121
|
+
class ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList extends cdktn.ComplexList {
|
|
1122
|
+
/**
|
|
1123
|
+
* @param terraformResource The parent resource
|
|
1124
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1125
|
+
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
1126
|
+
*/
|
|
1127
|
+
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
1128
|
+
super(terraformResource, terraformAttribute, wrapsSet);
|
|
1129
|
+
this.terraformResource = terraformResource;
|
|
1130
|
+
this.terraformAttribute = terraformAttribute;
|
|
1131
|
+
this.wrapsSet = wrapsSet;
|
|
1132
|
+
}
|
|
1133
|
+
/**
|
|
1134
|
+
* @param index the index of the item to return
|
|
1135
|
+
*/
|
|
1136
|
+
get(index) {
|
|
1137
|
+
return new ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList = ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList;
|
|
1141
|
+
_o = JSII_RTTI_SYMBOL_1;
|
|
1142
|
+
ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList[_o] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList", version: "15.0.0" };
|
|
1143
|
+
function conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToTerraform(struct) {
|
|
1144
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1145
|
+
return struct;
|
|
1146
|
+
}
|
|
1147
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1148
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1149
|
+
}
|
|
1150
|
+
return {
|
|
1151
|
+
guest_or_external_user_types: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.guestOrExternalUserTypes),
|
|
1152
|
+
external_tenants: cdktn.listMapper(conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToTerraform, true)(struct.externalTenants),
|
|
1153
|
+
};
|
|
1154
|
+
}
|
|
1155
|
+
function conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToHclTerraform(struct) {
|
|
1156
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1157
|
+
return struct;
|
|
1158
|
+
}
|
|
1159
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1160
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1161
|
+
}
|
|
1162
|
+
const attrs = {
|
|
1163
|
+
guest_or_external_user_types: {
|
|
1164
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.guestOrExternalUserTypes),
|
|
1165
|
+
isBlock: false,
|
|
1166
|
+
type: "list",
|
|
1167
|
+
storageClassType: "stringList",
|
|
1168
|
+
},
|
|
1169
|
+
external_tenants: {
|
|
1170
|
+
value: cdktn.listMapperHcl(conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToHclTerraform, true)(struct.externalTenants),
|
|
1171
|
+
isBlock: true,
|
|
1172
|
+
type: "list",
|
|
1173
|
+
storageClassType: "ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList",
|
|
1174
|
+
},
|
|
1175
|
+
};
|
|
1176
|
+
// remove undefined attributes
|
|
1177
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1178
|
+
}
|
|
1179
|
+
class ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference extends cdktn.ComplexObject {
|
|
1180
|
+
/**
|
|
1181
|
+
* @param terraformResource The parent resource
|
|
1182
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1183
|
+
* @param complexObjectIndex the index of this item in the list
|
|
1184
|
+
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
1185
|
+
*/
|
|
1186
|
+
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
1187
|
+
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
1188
|
+
this.isEmptyObject = false;
|
|
1189
|
+
// external_tenants - computed: false, optional: true, required: false
|
|
1190
|
+
this._externalTenants = new ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList(this, "external_tenants", false);
|
|
1191
|
+
}
|
|
1192
|
+
get internalValue() {
|
|
1193
|
+
if (this.resolvableValue) {
|
|
1194
|
+
return this.resolvableValue;
|
|
1195
|
+
}
|
|
1196
|
+
let hasAnyValues = this.isEmptyObject;
|
|
1197
|
+
const internalValueResult = {};
|
|
1198
|
+
if (this._guestOrExternalUserTypes !== undefined) {
|
|
1199
|
+
hasAnyValues = true;
|
|
1200
|
+
internalValueResult.guestOrExternalUserTypes = this._guestOrExternalUserTypes;
|
|
1201
|
+
}
|
|
1202
|
+
if (this._externalTenants?.internalValue !== undefined) {
|
|
1203
|
+
hasAnyValues = true;
|
|
1204
|
+
internalValueResult.externalTenants = this._externalTenants?.internalValue;
|
|
1205
|
+
}
|
|
1206
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
1207
|
+
}
|
|
1208
|
+
set internalValue(value) {
|
|
1209
|
+
if (value === undefined) {
|
|
1210
|
+
this.isEmptyObject = false;
|
|
1211
|
+
this.resolvableValue = undefined;
|
|
1212
|
+
this._guestOrExternalUserTypes = undefined;
|
|
1213
|
+
this._externalTenants.internalValue = undefined;
|
|
1214
|
+
}
|
|
1215
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
1216
|
+
this.isEmptyObject = false;
|
|
1217
|
+
this.resolvableValue = value;
|
|
1218
|
+
}
|
|
1219
|
+
else {
|
|
1220
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1221
|
+
this.resolvableValue = undefined;
|
|
1222
|
+
this._guestOrExternalUserTypes = value.guestOrExternalUserTypes;
|
|
1223
|
+
this._externalTenants.internalValue = value.externalTenants;
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
get guestOrExternalUserTypes() {
|
|
1227
|
+
return this.getListAttribute('guest_or_external_user_types');
|
|
1228
|
+
}
|
|
1229
|
+
set guestOrExternalUserTypes(value) {
|
|
1230
|
+
this._guestOrExternalUserTypes = value;
|
|
1231
|
+
}
|
|
1232
|
+
// Temporarily expose input value. Use with caution.
|
|
1233
|
+
get guestOrExternalUserTypesInput() {
|
|
1234
|
+
return this._guestOrExternalUserTypes;
|
|
1235
|
+
}
|
|
1236
|
+
get externalTenants() {
|
|
1237
|
+
return this._externalTenants;
|
|
1238
|
+
}
|
|
1239
|
+
putExternalTenants(value) {
|
|
1240
|
+
this._externalTenants.internalValue = value;
|
|
1241
|
+
}
|
|
1242
|
+
resetExternalTenants() {
|
|
1243
|
+
this._externalTenants.internalValue = undefined;
|
|
1244
|
+
}
|
|
1245
|
+
// Temporarily expose input value. Use with caution.
|
|
1246
|
+
get externalTenantsInput() {
|
|
1247
|
+
return this._externalTenants.internalValue;
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference = ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference;
|
|
1251
|
+
_p = JSII_RTTI_SYMBOL_1;
|
|
1252
|
+
ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference[_p] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference", version: "15.0.0" };
|
|
1253
|
+
class ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList extends cdktn.ComplexList {
|
|
1254
|
+
/**
|
|
1255
|
+
* @param terraformResource The parent resource
|
|
1256
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1257
|
+
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
1258
|
+
*/
|
|
1259
|
+
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
1260
|
+
super(terraformResource, terraformAttribute, wrapsSet);
|
|
1261
|
+
this.terraformResource = terraformResource;
|
|
1262
|
+
this.terraformAttribute = terraformAttribute;
|
|
1263
|
+
this.wrapsSet = wrapsSet;
|
|
1264
|
+
}
|
|
1265
|
+
/**
|
|
1266
|
+
* @param index the index of the item to return
|
|
1267
|
+
*/
|
|
1268
|
+
get(index) {
|
|
1269
|
+
return new ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList = ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList;
|
|
1273
|
+
_q = JSII_RTTI_SYMBOL_1;
|
|
1274
|
+
ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList[_q] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList", version: "15.0.0" };
|
|
1275
|
+
function conditionalAccessPolicyConditionsUsersToTerraform(struct) {
|
|
1276
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1277
|
+
return struct;
|
|
1278
|
+
}
|
|
1279
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1280
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1281
|
+
}
|
|
1282
|
+
return {
|
|
1283
|
+
excluded_groups: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedGroups),
|
|
1284
|
+
excluded_roles: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedRoles),
|
|
1285
|
+
excluded_users: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedUsers),
|
|
1286
|
+
included_groups: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedGroups),
|
|
1287
|
+
included_roles: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedRoles),
|
|
1288
|
+
included_users: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedUsers),
|
|
1289
|
+
excluded_guests_or_external_users: cdktn.listMapper(conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToTerraform, true)(struct.excludedGuestsOrExternalUsers),
|
|
1290
|
+
included_guests_or_external_users: cdktn.listMapper(conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToTerraform, true)(struct.includedGuestsOrExternalUsers),
|
|
1291
|
+
};
|
|
1292
|
+
}
|
|
1293
|
+
function conditionalAccessPolicyConditionsUsersToHclTerraform(struct) {
|
|
1294
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1295
|
+
return struct;
|
|
1296
|
+
}
|
|
1297
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1298
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1299
|
+
}
|
|
1300
|
+
const attrs = {
|
|
1301
|
+
excluded_groups: {
|
|
1302
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedGroups),
|
|
1303
|
+
isBlock: false,
|
|
1304
|
+
type: "list",
|
|
1305
|
+
storageClassType: "stringList",
|
|
1306
|
+
},
|
|
1307
|
+
excluded_roles: {
|
|
1308
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedRoles),
|
|
1309
|
+
isBlock: false,
|
|
1310
|
+
type: "list",
|
|
1311
|
+
storageClassType: "stringList",
|
|
1312
|
+
},
|
|
1313
|
+
excluded_users: {
|
|
1314
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedUsers),
|
|
1315
|
+
isBlock: false,
|
|
1316
|
+
type: "list",
|
|
1317
|
+
storageClassType: "stringList",
|
|
1318
|
+
},
|
|
1319
|
+
included_groups: {
|
|
1320
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedGroups),
|
|
1321
|
+
isBlock: false,
|
|
1322
|
+
type: "list",
|
|
1323
|
+
storageClassType: "stringList",
|
|
1324
|
+
},
|
|
1325
|
+
included_roles: {
|
|
1326
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedRoles),
|
|
1327
|
+
isBlock: false,
|
|
1328
|
+
type: "list",
|
|
1329
|
+
storageClassType: "stringList",
|
|
1330
|
+
},
|
|
1331
|
+
included_users: {
|
|
1332
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedUsers),
|
|
1333
|
+
isBlock: false,
|
|
1334
|
+
type: "list",
|
|
1335
|
+
storageClassType: "stringList",
|
|
1336
|
+
},
|
|
1337
|
+
excluded_guests_or_external_users: {
|
|
1338
|
+
value: cdktn.listMapperHcl(conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToHclTerraform, true)(struct.excludedGuestsOrExternalUsers),
|
|
1339
|
+
isBlock: true,
|
|
1340
|
+
type: "list",
|
|
1341
|
+
storageClassType: "ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList",
|
|
1342
|
+
},
|
|
1343
|
+
included_guests_or_external_users: {
|
|
1344
|
+
value: cdktn.listMapperHcl(conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToHclTerraform, true)(struct.includedGuestsOrExternalUsers),
|
|
1345
|
+
isBlock: true,
|
|
1346
|
+
type: "list",
|
|
1347
|
+
storageClassType: "ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList",
|
|
1348
|
+
},
|
|
1349
|
+
};
|
|
1350
|
+
// remove undefined attributes
|
|
1351
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1352
|
+
}
|
|
1353
|
+
class ConditionalAccessPolicyConditionsUsersOutputReference extends cdktn.ComplexObject {
|
|
1354
|
+
/**
|
|
1355
|
+
* @param terraformResource The parent resource
|
|
1356
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1357
|
+
*/
|
|
1358
|
+
constructor(terraformResource, terraformAttribute) {
|
|
1359
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
1360
|
+
this.isEmptyObject = false;
|
|
1361
|
+
// excluded_guests_or_external_users - computed: false, optional: true, required: false
|
|
1362
|
+
this._excludedGuestsOrExternalUsers = new ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList(this, "excluded_guests_or_external_users", false);
|
|
1363
|
+
// included_guests_or_external_users - computed: false, optional: true, required: false
|
|
1364
|
+
this._includedGuestsOrExternalUsers = new ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList(this, "included_guests_or_external_users", false);
|
|
1365
|
+
}
|
|
1366
|
+
get internalValue() {
|
|
1367
|
+
let hasAnyValues = this.isEmptyObject;
|
|
1368
|
+
const internalValueResult = {};
|
|
1369
|
+
if (this._excludedGroups !== undefined) {
|
|
1370
|
+
hasAnyValues = true;
|
|
1371
|
+
internalValueResult.excludedGroups = this._excludedGroups;
|
|
1372
|
+
}
|
|
1373
|
+
if (this._excludedRoles !== undefined) {
|
|
1374
|
+
hasAnyValues = true;
|
|
1375
|
+
internalValueResult.excludedRoles = this._excludedRoles;
|
|
1376
|
+
}
|
|
1377
|
+
if (this._excludedUsers !== undefined) {
|
|
1378
|
+
hasAnyValues = true;
|
|
1379
|
+
internalValueResult.excludedUsers = this._excludedUsers;
|
|
1380
|
+
}
|
|
1381
|
+
if (this._includedGroups !== undefined) {
|
|
1382
|
+
hasAnyValues = true;
|
|
1383
|
+
internalValueResult.includedGroups = this._includedGroups;
|
|
1384
|
+
}
|
|
1385
|
+
if (this._includedRoles !== undefined) {
|
|
1386
|
+
hasAnyValues = true;
|
|
1387
|
+
internalValueResult.includedRoles = this._includedRoles;
|
|
1388
|
+
}
|
|
1389
|
+
if (this._includedUsers !== undefined) {
|
|
1390
|
+
hasAnyValues = true;
|
|
1391
|
+
internalValueResult.includedUsers = this._includedUsers;
|
|
1392
|
+
}
|
|
1393
|
+
if (this._excludedGuestsOrExternalUsers?.internalValue !== undefined) {
|
|
1394
|
+
hasAnyValues = true;
|
|
1395
|
+
internalValueResult.excludedGuestsOrExternalUsers = this._excludedGuestsOrExternalUsers?.internalValue;
|
|
1396
|
+
}
|
|
1397
|
+
if (this._includedGuestsOrExternalUsers?.internalValue !== undefined) {
|
|
1398
|
+
hasAnyValues = true;
|
|
1399
|
+
internalValueResult.includedGuestsOrExternalUsers = this._includedGuestsOrExternalUsers?.internalValue;
|
|
1400
|
+
}
|
|
1401
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
1402
|
+
}
|
|
1403
|
+
set internalValue(value) {
|
|
1404
|
+
if (value === undefined) {
|
|
1405
|
+
this.isEmptyObject = false;
|
|
1406
|
+
this._excludedGroups = undefined;
|
|
1407
|
+
this._excludedRoles = undefined;
|
|
1408
|
+
this._excludedUsers = undefined;
|
|
1409
|
+
this._includedGroups = undefined;
|
|
1410
|
+
this._includedRoles = undefined;
|
|
1411
|
+
this._includedUsers = undefined;
|
|
1412
|
+
this._excludedGuestsOrExternalUsers.internalValue = undefined;
|
|
1413
|
+
this._includedGuestsOrExternalUsers.internalValue = undefined;
|
|
1414
|
+
}
|
|
1415
|
+
else {
|
|
1416
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1417
|
+
this._excludedGroups = value.excludedGroups;
|
|
1418
|
+
this._excludedRoles = value.excludedRoles;
|
|
1419
|
+
this._excludedUsers = value.excludedUsers;
|
|
1420
|
+
this._includedGroups = value.includedGroups;
|
|
1421
|
+
this._includedRoles = value.includedRoles;
|
|
1422
|
+
this._includedUsers = value.includedUsers;
|
|
1423
|
+
this._excludedGuestsOrExternalUsers.internalValue = value.excludedGuestsOrExternalUsers;
|
|
1424
|
+
this._includedGuestsOrExternalUsers.internalValue = value.includedGuestsOrExternalUsers;
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
get excludedGroups() {
|
|
1428
|
+
return this.getListAttribute('excluded_groups');
|
|
1429
|
+
}
|
|
1430
|
+
set excludedGroups(value) {
|
|
1431
|
+
this._excludedGroups = value;
|
|
1432
|
+
}
|
|
1433
|
+
resetExcludedGroups() {
|
|
1434
|
+
this._excludedGroups = undefined;
|
|
1435
|
+
}
|
|
1436
|
+
// Temporarily expose input value. Use with caution.
|
|
1437
|
+
get excludedGroupsInput() {
|
|
1438
|
+
return this._excludedGroups;
|
|
1439
|
+
}
|
|
1440
|
+
get excludedRoles() {
|
|
1441
|
+
return this.getListAttribute('excluded_roles');
|
|
1442
|
+
}
|
|
1443
|
+
set excludedRoles(value) {
|
|
1444
|
+
this._excludedRoles = value;
|
|
1445
|
+
}
|
|
1446
|
+
resetExcludedRoles() {
|
|
1447
|
+
this._excludedRoles = undefined;
|
|
1448
|
+
}
|
|
1449
|
+
// Temporarily expose input value. Use with caution.
|
|
1450
|
+
get excludedRolesInput() {
|
|
1451
|
+
return this._excludedRoles;
|
|
1452
|
+
}
|
|
1453
|
+
get excludedUsers() {
|
|
1454
|
+
return this.getListAttribute('excluded_users');
|
|
1455
|
+
}
|
|
1456
|
+
set excludedUsers(value) {
|
|
1457
|
+
this._excludedUsers = value;
|
|
1458
|
+
}
|
|
1459
|
+
resetExcludedUsers() {
|
|
1460
|
+
this._excludedUsers = undefined;
|
|
1461
|
+
}
|
|
1462
|
+
// Temporarily expose input value. Use with caution.
|
|
1463
|
+
get excludedUsersInput() {
|
|
1464
|
+
return this._excludedUsers;
|
|
1465
|
+
}
|
|
1466
|
+
get includedGroups() {
|
|
1467
|
+
return this.getListAttribute('included_groups');
|
|
1468
|
+
}
|
|
1469
|
+
set includedGroups(value) {
|
|
1470
|
+
this._includedGroups = value;
|
|
1471
|
+
}
|
|
1472
|
+
resetIncludedGroups() {
|
|
1473
|
+
this._includedGroups = undefined;
|
|
1474
|
+
}
|
|
1475
|
+
// Temporarily expose input value. Use with caution.
|
|
1476
|
+
get includedGroupsInput() {
|
|
1477
|
+
return this._includedGroups;
|
|
1478
|
+
}
|
|
1479
|
+
get includedRoles() {
|
|
1480
|
+
return this.getListAttribute('included_roles');
|
|
1481
|
+
}
|
|
1482
|
+
set includedRoles(value) {
|
|
1483
|
+
this._includedRoles = value;
|
|
1484
|
+
}
|
|
1485
|
+
resetIncludedRoles() {
|
|
1486
|
+
this._includedRoles = undefined;
|
|
1487
|
+
}
|
|
1488
|
+
// Temporarily expose input value. Use with caution.
|
|
1489
|
+
get includedRolesInput() {
|
|
1490
|
+
return this._includedRoles;
|
|
1491
|
+
}
|
|
1492
|
+
get includedUsers() {
|
|
1493
|
+
return this.getListAttribute('included_users');
|
|
1494
|
+
}
|
|
1495
|
+
set includedUsers(value) {
|
|
1496
|
+
this._includedUsers = value;
|
|
1497
|
+
}
|
|
1498
|
+
resetIncludedUsers() {
|
|
1499
|
+
this._includedUsers = undefined;
|
|
1500
|
+
}
|
|
1501
|
+
// Temporarily expose input value. Use with caution.
|
|
1502
|
+
get includedUsersInput() {
|
|
1503
|
+
return this._includedUsers;
|
|
1504
|
+
}
|
|
1505
|
+
get excludedGuestsOrExternalUsers() {
|
|
1506
|
+
return this._excludedGuestsOrExternalUsers;
|
|
1507
|
+
}
|
|
1508
|
+
putExcludedGuestsOrExternalUsers(value) {
|
|
1509
|
+
this._excludedGuestsOrExternalUsers.internalValue = value;
|
|
1510
|
+
}
|
|
1511
|
+
resetExcludedGuestsOrExternalUsers() {
|
|
1512
|
+
this._excludedGuestsOrExternalUsers.internalValue = undefined;
|
|
1513
|
+
}
|
|
1514
|
+
// Temporarily expose input value. Use with caution.
|
|
1515
|
+
get excludedGuestsOrExternalUsersInput() {
|
|
1516
|
+
return this._excludedGuestsOrExternalUsers.internalValue;
|
|
1517
|
+
}
|
|
1518
|
+
get includedGuestsOrExternalUsers() {
|
|
1519
|
+
return this._includedGuestsOrExternalUsers;
|
|
1520
|
+
}
|
|
1521
|
+
putIncludedGuestsOrExternalUsers(value) {
|
|
1522
|
+
this._includedGuestsOrExternalUsers.internalValue = value;
|
|
1523
|
+
}
|
|
1524
|
+
resetIncludedGuestsOrExternalUsers() {
|
|
1525
|
+
this._includedGuestsOrExternalUsers.internalValue = undefined;
|
|
1526
|
+
}
|
|
1527
|
+
// Temporarily expose input value. Use with caution.
|
|
1528
|
+
get includedGuestsOrExternalUsersInput() {
|
|
1529
|
+
return this._includedGuestsOrExternalUsers.internalValue;
|
|
1530
|
+
}
|
|
1531
|
+
}
|
|
1532
|
+
exports.ConditionalAccessPolicyConditionsUsersOutputReference = ConditionalAccessPolicyConditionsUsersOutputReference;
|
|
1533
|
+
_r = JSII_RTTI_SYMBOL_1;
|
|
1534
|
+
ConditionalAccessPolicyConditionsUsersOutputReference[_r] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersOutputReference", version: "15.0.0" };
|
|
1535
|
+
function conditionalAccessPolicyConditionsToTerraform(struct) {
|
|
1536
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1537
|
+
return struct;
|
|
1538
|
+
}
|
|
1539
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1540
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1541
|
+
}
|
|
1542
|
+
return {
|
|
1543
|
+
authentication_flow_transfer_methods: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.authenticationFlowTransferMethods),
|
|
1544
|
+
client_app_types: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.clientAppTypes),
|
|
1545
|
+
insider_risk_levels: cdktn.stringToTerraform(struct.insiderRiskLevels),
|
|
1546
|
+
service_principal_risk_levels: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.servicePrincipalRiskLevels),
|
|
1547
|
+
sign_in_risk_levels: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.signInRiskLevels),
|
|
1548
|
+
user_risk_levels: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.userRiskLevels),
|
|
1549
|
+
applications: conditionalAccessPolicyConditionsApplicationsToTerraform(struct.applications),
|
|
1550
|
+
client_applications: conditionalAccessPolicyConditionsClientApplicationsToTerraform(struct.clientApplications),
|
|
1551
|
+
devices: conditionalAccessPolicyConditionsDevicesToTerraform(struct.devices),
|
|
1552
|
+
locations: conditionalAccessPolicyConditionsLocationsToTerraform(struct.locations),
|
|
1553
|
+
platforms: conditionalAccessPolicyConditionsPlatformsToTerraform(struct.platforms),
|
|
1554
|
+
users: conditionalAccessPolicyConditionsUsersToTerraform(struct.users),
|
|
1555
|
+
};
|
|
1556
|
+
}
|
|
1557
|
+
function conditionalAccessPolicyConditionsToHclTerraform(struct) {
|
|
1558
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1559
|
+
return struct;
|
|
1560
|
+
}
|
|
1561
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1562
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1563
|
+
}
|
|
1564
|
+
const attrs = {
|
|
1565
|
+
authentication_flow_transfer_methods: {
|
|
1566
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.authenticationFlowTransferMethods),
|
|
1567
|
+
isBlock: false,
|
|
1568
|
+
type: "set",
|
|
1569
|
+
storageClassType: "stringList",
|
|
1570
|
+
},
|
|
1571
|
+
client_app_types: {
|
|
1572
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.clientAppTypes),
|
|
1573
|
+
isBlock: false,
|
|
1574
|
+
type: "list",
|
|
1575
|
+
storageClassType: "stringList",
|
|
1576
|
+
},
|
|
1577
|
+
insider_risk_levels: {
|
|
1578
|
+
value: cdktn.stringToHclTerraform(struct.insiderRiskLevels),
|
|
1579
|
+
isBlock: false,
|
|
1580
|
+
type: "simple",
|
|
1581
|
+
storageClassType: "string",
|
|
1582
|
+
},
|
|
1583
|
+
service_principal_risk_levels: {
|
|
1584
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.servicePrincipalRiskLevels),
|
|
1585
|
+
isBlock: false,
|
|
1586
|
+
type: "list",
|
|
1587
|
+
storageClassType: "stringList",
|
|
1588
|
+
},
|
|
1589
|
+
sign_in_risk_levels: {
|
|
1590
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.signInRiskLevels),
|
|
1591
|
+
isBlock: false,
|
|
1592
|
+
type: "list",
|
|
1593
|
+
storageClassType: "stringList",
|
|
1594
|
+
},
|
|
1595
|
+
user_risk_levels: {
|
|
1596
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.userRiskLevels),
|
|
1597
|
+
isBlock: false,
|
|
1598
|
+
type: "list",
|
|
1599
|
+
storageClassType: "stringList",
|
|
1600
|
+
},
|
|
1601
|
+
applications: {
|
|
1602
|
+
value: conditionalAccessPolicyConditionsApplicationsToHclTerraform(struct.applications),
|
|
1603
|
+
isBlock: true,
|
|
1604
|
+
type: "list",
|
|
1605
|
+
storageClassType: "ConditionalAccessPolicyConditionsApplicationsList",
|
|
1606
|
+
},
|
|
1607
|
+
client_applications: {
|
|
1608
|
+
value: conditionalAccessPolicyConditionsClientApplicationsToHclTerraform(struct.clientApplications),
|
|
1609
|
+
isBlock: true,
|
|
1610
|
+
type: "list",
|
|
1611
|
+
storageClassType: "ConditionalAccessPolicyConditionsClientApplicationsList",
|
|
1612
|
+
},
|
|
1613
|
+
devices: {
|
|
1614
|
+
value: conditionalAccessPolicyConditionsDevicesToHclTerraform(struct.devices),
|
|
1615
|
+
isBlock: true,
|
|
1616
|
+
type: "list",
|
|
1617
|
+
storageClassType: "ConditionalAccessPolicyConditionsDevicesList",
|
|
1618
|
+
},
|
|
1619
|
+
locations: {
|
|
1620
|
+
value: conditionalAccessPolicyConditionsLocationsToHclTerraform(struct.locations),
|
|
1621
|
+
isBlock: true,
|
|
1622
|
+
type: "list",
|
|
1623
|
+
storageClassType: "ConditionalAccessPolicyConditionsLocationsList",
|
|
1624
|
+
},
|
|
1625
|
+
platforms: {
|
|
1626
|
+
value: conditionalAccessPolicyConditionsPlatformsToHclTerraform(struct.platforms),
|
|
1627
|
+
isBlock: true,
|
|
1628
|
+
type: "list",
|
|
1629
|
+
storageClassType: "ConditionalAccessPolicyConditionsPlatformsList",
|
|
1630
|
+
},
|
|
1631
|
+
users: {
|
|
1632
|
+
value: conditionalAccessPolicyConditionsUsersToHclTerraform(struct.users),
|
|
1633
|
+
isBlock: true,
|
|
1634
|
+
type: "list",
|
|
1635
|
+
storageClassType: "ConditionalAccessPolicyConditionsUsersList",
|
|
1636
|
+
},
|
|
1637
|
+
};
|
|
1638
|
+
// remove undefined attributes
|
|
1639
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1640
|
+
}
|
|
1641
|
+
class ConditionalAccessPolicyConditionsOutputReference extends cdktn.ComplexObject {
|
|
1642
|
+
/**
|
|
1643
|
+
* @param terraformResource The parent resource
|
|
1644
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1645
|
+
*/
|
|
1646
|
+
constructor(terraformResource, terraformAttribute) {
|
|
1647
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
1648
|
+
this.isEmptyObject = false;
|
|
1649
|
+
// applications - computed: false, optional: false, required: true
|
|
1650
|
+
this._applications = new ConditionalAccessPolicyConditionsApplicationsOutputReference(this, "applications");
|
|
1651
|
+
// client_applications - computed: false, optional: true, required: false
|
|
1652
|
+
this._clientApplications = new ConditionalAccessPolicyConditionsClientApplicationsOutputReference(this, "client_applications");
|
|
1653
|
+
// devices - computed: false, optional: true, required: false
|
|
1654
|
+
this._devices = new ConditionalAccessPolicyConditionsDevicesOutputReference(this, "devices");
|
|
1655
|
+
// locations - computed: false, optional: true, required: false
|
|
1656
|
+
this._locations = new ConditionalAccessPolicyConditionsLocationsOutputReference(this, "locations");
|
|
1657
|
+
// platforms - computed: false, optional: true, required: false
|
|
1658
|
+
this._platforms = new ConditionalAccessPolicyConditionsPlatformsOutputReference(this, "platforms");
|
|
1659
|
+
// users - computed: false, optional: false, required: true
|
|
1660
|
+
this._users = new ConditionalAccessPolicyConditionsUsersOutputReference(this, "users");
|
|
1661
|
+
}
|
|
1662
|
+
get internalValue() {
|
|
1663
|
+
let hasAnyValues = this.isEmptyObject;
|
|
1664
|
+
const internalValueResult = {};
|
|
1665
|
+
if (this._authenticationFlowTransferMethods !== undefined) {
|
|
1666
|
+
hasAnyValues = true;
|
|
1667
|
+
internalValueResult.authenticationFlowTransferMethods = this._authenticationFlowTransferMethods;
|
|
1668
|
+
}
|
|
1669
|
+
if (this._clientAppTypes !== undefined) {
|
|
1670
|
+
hasAnyValues = true;
|
|
1671
|
+
internalValueResult.clientAppTypes = this._clientAppTypes;
|
|
1672
|
+
}
|
|
1673
|
+
if (this._insiderRiskLevels !== undefined) {
|
|
1674
|
+
hasAnyValues = true;
|
|
1675
|
+
internalValueResult.insiderRiskLevels = this._insiderRiskLevels;
|
|
1676
|
+
}
|
|
1677
|
+
if (this._servicePrincipalRiskLevels !== undefined) {
|
|
1678
|
+
hasAnyValues = true;
|
|
1679
|
+
internalValueResult.servicePrincipalRiskLevels = this._servicePrincipalRiskLevels;
|
|
1680
|
+
}
|
|
1681
|
+
if (this._signInRiskLevels !== undefined) {
|
|
1682
|
+
hasAnyValues = true;
|
|
1683
|
+
internalValueResult.signInRiskLevels = this._signInRiskLevels;
|
|
1684
|
+
}
|
|
1685
|
+
if (this._userRiskLevels !== undefined) {
|
|
1686
|
+
hasAnyValues = true;
|
|
1687
|
+
internalValueResult.userRiskLevels = this._userRiskLevels;
|
|
1688
|
+
}
|
|
1689
|
+
if (this._applications?.internalValue !== undefined) {
|
|
1690
|
+
hasAnyValues = true;
|
|
1691
|
+
internalValueResult.applications = this._applications?.internalValue;
|
|
1692
|
+
}
|
|
1693
|
+
if (this._clientApplications?.internalValue !== undefined) {
|
|
1694
|
+
hasAnyValues = true;
|
|
1695
|
+
internalValueResult.clientApplications = this._clientApplications?.internalValue;
|
|
1696
|
+
}
|
|
1697
|
+
if (this._devices?.internalValue !== undefined) {
|
|
1698
|
+
hasAnyValues = true;
|
|
1699
|
+
internalValueResult.devices = this._devices?.internalValue;
|
|
1700
|
+
}
|
|
1701
|
+
if (this._locations?.internalValue !== undefined) {
|
|
1702
|
+
hasAnyValues = true;
|
|
1703
|
+
internalValueResult.locations = this._locations?.internalValue;
|
|
1704
|
+
}
|
|
1705
|
+
if (this._platforms?.internalValue !== undefined) {
|
|
1706
|
+
hasAnyValues = true;
|
|
1707
|
+
internalValueResult.platforms = this._platforms?.internalValue;
|
|
1708
|
+
}
|
|
1709
|
+
if (this._users?.internalValue !== undefined) {
|
|
1710
|
+
hasAnyValues = true;
|
|
1711
|
+
internalValueResult.users = this._users?.internalValue;
|
|
1712
|
+
}
|
|
1713
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
1714
|
+
}
|
|
1715
|
+
set internalValue(value) {
|
|
1716
|
+
if (value === undefined) {
|
|
1717
|
+
this.isEmptyObject = false;
|
|
1718
|
+
this._authenticationFlowTransferMethods = undefined;
|
|
1719
|
+
this._clientAppTypes = undefined;
|
|
1720
|
+
this._insiderRiskLevels = undefined;
|
|
1721
|
+
this._servicePrincipalRiskLevels = undefined;
|
|
1722
|
+
this._signInRiskLevels = undefined;
|
|
1723
|
+
this._userRiskLevels = undefined;
|
|
1724
|
+
this._applications.internalValue = undefined;
|
|
1725
|
+
this._clientApplications.internalValue = undefined;
|
|
1726
|
+
this._devices.internalValue = undefined;
|
|
1727
|
+
this._locations.internalValue = undefined;
|
|
1728
|
+
this._platforms.internalValue = undefined;
|
|
1729
|
+
this._users.internalValue = undefined;
|
|
1730
|
+
}
|
|
1731
|
+
else {
|
|
1732
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1733
|
+
this._authenticationFlowTransferMethods = value.authenticationFlowTransferMethods;
|
|
1734
|
+
this._clientAppTypes = value.clientAppTypes;
|
|
1735
|
+
this._insiderRiskLevels = value.insiderRiskLevels;
|
|
1736
|
+
this._servicePrincipalRiskLevels = value.servicePrincipalRiskLevels;
|
|
1737
|
+
this._signInRiskLevels = value.signInRiskLevels;
|
|
1738
|
+
this._userRiskLevels = value.userRiskLevels;
|
|
1739
|
+
this._applications.internalValue = value.applications;
|
|
1740
|
+
this._clientApplications.internalValue = value.clientApplications;
|
|
1741
|
+
this._devices.internalValue = value.devices;
|
|
1742
|
+
this._locations.internalValue = value.locations;
|
|
1743
|
+
this._platforms.internalValue = value.platforms;
|
|
1744
|
+
this._users.internalValue = value.users;
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
get authenticationFlowTransferMethods() {
|
|
1748
|
+
return cdktn.Fn.tolist(this.getListAttribute('authentication_flow_transfer_methods'));
|
|
1749
|
+
}
|
|
1750
|
+
set authenticationFlowTransferMethods(value) {
|
|
1751
|
+
this._authenticationFlowTransferMethods = value;
|
|
1752
|
+
}
|
|
1753
|
+
resetAuthenticationFlowTransferMethods() {
|
|
1754
|
+
this._authenticationFlowTransferMethods = undefined;
|
|
1755
|
+
}
|
|
1756
|
+
// Temporarily expose input value. Use with caution.
|
|
1757
|
+
get authenticationFlowTransferMethodsInput() {
|
|
1758
|
+
return this._authenticationFlowTransferMethods;
|
|
1759
|
+
}
|
|
1760
|
+
get clientAppTypes() {
|
|
1761
|
+
return this.getListAttribute('client_app_types');
|
|
1762
|
+
}
|
|
1763
|
+
set clientAppTypes(value) {
|
|
1764
|
+
this._clientAppTypes = value;
|
|
1765
|
+
}
|
|
1766
|
+
// Temporarily expose input value. Use with caution.
|
|
1767
|
+
get clientAppTypesInput() {
|
|
1768
|
+
return this._clientAppTypes;
|
|
1769
|
+
}
|
|
1770
|
+
get insiderRiskLevels() {
|
|
1771
|
+
return this.getStringAttribute('insider_risk_levels');
|
|
1772
|
+
}
|
|
1773
|
+
set insiderRiskLevels(value) {
|
|
1774
|
+
this._insiderRiskLevels = value;
|
|
1775
|
+
}
|
|
1776
|
+
resetInsiderRiskLevels() {
|
|
1777
|
+
this._insiderRiskLevels = undefined;
|
|
1778
|
+
}
|
|
1779
|
+
// Temporarily expose input value. Use with caution.
|
|
1780
|
+
get insiderRiskLevelsInput() {
|
|
1781
|
+
return this._insiderRiskLevels;
|
|
1782
|
+
}
|
|
1783
|
+
get servicePrincipalRiskLevels() {
|
|
1784
|
+
return this.getListAttribute('service_principal_risk_levels');
|
|
1785
|
+
}
|
|
1786
|
+
set servicePrincipalRiskLevels(value) {
|
|
1787
|
+
this._servicePrincipalRiskLevels = value;
|
|
1788
|
+
}
|
|
1789
|
+
resetServicePrincipalRiskLevels() {
|
|
1790
|
+
this._servicePrincipalRiskLevels = undefined;
|
|
1791
|
+
}
|
|
1792
|
+
// Temporarily expose input value. Use with caution.
|
|
1793
|
+
get servicePrincipalRiskLevelsInput() {
|
|
1794
|
+
return this._servicePrincipalRiskLevels;
|
|
1795
|
+
}
|
|
1796
|
+
get signInRiskLevels() {
|
|
1797
|
+
return this.getListAttribute('sign_in_risk_levels');
|
|
1798
|
+
}
|
|
1799
|
+
set signInRiskLevels(value) {
|
|
1800
|
+
this._signInRiskLevels = value;
|
|
1801
|
+
}
|
|
1802
|
+
resetSignInRiskLevels() {
|
|
1803
|
+
this._signInRiskLevels = undefined;
|
|
1804
|
+
}
|
|
1805
|
+
// Temporarily expose input value. Use with caution.
|
|
1806
|
+
get signInRiskLevelsInput() {
|
|
1807
|
+
return this._signInRiskLevels;
|
|
1808
|
+
}
|
|
1809
|
+
get userRiskLevels() {
|
|
1810
|
+
return this.getListAttribute('user_risk_levels');
|
|
1811
|
+
}
|
|
1812
|
+
set userRiskLevels(value) {
|
|
1813
|
+
this._userRiskLevels = value;
|
|
1814
|
+
}
|
|
1815
|
+
resetUserRiskLevels() {
|
|
1816
|
+
this._userRiskLevels = undefined;
|
|
1817
|
+
}
|
|
1818
|
+
// Temporarily expose input value. Use with caution.
|
|
1819
|
+
get userRiskLevelsInput() {
|
|
1820
|
+
return this._userRiskLevels;
|
|
1821
|
+
}
|
|
1822
|
+
get applications() {
|
|
1823
|
+
return this._applications;
|
|
1824
|
+
}
|
|
1825
|
+
putApplications(value) {
|
|
1826
|
+
this._applications.internalValue = value;
|
|
1827
|
+
}
|
|
1828
|
+
// Temporarily expose input value. Use with caution.
|
|
1829
|
+
get applicationsInput() {
|
|
1830
|
+
return this._applications.internalValue;
|
|
1831
|
+
}
|
|
1832
|
+
get clientApplications() {
|
|
1833
|
+
return this._clientApplications;
|
|
1834
|
+
}
|
|
1835
|
+
putClientApplications(value) {
|
|
1836
|
+
this._clientApplications.internalValue = value;
|
|
1837
|
+
}
|
|
1838
|
+
resetClientApplications() {
|
|
1839
|
+
this._clientApplications.internalValue = undefined;
|
|
1840
|
+
}
|
|
1841
|
+
// Temporarily expose input value. Use with caution.
|
|
1842
|
+
get clientApplicationsInput() {
|
|
1843
|
+
return this._clientApplications.internalValue;
|
|
1844
|
+
}
|
|
1845
|
+
get devices() {
|
|
1846
|
+
return this._devices;
|
|
1847
|
+
}
|
|
1848
|
+
putDevices(value) {
|
|
1849
|
+
this._devices.internalValue = value;
|
|
1850
|
+
}
|
|
1851
|
+
resetDevices() {
|
|
1852
|
+
this._devices.internalValue = undefined;
|
|
1853
|
+
}
|
|
1854
|
+
// Temporarily expose input value. Use with caution.
|
|
1855
|
+
get devicesInput() {
|
|
1856
|
+
return this._devices.internalValue;
|
|
1857
|
+
}
|
|
1858
|
+
get locations() {
|
|
1859
|
+
return this._locations;
|
|
1860
|
+
}
|
|
1861
|
+
putLocations(value) {
|
|
1862
|
+
this._locations.internalValue = value;
|
|
1863
|
+
}
|
|
1864
|
+
resetLocations() {
|
|
1865
|
+
this._locations.internalValue = undefined;
|
|
1866
|
+
}
|
|
1867
|
+
// Temporarily expose input value. Use with caution.
|
|
1868
|
+
get locationsInput() {
|
|
1869
|
+
return this._locations.internalValue;
|
|
1870
|
+
}
|
|
1871
|
+
get platforms() {
|
|
1872
|
+
return this._platforms;
|
|
1873
|
+
}
|
|
1874
|
+
putPlatforms(value) {
|
|
1875
|
+
this._platforms.internalValue = value;
|
|
1876
|
+
}
|
|
1877
|
+
resetPlatforms() {
|
|
1878
|
+
this._platforms.internalValue = undefined;
|
|
1879
|
+
}
|
|
1880
|
+
// Temporarily expose input value. Use with caution.
|
|
1881
|
+
get platformsInput() {
|
|
1882
|
+
return this._platforms.internalValue;
|
|
1883
|
+
}
|
|
1884
|
+
get users() {
|
|
1885
|
+
return this._users;
|
|
1886
|
+
}
|
|
1887
|
+
putUsers(value) {
|
|
1888
|
+
this._users.internalValue = value;
|
|
1889
|
+
}
|
|
1890
|
+
// Temporarily expose input value. Use with caution.
|
|
1891
|
+
get usersInput() {
|
|
1892
|
+
return this._users.internalValue;
|
|
1893
|
+
}
|
|
1894
|
+
}
|
|
1895
|
+
exports.ConditionalAccessPolicyConditionsOutputReference = ConditionalAccessPolicyConditionsOutputReference;
|
|
1896
|
+
_s = JSII_RTTI_SYMBOL_1;
|
|
1897
|
+
ConditionalAccessPolicyConditionsOutputReference[_s] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsOutputReference", version: "15.0.0" };
|
|
1898
|
+
function conditionalAccessPolicyGrantControlsToTerraform(struct) {
|
|
1899
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1900
|
+
return struct;
|
|
1901
|
+
}
|
|
1902
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1903
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1904
|
+
}
|
|
1905
|
+
return {
|
|
1906
|
+
authentication_strength_policy_id: cdktn.stringToTerraform(struct.authenticationStrengthPolicyId),
|
|
1907
|
+
built_in_controls: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.builtInControls),
|
|
1908
|
+
custom_authentication_factors: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.customAuthenticationFactors),
|
|
1909
|
+
operator: cdktn.stringToTerraform(struct.operator),
|
|
1910
|
+
terms_of_use: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.termsOfUse),
|
|
1911
|
+
};
|
|
1912
|
+
}
|
|
1913
|
+
function conditionalAccessPolicyGrantControlsToHclTerraform(struct) {
|
|
1914
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1915
|
+
return struct;
|
|
1916
|
+
}
|
|
1917
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1918
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1919
|
+
}
|
|
1920
|
+
const attrs = {
|
|
1921
|
+
authentication_strength_policy_id: {
|
|
1922
|
+
value: cdktn.stringToHclTerraform(struct.authenticationStrengthPolicyId),
|
|
1923
|
+
isBlock: false,
|
|
1924
|
+
type: "simple",
|
|
1925
|
+
storageClassType: "string",
|
|
1926
|
+
},
|
|
1927
|
+
built_in_controls: {
|
|
1928
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.builtInControls),
|
|
1929
|
+
isBlock: false,
|
|
1930
|
+
type: "list",
|
|
1931
|
+
storageClassType: "stringList",
|
|
1932
|
+
},
|
|
1933
|
+
custom_authentication_factors: {
|
|
1934
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.customAuthenticationFactors),
|
|
1935
|
+
isBlock: false,
|
|
1936
|
+
type: "list",
|
|
1937
|
+
storageClassType: "stringList",
|
|
1938
|
+
},
|
|
1939
|
+
operator: {
|
|
1940
|
+
value: cdktn.stringToHclTerraform(struct.operator),
|
|
1941
|
+
isBlock: false,
|
|
1942
|
+
type: "simple",
|
|
1943
|
+
storageClassType: "string",
|
|
1944
|
+
},
|
|
1945
|
+
terms_of_use: {
|
|
1946
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.termsOfUse),
|
|
1947
|
+
isBlock: false,
|
|
1948
|
+
type: "list",
|
|
1949
|
+
storageClassType: "stringList",
|
|
1950
|
+
},
|
|
1951
|
+
};
|
|
1952
|
+
// remove undefined attributes
|
|
1953
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1954
|
+
}
|
|
1955
|
+
class ConditionalAccessPolicyGrantControlsOutputReference extends cdktn.ComplexObject {
|
|
1956
|
+
/**
|
|
1957
|
+
* @param terraformResource The parent resource
|
|
1958
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1959
|
+
*/
|
|
1960
|
+
constructor(terraformResource, terraformAttribute) {
|
|
1961
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
1962
|
+
this.isEmptyObject = false;
|
|
1963
|
+
}
|
|
1964
|
+
get internalValue() {
|
|
1965
|
+
let hasAnyValues = this.isEmptyObject;
|
|
1966
|
+
const internalValueResult = {};
|
|
1967
|
+
if (this._authenticationStrengthPolicyId !== undefined) {
|
|
1968
|
+
hasAnyValues = true;
|
|
1969
|
+
internalValueResult.authenticationStrengthPolicyId = this._authenticationStrengthPolicyId;
|
|
1970
|
+
}
|
|
1971
|
+
if (this._builtInControls !== undefined) {
|
|
1972
|
+
hasAnyValues = true;
|
|
1973
|
+
internalValueResult.builtInControls = this._builtInControls;
|
|
1974
|
+
}
|
|
1975
|
+
if (this._customAuthenticationFactors !== undefined) {
|
|
1976
|
+
hasAnyValues = true;
|
|
1977
|
+
internalValueResult.customAuthenticationFactors = this._customAuthenticationFactors;
|
|
1978
|
+
}
|
|
1979
|
+
if (this._operator !== undefined) {
|
|
1980
|
+
hasAnyValues = true;
|
|
1981
|
+
internalValueResult.operator = this._operator;
|
|
1982
|
+
}
|
|
1983
|
+
if (this._termsOfUse !== undefined) {
|
|
1984
|
+
hasAnyValues = true;
|
|
1985
|
+
internalValueResult.termsOfUse = this._termsOfUse;
|
|
1986
|
+
}
|
|
1987
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
1988
|
+
}
|
|
1989
|
+
set internalValue(value) {
|
|
1990
|
+
if (value === undefined) {
|
|
1991
|
+
this.isEmptyObject = false;
|
|
1992
|
+
this._authenticationStrengthPolicyId = undefined;
|
|
1993
|
+
this._builtInControls = undefined;
|
|
1994
|
+
this._customAuthenticationFactors = undefined;
|
|
1995
|
+
this._operator = undefined;
|
|
1996
|
+
this._termsOfUse = undefined;
|
|
1997
|
+
}
|
|
1998
|
+
else {
|
|
1999
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
2000
|
+
this._authenticationStrengthPolicyId = value.authenticationStrengthPolicyId;
|
|
2001
|
+
this._builtInControls = value.builtInControls;
|
|
2002
|
+
this._customAuthenticationFactors = value.customAuthenticationFactors;
|
|
2003
|
+
this._operator = value.operator;
|
|
2004
|
+
this._termsOfUse = value.termsOfUse;
|
|
2005
|
+
}
|
|
2006
|
+
}
|
|
2007
|
+
get authenticationStrengthPolicyId() {
|
|
2008
|
+
return this.getStringAttribute('authentication_strength_policy_id');
|
|
2009
|
+
}
|
|
2010
|
+
set authenticationStrengthPolicyId(value) {
|
|
2011
|
+
this._authenticationStrengthPolicyId = value;
|
|
2012
|
+
}
|
|
2013
|
+
resetAuthenticationStrengthPolicyId() {
|
|
2014
|
+
this._authenticationStrengthPolicyId = undefined;
|
|
2015
|
+
}
|
|
2016
|
+
// Temporarily expose input value. Use with caution.
|
|
2017
|
+
get authenticationStrengthPolicyIdInput() {
|
|
2018
|
+
return this._authenticationStrengthPolicyId;
|
|
2019
|
+
}
|
|
2020
|
+
get builtInControls() {
|
|
2021
|
+
return this.getListAttribute('built_in_controls');
|
|
2022
|
+
}
|
|
2023
|
+
set builtInControls(value) {
|
|
2024
|
+
this._builtInControls = value;
|
|
2025
|
+
}
|
|
2026
|
+
resetBuiltInControls() {
|
|
2027
|
+
this._builtInControls = undefined;
|
|
2028
|
+
}
|
|
2029
|
+
// Temporarily expose input value. Use with caution.
|
|
2030
|
+
get builtInControlsInput() {
|
|
2031
|
+
return this._builtInControls;
|
|
2032
|
+
}
|
|
2033
|
+
get customAuthenticationFactors() {
|
|
2034
|
+
return this.getListAttribute('custom_authentication_factors');
|
|
2035
|
+
}
|
|
2036
|
+
set customAuthenticationFactors(value) {
|
|
2037
|
+
this._customAuthenticationFactors = value;
|
|
2038
|
+
}
|
|
2039
|
+
resetCustomAuthenticationFactors() {
|
|
2040
|
+
this._customAuthenticationFactors = undefined;
|
|
2041
|
+
}
|
|
2042
|
+
// Temporarily expose input value. Use with caution.
|
|
2043
|
+
get customAuthenticationFactorsInput() {
|
|
2044
|
+
return this._customAuthenticationFactors;
|
|
2045
|
+
}
|
|
2046
|
+
get operator() {
|
|
2047
|
+
return this.getStringAttribute('operator');
|
|
2048
|
+
}
|
|
2049
|
+
set operator(value) {
|
|
2050
|
+
this._operator = value;
|
|
2051
|
+
}
|
|
2052
|
+
// Temporarily expose input value. Use with caution.
|
|
2053
|
+
get operatorInput() {
|
|
2054
|
+
return this._operator;
|
|
2055
|
+
}
|
|
2056
|
+
get termsOfUse() {
|
|
2057
|
+
return this.getListAttribute('terms_of_use');
|
|
2058
|
+
}
|
|
2059
|
+
set termsOfUse(value) {
|
|
2060
|
+
this._termsOfUse = value;
|
|
2061
|
+
}
|
|
2062
|
+
resetTermsOfUse() {
|
|
2063
|
+
this._termsOfUse = undefined;
|
|
2064
|
+
}
|
|
2065
|
+
// Temporarily expose input value. Use with caution.
|
|
2066
|
+
get termsOfUseInput() {
|
|
2067
|
+
return this._termsOfUse;
|
|
2068
|
+
}
|
|
2069
|
+
}
|
|
2070
|
+
exports.ConditionalAccessPolicyGrantControlsOutputReference = ConditionalAccessPolicyGrantControlsOutputReference;
|
|
2071
|
+
_t = JSII_RTTI_SYMBOL_1;
|
|
2072
|
+
ConditionalAccessPolicyGrantControlsOutputReference[_t] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyGrantControlsOutputReference", version: "15.0.0" };
|
|
2073
|
+
function conditionalAccessPolicySessionControlsToTerraform(struct) {
|
|
2074
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
2075
|
+
return struct;
|
|
2076
|
+
}
|
|
2077
|
+
if (cdktn.isComplexElement(struct)) {
|
|
2078
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
2079
|
+
}
|
|
2080
|
+
return {
|
|
2081
|
+
application_enforced_restrictions_enabled: cdktn.booleanToTerraform(struct.applicationEnforcedRestrictionsEnabled),
|
|
2082
|
+
cloud_app_security_policy: cdktn.stringToTerraform(struct.cloudAppSecurityPolicy),
|
|
2083
|
+
disable_resilience_defaults: cdktn.booleanToTerraform(struct.disableResilienceDefaults),
|
|
2084
|
+
persistent_browser_mode: cdktn.stringToTerraform(struct.persistentBrowserMode),
|
|
2085
|
+
sign_in_frequency: cdktn.numberToTerraform(struct.signInFrequency),
|
|
2086
|
+
sign_in_frequency_authentication_type: cdktn.stringToTerraform(struct.signInFrequencyAuthenticationType),
|
|
2087
|
+
sign_in_frequency_interval: cdktn.stringToTerraform(struct.signInFrequencyInterval),
|
|
2088
|
+
sign_in_frequency_period: cdktn.stringToTerraform(struct.signInFrequencyPeriod),
|
|
2089
|
+
};
|
|
2090
|
+
}
|
|
2091
|
+
function conditionalAccessPolicySessionControlsToHclTerraform(struct) {
|
|
2092
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
2093
|
+
return struct;
|
|
2094
|
+
}
|
|
2095
|
+
if (cdktn.isComplexElement(struct)) {
|
|
2096
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
2097
|
+
}
|
|
2098
|
+
const attrs = {
|
|
2099
|
+
application_enforced_restrictions_enabled: {
|
|
2100
|
+
value: cdktn.booleanToHclTerraform(struct.applicationEnforcedRestrictionsEnabled),
|
|
2101
|
+
isBlock: false,
|
|
2102
|
+
type: "simple",
|
|
2103
|
+
storageClassType: "boolean",
|
|
2104
|
+
},
|
|
2105
|
+
cloud_app_security_policy: {
|
|
2106
|
+
value: cdktn.stringToHclTerraform(struct.cloudAppSecurityPolicy),
|
|
2107
|
+
isBlock: false,
|
|
2108
|
+
type: "simple",
|
|
2109
|
+
storageClassType: "string",
|
|
2110
|
+
},
|
|
2111
|
+
disable_resilience_defaults: {
|
|
2112
|
+
value: cdktn.booleanToHclTerraform(struct.disableResilienceDefaults),
|
|
2113
|
+
isBlock: false,
|
|
2114
|
+
type: "simple",
|
|
2115
|
+
storageClassType: "boolean",
|
|
2116
|
+
},
|
|
2117
|
+
persistent_browser_mode: {
|
|
2118
|
+
value: cdktn.stringToHclTerraform(struct.persistentBrowserMode),
|
|
2119
|
+
isBlock: false,
|
|
2120
|
+
type: "simple",
|
|
2121
|
+
storageClassType: "string",
|
|
2122
|
+
},
|
|
2123
|
+
sign_in_frequency: {
|
|
2124
|
+
value: cdktn.numberToHclTerraform(struct.signInFrequency),
|
|
2125
|
+
isBlock: false,
|
|
2126
|
+
type: "simple",
|
|
2127
|
+
storageClassType: "number",
|
|
2128
|
+
},
|
|
2129
|
+
sign_in_frequency_authentication_type: {
|
|
2130
|
+
value: cdktn.stringToHclTerraform(struct.signInFrequencyAuthenticationType),
|
|
2131
|
+
isBlock: false,
|
|
2132
|
+
type: "simple",
|
|
2133
|
+
storageClassType: "string",
|
|
2134
|
+
},
|
|
2135
|
+
sign_in_frequency_interval: {
|
|
2136
|
+
value: cdktn.stringToHclTerraform(struct.signInFrequencyInterval),
|
|
2137
|
+
isBlock: false,
|
|
2138
|
+
type: "simple",
|
|
2139
|
+
storageClassType: "string",
|
|
2140
|
+
},
|
|
2141
|
+
sign_in_frequency_period: {
|
|
2142
|
+
value: cdktn.stringToHclTerraform(struct.signInFrequencyPeriod),
|
|
2143
|
+
isBlock: false,
|
|
2144
|
+
type: "simple",
|
|
2145
|
+
storageClassType: "string",
|
|
2146
|
+
},
|
|
2147
|
+
};
|
|
2148
|
+
// remove undefined attributes
|
|
2149
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
2150
|
+
}
|
|
2151
|
+
class ConditionalAccessPolicySessionControlsOutputReference extends cdktn.ComplexObject {
|
|
2152
|
+
/**
|
|
2153
|
+
* @param terraformResource The parent resource
|
|
2154
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
2155
|
+
*/
|
|
2156
|
+
constructor(terraformResource, terraformAttribute) {
|
|
2157
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
2158
|
+
this.isEmptyObject = false;
|
|
2159
|
+
}
|
|
2160
|
+
get internalValue() {
|
|
2161
|
+
let hasAnyValues = this.isEmptyObject;
|
|
2162
|
+
const internalValueResult = {};
|
|
2163
|
+
if (this._applicationEnforcedRestrictionsEnabled !== undefined) {
|
|
2164
|
+
hasAnyValues = true;
|
|
2165
|
+
internalValueResult.applicationEnforcedRestrictionsEnabled = this._applicationEnforcedRestrictionsEnabled;
|
|
2166
|
+
}
|
|
2167
|
+
if (this._cloudAppSecurityPolicy !== undefined) {
|
|
2168
|
+
hasAnyValues = true;
|
|
2169
|
+
internalValueResult.cloudAppSecurityPolicy = this._cloudAppSecurityPolicy;
|
|
2170
|
+
}
|
|
2171
|
+
if (this._disableResilienceDefaults !== undefined) {
|
|
2172
|
+
hasAnyValues = true;
|
|
2173
|
+
internalValueResult.disableResilienceDefaults = this._disableResilienceDefaults;
|
|
2174
|
+
}
|
|
2175
|
+
if (this._persistentBrowserMode !== undefined) {
|
|
2176
|
+
hasAnyValues = true;
|
|
2177
|
+
internalValueResult.persistentBrowserMode = this._persistentBrowserMode;
|
|
2178
|
+
}
|
|
2179
|
+
if (this._signInFrequency !== undefined) {
|
|
2180
|
+
hasAnyValues = true;
|
|
2181
|
+
internalValueResult.signInFrequency = this._signInFrequency;
|
|
2182
|
+
}
|
|
2183
|
+
if (this._signInFrequencyAuthenticationType !== undefined) {
|
|
2184
|
+
hasAnyValues = true;
|
|
2185
|
+
internalValueResult.signInFrequencyAuthenticationType = this._signInFrequencyAuthenticationType;
|
|
2186
|
+
}
|
|
2187
|
+
if (this._signInFrequencyInterval !== undefined) {
|
|
2188
|
+
hasAnyValues = true;
|
|
2189
|
+
internalValueResult.signInFrequencyInterval = this._signInFrequencyInterval;
|
|
2190
|
+
}
|
|
2191
|
+
if (this._signInFrequencyPeriod !== undefined) {
|
|
2192
|
+
hasAnyValues = true;
|
|
2193
|
+
internalValueResult.signInFrequencyPeriod = this._signInFrequencyPeriod;
|
|
2194
|
+
}
|
|
2195
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
2196
|
+
}
|
|
2197
|
+
set internalValue(value) {
|
|
2198
|
+
if (value === undefined) {
|
|
2199
|
+
this.isEmptyObject = false;
|
|
2200
|
+
this._applicationEnforcedRestrictionsEnabled = undefined;
|
|
2201
|
+
this._cloudAppSecurityPolicy = undefined;
|
|
2202
|
+
this._disableResilienceDefaults = undefined;
|
|
2203
|
+
this._persistentBrowserMode = undefined;
|
|
2204
|
+
this._signInFrequency = undefined;
|
|
2205
|
+
this._signInFrequencyAuthenticationType = undefined;
|
|
2206
|
+
this._signInFrequencyInterval = undefined;
|
|
2207
|
+
this._signInFrequencyPeriod = undefined;
|
|
2208
|
+
}
|
|
2209
|
+
else {
|
|
2210
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
2211
|
+
this._applicationEnforcedRestrictionsEnabled = value.applicationEnforcedRestrictionsEnabled;
|
|
2212
|
+
this._cloudAppSecurityPolicy = value.cloudAppSecurityPolicy;
|
|
2213
|
+
this._disableResilienceDefaults = value.disableResilienceDefaults;
|
|
2214
|
+
this._persistentBrowserMode = value.persistentBrowserMode;
|
|
2215
|
+
this._signInFrequency = value.signInFrequency;
|
|
2216
|
+
this._signInFrequencyAuthenticationType = value.signInFrequencyAuthenticationType;
|
|
2217
|
+
this._signInFrequencyInterval = value.signInFrequencyInterval;
|
|
2218
|
+
this._signInFrequencyPeriod = value.signInFrequencyPeriod;
|
|
2219
|
+
}
|
|
2220
|
+
}
|
|
2221
|
+
get applicationEnforcedRestrictionsEnabled() {
|
|
2222
|
+
return this.getBooleanAttribute('application_enforced_restrictions_enabled');
|
|
2223
|
+
}
|
|
2224
|
+
set applicationEnforcedRestrictionsEnabled(value) {
|
|
2225
|
+
this._applicationEnforcedRestrictionsEnabled = value;
|
|
2226
|
+
}
|
|
2227
|
+
resetApplicationEnforcedRestrictionsEnabled() {
|
|
2228
|
+
this._applicationEnforcedRestrictionsEnabled = undefined;
|
|
2229
|
+
}
|
|
2230
|
+
// Temporarily expose input value. Use with caution.
|
|
2231
|
+
get applicationEnforcedRestrictionsEnabledInput() {
|
|
2232
|
+
return this._applicationEnforcedRestrictionsEnabled;
|
|
2233
|
+
}
|
|
2234
|
+
get cloudAppSecurityPolicy() {
|
|
2235
|
+
return this.getStringAttribute('cloud_app_security_policy');
|
|
2236
|
+
}
|
|
2237
|
+
set cloudAppSecurityPolicy(value) {
|
|
2238
|
+
this._cloudAppSecurityPolicy = value;
|
|
2239
|
+
}
|
|
2240
|
+
resetCloudAppSecurityPolicy() {
|
|
2241
|
+
this._cloudAppSecurityPolicy = undefined;
|
|
2242
|
+
}
|
|
2243
|
+
// Temporarily expose input value. Use with caution.
|
|
2244
|
+
get cloudAppSecurityPolicyInput() {
|
|
2245
|
+
return this._cloudAppSecurityPolicy;
|
|
2246
|
+
}
|
|
2247
|
+
get disableResilienceDefaults() {
|
|
2248
|
+
return this.getBooleanAttribute('disable_resilience_defaults');
|
|
2249
|
+
}
|
|
2250
|
+
set disableResilienceDefaults(value) {
|
|
2251
|
+
this._disableResilienceDefaults = value;
|
|
2252
|
+
}
|
|
2253
|
+
resetDisableResilienceDefaults() {
|
|
2254
|
+
this._disableResilienceDefaults = undefined;
|
|
2255
|
+
}
|
|
2256
|
+
// Temporarily expose input value. Use with caution.
|
|
2257
|
+
get disableResilienceDefaultsInput() {
|
|
2258
|
+
return this._disableResilienceDefaults;
|
|
2259
|
+
}
|
|
2260
|
+
get persistentBrowserMode() {
|
|
2261
|
+
return this.getStringAttribute('persistent_browser_mode');
|
|
2262
|
+
}
|
|
2263
|
+
set persistentBrowserMode(value) {
|
|
2264
|
+
this._persistentBrowserMode = value;
|
|
2265
|
+
}
|
|
2266
|
+
resetPersistentBrowserMode() {
|
|
2267
|
+
this._persistentBrowserMode = undefined;
|
|
2268
|
+
}
|
|
2269
|
+
// Temporarily expose input value. Use with caution.
|
|
2270
|
+
get persistentBrowserModeInput() {
|
|
2271
|
+
return this._persistentBrowserMode;
|
|
2272
|
+
}
|
|
2273
|
+
get signInFrequency() {
|
|
2274
|
+
return this.getNumberAttribute('sign_in_frequency');
|
|
2275
|
+
}
|
|
2276
|
+
set signInFrequency(value) {
|
|
2277
|
+
this._signInFrequency = value;
|
|
2278
|
+
}
|
|
2279
|
+
resetSignInFrequency() {
|
|
2280
|
+
this._signInFrequency = undefined;
|
|
2281
|
+
}
|
|
2282
|
+
// Temporarily expose input value. Use with caution.
|
|
2283
|
+
get signInFrequencyInput() {
|
|
2284
|
+
return this._signInFrequency;
|
|
2285
|
+
}
|
|
2286
|
+
get signInFrequencyAuthenticationType() {
|
|
2287
|
+
return this.getStringAttribute('sign_in_frequency_authentication_type');
|
|
2288
|
+
}
|
|
2289
|
+
set signInFrequencyAuthenticationType(value) {
|
|
2290
|
+
this._signInFrequencyAuthenticationType = value;
|
|
2291
|
+
}
|
|
2292
|
+
resetSignInFrequencyAuthenticationType() {
|
|
2293
|
+
this._signInFrequencyAuthenticationType = undefined;
|
|
2294
|
+
}
|
|
2295
|
+
// Temporarily expose input value. Use with caution.
|
|
2296
|
+
get signInFrequencyAuthenticationTypeInput() {
|
|
2297
|
+
return this._signInFrequencyAuthenticationType;
|
|
2298
|
+
}
|
|
2299
|
+
get signInFrequencyInterval() {
|
|
2300
|
+
return this.getStringAttribute('sign_in_frequency_interval');
|
|
2301
|
+
}
|
|
2302
|
+
set signInFrequencyInterval(value) {
|
|
2303
|
+
this._signInFrequencyInterval = value;
|
|
2304
|
+
}
|
|
2305
|
+
resetSignInFrequencyInterval() {
|
|
2306
|
+
this._signInFrequencyInterval = undefined;
|
|
2307
|
+
}
|
|
2308
|
+
// Temporarily expose input value. Use with caution.
|
|
2309
|
+
get signInFrequencyIntervalInput() {
|
|
2310
|
+
return this._signInFrequencyInterval;
|
|
2311
|
+
}
|
|
2312
|
+
get signInFrequencyPeriod() {
|
|
2313
|
+
return this.getStringAttribute('sign_in_frequency_period');
|
|
2314
|
+
}
|
|
2315
|
+
set signInFrequencyPeriod(value) {
|
|
2316
|
+
this._signInFrequencyPeriod = value;
|
|
2317
|
+
}
|
|
2318
|
+
resetSignInFrequencyPeriod() {
|
|
2319
|
+
this._signInFrequencyPeriod = undefined;
|
|
2320
|
+
}
|
|
2321
|
+
// Temporarily expose input value. Use with caution.
|
|
2322
|
+
get signInFrequencyPeriodInput() {
|
|
2323
|
+
return this._signInFrequencyPeriod;
|
|
2324
|
+
}
|
|
2325
|
+
}
|
|
2326
|
+
exports.ConditionalAccessPolicySessionControlsOutputReference = ConditionalAccessPolicySessionControlsOutputReference;
|
|
2327
|
+
_u = JSII_RTTI_SYMBOL_1;
|
|
2328
|
+
ConditionalAccessPolicySessionControlsOutputReference[_u] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicySessionControlsOutputReference", version: "15.0.0" };
|
|
2329
|
+
function conditionalAccessPolicyTimeoutsToTerraform(struct) {
|
|
2330
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
2331
|
+
return struct;
|
|
2332
|
+
}
|
|
2333
|
+
if (cdktn.isComplexElement(struct)) {
|
|
2334
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
2335
|
+
}
|
|
2336
|
+
return {
|
|
2337
|
+
create: cdktn.stringToTerraform(struct.create),
|
|
2338
|
+
delete: cdktn.stringToTerraform(struct.delete),
|
|
2339
|
+
read: cdktn.stringToTerraform(struct.read),
|
|
2340
|
+
update: cdktn.stringToTerraform(struct.update),
|
|
2341
|
+
};
|
|
2342
|
+
}
|
|
2343
|
+
function conditionalAccessPolicyTimeoutsToHclTerraform(struct) {
|
|
2344
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
2345
|
+
return struct;
|
|
2346
|
+
}
|
|
2347
|
+
if (cdktn.isComplexElement(struct)) {
|
|
2348
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
2349
|
+
}
|
|
2350
|
+
const attrs = {
|
|
2351
|
+
create: {
|
|
2352
|
+
value: cdktn.stringToHclTerraform(struct.create),
|
|
2353
|
+
isBlock: false,
|
|
2354
|
+
type: "simple",
|
|
2355
|
+
storageClassType: "string",
|
|
2356
|
+
},
|
|
2357
|
+
delete: {
|
|
2358
|
+
value: cdktn.stringToHclTerraform(struct.delete),
|
|
2359
|
+
isBlock: false,
|
|
2360
|
+
type: "simple",
|
|
2361
|
+
storageClassType: "string",
|
|
2362
|
+
},
|
|
2363
|
+
read: {
|
|
2364
|
+
value: cdktn.stringToHclTerraform(struct.read),
|
|
2365
|
+
isBlock: false,
|
|
2366
|
+
type: "simple",
|
|
2367
|
+
storageClassType: "string",
|
|
2368
|
+
},
|
|
2369
|
+
update: {
|
|
2370
|
+
value: cdktn.stringToHclTerraform(struct.update),
|
|
2371
|
+
isBlock: false,
|
|
2372
|
+
type: "simple",
|
|
2373
|
+
storageClassType: "string",
|
|
2374
|
+
},
|
|
2375
|
+
};
|
|
2376
|
+
// remove undefined attributes
|
|
2377
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
2378
|
+
}
|
|
2379
|
+
class ConditionalAccessPolicyTimeoutsOutputReference extends cdktn.ComplexObject {
|
|
2380
|
+
/**
|
|
2381
|
+
* @param terraformResource The parent resource
|
|
2382
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
2383
|
+
*/
|
|
2384
|
+
constructor(terraformResource, terraformAttribute) {
|
|
2385
|
+
super(terraformResource, terraformAttribute, false);
|
|
2386
|
+
this.isEmptyObject = false;
|
|
2387
|
+
}
|
|
2388
|
+
get internalValue() {
|
|
2389
|
+
if (this.resolvableValue) {
|
|
2390
|
+
return this.resolvableValue;
|
|
2391
|
+
}
|
|
2392
|
+
let hasAnyValues = this.isEmptyObject;
|
|
2393
|
+
const internalValueResult = {};
|
|
2394
|
+
if (this._create !== undefined) {
|
|
2395
|
+
hasAnyValues = true;
|
|
2396
|
+
internalValueResult.create = this._create;
|
|
2397
|
+
}
|
|
2398
|
+
if (this._delete !== undefined) {
|
|
2399
|
+
hasAnyValues = true;
|
|
2400
|
+
internalValueResult.delete = this._delete;
|
|
2401
|
+
}
|
|
2402
|
+
if (this._read !== undefined) {
|
|
2403
|
+
hasAnyValues = true;
|
|
2404
|
+
internalValueResult.read = this._read;
|
|
2405
|
+
}
|
|
2406
|
+
if (this._update !== undefined) {
|
|
2407
|
+
hasAnyValues = true;
|
|
2408
|
+
internalValueResult.update = this._update;
|
|
2409
|
+
}
|
|
2410
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
2411
|
+
}
|
|
2412
|
+
set internalValue(value) {
|
|
2413
|
+
if (value === undefined) {
|
|
2414
|
+
this.isEmptyObject = false;
|
|
2415
|
+
this.resolvableValue = undefined;
|
|
2416
|
+
this._create = undefined;
|
|
2417
|
+
this._delete = undefined;
|
|
2418
|
+
this._read = undefined;
|
|
2419
|
+
this._update = undefined;
|
|
2420
|
+
}
|
|
2421
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
2422
|
+
this.isEmptyObject = false;
|
|
2423
|
+
this.resolvableValue = value;
|
|
2424
|
+
}
|
|
2425
|
+
else {
|
|
2426
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
2427
|
+
this.resolvableValue = undefined;
|
|
2428
|
+
this._create = value.create;
|
|
2429
|
+
this._delete = value.delete;
|
|
2430
|
+
this._read = value.read;
|
|
2431
|
+
this._update = value.update;
|
|
2432
|
+
}
|
|
2433
|
+
}
|
|
2434
|
+
get create() {
|
|
2435
|
+
return this.getStringAttribute('create');
|
|
2436
|
+
}
|
|
2437
|
+
set create(value) {
|
|
2438
|
+
this._create = value;
|
|
2439
|
+
}
|
|
2440
|
+
resetCreate() {
|
|
2441
|
+
this._create = undefined;
|
|
2442
|
+
}
|
|
2443
|
+
// Temporarily expose input value. Use with caution.
|
|
2444
|
+
get createInput() {
|
|
2445
|
+
return this._create;
|
|
2446
|
+
}
|
|
2447
|
+
get delete() {
|
|
2448
|
+
return this.getStringAttribute('delete');
|
|
2449
|
+
}
|
|
2450
|
+
set delete(value) {
|
|
2451
|
+
this._delete = value;
|
|
2452
|
+
}
|
|
2453
|
+
resetDelete() {
|
|
2454
|
+
this._delete = undefined;
|
|
2455
|
+
}
|
|
2456
|
+
// Temporarily expose input value. Use with caution.
|
|
2457
|
+
get deleteInput() {
|
|
2458
|
+
return this._delete;
|
|
2459
|
+
}
|
|
2460
|
+
get read() {
|
|
2461
|
+
return this.getStringAttribute('read');
|
|
2462
|
+
}
|
|
2463
|
+
set read(value) {
|
|
2464
|
+
this._read = value;
|
|
2465
|
+
}
|
|
2466
|
+
resetRead() {
|
|
2467
|
+
this._read = undefined;
|
|
2468
|
+
}
|
|
2469
|
+
// Temporarily expose input value. Use with caution.
|
|
2470
|
+
get readInput() {
|
|
2471
|
+
return this._read;
|
|
2472
|
+
}
|
|
2473
|
+
get update() {
|
|
2474
|
+
return this.getStringAttribute('update');
|
|
2475
|
+
}
|
|
2476
|
+
set update(value) {
|
|
2477
|
+
this._update = value;
|
|
2478
|
+
}
|
|
2479
|
+
resetUpdate() {
|
|
2480
|
+
this._update = undefined;
|
|
2481
|
+
}
|
|
2482
|
+
// Temporarily expose input value. Use with caution.
|
|
2483
|
+
get updateInput() {
|
|
2484
|
+
return this._update;
|
|
2485
|
+
}
|
|
2486
|
+
}
|
|
2487
|
+
exports.ConditionalAccessPolicyTimeoutsOutputReference = ConditionalAccessPolicyTimeoutsOutputReference;
|
|
2488
|
+
_v = JSII_RTTI_SYMBOL_1;
|
|
2489
|
+
ConditionalAccessPolicyTimeoutsOutputReference[_v] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyTimeoutsOutputReference", version: "15.0.0" };
|
|
2490
|
+
/**
|
|
2491
|
+
* Represents a {@link https://registry.terraform.io/providers/hashicorp/azuread/3.7.0/docs/resources/conditional_access_policy azuread_conditional_access_policy}
|
|
2492
|
+
*/
|
|
2493
|
+
class ConditionalAccessPolicy extends cdktn.TerraformResource {
|
|
2494
|
+
// ==============
|
|
2495
|
+
// STATIC Methods
|
|
2496
|
+
// ==============
|
|
2497
|
+
/**
|
|
2498
|
+
* Generates CDKTN code for importing a ConditionalAccessPolicy resource upon running "cdktn plan <stack-name>"
|
|
2499
|
+
* @param scope The scope in which to define this construct
|
|
2500
|
+
* @param importToId The construct id used in the generated config for the ConditionalAccessPolicy to import
|
|
2501
|
+
* @param importFromId The id of the existing ConditionalAccessPolicy that should be imported. Refer to the {@link https://registry.terraform.io/providers/hashicorp/azuread/3.7.0/docs/resources/conditional_access_policy#import import section} in the documentation of this resource for the id to use
|
|
2502
|
+
* @param provider? Optional instance of the provider where the ConditionalAccessPolicy to import is found
|
|
2503
|
+
*/
|
|
2504
|
+
static generateConfigForImport(scope, importToId, importFromId, provider) {
|
|
2505
|
+
return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "azuread_conditional_access_policy", importId: importFromId, provider });
|
|
2506
|
+
}
|
|
2507
|
+
// ===========
|
|
2508
|
+
// INITIALIZER
|
|
2509
|
+
// ===========
|
|
2510
|
+
/**
|
|
2511
|
+
* Create a new {@link https://registry.terraform.io/providers/hashicorp/azuread/3.7.0/docs/resources/conditional_access_policy azuread_conditional_access_policy} Resource
|
|
2512
|
+
*
|
|
2513
|
+
* @param scope The scope in which to define this construct
|
|
2514
|
+
* @param id The scoped construct ID. Must be unique amongst siblings in the same scope
|
|
2515
|
+
* @param options ConditionalAccessPolicyConfig
|
|
2516
|
+
*/
|
|
2517
|
+
constructor(scope, id, config) {
|
|
2518
|
+
super(scope, id, {
|
|
2519
|
+
terraformResourceType: 'azuread_conditional_access_policy',
|
|
2520
|
+
terraformGeneratorMetadata: {
|
|
2521
|
+
providerName: 'azuread',
|
|
2522
|
+
providerVersion: '3.7.0',
|
|
2523
|
+
providerVersionConstraint: '~> 3.0'
|
|
2524
|
+
},
|
|
2525
|
+
provider: config.provider,
|
|
2526
|
+
dependsOn: config.dependsOn,
|
|
2527
|
+
count: config.count,
|
|
2528
|
+
lifecycle: config.lifecycle,
|
|
2529
|
+
provisioners: config.provisioners,
|
|
2530
|
+
connection: config.connection,
|
|
2531
|
+
forEach: config.forEach
|
|
2532
|
+
});
|
|
2533
|
+
// conditions - computed: false, optional: false, required: true
|
|
2534
|
+
this._conditions = new ConditionalAccessPolicyConditionsOutputReference(this, "conditions");
|
|
2535
|
+
// grant_controls - computed: false, optional: true, required: false
|
|
2536
|
+
this._grantControls = new ConditionalAccessPolicyGrantControlsOutputReference(this, "grant_controls");
|
|
2537
|
+
// session_controls - computed: false, optional: true, required: false
|
|
2538
|
+
this._sessionControls = new ConditionalAccessPolicySessionControlsOutputReference(this, "session_controls");
|
|
2539
|
+
// timeouts - computed: false, optional: true, required: false
|
|
2540
|
+
this._timeouts = new ConditionalAccessPolicyTimeoutsOutputReference(this, "timeouts");
|
|
2541
|
+
this._displayName = config.displayName;
|
|
2542
|
+
this._id = config.id;
|
|
2543
|
+
this._state = config.state;
|
|
2544
|
+
this._conditions.internalValue = config.conditions;
|
|
2545
|
+
this._grantControls.internalValue = config.grantControls;
|
|
2546
|
+
this._sessionControls.internalValue = config.sessionControls;
|
|
2547
|
+
this._timeouts.internalValue = config.timeouts;
|
|
2548
|
+
}
|
|
2549
|
+
get displayName() {
|
|
2550
|
+
return this.getStringAttribute('display_name');
|
|
2551
|
+
}
|
|
2552
|
+
set displayName(value) {
|
|
2553
|
+
this._displayName = value;
|
|
2554
|
+
}
|
|
2555
|
+
// Temporarily expose input value. Use with caution.
|
|
2556
|
+
get displayNameInput() {
|
|
2557
|
+
return this._displayName;
|
|
2558
|
+
}
|
|
2559
|
+
get id() {
|
|
2560
|
+
return this.getStringAttribute('id');
|
|
2561
|
+
}
|
|
2562
|
+
set id(value) {
|
|
2563
|
+
this._id = value;
|
|
2564
|
+
}
|
|
2565
|
+
resetId() {
|
|
2566
|
+
this._id = undefined;
|
|
2567
|
+
}
|
|
2568
|
+
// Temporarily expose input value. Use with caution.
|
|
2569
|
+
get idInput() {
|
|
2570
|
+
return this._id;
|
|
2571
|
+
}
|
|
2572
|
+
// object_id - computed: true, optional: false, required: false
|
|
2573
|
+
get objectId() {
|
|
2574
|
+
return this.getStringAttribute('object_id');
|
|
2575
|
+
}
|
|
2576
|
+
get state() {
|
|
2577
|
+
return this.getStringAttribute('state');
|
|
2578
|
+
}
|
|
2579
|
+
set state(value) {
|
|
2580
|
+
this._state = value;
|
|
2581
|
+
}
|
|
2582
|
+
// Temporarily expose input value. Use with caution.
|
|
2583
|
+
get stateInput() {
|
|
2584
|
+
return this._state;
|
|
2585
|
+
}
|
|
2586
|
+
get conditions() {
|
|
2587
|
+
return this._conditions;
|
|
2588
|
+
}
|
|
2589
|
+
putConditions(value) {
|
|
2590
|
+
this._conditions.internalValue = value;
|
|
2591
|
+
}
|
|
2592
|
+
// Temporarily expose input value. Use with caution.
|
|
2593
|
+
get conditionsInput() {
|
|
2594
|
+
return this._conditions.internalValue;
|
|
2595
|
+
}
|
|
2596
|
+
get grantControls() {
|
|
2597
|
+
return this._grantControls;
|
|
2598
|
+
}
|
|
2599
|
+
putGrantControls(value) {
|
|
2600
|
+
this._grantControls.internalValue = value;
|
|
2601
|
+
}
|
|
2602
|
+
resetGrantControls() {
|
|
2603
|
+
this._grantControls.internalValue = undefined;
|
|
2604
|
+
}
|
|
2605
|
+
// Temporarily expose input value. Use with caution.
|
|
2606
|
+
get grantControlsInput() {
|
|
2607
|
+
return this._grantControls.internalValue;
|
|
2608
|
+
}
|
|
2609
|
+
get sessionControls() {
|
|
2610
|
+
return this._sessionControls;
|
|
2611
|
+
}
|
|
2612
|
+
putSessionControls(value) {
|
|
2613
|
+
this._sessionControls.internalValue = value;
|
|
2614
|
+
}
|
|
2615
|
+
resetSessionControls() {
|
|
2616
|
+
this._sessionControls.internalValue = undefined;
|
|
2617
|
+
}
|
|
2618
|
+
// Temporarily expose input value. Use with caution.
|
|
2619
|
+
get sessionControlsInput() {
|
|
2620
|
+
return this._sessionControls.internalValue;
|
|
2621
|
+
}
|
|
2622
|
+
get timeouts() {
|
|
2623
|
+
return this._timeouts;
|
|
2624
|
+
}
|
|
2625
|
+
putTimeouts(value) {
|
|
2626
|
+
this._timeouts.internalValue = value;
|
|
2627
|
+
}
|
|
2628
|
+
resetTimeouts() {
|
|
2629
|
+
this._timeouts.internalValue = undefined;
|
|
2630
|
+
}
|
|
2631
|
+
// Temporarily expose input value. Use with caution.
|
|
2632
|
+
get timeoutsInput() {
|
|
2633
|
+
return this._timeouts.internalValue;
|
|
2634
|
+
}
|
|
2635
|
+
// =========
|
|
2636
|
+
// SYNTHESIS
|
|
2637
|
+
// =========
|
|
2638
|
+
synthesizeAttributes() {
|
|
2639
|
+
return {
|
|
2640
|
+
display_name: cdktn.stringToTerraform(this._displayName),
|
|
2641
|
+
id: cdktn.stringToTerraform(this._id),
|
|
2642
|
+
state: cdktn.stringToTerraform(this._state),
|
|
2643
|
+
conditions: conditionalAccessPolicyConditionsToTerraform(this._conditions.internalValue),
|
|
2644
|
+
grant_controls: conditionalAccessPolicyGrantControlsToTerraform(this._grantControls.internalValue),
|
|
2645
|
+
session_controls: conditionalAccessPolicySessionControlsToTerraform(this._sessionControls.internalValue),
|
|
2646
|
+
timeouts: conditionalAccessPolicyTimeoutsToTerraform(this._timeouts.internalValue),
|
|
2647
|
+
};
|
|
2648
|
+
}
|
|
2649
|
+
synthesizeHclAttributes() {
|
|
2650
|
+
const attrs = {
|
|
2651
|
+
display_name: {
|
|
2652
|
+
value: cdktn.stringToHclTerraform(this._displayName),
|
|
2653
|
+
isBlock: false,
|
|
2654
|
+
type: "simple",
|
|
2655
|
+
storageClassType: "string",
|
|
2656
|
+
},
|
|
2657
|
+
id: {
|
|
2658
|
+
value: cdktn.stringToHclTerraform(this._id),
|
|
2659
|
+
isBlock: false,
|
|
2660
|
+
type: "simple",
|
|
2661
|
+
storageClassType: "string",
|
|
2662
|
+
},
|
|
2663
|
+
state: {
|
|
2664
|
+
value: cdktn.stringToHclTerraform(this._state),
|
|
2665
|
+
isBlock: false,
|
|
2666
|
+
type: "simple",
|
|
2667
|
+
storageClassType: "string",
|
|
2668
|
+
},
|
|
2669
|
+
conditions: {
|
|
2670
|
+
value: conditionalAccessPolicyConditionsToHclTerraform(this._conditions.internalValue),
|
|
2671
|
+
isBlock: true,
|
|
2672
|
+
type: "list",
|
|
2673
|
+
storageClassType: "ConditionalAccessPolicyConditionsList",
|
|
2674
|
+
},
|
|
2675
|
+
grant_controls: {
|
|
2676
|
+
value: conditionalAccessPolicyGrantControlsToHclTerraform(this._grantControls.internalValue),
|
|
2677
|
+
isBlock: true,
|
|
2678
|
+
type: "list",
|
|
2679
|
+
storageClassType: "ConditionalAccessPolicyGrantControlsList",
|
|
2680
|
+
},
|
|
2681
|
+
session_controls: {
|
|
2682
|
+
value: conditionalAccessPolicySessionControlsToHclTerraform(this._sessionControls.internalValue),
|
|
2683
|
+
isBlock: true,
|
|
2684
|
+
type: "list",
|
|
2685
|
+
storageClassType: "ConditionalAccessPolicySessionControlsList",
|
|
2686
|
+
},
|
|
2687
|
+
timeouts: {
|
|
2688
|
+
value: conditionalAccessPolicyTimeoutsToHclTerraform(this._timeouts.internalValue),
|
|
2689
|
+
isBlock: true,
|
|
2690
|
+
type: "struct",
|
|
2691
|
+
storageClassType: "ConditionalAccessPolicyTimeouts",
|
|
2692
|
+
},
|
|
2693
|
+
};
|
|
2694
|
+
// remove undefined attributes
|
|
2695
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
2696
|
+
}
|
|
2697
|
+
}
|
|
2698
|
+
exports.ConditionalAccessPolicy = ConditionalAccessPolicy;
|
|
2699
|
+
_w = JSII_RTTI_SYMBOL_1;
|
|
2700
|
+
ConditionalAccessPolicy[_w] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicy", version: "15.0.0" };
|
|
2701
|
+
// =================
|
|
2702
|
+
// STATIC PROPERTIES
|
|
2703
|
+
// =================
|
|
2704
|
+
ConditionalAccessPolicy.tfResourceType = "azuread_conditional_access_policy";
|
|
2705
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZGl0aW9uYWwtYWNjZXNzLXBvbGljeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBcUVBLDRIQVVDO0FBR0Qsa0lBNEJDO0FBeUdELG9KQVNDO0FBR0QsMEpBc0JDO0FBbUZELHdJQVVDO0FBR0QsOElBNEJDO0FBeUdELDhIQVNDO0FBR0Qsb0lBc0JDO0FBMkVELGtIQVFDO0FBR0Qsd0hBZ0JDO0FBNkRELHNIQVNDO0FBR0QsNEhBc0JDO0FBZ0ZELHNIQVNDO0FBR0QsNEhBc0JDO0FBZ0ZELHNNQVNDO0FBR0QsNE1Bc0JDO0FBa0hELHdLQVNDO0FBR0QsOEtBc0JDO0FBZ0hELHNNQVNDO0FBR0QsNE1Bc0JDO0FBa0hELHdLQVNDO0FBR0QsOEtBc0JDO0FBNElELDhHQWVDO0FBR0Qsb0hBMERDO0FBMlFELG9HQW1CQztBQUdELDBHQWtGQztBQWtURCwwR0FZQztBQUdELGdIQXdDQztBQTBLRCw4R0FlQztBQUdELG9IQTBEQztBQStORCxnR0FXQztBQUdELHNHQWtDQzs7QUFueEZELCtCQUErQjtBQTREL0IsU0FBZ0Isd0RBQXdELENBQUMsTUFBcUg7SUFDNUwsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU8sQ0FBQyxvQkFB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LFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFFLENBQUMsQ0FBQTtJQUM1SCxDQUFDOztBQXpPSCwwREEwT0M7OztBQXhPQyxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNHLHNDQUFjLEdBQUcsbUNBQW1DLEFBQXRDLENBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMjEsIDIwMjZcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3lcbi8vIGdlbmVyYXRlZCBmcm9tIHRlcnJhZm9ybSByZXNvdXJjZSBzY2hlbWFcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBjZGt0biBmcm9tICdjZGt0bic7XG5cbi8vIENvbmZpZ3VyYXRpb25cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmZpZyBleHRlbmRzIGNka3RuLlRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2Rpc3BsYXlfbmFtZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNkaXNwbGF5X25hbWV9XG4gICovXG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjaWQgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaWR9XG4gICpcbiAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgaWQgZmllbGQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgcmVzb3VyY2VzIGluIFRlcnJhZm9ybSBwcm92aWRlcnMgdXNpbmcgYSBUZXJyYWZvcm0gcHJvdmlkZXIgU0RLIHZlcnNpb24gYmVsb3cgMi5cbiAgKiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyBzZXR0aW5nIHRoaXMgdmFsdWUgaXQgbWlnaHQgbm90IGJlIHNldHRhYmxlLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgdGhlIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gdG8gZW5zdXJlIGl0IHNob3VsZCBiZSBzZXR0YWJsZS5cbiAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjc3RhdGUgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjc3RhdGV9XG4gICovXG4gIHJlYWRvbmx5IHN0YXRlOiBzdHJpbmc7XG4gIC8qKlxuICAqIGNvbmRpdGlvbnMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjY29uZGl0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNjb25kaXRpb25zfVxuICAqL1xuICByZWFkb25seSBjb25kaXRpb25zOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnM7XG4gIC8qKlxuICAqIGdyYW50X2NvbnRyb2xzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2dyYW50X2NvbnRyb2xzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2dyYW50X2NvbnRyb2xzfVxuICAqL1xuICByZWFkb25seSBncmFudENvbnRyb2xzPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzO1xuICAvKipcbiAgKiBzZXNzaW9uX2NvbnRyb2xzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3Nlc3Npb25fY29udHJvbHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjc2Vzc2lvbl9jb250cm9sc31cbiAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbnRyb2xzPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHM7XG4gIC8qKlxuICAqIHRpbWVvdXRzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3RpbWVvdXRzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3RpbWVvdXRzfVxuICAqL1xuICByZWFkb25seSB0aW1lb3V0cz86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHM7XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9ucyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZXhjbHVkZWRfYXBwbGljYXRpb25zIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4Y2x1ZGVkX2FwcGxpY2F0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWRBcHBsaWNhdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbmNsdWRlZF9hcHBsaWNhdGlvbnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfYXBwbGljYXRpb25zfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZEFwcGxpY2F0aW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2luY2x1ZGVkX3VzZXJfYWN0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNpbmNsdWRlZF91c2VyX2FjdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IGluY2x1ZGVkVXNlckFjdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBleGNsdWRlZF9hcHBsaWNhdGlvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmV4Y2x1ZGVkQXBwbGljYXRpb25zKSxcbiAgICBpbmNsdWRlZF9hcHBsaWNhdGlvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmluY2x1ZGVkQXBwbGljYXRpb25zKSxcbiAgICBpbmNsdWRlZF91c2VyX2FjdGlvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmluY2x1ZGVkVXNlckFjdGlvbnMpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZXhjbHVkZWRfYXBwbGljYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRBcHBsaWNhdGlvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfYXBwbGljYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRBcHBsaWNhdGlvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfdXNlcl9hY3Rpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRVc2VyQWN0aW9ucyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQXBwbGljYXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9leGNsdWRlZEFwcGxpY2F0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5leGNsdWRlZEFwcGxpY2F0aW9ucyA9IHRoaXMuX2V4Y2x1ZGVkQXBwbGljYXRpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZWRBcHBsaWNhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRBcHBsaWNhdGlvbnMgPSB0aGlzLl9pbmNsdWRlZEFwcGxpY2F0aW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkVXNlckFjdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRVc2VyQWN0aW9ucyA9IHRoaXMuX2luY2x1ZGVkVXNlckFjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNBcHBsaWNhdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9leGNsdWRlZEFwcGxpY2F0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luY2x1ZGVkQXBwbGljYXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW5jbHVkZWRVc2VyQWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZXhjbHVkZWRBcHBsaWNhdGlvbnMgPSB2YWx1ZS5leGNsdWRlZEFwcGxpY2F0aW9ucztcbiAgICAgIHRoaXMuX2luY2x1ZGVkQXBwbGljYXRpb25zID0gdmFsdWUuaW5jbHVkZWRBcHBsaWNhdGlvbnM7XG4gICAgICB0aGlzLl9pbmNsdWRlZFVzZXJBY3Rpb25zID0gdmFsdWUuaW5jbHVkZWRVc2VyQWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBleGNsdWRlZF9hcHBsaWNhdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXhjbHVkZWRBcHBsaWNhdGlvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRBcHBsaWNhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnZXhjbHVkZWRfYXBwbGljYXRpb25zJyk7XG4gIH1cbiAgcHVibGljIHNldCBleGNsdWRlZEFwcGxpY2F0aW9ucyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9leGNsdWRlZEFwcGxpY2F0aW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkQXBwbGljYXRpb25zKCkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkQXBwbGljYXRpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBleGNsdWRlZEFwcGxpY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZEFwcGxpY2F0aW9ucztcbiAgfVxuXG4gIC8vIGluY2x1ZGVkX2FwcGxpY2F0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pbmNsdWRlZEFwcGxpY2F0aW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBpbmNsdWRlZEFwcGxpY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF9hcHBsaWNhdGlvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkQXBwbGljYXRpb25zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVkQXBwbGljYXRpb25zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SW5jbHVkZWRBcHBsaWNhdGlvbnMoKSB7XG4gICAgdGhpcy5faW5jbHVkZWRBcHBsaWNhdGlvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkQXBwbGljYXRpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkQXBwbGljYXRpb25zO1xuICB9XG5cbiAgLy8gaW5jbHVkZWRfdXNlcl9hY3Rpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luY2x1ZGVkVXNlckFjdGlvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRVc2VyQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF91c2VyX2FjdGlvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkVXNlckFjdGlvbnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faW5jbHVkZWRVc2VyQWN0aW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEluY2x1ZGVkVXNlckFjdGlvbnMoKSB7XG4gICAgdGhpcy5faW5jbHVkZWRVc2VyQWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRVc2VyQWN0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlZFVzZXJBY3Rpb25zO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlciB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjbW9kZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNtb2RlfVxuICAqL1xuICByZWFkb25seSBtb2RlOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjcnVsZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNydWxlfVxuICAqL1xuICByZWFkb25seSBydWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXIpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbW9kZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5tb2RlKSxcbiAgICBydWxlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnJ1bGUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlclRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlck91dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlcik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgbW9kZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubW9kZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcnVsZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucnVsZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlciB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tb2RlID0gdGhpcy5fbW9kZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3J1bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucnVsZSA9IHRoaXMuX3J1bGU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9tb2RlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcnVsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fbW9kZSA9IHZhbHVlLm1vZGU7XG4gICAgICB0aGlzLl9ydWxlID0gdmFsdWUucnVsZTtcbiAgICB9XG4gIH1cblxuICAvLyBtb2RlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX21vZGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdtb2RlJyk7XG4gIH1cbiAgcHVibGljIHNldCBtb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tb2RlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1vZGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIC8vIHJ1bGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcnVsZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcnVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3J1bGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJ1bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3J1bGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcnVsZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ydWxlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9ucyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZXhjbHVkZWRfc2VydmljZV9wcmluY2lwYWxzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4Y2x1ZGVkX3NlcnZpY2VfcHJpbmNpcGFsc31cbiAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2luY2x1ZGVkX3NlcnZpY2VfcHJpbmNpcGFscyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNpbmNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHN9XG4gICovXG4gIHJlYWRvbmx5IGluY2x1ZGVkU2VydmljZVByaW5jaXBhbHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogZmlsdGVyIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2ZpbHRlciBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNmaWx0ZXJ9XG4gICovXG4gIHJlYWRvbmx5IGZpbHRlcj86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBleGNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmV4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHMpLFxuICAgIGluY2x1ZGVkX3NlcnZpY2VfcHJpbmNpcGFsczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyksXG4gICAgZmlsdGVyOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmZpbHRlciksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBleGNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGluY2x1ZGVkX3NlcnZpY2VfcHJpbmNpcGFsczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmluY2x1ZGVkU2VydmljZVByaW5jaXBhbHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgZmlsdGVyOiB7XG4gICAgICB2YWx1ZTogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zRmlsdGVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5maWx0ZXIpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHMgPSB0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pbmNsdWRlZFNlcnZpY2VQcmluY2lwYWxzID0gdGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZpbHRlcj8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5maWx0ZXIgPSB0aGlzLl9maWx0ZXI/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ZpbHRlci5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzID0gdmFsdWUuZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscztcbiAgICAgIHRoaXMuX2luY2x1ZGVkU2VydmljZVByaW5jaXBhbHMgPSB2YWx1ZS5pbmNsdWRlZFNlcnZpY2VQcmluY2lwYWxzO1xuICAgICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB2YWx1ZS5maWx0ZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gZXhjbHVkZWRfc2VydmljZV9wcmluY2lwYWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2V4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdleGNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHMoKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzO1xuICB9XG5cbiAgLy8gaW5jbHVkZWRfc2VydmljZV9wcmluY2lwYWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luY2x1ZGVkU2VydmljZVByaW5jaXBhbHM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkU2VydmljZVByaW5jaXBhbHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEluY2x1ZGVkU2VydmljZVByaW5jaXBhbHMoKSB7XG4gICAgdGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlZFNlcnZpY2VQcmluY2lwYWxzO1xuICB9XG5cbiAgLy8gZmlsdGVyIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZpbHRlciA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJmaWx0ZXJcIik7XG4gIHB1YmxpYyBnZXQgZmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XG4gIH1cbiAgcHVibGljIHB1dEZpbHRlcih2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zRmlsdGVyKSB7XG4gICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRGaWx0ZXIoKSB7XG4gICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZpbHRlcklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXIuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNtb2RlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I21vZGV9XG4gICovXG4gIHJlYWRvbmx5IG1vZGU6IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNydWxlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3J1bGV9XG4gICovXG4gIHJlYWRvbmx5IHJ1bGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlcik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtb2RlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm1vZGUpLFxuICAgIHJ1bGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucnVsZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlclRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBtb2RlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tb2RlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBydWxlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5ydWxlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXIgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX21vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubW9kZSA9IHRoaXMuX21vZGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9ydWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJ1bGUgPSB0aGlzLl9ydWxlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX21vZGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ydWxlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9tb2RlID0gdmFsdWUubW9kZTtcbiAgICAgIHRoaXMuX3J1bGUgPSB2YWx1ZS5ydWxlO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1vZGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbW9kZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21vZGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1vZGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX21vZGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbW9kZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgLy8gcnVsZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9ydWxlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBydWxlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncnVsZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgcnVsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcnVsZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBydWxlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3J1bGU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlcyB7XG4gIC8qKlxuICAqIGZpbHRlciBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNmaWx0ZXIgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZmlsdGVyfVxuICAqL1xuICByZWFkb25seSBmaWx0ZXI/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbHRlcjogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlclRvVGVycmFmb3JtKHN0cnVjdCEuZmlsdGVyKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGZpbHRlcjoge1xuICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmZpbHRlciksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXMgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2ZpbHRlcj8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5maWx0ZXIgPSB0aGlzLl9maWx0ZXI/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2ZpbHRlci5pbnRlcm5hbFZhbHVlID0gdmFsdWUuZmlsdGVyO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbHRlciAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9maWx0ZXIgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlck91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImZpbHRlclwiKTtcbiAgcHVibGljIGdldCBmaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcjtcbiAgfVxuICBwdWJsaWMgcHV0RmlsdGVyKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyKSB7XG4gICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRGaWx0ZXIoKSB7XG4gICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZpbHRlcklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXIuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2V4Y2x1ZGVkX2xvY2F0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNleGNsdWRlZF9sb2NhdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTG9jYXRpb25zPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjaW5jbHVkZWRfbG9jYXRpb25zIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2luY2x1ZGVkX2xvY2F0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZWRMb2NhdGlvbnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGV4Y2x1ZGVkX2xvY2F0aW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRMb2NhdGlvbnMpLFxuICAgIGluY2x1ZGVkX2xvY2F0aW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRMb2NhdGlvbnMpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0xvY2F0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0xvY2F0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0xvY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZXhjbHVkZWRfbG9jYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRMb2NhdGlvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfbG9jYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRMb2NhdGlvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0xvY2F0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZXhjbHVkZWRMb2NhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXhjbHVkZWRMb2NhdGlvbnMgPSB0aGlzLl9leGNsdWRlZExvY2F0aW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkTG9jYXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluY2x1ZGVkTG9jYXRpb25zID0gdGhpcy5faW5jbHVkZWRMb2NhdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9leGNsdWRlZExvY2F0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luY2x1ZGVkTG9jYXRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9leGNsdWRlZExvY2F0aW9ucyA9IHZhbHVlLmV4Y2x1ZGVkTG9jYXRpb25zO1xuICAgICAgdGhpcy5faW5jbHVkZWRMb2NhdGlvbnMgPSB2YWx1ZS5pbmNsdWRlZExvY2F0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBleGNsdWRlZF9sb2NhdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXhjbHVkZWRMb2NhdGlvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRMb2NhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnZXhjbHVkZWRfbG9jYXRpb25zJyk7XG4gIH1cbiAgcHVibGljIHNldCBleGNsdWRlZExvY2F0aW9ucyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9leGNsdWRlZExvY2F0aW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkTG9jYXRpb25zKCkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkTG9jYXRpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBleGNsdWRlZExvY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZExvY2F0aW9ucztcbiAgfVxuXG4gIC8vIGluY2x1ZGVkX2xvY2F0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9pbmNsdWRlZExvY2F0aW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBpbmNsdWRlZExvY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF9sb2NhdGlvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkTG9jYXRpb25zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVkTG9jYXRpb25zID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkTG9jYXRpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkTG9jYXRpb25zO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3JtcyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZXhjbHVkZWRfcGxhdGZvcm1zIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4Y2x1ZGVkX3BsYXRmb3Jtc31cbiAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWRQbGF0Zm9ybXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbmNsdWRlZF9wbGF0Zm9ybXMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfcGxhdGZvcm1zfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZFBsYXRmb3Jtczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXNPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZXhjbHVkZWRfcGxhdGZvcm1zOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5leGNsdWRlZFBsYXRmb3JtcyksXG4gICAgaW5jbHVkZWRfcGxhdGZvcm1zOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZFBsYXRmb3JtcyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBleGNsdWRlZF9wbGF0Zm9ybXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5leGNsdWRlZFBsYXRmb3JtcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBpbmNsdWRlZF9wbGF0Zm9ybXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZFBsYXRmb3JtcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3Jtc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9leGNsdWRlZFBsYXRmb3JtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5leGNsdWRlZFBsYXRmb3JtcyA9IHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZWRQbGF0Zm9ybXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRQbGF0Zm9ybXMgPSB0aGlzLl9pbmNsdWRlZFBsYXRmb3JtcztcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3JtcyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW5jbHVkZWRQbGF0Zm9ybXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zID0gdmFsdWUuZXhjbHVkZWRQbGF0Zm9ybXM7XG4gICAgICB0aGlzLl9pbmNsdWRlZFBsYXRmb3JtcyA9IHZhbHVlLmluY2x1ZGVkUGxhdGZvcm1zO1xuICAgIH1cbiAgfVxuXG4gIC8vIGV4Y2x1ZGVkX3BsYXRmb3JtcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9leGNsdWRlZFBsYXRmb3Jtcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBleGNsdWRlZFBsYXRmb3JtcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdleGNsdWRlZF9wbGF0Zm9ybXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4Y2x1ZGVkUGxhdGZvcm1zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RXhjbHVkZWRQbGF0Zm9ybXMoKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRQbGF0Zm9ybXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkUGxhdGZvcm1zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zO1xuICB9XG5cbiAgLy8gaW5jbHVkZWRfcGxhdGZvcm1zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2luY2x1ZGVkUGxhdGZvcm1zPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkUGxhdGZvcm1zKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2luY2x1ZGVkX3BsYXRmb3JtcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5jbHVkZWRQbGF0Zm9ybXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faW5jbHVkZWRQbGF0Zm9ybXMgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRQbGF0Zm9ybXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZWRQbGF0Zm9ybXM7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50cyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjbWVtYmVycyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNtZW1iZXJzfVxuICAqL1xuICByZWFkb25seSBtZW1iZXJzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjbWVtYmVyc2hpcF9raW5kIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I21lbWJlcnNoaXBfa2luZH1cbiAgKi9cbiAgcmVhZG9ubHkgbWVtYmVyc2hpcEtpbmQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbWVtYmVyczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEubWVtYmVycyksXG4gICAgbWVtYmVyc2hpcF9raW5kOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm1lbWJlcnNoaXBLaW5kKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50cyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBtZW1iZXJzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEubWVtYmVycyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBtZW1iZXJzaGlwX2tpbmQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1lbWJlcnNoaXBLaW5kKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdG4uSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50cyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbWVtYmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZW1iZXJzID0gdGhpcy5fbWVtYmVycztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21lbWJlcnNoaXBLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1lbWJlcnNoaXBLaW5kID0gdGhpcy5fbWVtYmVyc2hpcEtpbmQ7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21lbWJlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZW1iZXJzaGlwS2luZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZW1iZXJzID0gdmFsdWUubWVtYmVycztcbiAgICAgIHRoaXMuX21lbWJlcnNoaXBLaW5kID0gdmFsdWUubWVtYmVyc2hpcEtpbmQ7XG4gICAgfVxuICB9XG5cbiAgLy8gbWVtYmVycyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tZW1iZXJzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IG1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnbWVtYmVycycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWVtYmVycyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9tZW1iZXJzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWVtYmVycygpIHtcbiAgICB0aGlzLl9tZW1iZXJzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZW1iZXJzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lbWJlcnM7XG4gIH1cblxuICAvLyBtZW1iZXJzaGlwX2tpbmQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWVtYmVyc2hpcEtpbmQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG1lbWJlcnNoaXBLaW5kKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbWVtYmVyc2hpcF9raW5kJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZW1iZXJzaGlwS2luZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWVtYmVyc2hpcEtpbmQgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWVtYmVyc2hpcEtpbmRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVtYmVyc2hpcEtpbmQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNMaXN0IGV4dGVuZHMgY2RrdG4uQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzW10gfCBjZGt0bi5JUmVzb2x2YWJsZVxuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2d1ZXN0X29yX2V4dGVybmFsX3VzZXJfdHlwZXMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlc31cbiAgKi9cbiAgcmVhZG9ubHkgZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICogZXh0ZXJuYWxfdGVuYW50cyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNleHRlcm5hbF90ZW5hbnRzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4dGVybmFsX3RlbmFudHN9XG4gICovXG4gIHJlYWRvbmx5IGV4dGVybmFsVGVuYW50cz86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNbXSB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBndWVzdF9vcl9leHRlcm5hbF91c2VyX3R5cGVzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMpLFxuICAgIGV4dGVybmFsX3RlbmFudHM6IGNka3RuLmxpc3RNYXBwZXIoY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c1RvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLmV4dGVybmFsVGVuYW50cyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmd1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBleHRlcm5hbF90ZW5hbnRzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzVG9IY2xUZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEuZXh0ZXJuYWxUZW5hbnRzKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzID0gdGhpcy5fZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxUZW5hbnRzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV4dGVybmFsVGVuYW50cyA9IHRoaXMuX2V4dGVybmFsVGVuYW50cz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgfCBjZGt0bi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXh0ZXJuYWxUZW5hbnRzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzID0gdmFsdWUuZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzO1xuICAgICAgdGhpcy5fZXh0ZXJuYWxUZW5hbnRzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5leHRlcm5hbFRlbmFudHM7XG4gICAgfVxuICB9XG5cbiAgLy8gZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2d1ZXN0X29yX2V4dGVybmFsX3VzZXJfdHlwZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGd1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2d1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcztcbiAgfVxuXG4gIC8vIGV4dGVybmFsX3RlbmFudHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXh0ZXJuYWxUZW5hbnRzID0gbmV3IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNMaXN0KHRoaXMsIFwiZXh0ZXJuYWxfdGVuYW50c1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgZXh0ZXJuYWxUZW5hbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9leHRlcm5hbFRlbmFudHM7XG4gIH1cbiAgcHVibGljIHB1dEV4dGVybmFsVGVuYW50cyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c1tdIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9leHRlcm5hbFRlbmFudHMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4dGVybmFsVGVuYW50cygpIHtcbiAgICB0aGlzLl9leHRlcm5hbFRlbmFudHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXh0ZXJuYWxUZW5hbnRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dGVybmFsVGVuYW50cy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1tdIHwgY2RrdG4uSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNPdXRwdXRSZWZlcmVuY2UodGhpcy50ZXJyYWZvcm1SZXNvdXJjZSwgdGhpcy50ZXJyYWZvcm1BdHRyaWJ1dGUsIGluZGV4LCB0aGlzLndyYXBzU2V0KTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNtZW1iZXJzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I21lbWJlcnN9XG4gICovXG4gIHJlYWRvbmx5IG1lbWJlcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNtZW1iZXJzaGlwX2tpbmQgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjbWVtYmVyc2hpcF9raW5kfVxuICAqL1xuICByZWFkb25seSBtZW1iZXJzaGlwS2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtZW1iZXJzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5tZW1iZXJzKSxcbiAgICBtZW1iZXJzaGlwX2tpbmQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEubWVtYmVyc2hpcEtpbmQpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG1lbWJlcnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5tZW1iZXJzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIG1lbWJlcnNoaXBfa2luZDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubWVtYmVyc2hpcEtpbmQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9tZW1iZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1lbWJlcnMgPSB0aGlzLl9tZW1iZXJzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWVtYmVyc2hpcEtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWVtYmVyc2hpcEtpbmQgPSB0aGlzLl9tZW1iZXJzaGlwS2luZDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHMgfCBjZGt0bi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWVtYmVycyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21lbWJlcnNoaXBLaW5kID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21lbWJlcnMgPSB2YWx1ZS5tZW1iZXJzO1xuICAgICAgdGhpcy5fbWVtYmVyc2hpcEtpbmQgPSB2YWx1ZS5tZW1iZXJzaGlwS2luZDtcbiAgICB9XG4gIH1cblxuICAvLyBtZW1iZXJzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21lbWJlcnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgbWVtYmVycygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdtZW1iZXJzJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZW1iZXJzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX21lbWJlcnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNZW1iZXJzKCkge1xuICAgIHRoaXMuX21lbWJlcnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1lbWJlcnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVtYmVycztcbiAgfVxuXG4gIC8vIG1lbWJlcnNoaXBfa2luZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9tZW1iZXJzaGlwS2luZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbWVtYmVyc2hpcEtpbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdtZW1iZXJzaGlwX2tpbmQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1lbWJlcnNoaXBLaW5kKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tZW1iZXJzaGlwS2luZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZW1iZXJzaGlwS2luZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZW1iZXJzaGlwS2luZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c0xpc3QgZXh0ZW5kcyBjZGt0bi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNbXSB8IGNka3RuLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCBwcm90ZWN0ZWQgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHByb3RlY3RlZCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KVxuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c091dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNndWVzdF9vcl9leHRlcm5hbF91c2VyX3R5cGVzfVxuICAqL1xuICByZWFkb25seSBndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXM6IHN0cmluZ1tdO1xuICAvKipcbiAgKiBleHRlcm5hbF90ZW5hbnRzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2V4dGVybmFsX3RlbmFudHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZXh0ZXJuYWxfdGVuYW50c31cbiAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxUZW5hbnRzPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c1tdIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGd1ZXN0X29yX2V4dGVybmFsX3VzZXJfdHlwZXM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmd1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyksXG4gICAgZXh0ZXJuYWxfdGVuYW50czogY2RrdG4ubGlzdE1hcHBlcihjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzVG9UZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEuZXh0ZXJuYWxUZW5hbnRzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBndWVzdF9vcl9leHRlcm5hbF91c2VyX3R5cGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGV4dGVybmFsX3RlbmFudHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5leHRlcm5hbFRlbmFudHMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgfCBjZGt0bi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2YWJsZVZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZhYmxlVmFsdWU7XG4gICAgfVxuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2d1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgPSB0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9leHRlcm5hbFRlbmFudHM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXh0ZXJuYWxUZW5hbnRzID0gdGhpcy5fZXh0ZXJuYWxUZW5hbnRzPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9leHRlcm5hbFRlbmFudHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgPSB2YWx1ZS5ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXM7XG4gICAgICB0aGlzLl9leHRlcm5hbFRlbmFudHMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLmV4dGVybmFsVGVuYW50cztcbiAgICB9XG4gIH1cblxuICAvLyBndWVzdF9vcl9leHRlcm5hbF91c2VyX3R5cGVzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2d1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2d1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzO1xuICB9XG5cbiAgLy8gZXh0ZXJuYWxfdGVuYW50cyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9leHRlcm5hbFRlbmFudHMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c0xpc3QodGhpcywgXCJleHRlcm5hbF90ZW5hbnRzXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBleHRlcm5hbFRlbmFudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dGVybmFsVGVuYW50cztcbiAgfVxuICBwdWJsaWMgcHV0RXh0ZXJuYWxUZW5hbnRzKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzW10gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2V4dGVybmFsVGVuYW50cy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RXh0ZXJuYWxUZW5hbnRzKCkge1xuICAgIHRoaXMuX2V4dGVybmFsVGVuYW50cy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBleHRlcm5hbFRlbmFudHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXh0ZXJuYWxUZW5hbnRzLmludGVybmFsVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNMaXN0IGV4dGVuZHMgY2RrdG4uQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzW10gfCBjZGt0bi5JUmVzb2x2YWJsZVxuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNleGNsdWRlZF9ncm91cHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZXhjbHVkZWRfZ3JvdXBzfVxuICAqL1xuICByZWFkb25seSBleGNsdWRlZEdyb3Vwcz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2V4Y2x1ZGVkX3JvbGVzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4Y2x1ZGVkX3JvbGVzfVxuICAqL1xuICByZWFkb25seSBleGNsdWRlZFJvbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZXhjbHVkZWRfdXNlcnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZXhjbHVkZWRfdXNlcnN9XG4gICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkVXNlcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbmNsdWRlZF9ncm91cHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfZ3JvdXBzfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZEdyb3Vwcz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2luY2x1ZGVkX3JvbGVzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2luY2x1ZGVkX3JvbGVzfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZFJvbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjaW5jbHVkZWRfdXNlcnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfdXNlcnN9XG4gICovXG4gIHJlYWRvbmx5IGluY2x1ZGVkVXNlcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogZXhjbHVkZWRfZ3Vlc3RzX29yX2V4dGVybmFsX3VzZXJzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2V4Y2x1ZGVkX2d1ZXN0c19vcl9leHRlcm5hbF91c2VycyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnN9XG4gICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1tdIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIGluY2x1ZGVkX2d1ZXN0c19vcl9leHRlcm5hbF91c2VycyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfZ3Vlc3RzX29yX2V4dGVybmFsX3VzZXJzfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vycz86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNbXSB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGV4Y2x1ZGVkX2dyb3VwczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRHcm91cHMpLFxuICAgIGV4Y2x1ZGVkX3JvbGVzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5leGNsdWRlZFJvbGVzKSxcbiAgICBleGNsdWRlZF91c2VyczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRVc2VycyksXG4gICAgaW5jbHVkZWRfZ3JvdXBzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZEdyb3VwcyksXG4gICAgaW5jbHVkZWRfcm9sZXM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmluY2x1ZGVkUm9sZXMpLFxuICAgIGluY2x1ZGVkX3VzZXJzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZFVzZXJzKSxcbiAgICBleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnM6IGNka3RuLmxpc3RNYXBwZXIoY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1RvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLmV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKSxcbiAgICBpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnM6IGNka3RuLmxpc3RNYXBwZXIoY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1RvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLmluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGV4Y2x1ZGVkX2dyb3Vwczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmV4Y2x1ZGVkR3JvdXBzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGV4Y2x1ZGVkX3JvbGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRSb2xlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBleGNsdWRlZF91c2Vyczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmV4Y2x1ZGVkVXNlcnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfZ3JvdXBzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRHcm91cHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfcm9sZXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZFJvbGVzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGluY2x1ZGVkX3VzZXJzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRVc2VycyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5leGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNMaXN0XCIsXG4gICAgfSxcbiAgICBpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5pbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2VycyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZXhjbHVkZWRHcm91cHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXhjbHVkZWRHcm91cHMgPSB0aGlzLl9leGNsdWRlZEdyb3VwcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V4Y2x1ZGVkUm9sZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXhjbHVkZWRSb2xlcyA9IHRoaXMuX2V4Y2x1ZGVkUm9sZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9leGNsdWRlZFVzZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV4Y2x1ZGVkVXNlcnMgPSB0aGlzLl9leGNsdWRlZFVzZXJzO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZWRHcm91cHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRHcm91cHMgPSB0aGlzLl9pbmNsdWRlZEdyb3VwcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkUm9sZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRSb2xlcyA9IHRoaXMuX2luY2x1ZGVkUm9sZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbmNsdWRlZFVzZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluY2x1ZGVkVXNlcnMgPSB0aGlzLl9pbmNsdWRlZFVzZXJzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgPSB0aGlzLl9leGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vycz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzID0gdGhpcy5faW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2VycyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkR3JvdXBzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXhjbHVkZWRSb2xlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkVXNlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbmNsdWRlZEdyb3VwcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luY2x1ZGVkUm9sZXMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbmNsdWRlZFVzZXJzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkR3JvdXBzID0gdmFsdWUuZXhjbHVkZWRHcm91cHM7XG4gICAgICB0aGlzLl9leGNsdWRlZFJvbGVzID0gdmFsdWUuZXhjbHVkZWRSb2xlcztcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkVXNlcnMgPSB2YWx1ZS5leGNsdWRlZFVzZXJzO1xuICAgICAgdGhpcy5faW5jbHVkZWRHcm91cHMgPSB2YWx1ZS5pbmNsdWRlZEdyb3VwcztcbiAgICAgIHRoaXMuX2luY2x1ZGVkUm9sZXMgPSB2YWx1ZS5pbmNsdWRlZFJvbGVzO1xuICAgICAgdGhpcy5faW5jbHVkZWRVc2VycyA9IHZhbHVlLmluY2x1ZGVkVXNlcnM7XG4gICAgICB0aGlzLl9leGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vycy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnM7XG4gICAgICB0aGlzLl9pbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vycy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuaW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnM7XG4gICAgfVxuICB9XG5cbiAgLy8gZXhjbHVkZWRfZ3JvdXBzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2V4Y2x1ZGVkR3JvdXBzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkR3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2V4Y2x1ZGVkX2dyb3VwcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhjbHVkZWRHcm91cHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRHcm91cHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFeGNsdWRlZEdyb3VwcygpIHtcbiAgICB0aGlzLl9leGNsdWRlZEdyb3VwcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRHcm91cHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjbHVkZWRHcm91cHM7XG4gIH1cblxuICAvLyBleGNsdWRlZF9yb2xlcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9leGNsdWRlZFJvbGVzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkUm9sZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnZXhjbHVkZWRfcm9sZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4Y2x1ZGVkUm9sZXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRSb2xlcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkUm9sZXMoKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRSb2xlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRSb2xlc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZFJvbGVzO1xuICB9XG5cbiAgLy8gZXhjbHVkZWRfdXNlcnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXhjbHVkZWRVc2Vycz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBleGNsdWRlZFVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2V4Y2x1ZGVkX3VzZXJzJyk7XG4gIH1cbiAgcHVibGljIHNldCBleGNsdWRlZFVzZXJzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkVXNlcnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFeGNsdWRlZFVzZXJzKCkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkVXNlcnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkVXNlcnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjbHVkZWRVc2VycztcbiAgfVxuXG4gIC8vIGluY2x1ZGVkX2dyb3VwcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pbmNsdWRlZEdyb3Vwcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBpbmNsdWRlZEdyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF9ncm91cHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkR3JvdXBzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVkR3JvdXBzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SW5jbHVkZWRHcm91cHMoKSB7XG4gICAgdGhpcy5faW5jbHVkZWRHcm91cHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkR3JvdXBzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkR3JvdXBzO1xuICB9XG5cbiAgLy8gaW5jbHVkZWRfcm9sZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaW5jbHVkZWRSb2xlcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBpbmNsdWRlZFJvbGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2luY2x1ZGVkX3JvbGVzJyk7XG4gIH1cbiAgcHVibGljIHNldCBpbmNsdWRlZFJvbGVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVkUm9sZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJbmNsdWRlZFJvbGVzKCkge1xuICAgIHRoaXMuX2luY2x1ZGVkUm9sZXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkUm9sZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZWRSb2xlcztcbiAgfVxuXG4gIC8vIGluY2x1ZGVkX3VzZXJzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luY2x1ZGVkVXNlcnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRVc2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF91c2VycycpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5jbHVkZWRVc2Vycyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9pbmNsdWRlZFVzZXJzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SW5jbHVkZWRVc2VycygpIHtcbiAgICB0aGlzLl9pbmNsdWRlZFVzZXJzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpbmNsdWRlZFVzZXJzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkVXNlcnM7XG4gIH1cblxuICAvLyBleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0xpc3QodGhpcywgXCJleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnNcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycztcbiAgfVxuICBwdWJsaWMgcHV0RXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNbXSB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKCkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0xpc3QodGhpcywgXCJpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnNcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycztcbiAgfVxuICBwdWJsaWMgcHV0SW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNbXSB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5faW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKCkge1xuICAgIHRoaXMuX2luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNhdXRoZW50aWNhdGlvbl9mbG93X3RyYW5zZmVyX21ldGhvZHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjYXV0aGVudGljYXRpb25fZmxvd190cmFuc2Zlcl9tZXRob2RzfVxuICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNjbGllbnRfYXBwX3R5cGVzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2NsaWVudF9hcHBfdHlwZXN9XG4gICovXG4gIHJlYWRvbmx5IGNsaWVudEFwcFR5cGVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbnNpZGVyX3Jpc2tfbGV2ZWxzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2luc2lkZXJfcmlza19sZXZlbHN9XG4gICovXG4gIHJlYWRvbmx5IGluc2lkZXJSaXNrTGV2ZWxzPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3NlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3NlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzfVxuICAqL1xuICByZWFkb25seSBzZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3NpZ25faW5fcmlza19sZXZlbHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjc2lnbl9pbl9yaXNrX2xldmVsc31cbiAgKi9cbiAgcmVhZG9ubHkgc2lnbkluUmlza0xldmVscz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3VzZXJfcmlza19sZXZlbHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjdXNlcl9yaXNrX2xldmVsc31cbiAgKi9cbiAgcmVhZG9ubHkgdXNlclJpc2tMZXZlbHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogYXBwbGljYXRpb25zIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2FwcGxpY2F0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNhcHBsaWNhdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IGFwcGxpY2F0aW9uczogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQXBwbGljYXRpb25zO1xuICAvKipcbiAgKiBjbGllbnRfYXBwbGljYXRpb25zIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2NsaWVudF9hcHBsaWNhdGlvbnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjY2xpZW50X2FwcGxpY2F0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgY2xpZW50QXBwbGljYXRpb25zPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zO1xuICAvKipcbiAgKiBkZXZpY2VzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2RldmljZXMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZGV2aWNlc31cbiAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlcz86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXM7XG4gIC8qKlxuICAqIGxvY2F0aW9ucyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNsb2NhdGlvbnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjbG9jYXRpb25zfVxuICAqL1xuICByZWFkb25seSBsb2NhdGlvbnM/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnM7XG4gIC8qKlxuICAqIHBsYXRmb3JtcyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNwbGF0Zm9ybXMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjcGxhdGZvcm1zfVxuICAqL1xuICByZWFkb25seSBwbGF0Zm9ybXM/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXM7XG4gIC8qKlxuICAqIHVzZXJzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3VzZXJzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3VzZXJzfVxuICAqL1xuICByZWFkb25seSB1c2VyczogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXV0aGVudGljYXRpb25fZmxvd190cmFuc2Zlcl9tZXRob2RzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMpLFxuICAgIGNsaWVudF9hcHBfdHlwZXM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmNsaWVudEFwcFR5cGVzKSxcbiAgICBpbnNpZGVyX3Jpc2tfbGV2ZWxzOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmluc2lkZXJSaXNrTGV2ZWxzKSxcbiAgICBzZXJ2aWNlX3ByaW5jaXBhbF9yaXNrX2xldmVsczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuc2VydmljZVByaW5jaXBhbFJpc2tMZXZlbHMpLFxuICAgIHNpZ25faW5fcmlza19sZXZlbHM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnNpZ25JblJpc2tMZXZlbHMpLFxuICAgIHVzZXJfcmlza19sZXZlbHM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnVzZXJSaXNrTGV2ZWxzKSxcbiAgICBhcHBsaWNhdGlvbnM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc1RvVGVycmFmb3JtKHN0cnVjdCEuYXBwbGljYXRpb25zKSxcbiAgICBjbGllbnRfYXBwbGljYXRpb25zOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3QhLmNsaWVudEFwcGxpY2F0aW9ucyksXG4gICAgZGV2aWNlczogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc1RvVGVycmFmb3JtKHN0cnVjdCEuZGV2aWNlcyksXG4gICAgbG9jYXRpb25zOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3QhLmxvY2F0aW9ucyksXG4gICAgcGxhdGZvcm1zOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXNUb1RlcnJhZm9ybShzdHJ1Y3QhLnBsYXRmb3JtcyksXG4gICAgdXNlcnM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzVG9UZXJyYWZvcm0oc3RydWN0IS51c2VycyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhdXRoZW50aWNhdGlvbl9mbG93X3RyYW5zZmVyX21ldGhvZHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBjbGllbnRfYXBwX3R5cGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuY2xpZW50QXBwVHlwZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5zaWRlcl9yaXNrX2xldmVsczoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuaW5zaWRlclJpc2tMZXZlbHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuc2VydmljZVByaW5jaXBhbFJpc2tMZXZlbHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgc2lnbl9pbl9yaXNrX2xldmVsczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnNpZ25JblJpc2tMZXZlbHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgdXNlcl9yaXNrX2xldmVsczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnVzZXJSaXNrTGV2ZWxzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGFwcGxpY2F0aW9uczoge1xuICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXBwbGljYXRpb25zKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQXBwbGljYXRpb25zTGlzdFwiLFxuICAgIH0sXG4gICAgY2xpZW50X2FwcGxpY2F0aW9uczoge1xuICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY2xpZW50QXBwbGljYXRpb25zKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zTGlzdFwiLFxuICAgIH0sXG4gICAgZGV2aWNlczoge1xuICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRldmljZXMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzTGlzdFwiLFxuICAgIH0sXG4gICAgbG9jYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5sb2NhdGlvbnMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnNMaXN0XCIsXG4gICAgfSxcbiAgICBwbGF0Zm9ybXM6IHtcbiAgICAgIHZhbHVlOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXNUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnBsYXRmb3JtcyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3Jtc0xpc3RcIixcbiAgICB9LFxuICAgIHVzZXJzOiB7XG4gICAgICB2YWx1ZTogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnVzZXJzKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXV0aGVudGljYXRpb25GbG93VHJhbnNmZXJNZXRob2RzID0gdGhpcy5fYXV0aGVudGljYXRpb25GbG93VHJhbnNmZXJNZXRob2RzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2xpZW50QXBwVHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY2xpZW50QXBwVHlwZXMgPSB0aGlzLl9jbGllbnRBcHBUeXBlcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luc2lkZXJSaXNrTGV2ZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lmluc2lkZXJSaXNrTGV2ZWxzID0gdGhpcy5faW5zaWRlclJpc2tMZXZlbHM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscyA9IHRoaXMuX3NlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2lnbkluUmlza0xldmVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaWduSW5SaXNrTGV2ZWxzID0gdGhpcy5fc2lnbkluUmlza0xldmVscztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VzZXJSaXNrTGV2ZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnVzZXJSaXNrTGV2ZWxzID0gdGhpcy5fdXNlclJpc2tMZXZlbHM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hcHBsaWNhdGlvbnM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXBwbGljYXRpb25zID0gdGhpcy5fYXBwbGljYXRpb25zPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2xpZW50QXBwbGljYXRpb25zPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNsaWVudEFwcGxpY2F0aW9ucyA9IHRoaXMuX2NsaWVudEFwcGxpY2F0aW9ucz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RldmljZXM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGV2aWNlcyA9IHRoaXMuX2RldmljZXM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9sb2NhdGlvbnM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubG9jYXRpb25zID0gdGhpcy5fbG9jYXRpb25zPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGxhdGZvcm1zPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnBsYXRmb3JtcyA9IHRoaXMuX3BsYXRmb3Jtcz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VzZXJzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnVzZXJzID0gdGhpcy5fdXNlcnM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jbGllbnRBcHBUeXBlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luc2lkZXJSaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc2VydmljZVByaW5jaXBhbFJpc2tMZXZlbHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zaWduSW5SaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXNlclJpc2tMZXZlbHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hcHBsaWNhdGlvbnMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NsaWVudEFwcGxpY2F0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGV2aWNlcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbG9jYXRpb25zLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wbGF0Zm9ybXMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3VzZXJzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcyA9IHZhbHVlLmF1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcztcbiAgICAgIHRoaXMuX2NsaWVudEFwcFR5cGVzID0gdmFsdWUuY2xpZW50QXBwVHlwZXM7XG4gICAgICB0aGlzLl9pbnNpZGVyUmlza0xldmVscyA9IHZhbHVlLmluc2lkZXJSaXNrTGV2ZWxzO1xuICAgICAgdGhpcy5fc2VydmljZVByaW5jaXBhbFJpc2tMZXZlbHMgPSB2YWx1ZS5zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscztcbiAgICAgIHRoaXMuX3NpZ25JblJpc2tMZXZlbHMgPSB2YWx1ZS5zaWduSW5SaXNrTGV2ZWxzO1xuICAgICAgdGhpcy5fdXNlclJpc2tMZXZlbHMgPSB2YWx1ZS51c2VyUmlza0xldmVscztcbiAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuYXBwbGljYXRpb25zO1xuICAgICAgdGhpcy5fY2xpZW50QXBwbGljYXRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZS5jbGllbnRBcHBsaWNhdGlvbnM7XG4gICAgICB0aGlzLl9kZXZpY2VzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5kZXZpY2VzO1xuICAgICAgdGhpcy5fbG9jYXRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZS5sb2NhdGlvbnM7XG4gICAgICB0aGlzLl9wbGF0Zm9ybXMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLnBsYXRmb3JtcztcbiAgICAgIHRoaXMuX3VzZXJzLmludGVybmFsVmFsdWUgPSB2YWx1ZS51c2VycztcbiAgICB9XG4gIH1cblxuICAvLyBhdXRoZW50aWNhdGlvbl9mbG93X3RyYW5zZmVyX21ldGhvZHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRpb25GbG93VHJhbnNmZXJNZXRob2RzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcygpIHtcbiAgICByZXR1cm4gY2RrdG4uRm4udG9saXN0KHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnYXV0aGVudGljYXRpb25fZmxvd190cmFuc2Zlcl9tZXRob2RzJykpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0aGVudGljYXRpb25GbG93VHJhbnNmZXJNZXRob2RzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcygpIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHM7XG4gIH1cblxuICAvLyBjbGllbnRfYXBwX3R5cGVzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2NsaWVudEFwcFR5cGVzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGNsaWVudEFwcFR5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2NsaWVudF9hcHBfdHlwZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsaWVudEFwcFR5cGVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2NsaWVudEFwcFR5cGVzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNsaWVudEFwcFR5cGVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudEFwcFR5cGVzO1xuICB9XG5cbiAgLy8gaW5zaWRlcl9yaXNrX2xldmVscyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luc2lkZXJSaXNrTGV2ZWxzPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBpbnNpZGVyUmlza0xldmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2luc2lkZXJfcmlza19sZXZlbHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluc2lkZXJSaXNrTGV2ZWxzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pbnNpZGVyUmlza0xldmVscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEluc2lkZXJSaXNrTGV2ZWxzKCkge1xuICAgIHRoaXMuX2luc2lkZXJSaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpbnNpZGVyUmlza0xldmVsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbnNpZGVyUmlza0xldmVscztcbiAgfVxuXG4gIC8vIHNlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IHNlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3NlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzJyk7XG4gIH1cbiAgcHVibGljIHNldCBzZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzKCkge1xuICAgIHRoaXMuX3NlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscztcbiAgfVxuXG4gIC8vIHNpZ25faW5fcmlza19sZXZlbHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2lnbkluUmlza0xldmVscz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBzaWduSW5SaXNrTGV2ZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3NpZ25faW5fcmlza19sZXZlbHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpZ25JblJpc2tMZXZlbHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fc2lnbkluUmlza0xldmVscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNpZ25JblJpc2tMZXZlbHMoKSB7XG4gICAgdGhpcy5fc2lnbkluUmlza0xldmVscyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2lnbkluUmlza0xldmVsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zaWduSW5SaXNrTGV2ZWxzO1xuICB9XG5cbiAgLy8gdXNlcl9yaXNrX2xldmVscyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF91c2VyUmlza0xldmVscz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCB1c2VyUmlza0xldmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCd1c2VyX3Jpc2tfbGV2ZWxzJyk7XG4gIH1cbiAgcHVibGljIHNldCB1c2VyUmlza0xldmVscyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl91c2VyUmlza0xldmVscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFVzZXJSaXNrTGV2ZWxzKCkge1xuICAgIHRoaXMuX3VzZXJSaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB1c2VyUmlza0xldmVsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl91c2VyUmlza0xldmVscztcbiAgfVxuXG4gIC8vIGFwcGxpY2F0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9hcHBsaWNhdGlvbnMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQXBwbGljYXRpb25zT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiYXBwbGljYXRpb25zXCIpO1xuICBwdWJsaWMgZ2V0IGFwcGxpY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25zO1xuICB9XG4gIHB1YmxpYyBwdXRBcHBsaWNhdGlvbnModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9ucykge1xuICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFwcGxpY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGNsaWVudF9hcHBsaWNhdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY2xpZW50QXBwbGljYXRpb25zID0gbmV3IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImNsaWVudF9hcHBsaWNhdGlvbnNcIik7XG4gIHB1YmxpYyBnZXQgY2xpZW50QXBwbGljYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnRBcHBsaWNhdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dENsaWVudEFwcGxpY2F0aW9ucyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zKSB7XG4gICAgdGhpcy5fY2xpZW50QXBwbGljYXRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDbGllbnRBcHBsaWNhdGlvbnMoKSB7XG4gICAgdGhpcy5fY2xpZW50QXBwbGljYXRpb25zLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNsaWVudEFwcGxpY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnRBcHBsaWNhdGlvbnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGRldmljZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGV2aWNlcyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiZGV2aWNlc1wiKTtcbiAgcHVibGljIGdldCBkZXZpY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9kZXZpY2VzO1xuICB9XG4gIHB1YmxpYyBwdXREZXZpY2VzKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzKSB7XG4gICAgdGhpcy5fZGV2aWNlcy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGV2aWNlcygpIHtcbiAgICB0aGlzLl9kZXZpY2VzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRldmljZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGV2aWNlcy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gbG9jYXRpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2xvY2F0aW9ucyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJsb2NhdGlvbnNcIik7XG4gIHB1YmxpYyBnZXQgbG9jYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dExvY2F0aW9ucyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zKSB7XG4gICAgdGhpcy5fbG9jYXRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRMb2NhdGlvbnMoKSB7XG4gICAgdGhpcy5fbG9jYXRpb25zLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGxvY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHBsYXRmb3JtcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wbGF0Zm9ybXMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicGxhdGZvcm1zXCIpO1xuICBwdWJsaWMgZ2V0IHBsYXRmb3JtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhdGZvcm1zO1xuICB9XG4gIHB1YmxpYyBwdXRQbGF0Zm9ybXModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3Jtcykge1xuICAgIHRoaXMuX3BsYXRmb3Jtcy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UGxhdGZvcm1zKCkge1xuICAgIHRoaXMuX3BsYXRmb3Jtcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwbGF0Zm9ybXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhdGZvcm1zLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyB1c2VycyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF91c2VycyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInVzZXJzXCIpO1xuICBwdWJsaWMgZ2V0IHVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl91c2VycztcbiAgfVxuICBwdWJsaWMgcHV0VXNlcnModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzKSB7XG4gICAgdGhpcy5fdXNlcnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB1c2Vyc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl91c2Vycy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9scyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjYXV0aGVudGljYXRpb25fc3RyZW5ndGhfcG9saWN5X2lkIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2F1dGhlbnRpY2F0aW9uX3N0cmVuZ3RoX3BvbGljeV9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2J1aWx0X2luX2NvbnRyb2xzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2J1aWx0X2luX2NvbnRyb2xzfVxuICAqL1xuICByZWFkb25seSBidWlsdEluQ29udHJvbHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNjdXN0b21fYXV0aGVudGljYXRpb25fZmFjdG9ycyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNjdXN0b21fYXV0aGVudGljYXRpb25fZmFjdG9yc31cbiAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjb3BlcmF0b3IgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjb3BlcmF0b3J9XG4gICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjdGVybXNfb2ZfdXNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3Rlcm1zX29mX3VzZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGVybXNPZlVzZT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGF1dGhlbnRpY2F0aW9uX3N0cmVuZ3RoX3BvbGljeV9pZDogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQpLFxuICAgIGJ1aWx0X2luX2NvbnRyb2xzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5idWlsdEluQ29udHJvbHMpLFxuICAgIGN1c3RvbV9hdXRoZW50aWNhdGlvbl9mYWN0b3JzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5jdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnMpLFxuICAgIG9wZXJhdG9yOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm9wZXJhdG9yKSxcbiAgICB0ZXJtc19vZl91c2U6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnRlcm1zT2ZVc2UpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9scyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYXV0aGVudGljYXRpb25fc3RyZW5ndGhfcG9saWN5X2lkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGJ1aWx0X2luX2NvbnRyb2xzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYnVpbHRJbkNvbnRyb2xzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGN1c3RvbV9hdXRoZW50aWNhdGlvbl9mYWN0b3JzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIG9wZXJhdG9yOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5vcGVyYXRvciksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGVybXNfb2ZfdXNlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEudGVybXNPZlVzZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkID0gdGhpcy5fYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYnVpbHRJbkNvbnRyb2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmJ1aWx0SW5Db250cm9scyA9IHRoaXMuX2J1aWx0SW5Db250cm9scztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2N1c3RvbUF1dGhlbnRpY2F0aW9uRmFjdG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnMgPSB0aGlzLl9jdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcGVyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vcGVyYXRvciA9IHRoaXMuX29wZXJhdG9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGVybXNPZlVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50ZXJtc09mVXNlID0gdGhpcy5fdGVybXNPZlVzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9scyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uU3RyZW5ndGhQb2xpY3lJZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2J1aWx0SW5Db250cm9scyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2N1c3RvbUF1dGhlbnRpY2F0aW9uRmFjdG9ycyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGVybXNPZlVzZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkID0gdmFsdWUuYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkO1xuICAgICAgdGhpcy5fYnVpbHRJbkNvbnRyb2xzID0gdmFsdWUuYnVpbHRJbkNvbnRyb2xzO1xuICAgICAgdGhpcy5fY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzID0gdmFsdWUuY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzO1xuICAgICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZS5vcGVyYXRvcjtcbiAgICAgIHRoaXMuX3Rlcm1zT2ZVc2UgPSB2YWx1ZS50ZXJtc09mVXNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGF1dGhlbnRpY2F0aW9uX3N0cmVuZ3RoX3BvbGljeV9pZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0aW9uU3RyZW5ndGhQb2xpY3lJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2F1dGhlbnRpY2F0aW9uX3N0cmVuZ3RoX3BvbGljeV9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQoKSB7XG4gICAgdGhpcy5fYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkO1xuICB9XG5cbiAgLy8gYnVpbHRfaW5fY29udHJvbHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYnVpbHRJbkNvbnRyb2xzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGJ1aWx0SW5Db250cm9scygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdidWlsdF9pbl9jb250cm9scycpO1xuICB9XG4gIHB1YmxpYyBzZXQgYnVpbHRJbkNvbnRyb2xzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2J1aWx0SW5Db250cm9scyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEJ1aWx0SW5Db250cm9scygpIHtcbiAgICB0aGlzLl9idWlsdEluQ29udHJvbHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGJ1aWx0SW5Db250cm9sc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9idWlsdEluQ29udHJvbHM7XG4gIH1cblxuICAvLyBjdXN0b21fYXV0aGVudGljYXRpb25fZmFjdG9ycyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2N1c3RvbV9hdXRoZW50aWNhdGlvbl9mYWN0b3JzJyk7XG4gIH1cbiAgcHVibGljIHNldCBjdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzKCkge1xuICAgIHRoaXMuX2N1c3RvbUF1dGhlbnRpY2F0aW9uRmFjdG9ycyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbUF1dGhlbnRpY2F0aW9uRmFjdG9ycztcbiAgfVxuXG4gIC8vIG9wZXJhdG9yIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX29wZXJhdG9yPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvcGVyYXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ29wZXJhdG9yJyk7XG4gIH1cbiAgcHVibGljIHNldCBvcGVyYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3JJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3I7XG4gIH1cblxuICAvLyB0ZXJtc19vZl91c2UgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGVybXNPZlVzZT86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCB0ZXJtc09mVXNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3Rlcm1zX29mX3VzZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGVybXNPZlVzZSh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl90ZXJtc09mVXNlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGVybXNPZlVzZSgpIHtcbiAgICB0aGlzLl90ZXJtc09mVXNlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0ZXJtc09mVXNlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlcm1zT2ZVc2U7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2FwcGxpY2F0aW9uX2VuZm9yY2VkX3Jlc3RyaWN0aW9uc19lbmFibGVkIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2FwcGxpY2F0aW9uX2VuZm9yY2VkX3Jlc3RyaWN0aW9uc19lbmFibGVkfVxuICAqL1xuICByZWFkb25seSBhcHBsaWNhdGlvbkVuZm9yY2VkUmVzdHJpY3Rpb25zRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNjbG91ZF9hcHBfc2VjdXJpdHlfcG9saWN5IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2Nsb3VkX2FwcF9zZWN1cml0eV9wb2xpY3l9XG4gICovXG4gIHJlYWRvbmx5IGNsb3VkQXBwU2VjdXJpdHlQb2xpY3k/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZGlzYWJsZV9yZXNpbGllbmNlX2RlZmF1bHRzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2Rpc2FibGVfcmVzaWxpZW5jZV9kZWZhdWx0c31cbiAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZVJlc2lsaWVuY2VEZWZhdWx0cz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNwZXJzaXN0ZW50X2Jyb3dzZXJfbW9kZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNwZXJzaXN0ZW50X2Jyb3dzZXJfbW9kZX1cbiAgKi9cbiAgcmVhZG9ubHkgcGVyc2lzdGVudEJyb3dzZXJNb2RlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3NpZ25faW5fZnJlcXVlbmN5IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3NpZ25faW5fZnJlcXVlbmN5fVxuICAqL1xuICByZWFkb25seSBzaWduSW5GcmVxdWVuY3k/OiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjc2lnbl9pbl9mcmVxdWVuY3lfYXV0aGVudGljYXRpb25fdHlwZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNzaWduX2luX2ZyZXF1ZW5jeV9hdXRoZW50aWNhdGlvbl90eXBlfVxuICAqL1xuICByZWFkb25seSBzaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjc2lnbl9pbl9mcmVxdWVuY3lfaW50ZXJ2YWwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjc2lnbl9pbl9mcmVxdWVuY3lfaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IHNpZ25JbkZyZXF1ZW5jeUludGVydmFsPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3NpZ25faW5fZnJlcXVlbmN5X3BlcmlvZCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNzaWduX2luX2ZyZXF1ZW5jeV9wZXJpb2R9XG4gICovXG4gIHJlYWRvbmx5IHNpZ25JbkZyZXF1ZW5jeVBlcmlvZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5U2Vzc2lvbkNvbnRyb2xzVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHNPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9scyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhcHBsaWNhdGlvbl9lbmZvcmNlZF9yZXN0cmljdGlvbnNfZW5hYmxlZDogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQpLFxuICAgIGNsb3VkX2FwcF9zZWN1cml0eV9wb2xpY3k6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY2xvdWRBcHBTZWN1cml0eVBvbGljeSksXG4gICAgZGlzYWJsZV9yZXNpbGllbmNlX2RlZmF1bHRzOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzKSxcbiAgICBwZXJzaXN0ZW50X2Jyb3dzZXJfbW9kZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5wZXJzaXN0ZW50QnJvd3Nlck1vZGUpLFxuICAgIHNpZ25faW5fZnJlcXVlbmN5OiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLnNpZ25JbkZyZXF1ZW5jeSksXG4gICAgc2lnbl9pbl9mcmVxdWVuY3lfYXV0aGVudGljYXRpb25fdHlwZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUpLFxuICAgIHNpZ25faW5fZnJlcXVlbmN5X2ludGVydmFsOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnNpZ25JbkZyZXF1ZW5jeUludGVydmFsKSxcbiAgICBzaWduX2luX2ZyZXF1ZW5jeV9wZXJpb2Q6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuc2lnbkluRnJlcXVlbmN5UGVyaW9kKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9sc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5U2Vzc2lvbkNvbnRyb2xzT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGFwcGxpY2F0aW9uX2VuZm9yY2VkX3Jlc3RyaWN0aW9uc19lbmFibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBjbG91ZF9hcHBfc2VjdXJpdHlfcG9saWN5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jbG91ZEFwcFNlY3VyaXR5UG9saWN5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBkaXNhYmxlX3Jlc2lsaWVuY2VfZGVmYXVsdHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgcGVyc2lzdGVudF9icm93c2VyX21vZGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnBlcnNpc3RlbnRCcm93c2VyTW9kZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc2lnbl9pbl9mcmVxdWVuY3k6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNpZ25JbkZyZXF1ZW5jeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc2lnbl9pbl9mcmVxdWVuY3lfYXV0aGVudGljYXRpb25fdHlwZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2lnbkluRnJlcXVlbmN5QXV0aGVudGljYXRpb25UeXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBzaWduX2luX2ZyZXF1ZW5jeV9pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNpZ25faW5fZnJlcXVlbmN5X3BlcmlvZDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2lnbkluRnJlcXVlbmN5UGVyaW9kKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5U2Vzc2lvbkNvbnRyb2xzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9scyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQgPSB0aGlzLl9hcHBsaWNhdGlvbkVuZm9yY2VkUmVzdHJpY3Rpb25zRW5hYmxlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Nsb3VkQXBwU2VjdXJpdHlQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY2xvdWRBcHBTZWN1cml0eVBvbGljeSA9IHRoaXMuX2Nsb3VkQXBwU2VjdXJpdHlQb2xpY3k7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRpc2FibGVSZXNpbGllbmNlRGVmYXVsdHMgPSB0aGlzLl9kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGVyc2lzdGVudEJyb3dzZXJNb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnBlcnNpc3RlbnRCcm93c2VyTW9kZSA9IHRoaXMuX3BlcnNpc3RlbnRCcm93c2VyTW9kZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NpZ25JbkZyZXF1ZW5jeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaWduSW5GcmVxdWVuY3kgPSB0aGlzLl9zaWduSW5GcmVxdWVuY3k7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2lnbkluRnJlcXVlbmN5QXV0aGVudGljYXRpb25UeXBlID0gdGhpcy5fc2lnbkluRnJlcXVlbmN5QXV0aGVudGljYXRpb25UeXBlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWwgPSB0aGlzLl9zaWduSW5GcmVxdWVuY3lJbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NpZ25JbkZyZXF1ZW5jeVBlcmlvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaWduSW5GcmVxdWVuY3lQZXJpb2QgPSB0aGlzLl9zaWduSW5GcmVxdWVuY3lQZXJpb2Q7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9scyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY2xvdWRBcHBTZWN1cml0eVBvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rpc2FibGVSZXNpbGllbmNlRGVmYXVsdHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wZXJzaXN0ZW50QnJvd3Nlck1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3kgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeVBlcmlvZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQgPSB2YWx1ZS5hcHBsaWNhdGlvbkVuZm9yY2VkUmVzdHJpY3Rpb25zRW5hYmxlZDtcbiAgICAgIHRoaXMuX2Nsb3VkQXBwU2VjdXJpdHlQb2xpY3kgPSB2YWx1ZS5jbG91ZEFwcFNlY3VyaXR5UG9saWN5O1xuICAgICAgdGhpcy5fZGlzYWJsZVJlc2lsaWVuY2VEZWZhdWx0cyA9IHZhbHVlLmRpc2FibGVSZXNpbGllbmNlRGVmYXVsdHM7XG4gICAgICB0aGlzLl9wZXJzaXN0ZW50QnJvd3Nlck1vZGUgPSB2YWx1ZS5wZXJzaXN0ZW50QnJvd3Nlck1vZGU7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3kgPSB2YWx1ZS5zaWduSW5GcmVxdWVuY3k7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUgPSB2YWx1ZS5zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGU7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lJbnRlcnZhbCA9IHZhbHVlLnNpZ25JbkZyZXF1ZW5jeUludGVydmFsO1xuICAgICAgdGhpcy5fc2lnbkluRnJlcXVlbmN5UGVyaW9kID0gdmFsdWUuc2lnbkluRnJlcXVlbmN5UGVyaW9kO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFwcGxpY2F0aW9uX2VuZm9yY2VkX3Jlc3RyaWN0aW9uc19lbmFibGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2FwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBhcHBsaWNhdGlvbkVuZm9yY2VkUmVzdHJpY3Rpb25zRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdhcHBsaWNhdGlvbl9lbmZvcmNlZF9yZXN0cmljdGlvbnNfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2FwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQoKSB7XG4gICAgdGhpcy5fYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkO1xuICB9XG5cbiAgLy8gY2xvdWRfYXBwX3NlY3VyaXR5X3BvbGljeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jbG91ZEFwcFNlY3VyaXR5UG9saWN5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBjbG91ZEFwcFNlY3VyaXR5UG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY2xvdWRfYXBwX3NlY3VyaXR5X3BvbGljeScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2xvdWRBcHBTZWN1cml0eVBvbGljeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xvdWRBcHBTZWN1cml0eVBvbGljeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENsb3VkQXBwU2VjdXJpdHlQb2xpY3koKSB7XG4gICAgdGhpcy5fY2xvdWRBcHBTZWN1cml0eVBvbGljeSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY2xvdWRBcHBTZWN1cml0eVBvbGljeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jbG91ZEFwcFNlY3VyaXR5UG9saWN5O1xuICB9XG5cbiAgLy8gZGlzYWJsZV9yZXNpbGllbmNlX2RlZmF1bHRzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rpc2FibGVSZXNpbGllbmNlRGVmYXVsdHM/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGRpc2FibGVSZXNpbGllbmNlRGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZGlzYWJsZV9yZXNpbGllbmNlX2RlZmF1bHRzJyk7XG4gIH1cbiAgcHVibGljIHNldCBkaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGlzYWJsZVJlc2lsaWVuY2VEZWZhdWx0cygpIHtcbiAgICB0aGlzLl9kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVSZXNpbGllbmNlRGVmYXVsdHM7XG4gIH1cblxuICAvLyBwZXJzaXN0ZW50X2Jyb3dzZXJfbW9kZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wZXJzaXN0ZW50QnJvd3Nlck1vZGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHBlcnNpc3RlbnRCcm93c2VyTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3BlcnNpc3RlbnRfYnJvd3Nlcl9tb2RlJyk7XG4gIH1cbiAgcHVibGljIHNldCBwZXJzaXN0ZW50QnJvd3Nlck1vZGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BlcnNpc3RlbnRCcm93c2VyTW9kZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFBlcnNpc3RlbnRCcm93c2VyTW9kZSgpIHtcbiAgICB0aGlzLl9wZXJzaXN0ZW50QnJvd3Nlck1vZGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHBlcnNpc3RlbnRCcm93c2VyTW9kZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wZXJzaXN0ZW50QnJvd3Nlck1vZGU7XG4gIH1cblxuICAvLyBzaWduX2luX2ZyZXF1ZW5jeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zaWduSW5GcmVxdWVuY3k/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHNpZ25JbkZyZXF1ZW5jeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3NpZ25faW5fZnJlcXVlbmN5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBzaWduSW5GcmVxdWVuY3kodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNpZ25JbkZyZXF1ZW5jeSgpIHtcbiAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3kgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNpZ25JbkZyZXF1ZW5jeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zaWduSW5GcmVxdWVuY3k7XG4gIH1cblxuICAvLyBzaWduX2luX2ZyZXF1ZW5jeV9hdXRoZW50aWNhdGlvbl90eXBlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2lnbkluRnJlcXVlbmN5QXV0aGVudGljYXRpb25UeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzaWduX2luX2ZyZXF1ZW5jeV9hdXRoZW50aWNhdGlvbl90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBzaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeUF1dGhlbnRpY2F0aW9uVHlwZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNpZ25JbkZyZXF1ZW5jeUF1dGhlbnRpY2F0aW9uVHlwZSgpIHtcbiAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNpZ25JbkZyZXF1ZW5jeUF1dGhlbnRpY2F0aW9uVHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGU7XG4gIH1cblxuICAvLyBzaWduX2luX2ZyZXF1ZW5jeV9pbnRlcnZhbCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NpZ25JbkZyZXF1ZW5jeUludGVydmFsPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaWduSW5GcmVxdWVuY3lJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3NpZ25faW5fZnJlcXVlbmN5X2ludGVydmFsJyk7XG4gIH1cbiAgcHVibGljIHNldCBzaWduSW5GcmVxdWVuY3lJbnRlcnZhbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWwgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTaWduSW5GcmVxdWVuY3lJbnRlcnZhbCgpIHtcbiAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWw7XG4gIH1cblxuICAvLyBzaWduX2luX2ZyZXF1ZW5jeV9wZXJpb2QgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2lnbkluRnJlcXVlbmN5UGVyaW9kPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaWduSW5GcmVxdWVuY3lQZXJpb2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzaWduX2luX2ZyZXF1ZW5jeV9wZXJpb2QnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpZ25JbkZyZXF1ZW5jeVBlcmlvZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2lnbkluRnJlcXVlbmN5UGVyaW9kID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2lnbkluRnJlcXVlbmN5UGVyaW9kKCkge1xuICAgIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeVBlcmlvZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2lnbkluRnJlcXVlbmN5UGVyaW9kSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeVBlcmlvZDtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNjcmVhdGUgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjY3JlYXRlfVxuICAqL1xuICByZWFkb25seSBjcmVhdGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZGVsZXRlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2RlbGV0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3JlYWQgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjcmVhZH1cbiAgKi9cbiAgcmVhZG9ubHkgcmVhZD86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSN1cGRhdGUgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjdXBkYXRlfVxuICAqL1xuICByZWFkb25seSB1cGRhdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lUaW1lb3V0cyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgIGRlbGV0ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZWxldGUpLFxuICAgIHJlYWQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucmVhZCksXG4gICAgdXBkYXRlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnVwZGF0ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lUaW1lb3V0c1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgY3JlYXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGRlbGV0ZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGVsZXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICByZWFkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5yZWFkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB1cGRhdGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnVwZGF0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jcmVhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY3JlYXRlID0gdGhpcy5fY3JlYXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRlbGV0ZSA9IHRoaXMuX2RlbGV0ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucmVhZCA9IHRoaXMuX3JlYWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl91cGRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudXBkYXRlID0gdGhpcy5fdXBkYXRlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lUaW1lb3V0cyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jcmVhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kZWxldGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yZWFkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWF0ZSA9IHZhbHVlLmNyZWF0ZTtcbiAgICAgIHRoaXMuX2RlbGV0ZSA9IHZhbHVlLmRlbGV0ZTtcbiAgICAgIHRoaXMuX3JlYWQgPSB2YWx1ZS5yZWFkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gdmFsdWUudXBkYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNyZWF0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jcmVhdGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNyZWF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NyZWF0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3JlYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jcmVhdGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDcmVhdGUoKSB7XG4gICAgdGhpcy5fY3JlYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjcmVhdGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlO1xuICB9XG5cbiAgLy8gZGVsZXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2RlbGV0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGVsZXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZWxldGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlbGV0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlbGV0ZSgpIHtcbiAgICB0aGlzLl9kZWxldGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlbGV0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZWxldGU7XG4gIH1cblxuICAvLyByZWFkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3JlYWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHJlYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyZWFkJyk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZWFkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UmVhZCgpIHtcbiAgICB0aGlzLl9yZWFkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByZWFkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWQ7XG4gIH1cblxuICAvLyB1cGRhdGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdXBkYXRlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB1cGRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd1cGRhdGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVwZGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXBkYXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VXBkYXRlKCkge1xuICAgIHRoaXMuX3VwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdXBkYXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZTtcbiAgfVxufVxuXG4vKipcbiogUmVwcmVzZW50cyBhIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSBhenVyZWFkX2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3l9XG4qL1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5IGV4dGVuZHMgY2RrdG4uVGVycmFmb3JtUmVzb3VyY2Uge1xuXG4gIC8vID09PT09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGZSZXNvdXJjZVR5cGUgPSBcImF6dXJlYWRfY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeVwiO1xuXG4gIC8vID09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09XG4gIC8qKlxuICAqIEdlbmVyYXRlcyBDREtUTiBjb2RlIGZvciBpbXBvcnRpbmcgYSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSByZXNvdXJjZSB1cG9uIHJ1bm5pbmcgXCJjZGt0biBwbGFuIDxzdGFjay1uYW1lPlwiXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaW1wb3J0VG9JZCBUaGUgY29uc3RydWN0IGlkIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb25maWcgZm9yIHRoZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQuIFJlZmVyIHRvIHRoZSB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlXG4gICogQHBhcmFtIHByb3ZpZGVyPyBPcHRpb25hbCBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgd2hlcmUgdGhlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5IHRvIGltcG9ydCBpcyBmb3VuZFxuICAqL1xuICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ29uZmlnRm9ySW1wb3J0KHNjb3BlOiBDb25zdHJ1Y3QsIGltcG9ydFRvSWQ6IHN0cmluZywgaW1wb3J0RnJvbUlkOiBzdHJpbmcsIHByb3ZpZGVyPzogY2RrdG4uVGVycmFmb3JtUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjZGt0bi5JbXBvcnRhYmxlUmVzb3VyY2Uoc2NvcGUsIGltcG9ydFRvSWQsIHsgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiBcImF6dXJlYWRfY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeVwiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kgYXp1cmVhZF9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5fSBSZXNvdXJjZVxuICAqXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaWQgVGhlIHNjb3BlZCBjb25zdHJ1Y3QgSUQuIE11c3QgYmUgdW5pcXVlIGFtb25nc3Qgc2libGluZ3MgaW4gdGhlIHNhbWUgc2NvcGVcbiAgKiBAcGFyYW0gb3B0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmZpZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29uZmlnOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmZpZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAnYXp1cmVhZF9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5JyxcbiAgICAgIHRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyTmFtZTogJ2F6dXJlYWQnLFxuICAgICAgICBwcm92aWRlclZlcnNpb246ICczLjcuMCcsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICd+PiAzLjAnXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcbiAgICAgIGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBjb25maWcuY291bnQsXG4gICAgICBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsXG4gICAgICBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsXG4gICAgICBjb25uZWN0aW9uOiBjb25maWcuY29ubmVjdGlvbixcbiAgICAgIGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoXG4gICAgfSk7XG4gICAgdGhpcy5fZGlzcGxheU5hbWUgPSBjb25maWcuZGlzcGxheU5hbWU7XG4gICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5fc3RhdGUgPSBjb25maWcuc3RhdGU7XG4gICAgdGhpcy5fY29uZGl0aW9ucy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmNvbmRpdGlvbnM7XG4gICAgdGhpcy5fZ3JhbnRDb250cm9scy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmdyYW50Q29udHJvbHM7XG4gICAgdGhpcy5fc2Vzc2lvbkNvbnRyb2xzLmludGVybmFsVmFsdWUgPSBjb25maWcuc2Vzc2lvbkNvbnRyb2xzO1xuICAgIHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUgPSBjb25maWcudGltZW91dHM7XG4gIH1cblxuICAvLyA9PT09PT09PT09XG4gIC8vIEFUVFJJQlVURVNcbiAgLy8gPT09PT09PT09PVxuXG4gIC8vIGRpc3BsYXlfbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9kaXNwbGF5TmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGlzcGxheU5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkaXNwbGF5X25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRpc3BsYXlOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kaXNwbGF5TmFtZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkaXNwbGF5TmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5TmFtZTtcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElkKCkge1xuICAgIHRoaXMuX2lkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8vIG9iamVjdF9pZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG9iamVjdElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb2JqZWN0X2lkJyk7XG4gIH1cblxuICAvLyBzdGF0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zdGF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzdGF0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3N0YXRlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHN0YXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgLy8gY29uZGl0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9jb25kaXRpb25zID0gbmV3IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImNvbmRpdGlvbnNcIik7XG4gIHB1YmxpYyBnZXQgY29uZGl0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZGl0aW9ucztcbiAgfVxuICBwdWJsaWMgcHV0Q29uZGl0aW9ucyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zKSB7XG4gICAgdGhpcy5fY29uZGl0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNvbmRpdGlvbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZGl0aW9ucy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gZ3JhbnRfY29udHJvbHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZ3JhbnRDb250cm9scyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUdyYW50Q29udHJvbHNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJncmFudF9jb250cm9sc1wiKTtcbiAgcHVibGljIGdldCBncmFudENvbnRyb2xzKCkge1xuICAgIHJldHVybiB0aGlzLl9ncmFudENvbnRyb2xzO1xuICB9XG4gIHB1YmxpYyBwdXRHcmFudENvbnRyb2xzKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUdyYW50Q29udHJvbHMpIHtcbiAgICB0aGlzLl9ncmFudENvbnRyb2xzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRHcmFudENvbnRyb2xzKCkge1xuICAgIHRoaXMuX2dyYW50Q29udHJvbHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZ3JhbnRDb250cm9sc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ncmFudENvbnRyb2xzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzZXNzaW9uX2NvbnRyb2xzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Nlc3Npb25Db250cm9scyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9sc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInNlc3Npb25fY29udHJvbHNcIik7XG4gIHB1YmxpYyBnZXQgc2Vzc2lvbkNvbnRyb2xzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uQ29udHJvbHM7XG4gIH1cbiAgcHVibGljIHB1dFNlc3Npb25Db250cm9scyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHMpIHtcbiAgICB0aGlzLl9zZXNzaW9uQ29udHJvbHMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNlc3Npb25Db250cm9scygpIHtcbiAgICB0aGlzLl9zZXNzaW9uQ29udHJvbHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2Vzc2lvbkNvbnRyb2xzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25Db250cm9scy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdGltZW91dHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGltZW91dHMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lUaW1lb3V0c091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInRpbWVvdXRzXCIpO1xuICBwdWJsaWMgZ2V0IHRpbWVvdXRzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0cztcbiAgfVxuICBwdWJsaWMgcHV0VGltZW91dHModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHMpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGltZW91dHMoKSB7XG4gICAgdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGltZW91dHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PVxuICAvLyBTWU5USEVTSVNcbiAgLy8gPT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheV9uYW1lOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9kaXNwbGF5TmFtZSksXG4gICAgICBpZDogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgc3RhdGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3N0YXRlKSxcbiAgICAgIGNvbmRpdGlvbnM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1RvVGVycmFmb3JtKHRoaXMuX2NvbmRpdGlvbnMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBncmFudF9jb250cm9sczogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzVG9UZXJyYWZvcm0odGhpcy5fZ3JhbnRDb250cm9scy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHNlc3Npb25fY29udHJvbHM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5U2Vzc2lvbkNvbnRyb2xzVG9UZXJyYWZvcm0odGhpcy5fc2Vzc2lvbkNvbnRyb2xzLmludGVybmFsVmFsdWUpLFxuICAgICAgdGltZW91dHM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHNUb1RlcnJhZm9ybSh0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgIGRpc3BsYXlfbmFtZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fZGlzcGxheU5hbWUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBpZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBzdGF0ZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fc3RhdGUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIHZhbHVlOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNUb0hjbFRlcnJhZm9ybSh0aGlzLl9jb25kaXRpb25zLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgZ3JhbnRfY29udHJvbHM6IHtcbiAgICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc1RvSGNsVGVycmFmb3JtKHRoaXMuX2dyYW50Q29udHJvbHMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc0xpc3RcIixcbiAgICAgIH0sXG4gICAgICBzZXNzaW9uX2NvbnRyb2xzOiB7XG4gICAgICAgIHZhbHVlOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9sc1RvSGNsVGVycmFmb3JtKHRoaXMuX3Nlc3Npb25Db250cm9scy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgdGltZW91dHM6IHtcbiAgICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHNUb0hjbFRlcnJhZm9ybSh0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJzdHJ1Y3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzXCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCApKVxuICB9XG59XG4iXX0=
|