@aws-cdk/region-info 2.0.0 → 2.4.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 +125 -49
- package/.jsii.tabl.json +357 -0
- package/LICENSE +1 -1
- package/NOTICE +1 -1
- package/build-tools/fact-tables.d.ts +0 -1
- package/build-tools/fact-tables.js +150 -83
- package/build-tools/generate-static-data.js +11 -7
- package/lib/aws-entities.d.ts +56 -0
- package/lib/aws-entities.js +143 -0
- package/lib/built-ins.generated.d.ts +1 -1
- package/lib/built-ins.generated.js +275 -110
- package/lib/default.d.ts +3 -3
- package/lib/default.js +24 -15
- package/lib/fact.d.ts +1 -1
- package/lib/fact.js +10 -6
- package/lib/region-info.d.ts +14 -1
- package/lib/region-info.js +24 -4
- package/package.json +4 -4
- package/rosetta/_generated.ts-fixture +6 -0
- package/build-tools/aws-entities.d.ts +0 -12
- package/build-tools/aws-entities.js +0 -56
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRegionMap = exports.partitionInformation = exports.regionsBefore = exports.before = exports.AWS_SERVICES = exports.AWS_REGIONS = exports.AWS_REGIONS_AND_RULES = exports.RULE_S3_WEBSITE_REGIONAL_SUBDOMAIN = exports.RULE_SSM_PRINCIPALS_ARE_REGIONAL = void 0;
|
|
4
|
+
// Rule prefix
|
|
5
|
+
const RULE_ = 'RULE_';
|
|
6
|
+
/**
|
|
7
|
+
* After this point, SSM only creates regional principals
|
|
8
|
+
*/
|
|
9
|
+
exports.RULE_SSM_PRINCIPALS_ARE_REGIONAL = `${RULE_}SSM_PRINCIPALS_ARE_REGIONAL`;
|
|
10
|
+
/**
|
|
11
|
+
* After this point, S3 website domains look like `s3-website.REGION.s3.amazonaws.com`
|
|
12
|
+
*
|
|
13
|
+
* Before this point, S3 website domains look like `s3-website-REGION.s3.amazonaws.com`.
|
|
14
|
+
*/
|
|
15
|
+
exports.RULE_S3_WEBSITE_REGIONAL_SUBDOMAIN = `${RULE_}S3_WEBSITE_REGIONAL_SUBDOMAIN`;
|
|
16
|
+
/**
|
|
17
|
+
* List of AWS region, ordered by launch date (oldest to newest)
|
|
18
|
+
*
|
|
19
|
+
* The significance of this is that standards and conventions change over time.
|
|
20
|
+
* Generally, as rules are changed they only apply to new regions, and old
|
|
21
|
+
* regions are left as-is.
|
|
22
|
+
*
|
|
23
|
+
* We mix the list of regions with a list of rules that were introduced over
|
|
24
|
+
* time (rules are strings starting with `RULE_`).
|
|
25
|
+
*
|
|
26
|
+
* Therefore, if we want to know if a rule applies to a certain region, we
|
|
27
|
+
* only need to check its position in the list and compare it to when a
|
|
28
|
+
* rule was introduced.
|
|
29
|
+
*/
|
|
30
|
+
exports.AWS_REGIONS_AND_RULES = [
|
|
31
|
+
'us-east-1',
|
|
32
|
+
'eu-west-1',
|
|
33
|
+
'us-west-1',
|
|
34
|
+
'ap-southeast-1',
|
|
35
|
+
'ap-northeast-1',
|
|
36
|
+
'us-gov-west-1',
|
|
37
|
+
'us-west-2',
|
|
38
|
+
'sa-east-1',
|
|
39
|
+
'ap-southeast-2',
|
|
40
|
+
exports.RULE_S3_WEBSITE_REGIONAL_SUBDOMAIN,
|
|
41
|
+
'cn-north-1',
|
|
42
|
+
'us-iso-east-1',
|
|
43
|
+
'eu-central-1',
|
|
44
|
+
'ap-northeast-2',
|
|
45
|
+
'ap-south-1',
|
|
46
|
+
'us-east-2',
|
|
47
|
+
'ca-central-1',
|
|
48
|
+
'eu-west-2',
|
|
49
|
+
'us-isob-east-1',
|
|
50
|
+
'cn-northwest-1',
|
|
51
|
+
'eu-west-3',
|
|
52
|
+
'ap-northeast-3',
|
|
53
|
+
'us-gov-east-1',
|
|
54
|
+
'eu-north-1',
|
|
55
|
+
exports.RULE_SSM_PRINCIPALS_ARE_REGIONAL,
|
|
56
|
+
'ap-east-1',
|
|
57
|
+
'me-south-1',
|
|
58
|
+
'eu-south-1',
|
|
59
|
+
'af-south-1',
|
|
60
|
+
'us-iso-west-1',
|
|
61
|
+
'eu-south-2',
|
|
62
|
+
'ap-southeast-3',
|
|
63
|
+
];
|
|
64
|
+
/**
|
|
65
|
+
* The names of all (known) AWS regions
|
|
66
|
+
*
|
|
67
|
+
* Not in the list ==> no built-in data for that region.
|
|
68
|
+
*/
|
|
69
|
+
exports.AWS_REGIONS = exports.AWS_REGIONS_AND_RULES
|
|
70
|
+
.filter((x) => !x.startsWith(RULE_))
|
|
71
|
+
.sort();
|
|
72
|
+
/**
|
|
73
|
+
* Possibly non-exaustive list of all service names, used to locate service principals.
|
|
74
|
+
*
|
|
75
|
+
* Not in the list ==> default service principal mappings.
|
|
76
|
+
*/
|
|
77
|
+
exports.AWS_SERVICES = [
|
|
78
|
+
'application-autoscaling',
|
|
79
|
+
'autoscaling',
|
|
80
|
+
'codedeploy',
|
|
81
|
+
'ec2',
|
|
82
|
+
'events',
|
|
83
|
+
'lambda',
|
|
84
|
+
'logs',
|
|
85
|
+
's3',
|
|
86
|
+
'ssm',
|
|
87
|
+
'sns',
|
|
88
|
+
'sqs',
|
|
89
|
+
'states',
|
|
90
|
+
].sort();
|
|
91
|
+
/**
|
|
92
|
+
* Whether or not a region predates a given rule (or region).
|
|
93
|
+
*
|
|
94
|
+
* Unknown region => we have to assume no.
|
|
95
|
+
*/
|
|
96
|
+
function before(region, ruleOrRegion) {
|
|
97
|
+
const ruleIx = exports.AWS_REGIONS_AND_RULES.indexOf(ruleOrRegion);
|
|
98
|
+
if (ruleIx === -1) {
|
|
99
|
+
throw new Error(`Unknown rule: ${ruleOrRegion}`);
|
|
100
|
+
}
|
|
101
|
+
const regionIx = exports.AWS_REGIONS_AND_RULES.indexOf(region);
|
|
102
|
+
return regionIx === -1 ? false : regionIx < ruleIx;
|
|
103
|
+
}
|
|
104
|
+
exports.before = before;
|
|
105
|
+
/**
|
|
106
|
+
* Return all regions before a given rule was introduced (or region)
|
|
107
|
+
*/
|
|
108
|
+
function regionsBefore(ruleOrRegion) {
|
|
109
|
+
const ruleIx = exports.AWS_REGIONS_AND_RULES.indexOf(ruleOrRegion);
|
|
110
|
+
if (ruleIx === -1) {
|
|
111
|
+
throw new Error(`Unknown rule: ${ruleOrRegion}`);
|
|
112
|
+
}
|
|
113
|
+
return exports.AWS_REGIONS_AND_RULES.filter((_, i) => i < ruleIx).sort();
|
|
114
|
+
}
|
|
115
|
+
exports.regionsBefore = regionsBefore;
|
|
116
|
+
const PARTITION_MAP = {
|
|
117
|
+
'default': { partition: 'aws', domainSuffix: 'amazonaws.com' },
|
|
118
|
+
'cn-': { partition: 'aws-cn', domainSuffix: 'amazonaws.com.cn' },
|
|
119
|
+
'us-gov-': { partition: 'aws-us-gov', domainSuffix: 'amazonaws.com' },
|
|
120
|
+
'us-iso-': { partition: 'aws-iso', domainSuffix: 'c2s.ic.gov' },
|
|
121
|
+
'us-isob-': { partition: 'aws-iso-b', domainSuffix: 'sc2s.sgov.gov' },
|
|
122
|
+
};
|
|
123
|
+
function partitionInformation(region) {
|
|
124
|
+
for (const [prefix, info] of Object.entries(PARTITION_MAP)) {
|
|
125
|
+
if (region.startsWith(prefix)) {
|
|
126
|
+
return info;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return PARTITION_MAP.default;
|
|
130
|
+
}
|
|
131
|
+
exports.partitionInformation = partitionInformation;
|
|
132
|
+
/**
|
|
133
|
+
* Build a lookup map for all regions
|
|
134
|
+
*/
|
|
135
|
+
function generateRegionMap(cb) {
|
|
136
|
+
const ret = {};
|
|
137
|
+
for (const region of exports.AWS_REGIONS) {
|
|
138
|
+
ret[region] = cb(region);
|
|
139
|
+
}
|
|
140
|
+
return ret;
|
|
141
|
+
}
|
|
142
|
+
exports.generateRegionMap = generateRegionMap;
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWVudGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLWVudGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGNBQWM7QUFDZCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFFdEI7O0dBRUc7QUFDVSxRQUFBLGdDQUFnQyxHQUFHLEdBQUcsS0FBSyw2QkFBNkIsQ0FBQztBQUV0Rjs7OztHQUlHO0FBQ1UsUUFBQSxrQ0FBa0MsR0FBRyxHQUFHLEtBQUssK0JBQStCLENBQUM7QUFFMUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNVLFFBQUEscUJBQXFCLEdBQUc7SUFDbkMsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsV0FBVztJQUNYLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsMENBQWtDO0lBQ2xDLFlBQVk7SUFDWixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osV0FBVztJQUNYLGNBQWM7SUFDZCxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixZQUFZO0lBQ1osd0NBQWdDO0lBQ2hDLFdBQVc7SUFDWCxZQUFZO0lBQ1osWUFBWTtJQUNaLFlBQVk7SUFDWixlQUFlO0lBQ2YsWUFBWTtJQUNaLGdCQUFnQjtDQUNqQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNVLFFBQUEsV0FBVyxHQUFHLDZCQUFxQjtLQUM3QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNuQyxJQUFJLEVBQUUsQ0FBQztBQUVWOzs7O0dBSUc7QUFDVSxRQUFBLFlBQVksR0FBRztJQUMxQix5QkFBeUI7SUFDekIsYUFBYTtJQUNiLFlBQVk7SUFDWixLQUFLO0lBQ0wsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sSUFBSTtJQUNKLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLFFBQVE7Q0FDVCxDQUFDLElBQUksRUFBRSxDQUFDO0FBRVQ7Ozs7R0FJRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxNQUFjLEVBQUUsWUFBb0I7SUFDekQsTUFBTSxNQUFNLEdBQUcsNkJBQXFCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNELElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLFlBQVksRUFBRSxDQUFDLENBQUM7S0FDbEQ7SUFDRCxNQUFNLFFBQVEsR0FBRyw2QkFBcUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsT0FBTyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUNyRCxDQUFDO0FBUEQsd0JBT0M7QUFFRDs7R0FFRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxZQUFvQjtJQUNoRCxNQUFNLE1BQU0sR0FBRyw2QkFBcUIsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0QsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsWUFBWSxFQUFFLENBQUMsQ0FBQztLQUNsRDtJQUNELE9BQU8sNkJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ25FLENBQUM7QUFORCxzQ0FNQztBQUlELE1BQU0sYUFBYSxHQUFpQztJQUNsRCxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUU7SUFDOUQsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUU7SUFDaEUsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFO0lBQ3JFLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRTtJQUMvRCxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUU7Q0FDdEUsQ0FBQztBQUVGLFNBQWdCLG9CQUFvQixDQUFDLE1BQWM7SUFDakQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDMUQsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzdCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQztBQUMvQixDQUFDO0FBUEQsb0RBT0M7QUFFRDs7R0FFRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLEVBQThCO0lBQzlELE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsS0FBSyxNQUFNLE1BQU0sSUFBSSxtQkFBVyxFQUFFO1FBQ2hDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDMUI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFORCw4Q0FNQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFJ1bGUgcHJlZml4XG5jb25zdCBSVUxFXyA9ICdSVUxFXyc7XG5cbi8qKlxuICogQWZ0ZXIgdGhpcyBwb2ludCwgU1NNIG9ubHkgY3JlYXRlcyByZWdpb25hbCBwcmluY2lwYWxzXG4gKi9cbmV4cG9ydCBjb25zdCBSVUxFX1NTTV9QUklOQ0lQQUxTX0FSRV9SRUdJT05BTCA9IGAke1JVTEVffVNTTV9QUklOQ0lQQUxTX0FSRV9SRUdJT05BTGA7XG5cbi8qKlxuICogQWZ0ZXIgdGhpcyBwb2ludCwgUzMgd2Vic2l0ZSBkb21haW5zIGxvb2sgbGlrZSBgczMtd2Vic2l0ZS5SRUdJT04uczMuYW1hem9uYXdzLmNvbWBcbiAqXG4gKiBCZWZvcmUgdGhpcyBwb2ludCwgUzMgd2Vic2l0ZSBkb21haW5zIGxvb2sgbGlrZSBgczMtd2Vic2l0ZS1SRUdJT04uczMuYW1hem9uYXdzLmNvbWAuXG4gKi9cbmV4cG9ydCBjb25zdCBSVUxFX1MzX1dFQlNJVEVfUkVHSU9OQUxfU1VCRE9NQUlOID0gYCR7UlVMRV99UzNfV0VCU0lURV9SRUdJT05BTF9TVUJET01BSU5gO1xuXG4vKipcbiAqIExpc3Qgb2YgQVdTIHJlZ2lvbiwgb3JkZXJlZCBieSBsYXVuY2ggZGF0ZSAob2xkZXN0IHRvIG5ld2VzdClcbiAqXG4gKiBUaGUgc2lnbmlmaWNhbmNlIG9mIHRoaXMgaXMgdGhhdCBzdGFuZGFyZHMgYW5kIGNvbnZlbnRpb25zIGNoYW5nZSBvdmVyIHRpbWUuXG4gKiBHZW5lcmFsbHksIGFzIHJ1bGVzIGFyZSBjaGFuZ2VkIHRoZXkgb25seSBhcHBseSB0byBuZXcgcmVnaW9ucywgYW5kIG9sZFxuICogcmVnaW9ucyBhcmUgbGVmdCBhcy1pcy5cbiAqXG4gKiBXZSBtaXggdGhlIGxpc3Qgb2YgcmVnaW9ucyB3aXRoIGEgbGlzdCBvZiBydWxlcyB0aGF0IHdlcmUgaW50cm9kdWNlZCBvdmVyXG4gKiB0aW1lIChydWxlcyBhcmUgc3RyaW5ncyBzdGFydGluZyB3aXRoIGBSVUxFX2ApLlxuICpcbiAqIFRoZXJlZm9yZSwgaWYgd2Ugd2FudCB0byBrbm93IGlmIGEgcnVsZSBhcHBsaWVzIHRvIGEgY2VydGFpbiByZWdpb24sIHdlXG4gKiBvbmx5IG5lZWQgdG8gY2hlY2sgaXRzIHBvc2l0aW9uIGluIHRoZSBsaXN0IGFuZCBjb21wYXJlIGl0IHRvIHdoZW4gYVxuICogcnVsZSB3YXMgaW50cm9kdWNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFXU19SRUdJT05TX0FORF9SVUxFUyA9IFtcbiAgJ3VzLWVhc3QtMScsIC8vIFVTIEVhc3QgKE4uIFZpcmdpbmlhKVxuICAnZXUtd2VzdC0xJywgLy8gRXVyb3BlIChJcmVsYW5kKVxuICAndXMtd2VzdC0xJywgLy8gVVMgV2VzdCAoTi4gQ2FsaWZvcm5pYSlcbiAgJ2FwLXNvdXRoZWFzdC0xJywgLy8gQXNpYSBQYWNpZmljIChTaW5nYXBvcmUpXG4gICdhcC1ub3J0aGVhc3QtMScsIC8vIEFzaWEgUGFjaWZpYyAoVG9reW8pXG4gICd1cy1nb3Ytd2VzdC0xJywgLy8gQVdTIEdvdkNsb3VkIChVUy1XZXN0KVxuICAndXMtd2VzdC0yJywgLy8gVVMgV2VzdCAoT3JlZ29uKVxuICAnc2EtZWFzdC0xJywgLy8gU291dGggQW1lcmljYSAoU8OjbyBQYXVsbylcbiAgJ2FwLXNvdXRoZWFzdC0yJywgLy8gQXNpYSBQYWNpZmljIChTeWRuZXkpXG4gIFJVTEVfUzNfV0VCU0lURV9SRUdJT05BTF9TVUJET01BSU4sXG4gICdjbi1ub3J0aC0xJywgLy8gQ2hpbmEgKEJlaWppbmcpXG4gICd1cy1pc28tZWFzdC0xJywgLy8gQVdTIElTT1xuICAnZXUtY2VudHJhbC0xJywgLy8gRXVyb3BlIChGcmFua2Z1cnQpXG4gICdhcC1ub3J0aGVhc3QtMicsIC8vIEFzaWEgUGFjaWZpYyAoU2VvdWwpXG4gICdhcC1zb3V0aC0xJywgLy8gQXNpYSBQYWNpZmljIChNdW1iYWkpXG4gICd1cy1lYXN0LTInLCAvLyBVUyBFYXN0IChPaGlvKVxuICAnY2EtY2VudHJhbC0xJywgLy8gQ2FuYWRhIChDZW50cmFsKVxuICAnZXUtd2VzdC0yJywgLy8gRXVyb3BlIChMb25kb24pXG4gICd1cy1pc29iLWVhc3QtMScsIC8vIEFXUyBJU08tQlxuICAnY24tbm9ydGh3ZXN0LTEnLCAvLyBDaGluYSAoTmluZ3hpYSlcbiAgJ2V1LXdlc3QtMycsIC8vIEV1cm9wZSAoUGFyaXMpXG4gICdhcC1ub3J0aGVhc3QtMycsIC8vIEFzaWEgUGFjaWZpYyAoT3Nha2EpXG4gICd1cy1nb3YtZWFzdC0xJywgLy8gQVdTIEdvdkNsb3VkIChVUy1FYXN0KVxuICAnZXUtbm9ydGgtMScsIC8vIEV1cm9wZSAoU3RvY2tob2xtKVxuICBSVUxFX1NTTV9QUklOQ0lQQUxTX0FSRV9SRUdJT05BTCxcbiAgJ2FwLWVhc3QtMScsIC8vIEFzaWEgUGFjaWZpYyAoSG9uZyBLb25nKVxuICAnbWUtc291dGgtMScsIC8vIE1pZGRsZSBFYXN0IChCYWhyYWluKVxuICAnZXUtc291dGgtMScsIC8vIEV1cm9wZSAoTWlsYW4pXG4gICdhZi1zb3V0aC0xJywgLy8gQWZyaWNhIChDYXBlIFRvd24pXG4gICd1cy1pc28td2VzdC0xJywgLy8gVVMgSVNPIFdlc3RcbiAgJ2V1LXNvdXRoLTInLCAvLyBFdXJvcGUgKFNwYWluKVxuICAnYXAtc291dGhlYXN0LTMnLCAvLyBBc2lhIFBhY2lmaWMgKEpha2FydGEpXG5dO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiBhbGwgKGtub3duKSBBV1MgcmVnaW9uc1xuICpcbiAqIE5vdCBpbiB0aGUgbGlzdCA9PT4gbm8gYnVpbHQtaW4gZGF0YSBmb3IgdGhhdCByZWdpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBBV1NfUkVHSU9OUyA9IEFXU19SRUdJT05TX0FORF9SVUxFU1xuICAuZmlsdGVyKCh4KSA9PiAheC5zdGFydHNXaXRoKFJVTEVfKSlcbiAgLnNvcnQoKTtcblxuLyoqXG4gKiBQb3NzaWJseSBub24tZXhhdXN0aXZlIGxpc3Qgb2YgYWxsIHNlcnZpY2UgbmFtZXMsIHVzZWQgdG8gbG9jYXRlIHNlcnZpY2UgcHJpbmNpcGFscy5cbiAqXG4gKiBOb3QgaW4gdGhlIGxpc3QgPT0+IGRlZmF1bHQgc2VydmljZSBwcmluY2lwYWwgbWFwcGluZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBBV1NfU0VSVklDRVMgPSBbXG4gICdhcHBsaWNhdGlvbi1hdXRvc2NhbGluZycsXG4gICdhdXRvc2NhbGluZycsXG4gICdjb2RlZGVwbG95JyxcbiAgJ2VjMicsXG4gICdldmVudHMnLFxuICAnbGFtYmRhJyxcbiAgJ2xvZ3MnLFxuICAnczMnLFxuICAnc3NtJyxcbiAgJ3NucycsXG4gICdzcXMnLFxuICAnc3RhdGVzJyxcbl0uc29ydCgpO1xuXG4vKipcbiAqIFdoZXRoZXIgb3Igbm90IGEgcmVnaW9uIHByZWRhdGVzIGEgZ2l2ZW4gcnVsZSAob3IgcmVnaW9uKS5cbiAqXG4gKiBVbmtub3duIHJlZ2lvbiA9PiB3ZSBoYXZlIHRvIGFzc3VtZSBuby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShyZWdpb246IHN0cmluZywgcnVsZU9yUmVnaW9uOiBzdHJpbmcpIHtcbiAgY29uc3QgcnVsZUl4ID0gQVdTX1JFR0lPTlNfQU5EX1JVTEVTLmluZGV4T2YocnVsZU9yUmVnaW9uKTtcbiAgaWYgKHJ1bGVJeCA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcnVsZTogJHtydWxlT3JSZWdpb259YCk7XG4gIH1cbiAgY29uc3QgcmVnaW9uSXggPSBBV1NfUkVHSU9OU19BTkRfUlVMRVMuaW5kZXhPZihyZWdpb24pO1xuICByZXR1cm4gcmVnaW9uSXggPT09IC0xID8gZmFsc2UgOiByZWdpb25JeCA8IHJ1bGVJeDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWxsIHJlZ2lvbnMgYmVmb3JlIGEgZ2l2ZW4gcnVsZSB3YXMgaW50cm9kdWNlZCAob3IgcmVnaW9uKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uc0JlZm9yZShydWxlT3JSZWdpb246IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcnVsZUl4ID0gQVdTX1JFR0lPTlNfQU5EX1JVTEVTLmluZGV4T2YocnVsZU9yUmVnaW9uKTtcbiAgaWYgKHJ1bGVJeCA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcnVsZTogJHtydWxlT3JSZWdpb259YCk7XG4gIH1cbiAgcmV0dXJuIEFXU19SRUdJT05TX0FORF9SVUxFUy5maWx0ZXIoKF8sIGkpID0+IGkgPCBydWxlSXgpLnNvcnQoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpb24geyBwYXJ0aXRpb246IHN0cmluZywgZG9tYWluU3VmZml4OiBzdHJpbmcgfVxuXG5jb25zdCBQQVJUSVRJT05fTUFQOiB7IFtyZWdpb246IHN0cmluZ106IFJlZ2lvbiB9ID0ge1xuICAnZGVmYXVsdCc6IHsgcGFydGl0aW9uOiAnYXdzJywgZG9tYWluU3VmZml4OiAnYW1hem9uYXdzLmNvbScgfSxcbiAgJ2NuLSc6IHsgcGFydGl0aW9uOiAnYXdzLWNuJywgZG9tYWluU3VmZml4OiAnYW1hem9uYXdzLmNvbS5jbicgfSxcbiAgJ3VzLWdvdi0nOiB7IHBhcnRpdGlvbjogJ2F3cy11cy1nb3YnLCBkb21haW5TdWZmaXg6ICdhbWF6b25hd3MuY29tJyB9LFxuICAndXMtaXNvLSc6IHsgcGFydGl0aW9uOiAnYXdzLWlzbycsIGRvbWFpblN1ZmZpeDogJ2Mycy5pYy5nb3YnIH0sXG4gICd1cy1pc29iLSc6IHsgcGFydGl0aW9uOiAnYXdzLWlzby1iJywgZG9tYWluU3VmZml4OiAnc2Mycy5zZ292LmdvdicgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJ0aXRpb25JbmZvcm1hdGlvbihyZWdpb246IHN0cmluZyk6IFJlZ2lvbiB7XG4gIGZvciAoY29uc3QgW3ByZWZpeCwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXMoUEFSVElUSU9OX01BUCkpIHtcbiAgICBpZiAocmVnaW9uLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuICB9XG4gIHJldHVybiBQQVJUSVRJT05fTUFQLmRlZmF1bHQ7XG59XG5cbi8qKlxuICogQnVpbGQgYSBsb29rdXAgbWFwIGZvciBhbGwgcmVnaW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSZWdpb25NYXAoY2I6IChyZWdpb246IHN0cmluZykgPT4gc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJldDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHJlZ2lvbiBvZiBBV1NfUkVHSU9OUykge1xuICAgIHJldFtyZWdpb25dID0gY2IocmVnaW9uKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIl19
|