cdk8s 0.32.0 → 0.33.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 CHANGED
@@ -44,7 +44,7 @@
44
44
  "stability": "experimental"
45
45
  },
46
46
  "homepage": "https://github.com/awslabs/cdk8s.git",
47
- "jsiiVersion": "1.12.0 (build 5ddc9f2)",
47
+ "jsiiVersion": "1.13.0 (build 385c325)",
48
48
  "keywords": [
49
49
  "cdk",
50
50
  "kubernetes",
@@ -54,7 +54,7 @@
54
54
  "license": "Apache-2.0",
55
55
  "name": "cdk8s",
56
56
  "readme": {
57
- "markdown": "# cdk8s\n\n> Cloud Development Kit for Kubernetes\n\n**cdk8s** is a software development framework for defining Kubernetes\napplications using rich object-oriented APIs. It allows developers to leverage\nthe full power of software in order to define abstract components called\n\"constructs\" which compose Kubernetes resources or other constructs into\nhigher-level abstractions.\n\nThis library is the foundation of **cdk8s**. It includes base types that are\nused to define cdk8s applications.\n\n## Chart\n\nThe `Chart` is a container that synthesizes a single Kubernetes manifest.\n\n```ts\nclass MyChart extends Chart {\n constructor(scope: Construct, ns: string) {\n super(scope, ns);\n\n // add contents here\n }\n}\n```\n\nDuring synthesis, charts collect all the `ApiObject` nodes (recursively) and\nemit a single YAML manifest that includes all these objects.\n\n## ApiObject\n\nAn `ApiObject` is a construct that represents an entry in a Kubernetes manifest (level 0).\nIn most cases, you won't use `ApiObject` directly but rather use classes that\nare imported through `cdk8s import` and which extend this base class.\n\n## Include\n\nThe `Include` construct can be used to include an existing manifest in a chart.\n\nThe following example will include the Kubernetes Dashboard in `MyChart`:\n\n```ts\nimport { Include } from 'cdk8s';\n\nclass MyChart extends Chart {\n constructor(scope: Construct, id: string) {\n super(scope, id);\n\n const dashboard = new Include(this, 'dashboard', {\n url: 'https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml',\n // or\n url: 'dashboard.yaml'\n });\n\n // ...other resources\n }\n}\n```\n\nAll API objects defined in the included manifest will be added as children\n`ApiObject`s under the `Include` construct's scope and can be accessed\nthrough the `apiObject` property:\n\nThe following example queries for all the `Deployment` resources in the\ndashboard:\n\n```ts\nconst deploymentApiObject = dashboard.apiObjects.find(c => c.kind === 'Deployment);\n```\n\nNOTE: names of included objects (`metadata.name`) are preserved. This means that\nif you try to include the same manifest twice into the same chart, your manifest\nwill have duplicate definitions of the same objects.\n\n## Dependencies\n\nYou can declare dependencies between any two cdk8s constructs using the `addDependency()` method.\n\n### ApiObjects\n\nFor example, you can force kubernetes to first apply a `Namespace` before applying the `Service` in the scope of that namespace:\n\n```typescript\n\nconst namespace = new k8s.Namespace(chart, 'backend');\nconst service = new k8s.Service(chart, 'Service', { metadata: { namespace: namespace.name }});\n\n// declare the dependency. this is just a syntactic sugar for Node.of(service).addDependency(namespace)\nservice.addDependency(namespace);\n```\n\n`cdk8s` will ensure that the `Namespace` object is placed before the `Service` object in the resulting manifest:\n\n```yaml\napiVersion: v1\nkind: Namespace\nmetadata:\n name: chart-backend-a59d2e47\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: chart-service-93d02be7\n namespace: chart-backend-a59d2e47\n```\n\n### Charts\n\nYou can also specify dependencies between charts, in exactly the same manner. For example, if we have a chart that provisions our `namespace`, we need that chart to be applied first:\n\n```typescript\nconst namespaceChart = new NamespaceChart(app, 'namespace');\nconst applicationChart = new ApplicationChart(app, 'application');\n\n// declare the dependency. this is just a syntactic sugar for Node.of(applicationChart).addDependency(namespaceChart)\napplicationChart.addDependency(namespaceChart);\n```\n\nRunning `cdk8s synth` will produce the following `dist` directory:\n\n```console\n> cdk8s synth\n\ndist/0000-namespace.k8s.yaml\ndist/0001-application.k8s.yaml\n```\n\nNotice that the `namespace` chart appears first with the `0000` prefix. This will ensure that a subsequent execution of `kubectl apply -f dist/` will apply the `namespace` first, and the `application` second.\n\n### Custom Constructs\n\nThe behavior above applies in the same way to custom constructs that you create or use.\n\n```typescript\nclass Database extends Construct {\n constructor(scope: Construct, name: string) {\n super(scope, name);\n\n new k8s.StatefulSet(this, 'StatefulSet');\n new k8s.ConfigMap(this, 'ConfigMap');\n }\n}\n\nconst app = new App();\n\nconst chart = new Chart(app, 'Chart');\n\nconst service = new k8s.Service(chart, 'Service')\nconst database = new Database(chart, 'Database');\n\nservice.addDependency(database);\n```\n\nDeclaring such a dependency will cause **each** `ApiObject` in the source construct, to *depend on* **every** `ApiObject` in the target construct.\n\nNote that in the example above, the source construct is actually an `ApiObject`, which is also ok since it is essentially a construct with a single `ApiObject`.\n\n> Note that if the source of your dependency is a custom construct, it won't have the `addDependency` syntactic sugar by default, so you'll have to use `Node.of()`.\n\nThe resulting manifest will be:\n\n```yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n name: chart-database-statefulset-4627f8e2\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: chart-database-configmap-676f8640\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: chart-service-93d02be7\n```\n\nYou can see that all `ApiObject`s of the `Database` construct, appear before the `Service` object.\n\n### Things just got cool\n\nIf you simply declare a dependency between two `ApiObject`s (or `Constructs`), that belong to two different `Chart`s, `cdk8s` will create the chart dependency automatically for you.\n\n```typescript\nconst namespaceChart = new NamespaceChart(app, 'namespace');\nconst applicationChart = new ApplicationChart(app, 'application');\n\nconst namespace = new k8s.Namespace(namespaceChart, 'namespace');\nconst deployment = new k8s.Deployment(applicationChart, 'Deployment');\n\n// dependency between ApiObjects, not Charts!\ndeployment.addDependency(namespace);\n```\n\nRunning `cdk8s synth` will produce the same result as if explicit chart dependencies were declared:\n\n```console\n> cdk8s synth\n\ndist/0000-namespace.k8s.yaml\ndist/0001-application.k8s.yaml\n```\n\nThis means you need not be bothered with managing chart dependencies, simply work with the `ApiObject`s you create, and let `cdk8s` infer the chart dependencies.\n\n## Helm Support\n\nYou can use the `Helm` construct in order to include [Helm](https://helm.sh)\ncharts.\n\nIn order to use this construct, you must have `helm` installed on your system.\nSee [Installing Helm](https://helm.sh/docs/intro/install/) in the Helm\ndocumentation for details.\n\nThe following example adds the\n[bitnami/redis](https://github.com/bitnami/charts/tree/master/bitnami/redis)\nHelm chart with sentinel containers enabled:\n\n> The Bitnami helm repo needs to be added through: `helm repo add bitnami https://charts.bitnami.com/bitnami`\n\n```ts\nclass MyChart extends cdk8s.Chart {\n constructor(scope: Construct, id: string) {\n super(scope, id);\n\n const redis = new Helm(this, 'redis', {\n chart: 'bitnami/redis',\n values: {\n sentinel: {\n enabled: true\n }\n }\n });\n }\n}\n```\n\nThe `Helm` construct will render the manifest from the specified chart by\nexecuting `helm template`. If `values` is specified, these values will override\nthe default values included with the chart.\n\nThe `name` option can be used to specify the chart's [release name](https://helm.sh/docs/intro/using_helm/#three-big-concepts).\nIf not specified, a valid and unique release name will be allocated\nbased on the construct path.\n\nThe `Helm` construct extends `Include` and inherits it's API. For example, you\ncan use the `apiObjects` property to find and interact with included API\nobjects.\n\nThe following example shows how to add an annotation to the Redis master\ndeployment:\n\n```ts\nconst master = redis.apiObjects.find(o => o.name === 'foo-redis-master);\nmaster.metadata.addAnnotation('my.annotation', 'hey-there');\n```\n\n## Testing\n\ncdk8s bundles a set of test utilities under the `Testing` class:\n\n* `Testing.app()` returns an `App` object bound to a temporary output directory.\n* `Testing.chart()` returns a `Chart` object bound to a testing app.\n* `Testing.synth(chart)` returns the Kubernetes manifest synthesized from a\n chart.\n\n## License\n\nThis project is distributed under the [Apache License, Version 2.0](./LICENSE).\n\nThis module is part of the [cdk8s project](https://github.com/awslabs/cdk8s).\n"
57
+ "markdown": "# cdk8s\n\n> Cloud Development Kit for Kubernetes\n\n**cdk8s** is a software development framework for defining Kubernetes\napplications using rich object-oriented APIs. It allows developers to leverage\nthe full power of software in order to define abstract components called\n\"constructs\" which compose Kubernetes resources or other constructs into\nhigher-level abstractions.\n\nThis library is the foundation of **cdk8s**. It includes base types that are\nused to define cdk8s applications.\n\n## Chart\n\nThe `Chart` is a container that synthesizes a single Kubernetes manifest.\n\n```ts\nclass MyChart extends Chart {\n constructor(scope: Construct, ns: string) {\n super(scope, ns);\n\n // add contents here\n }\n}\n```\n\nDuring synthesis, charts collect all the `ApiObject` nodes (recursively) and\nemit a single YAML manifest that includes all these objects.\n\nWhen a chart is defined, you can specify chart-level `namespace` and `labels`.\nThose will be applied to all API objects defined within the chart (recursively):\n\n```ts\nclass MyChart extends Chart {\n constructor(scope: Construct, ns: string) {\n super(scope, ns, {\n namespace: 'my-namespace',\n labels: {\n app: 'my-app',\n },\n });\n\n new ApiObject(this, 'my-object', {\n apiVersion: 'v1',\n kind: 'Foo'\n });\n }\n}\n```\n\nWill synthesize into:\n\n```yaml\napiVersion: v1\nkind: Foo\nmetadata:\n namesapce: my-namespace\n labels:\n app: my-app\n```\n\n## ApiObject\n\nAn `ApiObject` is a construct that represents an entry in a Kubernetes manifest (level 0).\nIn most cases, you won't use `ApiObject` directly but rather use classes that\nare imported through `cdk8s import` and which extend this base class.\n\n## Include\n\nThe `Include` construct can be used to include an existing manifest in a chart.\n\nThe following example will include the Kubernetes Dashboard in `MyChart`:\n\n```ts\nimport { Include } from 'cdk8s';\n\nclass MyChart extends Chart {\n constructor(scope: Construct, id: string) {\n super(scope, id);\n\n const dashboard = new Include(this, 'dashboard', {\n url: 'https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml',\n // or\n url: 'dashboard.yaml'\n });\n\n // ...other resources\n }\n}\n```\n\nAll API objects defined in the included manifest will be added as children\n`ApiObject`s under the `Include` construct's scope and can be accessed\nthrough the `apiObject` property:\n\nThe following example queries for all the `Deployment` resources in the\ndashboard:\n\n```ts\nconst deploymentApiObject = dashboard.apiObjects.find(c => c.kind === 'Deployment);\n```\n\nNOTE: names of included objects (`metadata.name`) are preserved. This means that\nif you try to include the same manifest twice into the same chart, your manifest\nwill have duplicate definitions of the same objects.\n\n## Dependencies\n\nYou can declare dependencies between any two cdk8s constructs using the `addDependency()` method.\n\n### ApiObjects\n\nFor example, you can force kubernetes to first apply a `Namespace` before applying the `Service` in the scope of that namespace:\n\n```typescript\n\nconst namespace = new k8s.Namespace(chart, 'backend');\nconst service = new k8s.Service(chart, 'Service', { metadata: { namespace: namespace.name }});\n\n// declare the dependency. this is just a syntactic sugar for Node.of(service).addDependency(namespace)\nservice.addDependency(namespace);\n```\n\n`cdk8s` will ensure that the `Namespace` object is placed before the `Service` object in the resulting manifest:\n\n```yaml\napiVersion: v1\nkind: Namespace\nmetadata:\n name: chart-backend-a59d2e47\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: chart-service-93d02be7\n namespace: chart-backend-a59d2e47\n```\n\n### Charts\n\nYou can also specify dependencies between charts, in exactly the same manner. For example, if we have a chart that provisions our `namespace`, we need that chart to be applied first:\n\n```typescript\nconst namespaceChart = new NamespaceChart(app, 'namespace');\nconst applicationChart = new ApplicationChart(app, 'application');\n\n// declare the dependency. this is just a syntactic sugar for Node.of(applicationChart).addDependency(namespaceChart)\napplicationChart.addDependency(namespaceChart);\n```\n\nRunning `cdk8s synth` will produce the following `dist` directory:\n\n```console\n> cdk8s synth\n\ndist/0000-namespace.k8s.yaml\ndist/0001-application.k8s.yaml\n```\n\nNotice that the `namespace` chart appears first with the `0000` prefix. This will ensure that a subsequent execution of `kubectl apply -f dist/` will apply the `namespace` first, and the `application` second.\n\n### Custom Constructs\n\nThe behavior above applies in the same way to custom constructs that you create or use.\n\n```typescript\nclass Database extends Construct {\n constructor(scope: Construct, name: string) {\n super(scope, name);\n\n new k8s.StatefulSet(this, 'StatefulSet');\n new k8s.ConfigMap(this, 'ConfigMap');\n }\n}\n\nconst app = new App();\n\nconst chart = new Chart(app, 'Chart');\n\nconst service = new k8s.Service(chart, 'Service')\nconst database = new Database(chart, 'Database');\n\nservice.addDependency(database);\n```\n\nDeclaring such a dependency will cause **each** `ApiObject` in the source construct, to *depend on* **every** `ApiObject` in the target construct.\n\nNote that in the example above, the source construct is actually an `ApiObject`, which is also ok since it is essentially a construct with a single `ApiObject`.\n\n> Note that if the source of your dependency is a custom construct, it won't have the `addDependency` syntactic sugar by default, so you'll have to use `Node.of()`.\n\nThe resulting manifest will be:\n\n```yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n name: chart-database-statefulset-4627f8e2\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: chart-database-configmap-676f8640\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: chart-service-93d02be7\n```\n\nYou can see that all `ApiObject`s of the `Database` construct, appear before the `Service` object.\n\n### Things just got cool\n\nIf you simply declare a dependency between two `ApiObject`s (or `Constructs`), that belong to two different `Chart`s, `cdk8s` will create the chart dependency automatically for you.\n\n```typescript\nconst namespaceChart = new NamespaceChart(app, 'namespace');\nconst applicationChart = new ApplicationChart(app, 'application');\n\nconst namespace = new k8s.Namespace(namespaceChart, 'namespace');\nconst deployment = new k8s.Deployment(applicationChart, 'Deployment');\n\n// dependency between ApiObjects, not Charts!\ndeployment.addDependency(namespace);\n```\n\nRunning `cdk8s synth` will produce the same result as if explicit chart dependencies were declared:\n\n```console\n> cdk8s synth\n\ndist/0000-namespace.k8s.yaml\ndist/0001-application.k8s.yaml\n```\n\nThis means you need not be bothered with managing chart dependencies, simply work with the `ApiObject`s you create, and let `cdk8s` infer the chart dependencies.\n\n## Helm Support\n\nYou can use the `Helm` construct in order to include [Helm](https://helm.sh)\ncharts.\n\nIn order to use this construct, you must have `helm` installed on your system.\nSee [Installing Helm](https://helm.sh/docs/intro/install/) in the Helm\ndocumentation for details.\n\nThe following example adds the\n[bitnami/redis](https://github.com/bitnami/charts/tree/master/bitnami/redis)\nHelm chart with sentinel containers enabled:\n\n> The Bitnami helm repo needs to be added through: `helm repo add bitnami https://charts.bitnami.com/bitnami`\n\n```ts\nclass MyChart extends cdk8s.Chart {\n constructor(scope: Construct, id: string) {\n super(scope, id);\n\n const redis = new Helm(this, 'redis', {\n chart: 'bitnami/redis',\n values: {\n sentinel: {\n enabled: true\n }\n }\n });\n }\n}\n```\n\nThe `Helm` construct will render the manifest from the specified chart by\nexecuting `helm template`. If `values` is specified, these values will override\nthe default values included with the chart.\n\nThe `name` option can be used to specify the chart's [release name](https://helm.sh/docs/intro/using_helm/#three-big-concepts).\nIf not specified, a valid and unique release name will be allocated\nbased on the construct path.\n\nThe `Helm` construct extends `Include` and inherits it's API. For example, you\ncan use the `apiObjects` property to find and interact with included API\nobjects.\n\nThe following example shows how to add an annotation to the Redis master\ndeployment:\n\n```ts\nconst master = redis.apiObjects.find(o => o.name === 'foo-redis-master);\nmaster.metadata.addAnnotation('my.annotation', 'hey-there');\n```\n\n## Testing\n\ncdk8s bundles a set of test utilities under the `Testing` class:\n\n* `Testing.app()` returns an `App` object bound to a temporary output directory.\n* `Testing.chart()` returns a `Chart` object bound to a testing app.\n* `Testing.synth(chart)` returns the Kubernetes manifest synthesized from a\n chart.\n\n## License\n\nThis project is distributed under the [Apache License, Version 2.0](./LICENSE).\n\nThis module is part of the [cdk8s project](https://github.com/awslabs/cdk8s).\n"
58
58
  },
59
59
  "repository": {
60
60
  "type": "git",
@@ -142,7 +142,7 @@
142
142
  },
143
143
  "locationInModule": {
144
144
  "filename": "src/api-object.ts",
145
- "line": 103
145
+ "line": 108
146
146
  },
147
147
  "name": "addDependency",
148
148
  "parameters": [
@@ -166,7 +166,7 @@
166
166
  },
167
167
  "locationInModule": {
168
168
  "filename": "src/api-object.ts",
169
- "line": 110
169
+ "line": 115
170
170
  },
171
171
  "name": "toJson",
172
172
  "returns": {
@@ -763,7 +763,7 @@
763
763
  },
764
764
  "locationInModule": {
765
765
  "filename": "src/chart.ts",
766
- "line": 41
766
+ "line": 53
767
767
  },
768
768
  "parameters": [
769
769
  {
@@ -790,7 +790,7 @@
790
790
  "kind": "class",
791
791
  "locationInModule": {
792
792
  "filename": "src/chart.ts",
793
- "line": 17
793
+ "line": 24
794
794
  },
795
795
  "methods": [
796
796
  {
@@ -800,7 +800,7 @@
800
800
  },
801
801
  "locationInModule": {
802
802
  "filename": "src/chart.ts",
803
- "line": 23
803
+ "line": 30
804
804
  },
805
805
  "name": "of",
806
806
  "parameters": [
@@ -829,7 +829,7 @@
829
829
  },
830
830
  "locationInModule": {
831
831
  "filename": "src/chart.ts",
832
- "line": 76
832
+ "line": 98
833
833
  },
834
834
  "name": "addDependency",
835
835
  "parameters": [
@@ -854,7 +854,7 @@
854
854
  },
855
855
  "locationInModule": {
856
856
  "filename": "src/chart.ts",
857
- "line": 66
857
+ "line": 88
858
858
  },
859
859
  "name": "generateObjectName",
860
860
  "parameters": [
@@ -882,7 +882,7 @@
882
882
  },
883
883
  "locationInModule": {
884
884
  "filename": "src/chart.ts",
885
- "line": 84
885
+ "line": 106
886
886
  },
887
887
  "name": "toJson",
888
888
  "returns": {
@@ -899,6 +899,27 @@
899
899
  ],
900
900
  "name": "Chart",
901
901
  "properties": [
902
+ {
903
+ "docs": {
904
+ "remarks": "This is an immutable copy.",
905
+ "stability": "experimental",
906
+ "summary": "Labels applied to all resources in this chart."
907
+ },
908
+ "immutable": true,
909
+ "locationInModule": {
910
+ "filename": "src/chart.ts",
911
+ "line": 64
912
+ },
913
+ "name": "labels",
914
+ "type": {
915
+ "collection": {
916
+ "elementtype": {
917
+ "primitive": "string"
918
+ },
919
+ "kind": "map"
920
+ }
921
+ }
922
+ },
902
923
  {
903
924
  "docs": {
904
925
  "stability": "experimental",
@@ -907,7 +928,7 @@
907
928
  "immutable": true,
908
929
  "locationInModule": {
909
930
  "filename": "src/chart.ts",
910
- "line": 39
931
+ "line": 46
911
932
  },
912
933
  "name": "namespace",
913
934
  "optional": true,
@@ -931,6 +952,29 @@
931
952
  },
932
953
  "name": "ChartOptions",
933
954
  "properties": [
955
+ {
956
+ "abstract": true,
957
+ "docs": {
958
+ "default": "- no common labels",
959
+ "stability": "experimental",
960
+ "summary": "Labels to apply to all resources in this chart."
961
+ },
962
+ "immutable": true,
963
+ "locationInModule": {
964
+ "filename": "src/chart.ts",
965
+ "line": 21
966
+ },
967
+ "name": "labels",
968
+ "optional": true,
969
+ "type": {
970
+ "collection": {
971
+ "elementtype": {
972
+ "primitive": "string"
973
+ },
974
+ "kind": "map"
975
+ }
976
+ }
977
+ },
934
978
  {
935
979
  "abstract": true,
936
980
  "docs": {
@@ -1843,6 +1887,6 @@
1843
1887
  "name": "Yaml"
1844
1888
  }
1845
1889
  },
1846
- "version": "0.32.0",
1847
- "fingerprint": "DPRmI+arIHwiM+I0DSJQ62++FlZmoPVKNsS3HYfkVbc="
1890
+ "version": "0.33.0",
1891
+ "fingerprint": "K95av6FvAZM1/HSlOO3mX0HQ6W3vU/PrmlT3xI2Juug="
1848
1892
  }
package/API.md CHANGED
@@ -273,6 +273,7 @@ new Chart(scope: Construct, ns: string, options?: ChartOptions)
273
273
  * **scope** (<code>[Construct](#constructs-construct)</code>) *No description*
274
274
  * **ns** (<code>string</code>) *No description*
275
275
  * **options** (<code>[ChartOptions](#cdk8s-chartoptions)</code>) *No description*
276
+ * **labels** (<code>Map<string, string></code>) Labels to apply to all resources in this chart. __*Default*__: no common labels
276
277
  * **namespace** (<code>string</code>) The default namespace for all objects defined in this chart (directly or indirectly). __*Default*__: no namespace is synthesized (usually this implies "default")
277
278
 
278
279
 
@@ -282,6 +283,7 @@ new Chart(scope: Construct, ns: string, options?: ChartOptions)
282
283
 
283
284
  Name | Type | Description
284
285
  -----|------|-------------
286
+ **labels**🔹 | <code>Map<string, string></code> | Labels applied to all resources in this chart.
285
287
  **namespace**?🔹 | <code>string</code> | The default namespace for all objects in this chart.<br/>__*Optional*__
286
288
 
287
289
  ### Methods
@@ -802,6 +804,7 @@ Name | Type | Description
802
804
 
803
805
  Name | Type | Description
804
806
  -----|------|-------------
807
+ **labels**?🔹 | <code>Map<string, string></code> | Labels to apply to all resources in this chart.<br/>__*Default*__: no common labels
805
808
  **namespace**?🔹 | <code>string</code> | The default namespace for all objects defined in this chart (directly or indirectly).<br/>__*Default*__: no namespace is synthesized (usually this implies "default")
806
809
 
807
810
 
package/README.md CHANGED
@@ -28,6 +28,38 @@ class MyChart extends Chart {
28
28
  During synthesis, charts collect all the `ApiObject` nodes (recursively) and
29
29
  emit a single YAML manifest that includes all these objects.
30
30
 
31
+ When a chart is defined, you can specify chart-level `namespace` and `labels`.
32
+ Those will be applied to all API objects defined within the chart (recursively):
33
+
34
+ ```ts
35
+ class MyChart extends Chart {
36
+ constructor(scope: Construct, ns: string) {
37
+ super(scope, ns, {
38
+ namespace: 'my-namespace',
39
+ labels: {
40
+ app: 'my-app',
41
+ },
42
+ });
43
+
44
+ new ApiObject(this, 'my-object', {
45
+ apiVersion: 'v1',
46
+ kind: 'Foo'
47
+ });
48
+ }
49
+ }
50
+ ```
51
+
52
+ Will synthesize into:
53
+
54
+ ```yaml
55
+ apiVersion: v1
56
+ kind: Foo
57
+ metadata:
58
+ namesapce: my-namespace
59
+ labels:
60
+ app: my-app
61
+ ```
62
+
31
63
  ## ApiObject
32
64
 
33
65
  An `ApiObject` is a construct that represents an entry in a Kubernetes manifest (level 0).
@@ -241,8 +273,8 @@ The `Helm` construct will render the manifest from the specified chart by
241
273
  executing `helm template`. If `values` is specified, these values will override
242
274
  the default values included with the chart.
243
275
 
244
- The `name` option can be used to specify the chart's [release name](https://helm.sh/docs/intro/using_helm/#three-big-concepts).
245
- If not specified, a valid and unique release name will be allocated
276
+ The `name` option can be used to specify the chart's [release name](https://helm.sh/docs/intro/using_helm/#three-big-concepts).
277
+ If not specified, a valid and unique release name will be allocated
246
278
  based on the construct path.
247
279
 
248
280
  The `Helm` construct extends `Include` and inherits it's API. For example, you
@@ -2,22 +2,30 @@ import { Construct, IConstruct } from 'constructs';
2
2
  import { Chart } from './chart';
3
3
  import { ApiObjectMetadata, ApiObjectMetadataDefinition } from './metadata';
4
4
  /**
5
- * Options for defining API objects.
5
+ * (experimental) Options for defining API objects.
6
+ *
7
+ * @experimental
6
8
  */
7
9
  export interface ApiObjectOptions {
8
10
  /**
9
- * Object metadata.
11
+ * (experimental) Object metadata.
10
12
  *
11
13
  * If `name` is not specified, an app-unique name will be allocated by the
12
14
  * framework based on the path of the construct within thes construct tree.
15
+ *
16
+ * @experimental
13
17
  */
14
18
  readonly metadata?: ApiObjectMetadata;
15
19
  /**
16
- * API version.
20
+ * (experimental) API version.
21
+ *
22
+ * @experimental
17
23
  */
18
24
  readonly apiVersion: string;
19
25
  /**
20
- * Resource kind.
26
+ * (experimental) Resource kind.
27
+ *
28
+ * @experimental
21
29
  */
22
30
  readonly kind: string;
23
31
  /**
@@ -25,54 +33,74 @@ export interface ApiObjectOptions {
25
33
  */
26
34
  readonly [key: string]: any;
27
35
  }
36
+ /**
37
+ * @experimental
38
+ */
28
39
  export declare class ApiObject extends Construct {
29
40
  private readonly options;
30
41
  /**
31
- * The name of the API object.
42
+ * (experimental) The name of the API object.
32
43
  *
33
44
  * If a name is specified in `metadata.name` this will be the name returned.
34
45
  * Otherwise, a name will be generated by calling
35
46
  * `Chart.of(this).generatedObjectName(this)`, which by default uses the
36
47
  * construct path to generate a DNS-compatible name for the resource.
48
+ *
49
+ * @experimental
37
50
  */
38
51
  readonly name: string;
39
52
  /**
40
- * The object's API version (e.g. `authorization.k8s.io/v1`)
53
+ * (experimental) The object's API version (e.g. `authorization.k8s.io/v1`).
54
+ *
55
+ * @experimental
41
56
  */
42
57
  readonly apiVersion: string;
43
58
  /**
44
- * The group portion of the API version (e.g. `authorization.k8s.io`)
59
+ * (experimental) The group portion of the API version (e.g. `authorization.k8s.io`).
60
+ *
61
+ * @experimental
45
62
  */
46
63
  readonly apiGroup: string;
47
64
  /**
48
- * The object kind.
65
+ * (experimental) The object kind.
66
+ *
67
+ * @experimental
49
68
  */
50
69
  readonly kind: string;
51
70
  /**
52
- * The chart in which this object is defined.
71
+ * (experimental) The chart in which this object is defined.
72
+ *
73
+ * @experimental
53
74
  */
54
75
  readonly chart: Chart;
55
76
  /**
56
- * Metadata associated with this API object.
77
+ * (experimental) Metadata associated with this API object.
78
+ *
79
+ * @experimental
57
80
  */
58
81
  readonly metadata: ApiObjectMetadataDefinition;
59
82
  /**
60
- * Defines an API object.
83
+ * (experimental) Defines an API object.
61
84
  *
62
- * @param scope the construct scope
63
- * @param ns namespace
64
- * @param options options
85
+ * @param scope the construct scope.
86
+ * @param ns namespace.
87
+ * @param options options.
88
+ * @experimental
65
89
  */
66
90
  constructor(scope: Construct, ns: string, options: ApiObjectOptions);
67
91
  /**
68
- * Create a dependency between this ApiObject and other constructs.
92
+ * (experimental) Create a dependency between this ApiObject and other constructs.
93
+ *
69
94
  * These can be other ApiObjects, Charts, or custom.
70
95
  *
71
96
  * @param dependencies the dependencies to add.
97
+ * @experimental
72
98
  */
73
99
  addDependency(...dependencies: IConstruct[]): void;
74
100
  /**
75
- * Renders the object to Kubernetes JSON.
101
+ * (experimental) Renders the object to Kubernetes JSON.
102
+ *
103
+ * @experimental
76
104
  */
77
105
  toJson(): any;
78
106
  }
package/lib/api-object.js CHANGED
@@ -7,16 +7,20 @@ const _util_1 = require("./_util");
7
7
  const _resolve_1 = require("./_resolve");
8
8
  const stringify = require("json-stable-stringify");
9
9
  const metadata_1 = require("./metadata");
10
+ /**
11
+ * @experimental
12
+ */
10
13
  class ApiObject extends constructs_1.Construct {
11
14
  /**
12
- * Defines an API object.
15
+ * (experimental) Defines an API object.
13
16
  *
14
- * @param scope the construct scope
15
- * @param ns namespace
16
- * @param options options
17
+ * @param scope the construct scope.
18
+ * @param ns namespace.
19
+ * @param options options.
20
+ * @experimental
17
21
  */
18
22
  constructor(scope, ns, options) {
19
- var _a, _b, _c, _d;
23
+ var _a, _b, _c, _d, _e;
20
24
  super(scope, ns);
21
25
  this.options = options;
22
26
  this.chart = chart_1.Chart.of(this);
@@ -26,22 +30,30 @@ class ApiObject extends constructs_1.Construct {
26
30
  this.name = (_b = (_a = options.metadata) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : this.chart.generateObjectName(this);
27
31
  this.metadata = new metadata_1.ApiObjectMetadataDefinition({
28
32
  name: this.name,
29
- namespace: (_d = (_c = options.metadata) === null || _c === void 0 ? void 0 : _c.namespace) !== null && _d !== void 0 ? _d : this.chart.namespace,
30
- // override user defined values
33
+ // user defined values
31
34
  ...options.metadata,
35
+ namespace: (_d = (_c = options.metadata) === null || _c === void 0 ? void 0 : _c.namespace) !== null && _d !== void 0 ? _d : this.chart.namespace,
36
+ labels: {
37
+ ...this.chart.labels,
38
+ ...(_e = options.metadata) === null || _e === void 0 ? void 0 : _e.labels,
39
+ },
32
40
  });
33
41
  }
34
42
  /**
35
- * Create a dependency between this ApiObject and other constructs.
43
+ * (experimental) Create a dependency between this ApiObject and other constructs.
44
+ *
36
45
  * These can be other ApiObjects, Charts, or custom.
37
46
  *
38
47
  * @param dependencies the dependencies to add.
48
+ * @experimental
39
49
  */
40
50
  addDependency(...dependencies) {
41
51
  constructs_1.Node.of(this).addDependency(...dependencies);
42
52
  }
43
53
  /**
44
- * Renders the object to Kubernetes JSON.
54
+ * (experimental) Renders the object to Kubernetes JSON.
55
+ *
56
+ * @experimental
45
57
  */
46
58
  toJson() {
47
59
  const data = {
@@ -66,4 +78,4 @@ function parseApiGroup(apiVersion) {
66
78
  }
67
79
  throw new Error(`invalid apiVersion ${apiVersion}, expecting GROUP/VERSION. See https://kubernetes.io/docs/reference/using-api/api-overview/#api-groups`);
68
80
  }
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLW9iamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcGktb2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF5RDtBQUN6RCxtQ0FBZ0M7QUFDaEMsbUNBQXdDO0FBQ3hDLHlDQUFxQztBQUNyQyxtREFBbUQ7QUFDbkQseUNBQTRFO0FBOEI1RSxNQUFhLFNBQVUsU0FBUSxzQkFBUztJQW9DdEM7Ozs7OztPQU1HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBbUIsT0FBeUI7O1FBQ2xGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFEd0MsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFFbEYsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRS9DLElBQUksQ0FBQyxJQUFJLGVBQUcsT0FBTyxDQUFDLFFBQVEsMENBQUUsSUFBSSxtQ0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxzQ0FBMkIsQ0FBQztZQUM5QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixTQUFTLGNBQUUsT0FBTyxDQUFDLFFBQVEsMENBQUUsU0FBUyxtQ0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7WUFFOUQsK0JBQStCO1lBQy9CLEdBQUcsT0FBTyxDQUFDLFFBQVE7U0FDcEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLEdBQUcsWUFBMEI7UUFDaEQsaUJBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTTtRQUNYLE1BQU0sSUFBSSxHQUFHO1lBQ1gsR0FBRyxJQUFJLENBQUMsT0FBTztZQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtTQUNqQyxDQUFDO1FBRUYsd0VBQXdFO1FBQ3hFLDJDQUEyQztRQUMzQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLHFCQUFhLENBQUMsa0JBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUFwRkQsOEJBb0ZDO0FBRUQsU0FBUyxhQUFhLENBQUMsVUFBa0I7SUFDdkMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVoQyx3QkFBd0I7SUFDeEIsMEVBQTBFO0lBQzFFLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUVELElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDYjtJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLFVBQVUsd0dBQXdHLENBQUMsQ0FBQztBQUM1SixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0LCBOb2RlIH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDaGFydCB9IGZyb20gJy4vY2hhcnQnO1xuaW1wb3J0IHsgc2FuaXRpemVWYWx1ZSB9IGZyb20gJy4vX3V0aWwnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJy4vX3Jlc29sdmUnO1xuaW1wb3J0ICogYXMgc3RyaW5naWZ5IGZyb20gJ2pzb24tc3RhYmxlLXN0cmluZ2lmeSc7XG5pbXBvcnQgeyBBcGlPYmplY3RNZXRhZGF0YSwgQXBpT2JqZWN0TWV0YWRhdGFEZWZpbml0aW9uIH0gZnJvbSAnLi9tZXRhZGF0YSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZGVmaW5pbmcgQVBJIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpT2JqZWN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPYmplY3QgbWV0YWRhdGEuXG4gICAqXG4gICAqIElmIGBuYW1lYCBpcyBub3Qgc3BlY2lmaWVkLCBhbiBhcHAtdW5pcXVlIG5hbWUgd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhlXG4gICAqIGZyYW1ld29yayBiYXNlZCBvbiB0aGUgcGF0aCBvZiB0aGUgY29uc3RydWN0IHdpdGhpbiB0aGVzIGNvbnN0cnVjdCB0cmVlLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YWRhdGE/OiBBcGlPYmplY3RNZXRhZGF0YTtcblxuICAvKipcbiAgICogQVBJIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlIGtpbmQuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYXR0cmlidXRlcyBmb3IgdGhpcyBBUEkgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgQXBpT2JqZWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBBUEkgb2JqZWN0LlxuICAgKlxuICAgKiBJZiBhIG5hbWUgaXMgc3BlY2lmaWVkIGluIGBtZXRhZGF0YS5uYW1lYCB0aGlzIHdpbGwgYmUgdGhlIG5hbWUgcmV0dXJuZWQuXG4gICAqIE90aGVyd2lzZSwgYSBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IGNhbGxpbmdcbiAgICogYENoYXJ0Lm9mKHRoaXMpLmdlbmVyYXRlZE9iamVjdE5hbWUodGhpcylgLCB3aGljaCBieSBkZWZhdWx0IHVzZXMgdGhlXG4gICAqIGNvbnN0cnVjdCBwYXRoIHRvIGdlbmVyYXRlIGEgRE5TLWNvbXBhdGlibGUgbmFtZSBmb3IgdGhlIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCdzIEFQSSB2ZXJzaW9uIChlLmcuIGBhdXRob3JpemF0aW9uLms4cy5pby92MWApXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ3JvdXAgcG9ydGlvbiBvZiB0aGUgQVBJIHZlcnNpb24gKGUuZy4gYGF1dGhvcml6YXRpb24uazhzLmlvYClcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGlHcm91cDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IGtpbmQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkga2luZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhcnQgaW4gd2hpY2ggdGhpcyBvYmplY3QgaXMgZGVmaW5lZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjaGFydDogQ2hhcnQ7XG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFQSSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IEFwaU9iamVjdE1ldGFkYXRhRGVmaW5pdGlvbjtcblxuICAvKipcbiAgICogRGVmaW5lcyBhbiBBUEkgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgdGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gbnMgbmFtZXNwYWNlXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5zOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXBpT2JqZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlLCBucyk7XG4gICAgdGhpcy5jaGFydCA9IENoYXJ0Lm9mKHRoaXMpO1xuICAgIHRoaXMua2luZCA9IG9wdGlvbnMua2luZDtcbiAgICB0aGlzLmFwaVZlcnNpb24gPSBvcHRpb25zLmFwaVZlcnNpb247XG4gICAgdGhpcy5hcGlHcm91cCA9IHBhcnNlQXBpR3JvdXAodGhpcy5hcGlWZXJzaW9uKTtcblxuICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubWV0YWRhdGE/Lm5hbWUgPz8gdGhpcy5jaGFydC5nZW5lcmF0ZU9iamVjdE5hbWUodGhpcyk7XG5cbiAgICB0aGlzLm1ldGFkYXRhID0gbmV3IEFwaU9iamVjdE1ldGFkYXRhRGVmaW5pdGlvbih7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBuYW1lc3BhY2U6IG9wdGlvbnMubWV0YWRhdGE/Lm5hbWVzcGFjZSA/PyB0aGlzLmNoYXJ0Lm5hbWVzcGFjZSxcblxuICAgICAgLy8gb3ZlcnJpZGUgdXNlciBkZWZpbmVkIHZhbHVlc1xuICAgICAgLi4ub3B0aW9ucy5tZXRhZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBkZXBlbmRlbmN5IGJldHdlZW4gdGhpcyBBcGlPYmplY3QgYW5kIG90aGVyIGNvbnN0cnVjdHMuXG4gICAqIFRoZXNlIGNhbiBiZSBvdGhlciBBcGlPYmplY3RzLCBDaGFydHMsIG9yIGN1c3RvbS5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY2llcyB0aGUgZGVwZW5kZW5jaWVzIHRvIGFkZC5cbiAgICovXG4gIHB1YmxpYyBhZGREZXBlbmRlbmN5KC4uLmRlcGVuZGVuY2llczogSUNvbnN0cnVjdFtdKSB7XG4gICAgTm9kZS5vZih0aGlzKS5hZGREZXBlbmRlbmN5KC4uLmRlcGVuZGVuY2llcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgb2JqZWN0IHRvIEt1YmVybmV0ZXMgSlNPTi5cbiAgICovXG4gIHB1YmxpYyB0b0pzb24oKTogYW55IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEudG9Kc29uKCksXG4gICAgfTtcblxuICAgIC8vIGNvbnZlcnQgdG8gXCJwdXJlIGRhdGFcIiBzbywgZm9yIGV4YW1wbGUsIHdoZW4gd2UgY29udmVydCB0byB5YW1sIHRoZXNlXG4gICAgLy8gcmVmZXJlbmNlcyBhcmUgbm90IGNvbnZlcnRlZCB0byBhbmNob3JzLlxuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cmluZ2lmeShzYW5pdGl6ZVZhbHVlKHJlc29sdmUoZGF0YSkpKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VBcGlHcm91cChhcGlWZXJzaW9uOiBzdHJpbmcpIHtcbiAgY29uc3QgdiA9IGFwaVZlcnNpb24uc3BsaXQoJy8nKTtcblxuICAvLyBubyBncm91cCBtZWFucyBcImNvcmVcIlxuICAvLyBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9yZWZlcmVuY2UvdXNpbmctYXBpL2FwaS1vdmVydmlldy8jYXBpLWdyb3Vwc1xuICBpZiAodi5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gJ2NvcmUnO1xuICB9XG5cbiAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIHZbMF07XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYXBpVmVyc2lvbiAke2FwaVZlcnNpb259LCBleHBlY3RpbmcgR1JPVVAvVkVSU0lPTi4gU2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL3JlZmVyZW5jZS91c2luZy1hcGkvYXBpLW92ZXJ2aWV3LyNhcGktZ3JvdXBzYCk7XG59Il19
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLW9iamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcGktb2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF5RDtBQUN6RCxtQ0FBZ0M7QUFDaEMsbUNBQXdDO0FBQ3hDLHlDQUFxQztBQUNyQyxtREFBbUQ7QUFDbkQseUNBQTRFOzs7O0FBOEI1RSxNQUFhLFNBQVUsU0FBUSxzQkFBUzs7Ozs7Ozs7O0lBMkN0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFtQixPQUF5Qjs7UUFDbEYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUR3QyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUVsRixJQUFJLENBQUMsS0FBSyxHQUFHLGFBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLElBQUksZUFBRyxPQUFPLENBQUMsUUFBUSwwQ0FBRSxJQUFJLG1DQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHNDQUEyQixDQUFDO1lBQzlDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUVmLHNCQUFzQjtZQUN0QixHQUFHLE9BQU8sQ0FBQyxRQUFRO1lBRW5CLFNBQVMsY0FBRSxPQUFPLENBQUMsUUFBUSwwQ0FBRSxTQUFTLG1DQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUztZQUM5RCxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLFNBQUcsT0FBTyxDQUFDLFFBQVEsMENBQUUsTUFBTTthQUM1QjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Ozs7Ozs7OztJQVFNLGFBQWEsQ0FBQyxHQUFHLFlBQTBCO1FBQ2hELGlCQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQy9DLENBQUM7Ozs7OztJQUtNLE1BQU07UUFDWCxNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsSUFBSSxDQUFDLE9BQU87WUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7U0FDakMsQ0FBQztRQUVGLHdFQUF3RTtRQUN4RSwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxxQkFBYSxDQUFDLGtCQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztDQUNGO0FBekZELDhCQXlGQztBQUVELFNBQVMsYUFBYSxDQUFDLFVBQWtCO0lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFaEMsd0JBQXdCO0lBQ3hCLDBFQUEwRTtJQUMxRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2xCLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFFRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2xCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2I7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixVQUFVLHdHQUF3RyxDQUFDLENBQUM7QUFDNUosQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCwgTm9kZSB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2hhcnQgfSBmcm9tICcuL2NoYXJ0JztcbmltcG9ydCB7IHNhbml0aXplVmFsdWUgfSBmcm9tICcuL191dGlsJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICcuL19yZXNvbHZlJztcbmltcG9ydCAqIGFzIHN0cmluZ2lmeSBmcm9tICdqc29uLXN0YWJsZS1zdHJpbmdpZnknO1xuaW1wb3J0IHsgQXBpT2JqZWN0TWV0YWRhdGEsIEFwaU9iamVjdE1ldGFkYXRhRGVmaW5pdGlvbiB9IGZyb20gJy4vbWV0YWRhdGEnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGludGVyZmFjZSBBcGlPYmplY3RPcHRpb25zIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgbWV0YWRhdGE/OiBBcGlPYmplY3RNZXRhZGF0YTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBhdHRyaWJ1dGVzIGZvciB0aGlzIEFQSSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBBcGlPYmplY3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBhcGlHcm91cDogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJlYWRvbmx5IGNoYXJ0OiBDaGFydDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IEFwaU9iamVjdE1ldGFkYXRhRGVmaW5pdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5zOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXBpT2JqZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlLCBucyk7XG4gICAgdGhpcy5jaGFydCA9IENoYXJ0Lm9mKHRoaXMpO1xuICAgIHRoaXMua2luZCA9IG9wdGlvbnMua2luZDtcbiAgICB0aGlzLmFwaVZlcnNpb24gPSBvcHRpb25zLmFwaVZlcnNpb247XG4gICAgdGhpcy5hcGlHcm91cCA9IHBhcnNlQXBpR3JvdXAodGhpcy5hcGlWZXJzaW9uKTtcblxuICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubWV0YWRhdGE/Lm5hbWUgPz8gdGhpcy5jaGFydC5nZW5lcmF0ZU9iamVjdE5hbWUodGhpcyk7XG5cbiAgICB0aGlzLm1ldGFkYXRhID0gbmV3IEFwaU9iamVjdE1ldGFkYXRhRGVmaW5pdGlvbih7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG5cbiAgICAgIC8vIHVzZXIgZGVmaW5lZCB2YWx1ZXNcbiAgICAgIC4uLm9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBcbiAgICAgIG5hbWVzcGFjZTogb3B0aW9ucy5tZXRhZGF0YT8ubmFtZXNwYWNlID8/IHRoaXMuY2hhcnQubmFtZXNwYWNlLFxuICAgICAgbGFiZWxzOiB7XG4gICAgICAgIC4uLnRoaXMuY2hhcnQubGFiZWxzLFxuICAgICAgICAuLi5vcHRpb25zLm1ldGFkYXRhPy5sYWJlbHMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBhZGREZXBlbmRlbmN5KC4uLmRlcGVuZGVuY2llczogSUNvbnN0cnVjdFtdKSB7XG4gICAgTm9kZS5vZih0aGlzKS5hZGREZXBlbmRlbmN5KC4uLmRlcGVuZGVuY2llcyk7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgdG9Kc29uKCk6IGFueSB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLnRvSnNvbigpLFxuICAgIH07XG5cbiAgICAvLyBjb252ZXJ0IHRvIFwicHVyZSBkYXRhXCIgc28sIGZvciBleGFtcGxlLCB3aGVuIHdlIGNvbnZlcnQgdG8geWFtbCB0aGVzZVxuICAgIC8vIHJlZmVyZW5jZXMgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gYW5jaG9ycy5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHJpbmdpZnkoc2FuaXRpemVWYWx1ZShyZXNvbHZlKGRhdGEpKSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQXBpR3JvdXAoYXBpVmVyc2lvbjogc3RyaW5nKSB7XG4gIGNvbnN0IHYgPSBhcGlWZXJzaW9uLnNwbGl0KCcvJyk7XG5cbiAgLy8gbm8gZ3JvdXAgbWVhbnMgXCJjb3JlXCJcbiAgLy8gaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvcmVmZXJlbmNlL3VzaW5nLWFwaS9hcGktb3ZlcnZpZXcvI2FwaS1ncm91cHNcbiAgaWYgKHYubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuICdjb3JlJztcbiAgfVxuXG4gIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiB2WzBdO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGFwaVZlcnNpb24gJHthcGlWZXJzaW9ufSwgZXhwZWN0aW5nIEdST1VQL1ZFUlNJT04uIFNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9yZWZlcmVuY2UvdXNpbmctYXBpL2FwaS1vdmVydmlldy8jYXBpLWdyb3Vwc2ApO1xufSJdfQ==
package/lib/app.d.ts CHANGED
@@ -1,27 +1,39 @@
1
1
  import { Construct } from 'constructs';
2
+ /**
3
+ * @experimental
4
+ */
2
5
  export interface AppOptions {
3
6
  /**
4
- * The directory to output Kubernetes manifests.
7
+ * (experimental) The directory to output Kubernetes manifests.
5
8
  *
6
9
  * @default - CDK8S_OUTDIR if defined, otherwise "dist"
10
+ * @experimental
7
11
  */
8
12
  readonly outdir?: string;
9
13
  }
10
14
  /**
11
- * Represents a cdk8s application.
15
+ * (experimental) Represents a cdk8s application.
16
+ *
17
+ * @experimental
12
18
  */
13
19
  export declare class App extends Construct {
14
20
  /**
15
- * The output directory into which manifests will be synthesized.
21
+ * (experimental) The output directory into which manifests will be synthesized.
22
+ *
23
+ * @experimental
16
24
  */
17
25
  readonly outdir: string;
18
26
  /**
19
- * Defines an app
20
- * @param options configuration options
27
+ * (experimental) Defines an app.
28
+ *
29
+ * @param options configuration options.
30
+ * @experimental
21
31
  */
22
32
  constructor(options?: AppOptions);
23
33
  /**
24
- * Synthesizes all manifests to the output directory
34
+ * (experimental) Synthesizes all manifests to the output directory.
35
+ *
36
+ * @experimental
25
37
  */
26
38
  synth(): void;
27
39
  private static of;
package/lib/app.js CHANGED
@@ -10,12 +10,16 @@ const dependency_1 = require("./dependency");
10
10
  const api_object_1 = require("./api-object");
11
11
  const names_1 = require("./names");
12
12
  /**
13
- * Represents a cdk8s application.
13
+ * (experimental) Represents a cdk8s application.
14
+ *
15
+ * @experimental
14
16
  */
15
17
  class App extends constructs_1.Construct {
16
18
  /**
17
- * Defines an app
18
- * @param options configuration options
19
+ * (experimental) Defines an app.
20
+ *
21
+ * @param options configuration options.
22
+ * @experimental
19
23
  */
20
24
  constructor(options = {}) {
21
25
  var _a, _b;
@@ -23,7 +27,9 @@ class App extends constructs_1.Construct {
23
27
  this.outdir = (_b = (_a = options.outdir) !== null && _a !== void 0 ? _a : process.env.CDK8S_OUTDIR) !== null && _b !== void 0 ? _b : 'dist';
24
28
  }
25
29
  /**
26
- * Synthesizes all manifests to the output directory
30
+ * (experimental) Synthesizes all manifests to the output directory.
31
+ *
32
+ * @experimental
27
33
  */
28
34
  synth() {
29
35
  fs.mkdirSync(this.outdir, { recursive: true });
@@ -111,4 +117,4 @@ function chartToKube(chart) {
111
117
  .filter(x => x instanceof api_object_1.ApiObject)
112
118
  .map(x => x.toJson());
113
119
  }
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBeUQ7QUFDekQseUJBQXlCO0FBQ3pCLG1DQUFnQztBQUNoQyw2QkFBNkI7QUFDN0IsaUNBQThCO0FBQzlCLDZDQUErQztBQUMvQyw2Q0FBeUM7QUFDekMsbUNBQWdDO0FBV2hDOztHQUVHO0FBQ0gsTUFBYSxHQUFJLFNBQVEsc0JBQVM7SUFNaEM7OztPQUdHO0lBQ0gsWUFBWSxVQUFzQixFQUFHOztRQUNuQyxLQUFLLENBQUMsU0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxlQUFHLE9BQU8sQ0FBQyxNQUFNLG1DQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxtQ0FBSSxNQUFNLENBQUM7SUFDckUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSztRQUVWLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLHFFQUFxRTtRQUNyRSxzQ0FBc0M7UUFDdEMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyRCw4SEFBOEg7UUFDOUgsdUZBQXVGO1FBQ3ZGLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVmLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUFDLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2xHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQztRQUV4SixNQUFNLE1BQU0sR0FBaUIsSUFBSSw0QkFBZSxDQUFDLGlCQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLGFBQUssQ0FBQyxDQUFDO1FBRTNHLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO1lBQ3pCLE1BQU0sS0FBSyxHQUFVLGFBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsV0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUUsS0FBSyxFQUFFLENBQUM7U0FDVDtJQUVILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQVk7UUFFcEMsTUFBTSxHQUFHLEdBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvQiwrREFBK0Q7UUFDL0QsNkRBQTZEO1FBQzdELG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLGdGQUFnRjtRQUNoRixvRkFBb0Y7UUFDcEYsMkZBQTJGO1FBQzNGLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVkLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQWE7UUFFN0IsTUFBTSxLQUFLLEdBQUcsaUJBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBRS9CLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixpREFBaUQ7WUFDakQsT0FBTyxDQUFRLENBQUM7U0FDakI7UUFFRCxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztDQUVGO0FBckZELGtCQXFGQztBQUVELFNBQVMsUUFBUSxDQUFDLEdBQVE7SUFFeEIsb0dBQW9HO0lBQ3BHLE1BQU0sTUFBTSxHQUFHLGlCQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDckIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksaUJBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsU0FBUyxFQUFFLENBQUMsQ0FBQztLQUNqRjtBQUVILENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEdBQVE7SUFFbkMsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFFL0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUU7UUFFM0MsK0VBQStFO1FBQy9FLE1BQU0sZ0JBQWdCLEdBQUcsaUJBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxzQkFBUyxDQUFDLENBQUM7UUFDM0YsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLHNCQUFTLENBQUMsQ0FBQztRQUUzRixLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFO1lBQ3JDLEtBQUssTUFBTSxNQUFNLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3JDLGlCQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN2QztTQUNGO1FBRUQsMkVBQTJFO1FBQzNFLE1BQU0sV0FBVyxHQUFHLGFBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLGFBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLElBQUksV0FBVyxLQUFLLFdBQVcsRUFBRTtZQUMvQixpQkFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0tBRUY7SUFFRCxPQUFPLGtCQUFrQixDQUFDO0FBRTVCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFZO0lBQy9CLE9BQU8sSUFBSSw0QkFBZSxDQUFDLGlCQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO1NBQ2xELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxzQkFBUyxDQUFDO1NBQ25DLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFFLENBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QsIE5vZGUsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IENoYXJ0IH0gZnJvbSAnLi9jaGFydCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgWWFtbCB9IGZyb20gJy4veWFtbCc7XG5pbXBvcnQgeyBEZXBlbmRlbmN5R3JhcGggfSBmcm9tICcuL2RlcGVuZGVuY3knO1xuaW1wb3J0IHsgQXBpT2JqZWN0IH0gZnJvbSAnLi9hcGktb2JqZWN0JztcbmltcG9ydCB7IE5hbWVzIH0gZnJvbSAnLi9uYW1lcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHRvIG91dHB1dCBLdWJlcm5ldGVzIG1hbmlmZXN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBDREs4U19PVVRESVIgaWYgZGVmaW5lZCwgb3RoZXJ3aXNlIFwiZGlzdFwiXG4gICAqL1xuICByZWFkb25seSBvdXRkaXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNkazhzIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXBwIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXQgZGlyZWN0b3J5IGludG8gd2hpY2ggbWFuaWZlc3RzIHdpbGwgYmUgc3ludGhlc2l6ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3V0ZGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYW4gYXBwXG4gICAqIEBwYXJhbSBvcHRpb25zIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogQXBwT3B0aW9ucyA9IHsgfSkge1xuICAgIHN1cGVyKHVuZGVmaW5lZCBhcyBhbnksICcnKTtcbiAgICB0aGlzLm91dGRpciA9IG9wdGlvbnMub3V0ZGlyID8/IHByb2Nlc3MuZW52LkNESzhTX09VVERJUiA/PyAnZGlzdCc7XG4gIH1cblxuICAvKipcbiAgICogU3ludGhlc2l6ZXMgYWxsIG1hbmlmZXN0cyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeVxuICAgKi9cbiAgcHVibGljIHN5bnRoKCk6IHZvaWQge1xuXG4gICAgZnMubWtkaXJTeW5jKHRoaXMub3V0ZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIHRoaXMgaXMga2luZCBvZiBzdWNreSwgZXZlbnR1YWxseSBJIHdvdWxkIGxpa2UgdGhlIERlcGVuZGVuY3lHcmFwaFxuICAgIC8vIHRvIGJlIGFibGUgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24uXG4gICAgY29uc3QgaGFzRGVwZW5kYW50Q2hhcnRzID0gcmVzb2x2ZURlcGVuZGVuY2llcyh0aGlzKTtcblxuICAgIC8vIFNpbmNlIHdlIHBsYW4gb24gcmVtb3ZpbmcgdGhlIGRpc3RyaWJ1dGVkIHN5bnRoIG1lY2hhbmlzbSwgd2Ugbm8gbG9uZ2VyIGNhbGwgYE5vZGUuc3ludGhlc2l6ZWAsIGJ1dCByYXRoZXIgc2ltcGx5IGltcGxlbWVudFxuICAgIC8vIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9ucy4gV2UgZG8gaG93ZXZlciB3YW50IHRvIHByZXNlcnZlIHRoZSBkaXN0cmlidXRlZCB2YWxpZGF0aW9uLlxuICAgIHZhbGlkYXRlKHRoaXMpO1xuXG4gICAgY29uc3Qgc2ltcGxlTWFuaWZlc3ROYW1lciA9IChjaGFydDogQ2hhcnQpID0+IGAke05hbWVzLnRvRG5zTGFiZWwoTm9kZS5vZihjaGFydCkucGF0aCl9Lms4cy55YW1sYDtcbiAgICBjb25zdCBtYW5pZmVzdE5hbWVyID0gaGFzRGVwZW5kYW50Q2hhcnRzID8gKGNoYXJ0OiBDaGFydCkgPT4gYCR7aW5kZXgudG9TdHJpbmcoKS5wYWRTdGFydCg0LCAnMCcpfS0ke3NpbXBsZU1hbmlmZXN0TmFtZXIoY2hhcnQpfWAgOiBzaW1wbGVNYW5pZmVzdE5hbWVyO1xuXG4gICAgY29uc3QgY2hhcnRzOiBJQ29uc3RydWN0W10gPSBuZXcgRGVwZW5kZW5jeUdyYXBoKE5vZGUub2YodGhpcykpLnRvcG9sb2d5KCkuZmlsdGVyKHggPT4geCBpbnN0YW5jZW9mIENoYXJ0KTtcblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGNoYXJ0cykge1xuICAgICAgY29uc3QgY2hhcnQ6IENoYXJ0ID0gQ2hhcnQub2Yobm9kZSk7XG4gICAgICBZYW1sLnNhdmUocGF0aC5qb2luKHRoaXMub3V0ZGlyLCBtYW5pZmVzdE5hbWVyKGNoYXJ0KSksIGNoYXJ0VG9LdWJlKGNoYXJ0KSk7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoZXNpemUgYSBzaW5nbGUgY2hhcnQuXG4gICAqXG4gICAqIEVhY2ggZWxlbWVudCByZXR1cm5lZCBpbiB0aGUgcmVzdWx0aW5nIGFycmF5IHJlcHJlc2VudHMgYSBkaWZmZXJlbnQgQXBpT2JqZWN0XG4gICAqIGluIHRoZSBzY29wZSBvZiB0aGUgY2hhcnQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgYXJyYXkgb3JkZXIgaXMgaW1wb3J0YW50LiBJdCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB2YXJpb3VzIGRlcGVuZGVuY2llcyBiZXR3ZWVuXG4gICAqIHRoZSBjb25zdHJ1Y3RzIGluIHRoZSBjaGFydCwgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIG9uZSB3aXRob3V0IGRlcGVuZGVuY2llcywgYW5kIHNvIG9uLi4uXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIEpTT04gb2JqZWN0cy5cbiAgICogQHBhcmFtIGNoYXJ0IHRoZSBjaGFydCB0byBzeW50aGVzaXplLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX3N5bnRoQ2hhcnQoY2hhcnQ6IENoYXJ0KTogYW55W10ge1xuXG4gICAgY29uc3QgYXBwOiBBcHAgPSBBcHAub2YoY2hhcnQpO1xuXG4gICAgLy8gd2UgbXVzdCBwcmVwYXJlIHRoZSBlbnRpcmUgYXBwIGJlZm9yZSBzeW50aGVzaXppbmcgdGhlIGNoYXJ0XG4gICAgLy8gYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBpbmZlcmVuY2UgaGFwcGVucyBvbiB0aGUgYXBwIGxldmVsLlxuICAgIHJlc29sdmVEZXBlbmRlbmNpZXMoYXBwKTtcblxuICAgIC8vIHZhbGlkYXRlIHRoZSBhcHAgc2luY2Ugd2Ugd2FudCB0byBjYWxsIG9uVmFsaWRhdGUgb2YgdGhlIHJlbGV2YW50IGNvbnN0cnVjdHMuXG4gICAgLy8gbm90ZSB0aGlzIHdpbGwgYWxzbyBjYWxsIG9uVmFsaWRhdGUgb24gY29uc3RydWN0cyBmcm9tIHBvc3NpYmx5IGRpZmZlcmVudCBjaGFydHMsXG4gICAgLy8gYnV0IHRoYXRzIG9rIHRvbyBzaW5jZSB3ZSBubyBsb25nZXIgdHJlYXQgY29uc3RydWN0cyBhcyBhIHNlbGYtY29udGFpbmVkIHN5bnRoZXNpcyB1bml0LlxuICAgIHZhbGlkYXRlKGFwcCk7XG5cbiAgICByZXR1cm4gY2hhcnRUb0t1YmUoY2hhcnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgb2YoYzogSUNvbnN0cnVjdCk6IEFwcCB7XG5cbiAgICBjb25zdCBzY29wZSA9IE5vZGUub2YoYykuc2NvcGU7XG5cbiAgICBpZiAoIXNjb3BlKSB7XG4gICAgICAvLyB0aGUgYXBwIGlzIHRoZSBvbmx5IGNvbnN0cnVjdCB3aXRob3V0IGEgc2NvcGUuXG4gICAgICByZXR1cm4gYyBhcyBBcHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFwcC5vZihzY29wZSk7XG4gIH1cblxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZShhcHA6IEFwcCkge1xuXG4gIC8vIE5vdGUgdGhpcyBpcyBhIGNvcHktcGFzdGUgb2YgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9jb25zdHJ1Y3RzL2Jsb2IvbWFzdGVyL2xpYi9jb25zdHJ1Y3QudHMjTDQzOC5cbiAgY29uc3QgZXJyb3JzID0gTm9kZS5vZihhcHApLnZhbGlkYXRlKCk7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGVycm9yTGlzdCA9IGVycm9ycy5tYXAoZSA9PiBgWyR7Tm9kZS5vZihlLnNvdXJjZSkucGF0aH1dICR7ZS5tZXNzYWdlfWApLmpvaW4oJ1xcbiAgJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxcbiAgJHtlcnJvckxpc3R9YCk7XG4gIH1cblxufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVwZW5kZW5jaWVzKGFwcDogQXBwKSB7XG5cbiAgbGV0IGhhc0RlcGVuZGFudENoYXJ0cyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVwIG9mIE5vZGUub2YoYXBwKS5kZXBlbmRlbmNpZXMpIHtcblxuICAgIC8vIGNyZWF0ZSBleHBsaWNpdCBhcGkgb2JqZWN0IGRlcGVuZGVuY2llcyBmcm9tIGltcGxpY2l0IGNvbnN0cnVjdCBkZXBlbmRlbmNpZXNcbiAgICBjb25zdCB0YXJnZXRBcGlPYmplY3RzID0gTm9kZS5vZihkZXAudGFyZ2V0KS5maW5kQWxsKCkuZmlsdGVyKGMgPT4gYyBpbnN0YW5jZW9mIEFwaU9iamVjdCk7XG4gICAgY29uc3Qgc291cmNlQXBpT2JqZWN0cyA9IE5vZGUub2YoZGVwLnNvdXJjZSkuZmluZEFsbCgpLmZpbHRlcihjID0+IGMgaW5zdGFuY2VvZiBBcGlPYmplY3QpO1xuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0QXBpT2JqZWN0cykge1xuICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlQXBpT2JqZWN0cykge1xuICAgICAgICBOb2RlLm9mKHNvdXJjZSkuYWRkRGVwZW5kZW5jeSh0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhbiBleHBsaWNpdCBjaGFydCBkZXBlbmRlbmN5IGZyb20gaW1wbGljaXQgY29uc3RydWN0IGRlcGVuZGVuY2llc1xuICAgIGNvbnN0IHNvdXJjZUNoYXJ0ID0gQ2hhcnQub2YoZGVwLnNvdXJjZSk7XG4gICAgY29uc3QgdGFyZ2V0Q2hhcnQgPSBDaGFydC5vZihkZXAudGFyZ2V0KTtcblxuICAgIGlmIChzb3VyY2VDaGFydCAhPT0gdGFyZ2V0Q2hhcnQpIHtcbiAgICAgIE5vZGUub2Yoc291cmNlQ2hhcnQpLmFkZERlcGVuZGVuY3kodGFyZ2V0Q2hhcnQpO1xuICAgICAgaGFzRGVwZW5kYW50Q2hhcnRzID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG4gIHJldHVybiBoYXNEZXBlbmRhbnRDaGFydHM7XG5cbn1cblxuZnVuY3Rpb24gY2hhcnRUb0t1YmUoY2hhcnQ6IENoYXJ0KSB7XG4gIHJldHVybiBuZXcgRGVwZW5kZW5jeUdyYXBoKE5vZGUub2YoY2hhcnQpKS50b3BvbG9neSgpXG4gICAgLmZpbHRlcih4ID0+IHggaW5zdGFuY2VvZiBBcGlPYmplY3QpXG4gICAgLm1hcCh4ID0+ICh4IGFzIEFwaU9iamVjdCkudG9Kc29uKCkpO1xufSJdfQ==
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBeUQ7QUFDekQseUJBQXlCO0FBQ3pCLG1DQUFnQztBQUNoQyw2QkFBNkI7QUFDN0IsaUNBQThCO0FBQzlCLDZDQUErQztBQUMvQyw2Q0FBeUM7QUFDekMsbUNBQWdDOzs7Ozs7QUFjaEMsTUFBYSxHQUFJLFNBQVEsc0JBQVM7Ozs7Ozs7SUFVaEMsWUFBWSxVQUFzQixFQUFHOztRQUNuQyxLQUFLLENBQUMsU0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxlQUFHLE9BQU8sQ0FBQyxNQUFNLG1DQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxtQ0FBSSxNQUFNLENBQUM7SUFDckUsQ0FBQzs7Ozs7O0lBS00sS0FBSztRQUVWLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLHFFQUFxRTtRQUNyRSxzQ0FBc0M7UUFDdEMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyRCw4SEFBOEg7UUFDOUgsdUZBQXVGO1FBQ3ZGLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVmLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUFDLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2xHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxtQkFBbUIs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QUFZLHNCQUFTLENBQUMsQ0FBQztRQUUzRixLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFO1lBQ3JDLEtBQUssTUFBTSxNQUFNLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3JDLGlCQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN2QztTQUNGO1FBRUQsMkVBQTJFO1FBQzNFLE1BQU0sV0FBVyxHQUFHLGFBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLGFBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLElBQUksV0FBVyxLQUFLLFdBQVcsRUFBRTtZQUMvQixpQkFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0tBRUY7SUFFRCxPQUFPLGtCQUFrQixDQUFDO0FBRTVCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFZO0lBQy9CLE9BQU8sSUFBSSw0QkFBZSxDQUFDLGlCQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO1NBQ2xELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxzQkFBUyxDQUFDO1NBQ25DLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFFLENBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QsIE5vZGUsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IENoYXJ0IH0gZnJvbSAnLi9jaGFydCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgWWFtbCB9IGZyb20gJy4veWFtbCc7XG5pbXBvcnQgeyBEZXBlbmRlbmN5R3JhcGggfSBmcm9tICcuL2RlcGVuZGVuY3knO1xuaW1wb3J0IHsgQXBpT2JqZWN0IH0gZnJvbSAnLi9hcGktb2JqZWN0JztcbmltcG9ydCB7IE5hbWVzIH0gZnJvbSAnLi9uYW1lcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwT3B0aW9ucyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBvdXRkaXI/OiBzdHJpbmc7XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGNsYXNzIEFwcCBleHRlbmRzIENvbnN0cnVjdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBvdXRkaXI6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBcHBPcHRpb25zID0geyB9KSB7XG4gICAgc3VwZXIodW5kZWZpbmVkIGFzIGFueSwgJycpO1xuICAgIHRoaXMub3V0ZGlyID0gb3B0aW9ucy5vdXRkaXIgPz8gcHJvY2Vzcy5lbnYuQ0RLOFNfT1VURElSID8/ICdkaXN0JztcbiAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHN5bnRoKCk6IHZvaWQge1xuXG4gICAgZnMubWtkaXJTeW5jKHRoaXMub3V0ZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIHRoaXMgaXMga2luZCBvZiBzdWNreSwgZXZlbnR1YWxseSBJIHdvdWxkIGxpa2UgdGhlIERlcGVuZGVuY3lHcmFwaFxuICAgIC8vIHRvIGJlIGFibGUgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24uXG4gICAgY29uc3QgaGFzRGVwZW5kYW50Q2hhcnRzID0gcmVzb2x2ZURlcGVuZGVuY2llcyh0aGlzKTtcblxuICAgIC8vIFNpbmNlIHdlIHBsYW4gb24gcmVtb3ZpbmcgdGhlIGRpc3RyaWJ1dGVkIHN5bnRoIG1lY2hhbmlzbSwgd2Ugbm8gbG9uZ2VyIGNhbGwgYE5vZGUuc3ludGhlc2l6ZWAsIGJ1dCByYXRoZXIgc2ltcGx5IGltcGxlbWVudFxuICAgIC8vIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9ucy4gV2UgZG8gaG93ZXZlciB3YW50IHRvIHByZXNlcnZlIHRoZSBkaXN0cmlidXRlZCB2YWxpZGF0aW9uLlxuICAgIHZhbGlkYXRlKHRoaXMpO1xuXG4gICAgY29uc3Qgc2ltcGxlTWFuaWZlc3ROYW1lciA9IChjaGFydDogQ2hhcnQpID0+IGAke05hbWVzLnRvRG5zTGFiZWwoTm9kZS5vZihjaGFydCkucGF0aCl9Lms4cy55YW1sYDtcbiAgICBjb25zdCBtYW5pZmVzdE5hbWVyID0gaGFzRGVwZW5kYW50Q2hhcnRzID8gKGNoYXJ0OiBDaGFydCkgPT4gYCR7aW5kZXgudG9TdHJpbmcoKS5wYWRTdGFydCg0LCAnMCcpfS0ke3NpbXBsZU1hbmlmZXN0TmFtZXIoY2hhcnQpfWAgOiBzaW1wbGVNYW5pZmVzdE5hbWVyO1xuXG4gICAgY29uc3QgY2hhcnRzOiBJQ29uc3RydWN0W10gPSBuZXcgRGVwZW5kZW5jeUdyYXBoKE5vZGUub2YodGhpcykpLnRvcG9sb2d5KCkuZmlsdGVyKHggPT4geCBpbnN0YW5jZW9mIENoYXJ0KTtcblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGNoYXJ0cykge1xuICAgICAgY29uc3QgY2hhcnQ6IENoYXJ0ID0gQ2hhcnQub2Yobm9kZSk7XG4gICAgICBZYW1sLnNhdmUocGF0aC5qb2luKHRoaXMub3V0ZGlyLCBtYW5pZmVzdE5hbWVyKGNoYXJ0KSksIGNoYXJ0VG9LdWJlKGNoYXJ0KSk7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoZXNpemUgYSBzaW5nbGUgY2hhcnQuXG4gICAqXG4gICAqIEVhY2ggZWxlbWVudCByZXR1cm5lZCBpbiB0aGUgcmVzdWx0aW5nIGFycmF5IHJlcHJlc2VudHMgYSBkaWZmZXJlbnQgQXBpT2JqZWN0XG4gICAqIGluIHRoZSBzY29wZSBvZiB0aGUgY2hhcnQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgYXJyYXkgb3JkZXIgaXMgaW1wb3J0YW50LiBJdCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB2YXJpb3VzIGRlcGVuZGVuY2llcyBiZXR3ZWVuXG4gICAqIHRoZSBjb25zdHJ1Y3RzIGluIHRoZSBjaGFydCwgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIG9uZSB3aXRob3V0IGRlcGVuZGVuY2llcywgYW5kIHNvIG9uLi4uXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIEpTT04gb2JqZWN0cy5cbiAgICogQHBhcmFtIGNoYXJ0IHRoZSBjaGFydCB0byBzeW50aGVzaXplLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX3N5bnRoQ2hhcnQoY2hhcnQ6IENoYXJ0KTogYW55W10ge1xuXG4gICAgY29uc3QgYXBwOiBBcHAgPSBBcHAub2YoY2hhcnQpO1xuXG4gICAgLy8gd2UgbXVzdCBwcmVwYXJlIHRoZSBlbnRpcmUgYXBwIGJlZm9yZSBzeW50aGVzaXppbmcgdGhlIGNoYXJ0XG4gICAgLy8gYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBpbmZlcmVuY2UgaGFwcGVucyBvbiB0aGUgYXBwIGxldmVsLlxuICAgIHJlc29sdmVEZXBlbmRlbmNpZXMoYXBwKTtcblxuICAgIC8vIHZhbGlkYXRlIHRoZSBhcHAgc2luY2Ugd2Ugd2FudCB0byBjYWxsIG9uVmFsaWRhdGUgb2YgdGhlIHJlbGV2YW50IGNvbnN0cnVjdHMuXG4gICAgLy8gbm90ZSB0aGlzIHdpbGwgYWxzbyBjYWxsIG9uVmFsaWRhdGUgb24gY29uc3RydWN0cyBmcm9tIHBvc3NpYmx5IGRpZmZlcmVudCBjaGFydHMsXG4gICAgLy8gYnV0IHRoYXRzIG9rIHRvbyBzaW5jZSB3ZSBubyBsb25nZXIgdHJlYXQgY29uc3RydWN0cyBhcyBhIHNlbGYtY29udGFpbmVkIHN5bnRoZXNpcyB1bml0LlxuICAgIHZhbGlkYXRlKGFwcCk7XG5cbiAgICByZXR1cm4gY2hhcnRUb0t1YmUoY2hhcnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgb2YoYzogSUNvbnN0cnVjdCk6IEFwcCB7XG5cbiAgICBjb25zdCBzY29wZSA9IE5vZGUub2YoYykuc2NvcGU7XG5cbiAgICBpZiAoIXNjb3BlKSB7XG4gICAgICAvLyB0aGUgYXBwIGlzIHRoZSBvbmx5IGNvbnN0cnVjdCB3aXRob3V0IGEgc2NvcGUuXG4gICAgICByZXR1cm4gYyBhcyBBcHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFwcC5vZihzY29wZSk7XG4gIH1cblxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZShhcHA6IEFwcCkge1xuXG4gIC8vIE5vdGUgdGhpcyBpcyBhIGNvcHktcGFzdGUgb2YgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9jb25zdHJ1Y3RzL2Jsb2IvbWFzdGVyL2xpYi9jb25zdHJ1Y3QudHMjTDQzOC5cbiAgY29uc3QgZXJyb3JzID0gTm9kZS5vZihhcHApLnZhbGlkYXRlKCk7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGVycm9yTGlzdCA9IGVycm9ycy5tYXAoZSA9PiBgWyR7Tm9kZS5vZihlLnNvdXJjZSkucGF0aH1dICR7ZS5tZXNzYWdlfWApLmpvaW4oJ1xcbiAgJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxcbiAgJHtlcnJvckxpc3R9YCk7XG4gIH1cblxufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVwZW5kZW5jaWVzKGFwcDogQXBwKSB7XG5cbiAgbGV0IGhhc0RlcGVuZGFudENoYXJ0cyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVwIG9mIE5vZGUub2YoYXBwKS5kZXBlbmRlbmNpZXMpIHtcblxuICAgIC8vIGNyZWF0ZSBleHBsaWNpdCBhcGkgb2JqZWN0IGRlcGVuZGVuY2llcyBmcm9tIGltcGxpY2l0IGNvbnN0cnVjdCBkZXBlbmRlbmNpZXNcbiAgICBjb25zdCB0YXJnZXRBcGlPYmplY3RzID0gTm9kZS5vZihkZXAudGFyZ2V0KS5maW5kQWxsKCkuZmlsdGVyKGMgPT4gYyBpbnN0YW5jZW9mIEFwaU9iamVjdCk7XG4gICAgY29uc3Qgc291cmNlQXBpT2JqZWN0cyA9IE5vZGUub2YoZGVwLnNvdXJjZSkuZmluZEFsbCgpLmZpbHRlcihjID0+IGMgaW5zdGFuY2VvZiBBcGlPYmplY3QpO1xuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0QXBpT2JqZWN0cykge1xuICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlQXBpT2JqZWN0cykge1xuICAgICAgICBOb2RlLm9mKHNvdXJjZSkuYWRkRGVwZW5kZW5jeSh0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhbiBleHBsaWNpdCBjaGFydCBkZXBlbmRlbmN5IGZyb20gaW1wbGljaXQgY29uc3RydWN0IGRlcGVuZGVuY2llc1xuICAgIGNvbnN0IHNvdXJjZUNoYXJ0ID0gQ2hhcnQub2YoZGVwLnNvdXJjZSk7XG4gICAgY29uc3QgdGFyZ2V0Q2hhcnQgPSBDaGFydC5vZihkZXAudGFyZ2V0KTtcblxuICAgIGlmIChzb3VyY2VDaGFydCAhPT0gdGFyZ2V0Q2hhcnQpIHtcbiAgICAgIE5vZGUub2Yoc291cmNlQ2hhcnQpLmFkZERlcGVuZGVuY3kodGFyZ2V0Q2hhcnQpO1xuICAgICAgaGFzRGVwZW5kYW50Q2hhcnRzID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG4gIHJldHVybiBoYXNEZXBlbmRhbnRDaGFydHM7XG5cbn1cblxuZnVuY3Rpb24gY2hhcnRUb0t1YmUoY2hhcnQ6IENoYXJ0KSB7XG4gIHJldHVybiBuZXcgRGVwZW5kZW5jeUdyYXBoKE5vZGUub2YoY2hhcnQpKS50b3BvbG9neSgpXG4gICAgLmZpbHRlcih4ID0+IHggaW5zdGFuY2VvZiBBcGlPYmplY3QpXG4gICAgLm1hcCh4ID0+ICh4IGFzIEFwaU9iamVjdCkudG9Kc29uKCkpO1xufSJdfQ==