breeze-client 2.1.2 → 2.1.3-mjs
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/LICENSE +1 -1
- package/adapter-ajax-angularjs/{breeze-client-adapter-ajax-angularjs.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-fetch/{breeze-client-adapter-ajax-fetch.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-httpclient/{breeze-client-adapter-ajax-httpclient.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-jquery/{breeze-client-adapter-ajax-jquery.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-post/{breeze-client-adapter-ajax-post.d.ts → index.d.ts} +1 -0
- package/adapter-data-service-odata/{breeze-client-adapter-data-service-odata.d.ts → index.d.ts} +1 -0
- package/adapter-data-service-webapi/{breeze-client-adapter-data-service-webapi.d.ts → index.d.ts} +1 -0
- package/adapter-model-library-backing-store/{breeze-client-adapter-model-library-backing-store.d.ts → index.d.ts} +1 -0
- package/adapter-model-library-ko/{breeze-client-adapter-model-library-ko.d.ts → index.d.ts} +1 -0
- package/adapter-uri-builder-json/{breeze-client-adapter-uri-builder-json.d.ts → index.d.ts} +1 -0
- package/adapter-uri-builder-odata/{breeze-client-adapter-uri-builder-odata.d.ts → index.d.ts} +1 -0
- package/esm2020/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +130 -0
- package/esm2020/adapter-ajax-angularjs/adapter-core.mjs +49 -0
- package/esm2020/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
- package/esm2020/adapter-ajax-fetch/adapter-ajax-fetch.mjs +132 -0
- package/esm2020/adapter-ajax-fetch/adapter-core.mjs +49 -0
- package/esm2020/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
- package/esm2020/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +137 -0
- package/esm2020/adapter-ajax-httpclient/adapter-core.mjs +49 -0
- package/esm2020/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
- package/esm2020/adapter-ajax-jquery/adapter-ajax-jquery.mjs +103 -0
- package/esm2020/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
- package/esm2020/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
- package/esm2020/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
- package/esm2020/adapter-data-service-odata/adapter-core.mjs +49 -0
- package/esm2020/adapter-data-service-odata/adapter-data-service-odata.mjs +456 -0
- package/esm2020/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
- package/esm2020/adapter-data-service-webapi/adapter-data-service-webapi.mjs +93 -0
- package/esm2020/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
- package/esm2020/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +268 -0
- package/esm2020/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
- package/esm2020/adapter-model-library-ko/adapter-model-library-ko.mjs +240 -0
- package/esm2020/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
- package/esm2020/adapter-uri-builder-json/adapter-core.mjs +49 -0
- package/esm2020/adapter-uri-builder-json/adapter-uri-builder-json.mjs +36 -0
- package/esm2020/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
- package/esm2020/adapter-uri-builder-odata/adapter-core.mjs +49 -0
- package/esm2020/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +190 -0
- package/esm2020/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
- package/esm2020/breeze-client.mjs +5 -0
- package/esm2020/index.mjs +2 -0
- package/esm2020/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
- package/esm2020/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
- package/esm2020/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
- package/esm2020/mixin-save-queuing/mixin-save-queuing.mjs +400 -0
- package/esm2020/src/abstract-data-service-adapter.mjs +296 -0
- package/esm2020/src/array.mjs +4 -0
- package/esm2020/src/assert-param.mjs +312 -0
- package/esm2020/src/breeze.mjs +85 -0
- package/esm2020/src/complex-array.mjs +117 -0
- package/esm2020/src/config.mjs +223 -0
- package/esm2020/src/core.mjs +707 -0
- package/esm2020/src/csdl-metadata-parser.mjs +385 -0
- package/esm2020/src/data-service.mjs +203 -0
- package/esm2020/src/data-type.mjs +444 -0
- package/esm2020/src/default-property-interceptor.mjs +460 -0
- package/esm2020/src/entity-action.mjs +45 -0
- package/esm2020/src/entity-aspect.mjs +806 -0
- package/esm2020/src/entity-group.mjs +187 -0
- package/esm2020/src/entity-key.mjs +116 -0
- package/esm2020/src/entity-manager.mjs +2094 -0
- package/esm2020/src/entity-metadata.mjs +2109 -0
- package/esm2020/src/entity-query.mjs +996 -0
- package/esm2020/src/entity-state.mjs +99 -0
- package/esm2020/src/enum.mjs +141 -0
- package/esm2020/src/event.mjs +256 -0
- package/esm2020/src/interface-registry.mjs +41 -0
- package/esm2020/src/key-generator.mjs +108 -0
- package/esm2020/src/local-query-comparison-options.mjs +65 -0
- package/esm2020/src/mapping-context.mjs +405 -0
- package/esm2020/src/naming-convention.mjs +88 -0
- package/esm2020/src/observable-array.mjs +183 -0
- package/esm2020/src/predicate.mjs +1232 -0
- package/esm2020/src/primitive-array.mjs +85 -0
- package/esm2020/src/query-options.mjs +152 -0
- package/esm2020/src/relation-array.mjs +173 -0
- package/esm2020/src/save-options.mjs +41 -0
- package/esm2020/src/unattached-children-map.mjs +58 -0
- package/esm2020/src/validate.mjs +988 -0
- package/esm2020/src/validation-options.mjs +64 -0
- package/fesm2015/{breeze-client-adapter-ajax-angularjs.js → breeze-client-adapter-ajax-angularjs.mjs} +1 -1
- package/fesm2015/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-fetch.js → breeze-client-adapter-ajax-fetch.mjs} +5 -3
- package/fesm2015/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-httpclient.js → breeze-client-adapter-ajax-httpclient.mjs} +1 -1
- package/fesm2015/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-jquery.js → breeze-client-adapter-ajax-jquery.mjs} +2 -2
- package/fesm2015/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-post.js → breeze-client-adapter-ajax-post.mjs} +1 -1
- package/fesm2015/breeze-client-adapter-ajax-post.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-data-service-odata.js → breeze-client-adapter-data-service-odata.mjs} +20 -22
- package/fesm2015/breeze-client-adapter-data-service-odata.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-data-service-webapi.js → breeze-client-adapter-data-service-webapi.mjs} +13 -13
- package/fesm2015/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-model-library-backing-store.js → breeze-client-adapter-model-library-backing-store.mjs} +13 -13
- package/fesm2015/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-model-library-ko.js → breeze-client-adapter-model-library-ko.mjs} +13 -13
- package/fesm2015/breeze-client-adapter-model-library-ko.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-uri-builder-json.js → breeze-client-adapter-uri-builder-json.mjs} +8 -8
- package/fesm2015/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-uri-builder-odata.js → breeze-client-adapter-uri-builder-odata.mjs} +85 -86
- package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
- package/fesm2015/{breeze-client-mixin-get-entity-graph.js → breeze-client-mixin-get-entity-graph.mjs} +1 -1
- package/fesm2015/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
- package/fesm2015/{breeze-client-mixin-save-queuing.js → breeze-client-mixin-save-queuing.mjs} +1 -1
- package/fesm2015/breeze-client-mixin-save-queuing.mjs.map +1 -0
- package/fesm2015/{breeze-client.js → breeze-client.mjs} +417 -422
- package/fesm2015/breeze-client.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-angularjs.js → fesm2020/breeze-client-adapter-ajax-angularjs.mjs} +41 -42
- package/fesm2020/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-fetch.js → fesm2020/breeze-client-adapter-ajax-fetch.mjs} +44 -43
- package/fesm2020/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-httpclient.js → fesm2020/breeze-client-adapter-ajax-httpclient.mjs} +43 -44
- package/fesm2020/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-jquery.js → fesm2020/breeze-client-adapter-ajax-jquery.mjs} +18 -19
- package/fesm2020/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-post.js → fesm2020/breeze-client-adapter-ajax-post.mjs} +8 -11
- package/fesm2020/breeze-client-adapter-ajax-post.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-data-service-odata.js → fesm2020/breeze-client-adapter-data-service-odata.mjs} +126 -134
- package/fesm2020/breeze-client-adapter-data-service-odata.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-data-service-webapi.js → fesm2020/breeze-client-adapter-data-service-webapi.mjs} +38 -42
- package/fesm2020/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-model-library-backing-store.js → fesm2020/breeze-client-adapter-model-library-backing-store.mjs} +63 -64
- package/fesm2020/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-model-library-ko.js → fesm2020/breeze-client-adapter-model-library-ko.mjs} +57 -58
- package/fesm2020/breeze-client-adapter-model-library-ko.mjs.map +1 -0
- package/fesm2020/breeze-client-adapter-uri-builder-json.mjs +91 -0
- package/fesm2020/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
- package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs +245 -0
- package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
- package/{fesm5/breeze-client-mixin-get-entity-graph.js → fesm2020/breeze-client-mixin-get-entity-graph.mjs} +45 -45
- package/fesm2020/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
- package/{fesm5/breeze-client-mixin-save-queuing.js → fesm2020/breeze-client-mixin-save-queuing.mjs} +116 -126
- package/fesm2020/breeze-client-mixin-save-queuing.mjs.map +1 -0
- package/{fesm5/breeze-client.js → fesm2020/breeze-client.mjs} +3403 -3615
- package/fesm2020/breeze-client.mjs.map +1 -0
- package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
- package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
- package/package.json +126 -12
- package/src/entity-metadata.d.ts +6 -4
- package/src/entity-query.d.ts +1 -1
- package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
- package/adapter-ajax-angularjs/package.json +0 -13
- package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
- package/adapter-ajax-fetch/package.json +0 -13
- package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
- package/adapter-ajax-httpclient/package.json +0 -17
- package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
- package/adapter-ajax-jquery/package.json +0 -13
- package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
- package/adapter-ajax-post/package.json +0 -13
- package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
- package/adapter-data-service-odata/package.json +0 -13
- package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
- package/adapter-data-service-webapi/package.json +0 -13
- package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
- package/adapter-model-library-backing-store/package.json +0 -13
- package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
- package/adapter-model-library-ko/package.json +0 -13
- package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
- package/adapter-uri-builder-json/package.json +0 -13
- package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
- package/adapter-uri-builder-odata/package.json +0 -13
- package/breeze-client.d.ts +0 -8
- package/breeze-client.metadata.json +0 -1
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
- package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -743
- package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -326
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
- package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
- package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
- package/bundles/breeze-client.umd.js +0 -14094
- package/bundles/breeze-client.umd.js.map +0 -1
- package/bundles/breeze-client.umd.min.js +0 -16
- package/bundles/breeze-client.umd.min.js.map +0 -1
- package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
- package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
- package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
- package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
- package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
- package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
- package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
- package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
- package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
- package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
- package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
- package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -459
- package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
- package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -93
- package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
- package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
- package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
- package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
- package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
- package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
- package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
- package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
- package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
- package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
- package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
- package/esm2015/breeze-client.js +0 -9
- package/esm2015/index.js +0 -2
- package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
- package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
- package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
- package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
- package/esm2015/public_api.js +0 -2
- package/esm2015/src/abstract-data-service-adapter.js +0 -296
- package/esm2015/src/array.js +0 -4
- package/esm2015/src/assert-param.js +0 -312
- package/esm2015/src/breeze.js +0 -85
- package/esm2015/src/complex-array.js +0 -119
- package/esm2015/src/config.js +0 -223
- package/esm2015/src/core.js +0 -706
- package/esm2015/src/csdl-metadata-parser.js +0 -385
- package/esm2015/src/data-service.js +0 -203
- package/esm2015/src/data-type.js +0 -444
- package/esm2015/src/default-property-interceptor.js +0 -459
- package/esm2015/src/entity-action.js +0 -45
- package/esm2015/src/entity-aspect.js +0 -806
- package/esm2015/src/entity-group.js +0 -187
- package/esm2015/src/entity-key.js +0 -116
- package/esm2015/src/entity-manager.js +0 -2094
- package/esm2015/src/entity-metadata.js +0 -2109
- package/esm2015/src/entity-query.js +0 -996
- package/esm2015/src/entity-state.js +0 -99
- package/esm2015/src/enum.js +0 -141
- package/esm2015/src/event.js +0 -256
- package/esm2015/src/interface-registry.js +0 -41
- package/esm2015/src/key-generator.js +0 -108
- package/esm2015/src/local-query-comparison-options.js +0 -65
- package/esm2015/src/mapping-context.js +0 -405
- package/esm2015/src/naming-convention.js +0 -88
- package/esm2015/src/observable-array.js +0 -185
- package/esm2015/src/predicate.js +0 -1235
- package/esm2015/src/primitive-array.js +0 -87
- package/esm2015/src/query-options.js +0 -152
- package/esm2015/src/relation-array.js +0 -175
- package/esm2015/src/save-options.js +0 -41
- package/esm2015/src/unattached-children-map.js +0 -58
- package/esm2015/src/validate.js +0 -991
- package/esm2015/src/validation-options.js +0 -64
- package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
- package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
- package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
- package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
- package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
- package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
- package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
- package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
- package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
- package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
- package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
- package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
- package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
- package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
- package/esm5/adapter-data-service-odata/adapter-data-service-odata.js +0 -466
- package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
- package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -98
- package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
- package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
- package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
- package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
- package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
- package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
- package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
- package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
- package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
- package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
- package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
- package/esm5/breeze-client.js +0 -9
- package/esm5/index.js +0 -2
- package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
- package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
- package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
- package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
- package/esm5/public_api.js +0 -2
- package/esm5/src/abstract-data-service-adapter.js +0 -302
- package/esm5/src/array.js +0 -4
- package/esm5/src/assert-param.js +0 -317
- package/esm5/src/breeze.js +0 -85
- package/esm5/src/complex-array.js +0 -119
- package/esm5/src/config.js +0 -228
- package/esm5/src/core.js +0 -714
- package/esm5/src/csdl-metadata-parser.js +0 -385
- package/esm5/src/data-service.js +0 -207
- package/esm5/src/data-type.js +0 -451
- package/esm5/src/default-property-interceptor.js +0 -459
- package/esm5/src/entity-action.js +0 -52
- package/esm5/src/entity-aspect.js +0 -812
- package/esm5/src/entity-group.js +0 -189
- package/esm5/src/entity-key.js +0 -118
- package/esm5/src/entity-manager.js +0 -2112
- package/esm5/src/entity-metadata.js +0 -2144
- package/esm5/src/entity-query.js +0 -1023
- package/esm5/src/entity-state.js +0 -106
- package/esm5/src/enum.js +0 -144
- package/esm5/src/event.js +0 -259
- package/esm5/src/interface-registry.js +0 -43
- package/esm5/src/key-generator.js +0 -111
- package/esm5/src/local-query-comparison-options.js +0 -67
- package/esm5/src/mapping-context.js +0 -407
- package/esm5/src/naming-convention.js +0 -90
- package/esm5/src/observable-array.js +0 -201
- package/esm5/src/predicate.js +0 -1300
- package/esm5/src/primitive-array.js +0 -87
- package/esm5/src/query-options.js +0 -167
- package/esm5/src/relation-array.js +0 -175
- package/esm5/src/save-options.js +0 -43
- package/esm5/src/unattached-children-map.js +0 -60
- package/esm5/src/validate.js +0 -996
- package/esm5/src/validation-options.js +0 -66
- package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
- package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
- package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
- package/fesm2015/breeze-client.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
- package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
- package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
- package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
- package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
- package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
- package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
- package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
- package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
- package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
- package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
- package/fesm5/breeze-client.js.map +0 -1
- package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
- package/mixin-get-entity-graph/package.json +0 -13
- package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
- package/mixin-save-queuing/package.json +0 -13
- package/public_api.d.ts +0 -1
|
@@ -1,459 +0,0 @@
|
|
|
1
|
-
import { core } from './core';
|
|
2
|
-
import { EntityKey } from './entity-key';
|
|
3
|
-
import { EntityAspect } from './entity-aspect';
|
|
4
|
-
import { EntityState } from './entity-state';
|
|
5
|
-
import { EntityAction } from './entity-action';
|
|
6
|
-
import { EntityQuery } from './entity-query';
|
|
7
|
-
/** @hidden @internal */
|
|
8
|
-
export function defaultPropertyInterceptor(property, newValue, rawAccessorFn) {
|
|
9
|
-
// 'this' is the entity itself in this context.
|
|
10
|
-
if (newValue === undefined)
|
|
11
|
-
newValue = null; // remove? to allow assignment to undefined in Babel constructors?
|
|
12
|
-
let oldValue = rawAccessorFn();
|
|
13
|
-
let dataType = property.dataType;
|
|
14
|
-
if (dataType && dataType.parse) {
|
|
15
|
-
// attempts to coerce a value to the correct type - if this fails return the value unchanged
|
|
16
|
-
if (Array.isArray(newValue) && !property.isScalar) {
|
|
17
|
-
newValue = newValue.map(function (nv) {
|
|
18
|
-
return dataType.parse(nv, typeof nv);
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
newValue = dataType.parse(newValue, typeof newValue);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
// exit if no change - extra cruft is because dateTimes don't compare cleanly.
|
|
26
|
-
if (newValue === oldValue || (dataType && dataType.normalize && newValue && oldValue && dataType.normalize(newValue) === dataType.normalize(oldValue))) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
// CANNOT DO NEXT LINE because it has the possibility of creating a new property
|
|
30
|
-
// 'entityAspect' on 'this'. - Not permitted by IE inside of a defined property on a prototype.
|
|
31
|
-
// let entityAspect = new EntityAspect(this);
|
|
32
|
-
let propertyName;
|
|
33
|
-
let entityAspect = this.entityAspect;
|
|
34
|
-
if (entityAspect) {
|
|
35
|
-
propertyName = property.name;
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
let localAspect = this.complexAspect;
|
|
39
|
-
if (localAspect) {
|
|
40
|
-
entityAspect = localAspect.getEntityAspect();
|
|
41
|
-
propertyName = localAspect.getPropertyPath(property.name);
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
// does not yet have an EntityAspect so just set the prop
|
|
45
|
-
rawAccessorFn(newValue);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// Note that we need to handle multiple properties in process, not just one in order to avoid recursion.
|
|
50
|
-
// ( except in the case of null propagation with fks where null -> 0 in some cases.)
|
|
51
|
-
// (this may not be needed because of the newValue === oldValue test above)
|
|
52
|
-
let inProcess = entityAspect._inProcess = entityAspect._inProcess || [];
|
|
53
|
-
// check for recursion
|
|
54
|
-
if (inProcess.indexOf(property) >= 0)
|
|
55
|
-
return;
|
|
56
|
-
inProcess.push(property);
|
|
57
|
-
try {
|
|
58
|
-
let context = {
|
|
59
|
-
parent: this,
|
|
60
|
-
property: property,
|
|
61
|
-
newValue: newValue,
|
|
62
|
-
oldValue: oldValue,
|
|
63
|
-
propertyName: propertyName,
|
|
64
|
-
entityAspect: entityAspect
|
|
65
|
-
};
|
|
66
|
-
if (property.isComplexProperty) {
|
|
67
|
-
setDpValueComplex(context, rawAccessorFn);
|
|
68
|
-
}
|
|
69
|
-
else if (property.isDataProperty) {
|
|
70
|
-
setDpValueSimple(context, rawAccessorFn);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
setNpValue(context, rawAccessorFn);
|
|
74
|
-
}
|
|
75
|
-
postChangeEvents(context);
|
|
76
|
-
}
|
|
77
|
-
finally {
|
|
78
|
-
inProcess.pop();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function setDpValueSimple(context, rawAccessorFn) {
|
|
82
|
-
let parent = context.parent;
|
|
83
|
-
let property = context.property;
|
|
84
|
-
let entityAspect = context.entityAspect;
|
|
85
|
-
let oldValue = context.oldValue;
|
|
86
|
-
let newValue = context.newValue;
|
|
87
|
-
let entityManager = entityAspect.entityManager;
|
|
88
|
-
if (!property.isScalar) {
|
|
89
|
-
throw new Error("Nonscalar data properties are readonly - items may be added or removed but the collection may not be changed.");
|
|
90
|
-
}
|
|
91
|
-
// store an original value for this property if not already set
|
|
92
|
-
if (entityAspect.entityState.isUnchangedOrModified()) {
|
|
93
|
-
let propName = property.name;
|
|
94
|
-
// localAspect is not the same as entityAspect for complex props
|
|
95
|
-
let localAspect = EntityAspect.isEntity(parent) ? parent.entityAspect : parent.complexAspect;
|
|
96
|
-
if (localAspect.originalValues[propName] === undefined) {
|
|
97
|
-
// otherwise this entry will be skipped during serialization
|
|
98
|
-
localAspect.originalValues[propName] = oldValue !== undefined ? oldValue : property.defaultValue;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// if we are changing the key update our internal entityGroup indexes.
|
|
102
|
-
if (property.isPartOfKey && entityManager && !entityManager.isLoading) {
|
|
103
|
-
// 'entityType' on the next line be null for complex properties but it will only be ref'd within this
|
|
104
|
-
// fn when the property is part of the key
|
|
105
|
-
let entityType = parent.entityType;
|
|
106
|
-
let keyProps = entityType.keyProperties;
|
|
107
|
-
let values = keyProps.map(function (p) {
|
|
108
|
-
if (p === property) {
|
|
109
|
-
return newValue;
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
return parent.getProperty(p.name);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
let newKey = new EntityKey(entityType, values);
|
|
116
|
-
if (entityManager.getEntityByKey(newKey)) {
|
|
117
|
-
throw new Error("An entity with this key is already in the cache: " + newKey.toString());
|
|
118
|
-
}
|
|
119
|
-
let oldKey = parent.entityAspect.getKey();
|
|
120
|
-
let eg = entityManager._findEntityGroup(entityType);
|
|
121
|
-
eg._replaceKey(oldKey, newKey);
|
|
122
|
-
}
|
|
123
|
-
// process related updates ( the inverse relationship) first so that collection dups check works properly.
|
|
124
|
-
// update inverse relationship
|
|
125
|
-
let relatedNavProp = property.relatedNavigationProperty;
|
|
126
|
-
if (relatedNavProp && entityManager) {
|
|
127
|
-
// Example: bidirectional fkDataProperty: 1->n: order -> orderDetails
|
|
128
|
-
// orderDetail.orderId <- newOrderId || null
|
|
129
|
-
// ==> orderDetail.order = lookupOrder(newOrderId)
|
|
130
|
-
// ==> (see set navProp above)
|
|
131
|
-
// and
|
|
132
|
-
// Example: bidirectional fkDataProperty: 1->1: order -> internationalOrder
|
|
133
|
-
// internationalOrder.orderId <- newOrderId || null
|
|
134
|
-
// ==> internationalOrder.order = lookupOrder(newOrderId)
|
|
135
|
-
// ==> (see set navProp above)
|
|
136
|
-
if (newValue != null) {
|
|
137
|
-
let relatedEntity;
|
|
138
|
-
let key;
|
|
139
|
-
if (relatedNavProp.invForeignKeyNames.length) {
|
|
140
|
-
// property is related by field which is not the PK
|
|
141
|
-
const query = new EntityQuery(relatedNavProp.entityType.defaultResourceName).where(relatedNavProp.invForeignKeyNames[0], 'eq', newValue);
|
|
142
|
-
const qresult = entityManager.executeQueryLocally(query);
|
|
143
|
-
if (qresult.length === 1) {
|
|
144
|
-
relatedEntity = qresult[0];
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
// property is related by the PK
|
|
149
|
-
key = new EntityKey(relatedNavProp.entityType, [newValue]);
|
|
150
|
-
relatedEntity = entityManager.getEntityByKey(key);
|
|
151
|
-
}
|
|
152
|
-
if (relatedEntity) {
|
|
153
|
-
parent.setProperty(relatedNavProp.name, relatedEntity);
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
// it may not have been fetched yet in which case we want to add it as an unattachedChild.
|
|
157
|
-
if (key) {
|
|
158
|
-
// TODO currently _linkRelatedentities only works with PK relations, so we only add those.
|
|
159
|
-
entityManager._unattachedChildrenMap.addChild(key, relatedNavProp, parent);
|
|
160
|
-
}
|
|
161
|
-
parent.setProperty(relatedNavProp.name, null);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
parent.setProperty(relatedNavProp.name, null);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else if (property.inverseNavigationProperty && entityManager && !entityManager._inKeyFixup) {
|
|
169
|
-
// Example: unidirectional fkDataProperty: 1->n: region -> territories
|
|
170
|
-
// territory.regionId <- newRegionId
|
|
171
|
-
// ==> lookupRegion(newRegionId).territories.push(territory)
|
|
172
|
-
// and
|
|
173
|
-
// Example: unidirectional fkDataProperty: 1->1: order -> internationalOrder
|
|
174
|
-
// internationalOrder.orderId <- newOrderId
|
|
175
|
-
// ==> lookupOrder(newOrderId).internationalOrder = internationalOrder
|
|
176
|
-
// and
|
|
177
|
-
// Example: unidirectional fkDataProperty: 1->n: region -> territories
|
|
178
|
-
// territory.regionId <- null
|
|
179
|
-
// ==> lookupRegion(territory.oldRegionId).territories.remove(oldTerritory);
|
|
180
|
-
// and
|
|
181
|
-
// Example: unidirectional fkDataProperty: 1->1: order -> internationalOrder
|
|
182
|
-
// internationalOrder.orderId <- null
|
|
183
|
-
// ==> lookupOrder(internationalOrder.oldOrderId).internationalOrder = null;
|
|
184
|
-
let invNavProp = property.inverseNavigationProperty;
|
|
185
|
-
if (oldValue != null) {
|
|
186
|
-
let key = new EntityKey(invNavProp.parentType, [oldValue]);
|
|
187
|
-
let relatedEntity = entityManager.getEntityByKey(key);
|
|
188
|
-
if (relatedEntity) {
|
|
189
|
-
if (invNavProp.isScalar) {
|
|
190
|
-
relatedEntity.setProperty(invNavProp.name, null);
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
// remove 'this' from old related nav prop
|
|
194
|
-
let relatedArray = relatedEntity.getProperty(invNavProp.name);
|
|
195
|
-
// arr.splice(arr.indexOf(value_to_remove), 1);
|
|
196
|
-
relatedArray.splice(relatedArray.indexOf(parent), 1);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
if (newValue != null) {
|
|
201
|
-
let key = new EntityKey(invNavProp.parentType, [newValue]);
|
|
202
|
-
let relatedEntity = entityManager.getEntityByKey(key);
|
|
203
|
-
if (relatedEntity) {
|
|
204
|
-
if (invNavProp.isScalar) {
|
|
205
|
-
relatedEntity.setProperty(invNavProp.name, parent);
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
relatedEntity.getProperty(invNavProp.name).push(parent);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
// it may not have been fetched yet in which case we want to add it as an unattachedChild.
|
|
213
|
-
entityManager._unattachedChildrenMap.addChild(key, invNavProp, parent);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
rawAccessorFn(newValue);
|
|
218
|
-
updateStateAndValidate(context);
|
|
219
|
-
// if (property.isPartOfKey && (!this.complexAspect)) {
|
|
220
|
-
if (property.isPartOfKey) {
|
|
221
|
-
// propogate pk change to all related entities;
|
|
222
|
-
let entityType = parent.entityType;
|
|
223
|
-
let propertyIx = entityType.keyProperties.indexOf(property);
|
|
224
|
-
// this part handles order.orderId => orderDetail.orderId
|
|
225
|
-
// but won't handle product.productId => orderDetail.productId because product
|
|
226
|
-
// doesn't have an orderDetails property.
|
|
227
|
-
entityType.navigationProperties.forEach(function (np) {
|
|
228
|
-
let inverseNp = np.inverse;
|
|
229
|
-
let fkNames = inverseNp ? inverseNp.foreignKeyNames : np.invForeignKeyNames;
|
|
230
|
-
if (fkNames.length === 0)
|
|
231
|
-
return;
|
|
232
|
-
let npValue = parent.getProperty(np.name);
|
|
233
|
-
if (!npValue)
|
|
234
|
-
return;
|
|
235
|
-
let fkName = fkNames[propertyIx];
|
|
236
|
-
if (np.isScalar) {
|
|
237
|
-
npValue.setProperty(fkName, newValue);
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
npValue.slice(0).forEach(function (iv) {
|
|
241
|
-
iv.setProperty(fkName, newValue);
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
// this handles unidirectional problems not covered above.
|
|
246
|
-
if (entityManager) {
|
|
247
|
-
let inverseForeignKeyProperties = entityType.inverseForeignKeyProperties;
|
|
248
|
-
let baseEntityType = entityType.baseEntityType;
|
|
249
|
-
while (baseEntityType) {
|
|
250
|
-
inverseForeignKeyProperties = inverseForeignKeyProperties.concat(baseEntityType.inverseForeignKeyProperties);
|
|
251
|
-
baseEntityType = baseEntityType.baseEntityType;
|
|
252
|
-
}
|
|
253
|
-
inverseForeignKeyProperties.forEach((invFkProp) => {
|
|
254
|
-
if (invFkProp.relatedNavigationProperty.inverse == null) {
|
|
255
|
-
// this next step may be slow - it iterates over all of the entities in a group;
|
|
256
|
-
// hopefully it doesn't happen often.
|
|
257
|
-
entityManager._updateFkVal(invFkProp, oldValue, newValue);
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
// insure that cached key is updated.
|
|
262
|
-
entityAspect.getKey(true);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
function setDpValueComplex(context, rawAccessorFn) {
|
|
266
|
-
let property = context.property;
|
|
267
|
-
let oldValue = context.oldValue;
|
|
268
|
-
let newValue = context.newValue;
|
|
269
|
-
// To get here it must be a ComplexProperty
|
|
270
|
-
// 'dataType' will be a complexType
|
|
271
|
-
let dataType = property.dataType;
|
|
272
|
-
if (property.isScalar) {
|
|
273
|
-
if (!newValue) {
|
|
274
|
-
throw new Error(core.formatString("You cannot set the '%1' property to null because it's datatype is the ComplexType: '%2'", property.name, property.dataType.name));
|
|
275
|
-
}
|
|
276
|
-
if (!oldValue) {
|
|
277
|
-
let ctor = dataType.getCtor();
|
|
278
|
-
oldValue = new ctor();
|
|
279
|
-
rawAccessorFn(oldValue);
|
|
280
|
-
}
|
|
281
|
-
dataType.dataProperties.forEach(function (dp) {
|
|
282
|
-
let pn = dp.name;
|
|
283
|
-
let nv = newValue.getProperty(pn);
|
|
284
|
-
oldValue.setProperty(pn, nv);
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
else {
|
|
288
|
-
throw new Error(core.formatString("You cannot set the non-scalar complex property: '%1' on the type: '%2'." +
|
|
289
|
-
"Instead get the property and use array functions like 'push' or 'splice' to change its contents.", property.name, property.parentType.name));
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
function setNpValue(context, rawAccessorFn) {
|
|
293
|
-
let parent = context.parent;
|
|
294
|
-
let property = context.property;
|
|
295
|
-
let entityAspect = context.entityAspect;
|
|
296
|
-
let oldValue = context.oldValue;
|
|
297
|
-
let newValue = context.newValue;
|
|
298
|
-
if (!property.isScalar) {
|
|
299
|
-
throw new Error("Nonscalar navigation properties are readonly - entities can be added or removed but the collection may not be changed.");
|
|
300
|
-
}
|
|
301
|
-
let entityManager = entityAspect.entityManager;
|
|
302
|
-
let inverseProp = property.inverse;
|
|
303
|
-
// manage attachment -
|
|
304
|
-
if (newValue != null) {
|
|
305
|
-
if (!newValue.entityAspect) {
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
let newAspect = newValue.entityAspect;
|
|
309
|
-
if (entityManager) {
|
|
310
|
-
if (newAspect.entityState.isDetached()) {
|
|
311
|
-
if (!entityManager.isLoading) {
|
|
312
|
-
entityManager.attachEntity(newValue, EntityState.Added);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
if (newAspect.entityManager !== entityManager) {
|
|
317
|
-
throw new Error("An Entity cannot be attached to an entity in another EntityManager. One of the two entities must be detached first.");
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
if (newAspect && newAspect.entityManager) {
|
|
323
|
-
entityManager = newAspect.entityManager;
|
|
324
|
-
if (!entityManager.isLoading) {
|
|
325
|
-
entityManager.attachEntity(entityAspect.entity, EntityState.Added);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
// process related updates ( the inverse relationship) first so that collection dups check works properly.
|
|
331
|
-
// update inverse relationship
|
|
332
|
-
if (inverseProp) {
|
|
333
|
-
///
|
|
334
|
-
if (inverseProp.isScalar) {
|
|
335
|
-
// Example: bidirectional navProperty: 1->1: order -> internationalOrder
|
|
336
|
-
// order.internationalOrder <- internationalOrder || null
|
|
337
|
-
// ==> (oldInternationalOrder.order = null)
|
|
338
|
-
// ==> internationalOrder.order = order
|
|
339
|
-
if (oldValue != null) {
|
|
340
|
-
// TODO: null -> NullEntity later
|
|
341
|
-
oldValue.setProperty(inverseProp.name, null);
|
|
342
|
-
}
|
|
343
|
-
if (newValue != null) {
|
|
344
|
-
newValue.setProperty(inverseProp.name, parent);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
else {
|
|
348
|
-
// Example: bidirectional navProperty: 1->n: order -> orderDetails
|
|
349
|
-
// orderDetail.order <- newOrder || null
|
|
350
|
-
// ==> (oldOrder).orderDetails.remove(orderDetail)
|
|
351
|
-
// ==> order.orderDetails.push(newOrder)
|
|
352
|
-
if (oldValue != null) {
|
|
353
|
-
let oldSiblings = oldValue.getProperty(inverseProp.name);
|
|
354
|
-
let ix = oldSiblings.indexOf(parent);
|
|
355
|
-
if (ix !== -1) {
|
|
356
|
-
oldSiblings.splice(ix, 1);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
if (newValue != null) {
|
|
360
|
-
let siblings = newValue.getProperty(inverseProp.name);
|
|
361
|
-
// recursion check if already in the collection is performed by the relationArray
|
|
362
|
-
siblings.push(parent);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
else if (property.invForeignKeyNames && entityManager && !entityManager._inKeyFixup) {
|
|
367
|
-
let invForeignKeyNames = property.invForeignKeyNames;
|
|
368
|
-
if (newValue != null) {
|
|
369
|
-
// Example: unidirectional navProperty: 1->1: order -> internationalOrder
|
|
370
|
-
// order.InternationalOrder <- internationalOrder
|
|
371
|
-
// ==> internationalOrder.orderId = orderId
|
|
372
|
-
// and
|
|
373
|
-
// Example: unidirectional navProperty: 1->n: order -> orderDetails
|
|
374
|
-
// orderDetail.order <-xxx newOrder
|
|
375
|
-
// ==> CAN'T HAPPEN because if unidirectional because orderDetail will not have an order prop
|
|
376
|
-
let pkValues = parent.entityAspect.getKey().values;
|
|
377
|
-
invForeignKeyNames.forEach((fkName, i) => {
|
|
378
|
-
newValue.setProperty(fkName, pkValues[i]);
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
else {
|
|
382
|
-
// Example: unidirectional navProperty: 1->1: order -> internationalOrder
|
|
383
|
-
// order.internationalOrder <- null
|
|
384
|
-
// ==> (old internationalOrder).orderId = null
|
|
385
|
-
// and
|
|
386
|
-
// Example: unidirectional navProperty: 1->n: order -> orderDetails
|
|
387
|
-
// orderDetail.order <-xxx newOrder
|
|
388
|
-
// ==> CAN'T HAPPEN because if unidirectional because orderDetail will not have an order prop
|
|
389
|
-
if (oldValue != null) {
|
|
390
|
-
invForeignKeyNames.forEach((fkName) => {
|
|
391
|
-
let fkProp = oldValue.entityType.getProperty(fkName);
|
|
392
|
-
if (!fkProp.isPartOfKey) {
|
|
393
|
-
// don't update with null if fk is part of the key
|
|
394
|
-
oldValue.setProperty(fkName, null);
|
|
395
|
-
}
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
rawAccessorFn(newValue);
|
|
401
|
-
updateStateAndValidate(context);
|
|
402
|
-
// update fk data property - this can only occur if this navProperty has
|
|
403
|
-
// a corresponding fk on this entity.
|
|
404
|
-
if (property.relatedDataProperties) {
|
|
405
|
-
let entityState = entityAspect.entityState;
|
|
406
|
-
// if either side of nav prop is detached don't clear fks. Note: oldValue in next line cannot be null so no check is needed.
|
|
407
|
-
if (newValue == null && (entityState.isDetached() || oldValue.entityAspect.entityState.isDetached()))
|
|
408
|
-
return;
|
|
409
|
-
if (entityState.isDeleted())
|
|
410
|
-
return;
|
|
411
|
-
// we may have inverse props indicating the related prop on the other entity, if it is not the other entity's PK
|
|
412
|
-
let inverseKeyProps = property.invForeignKeyNames;
|
|
413
|
-
if (!(inverseKeyProps && inverseKeyProps.length)) {
|
|
414
|
-
// otherwise, this prop is related to the other entity's PK
|
|
415
|
-
inverseKeyProps = property.entityType.keyProperties.map(k => k.name);
|
|
416
|
-
}
|
|
417
|
-
inverseKeyProps.forEach(function (keyProp, i) {
|
|
418
|
-
let relatedDataProp = property.relatedDataProperties[i];
|
|
419
|
-
// Do not trash related property if it is part of that entity's key
|
|
420
|
-
if (newValue || !relatedDataProp.isPartOfKey) {
|
|
421
|
-
let relatedValue = newValue ? newValue.getProperty(keyProp) : relatedDataProp.defaultValue;
|
|
422
|
-
parent.setProperty(relatedDataProp.name, relatedValue);
|
|
423
|
-
}
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
function postChangeEvents(context) {
|
|
428
|
-
let entityAspect = context.entityAspect;
|
|
429
|
-
let entityManager = entityAspect.entityManager;
|
|
430
|
-
let entity = entityAspect.entity;
|
|
431
|
-
let propChangedArgs = { entity: entity, parent: context.parent, property: context.property, propertyName: context.propertyName, oldValue: context.oldValue, newValue: context.newValue };
|
|
432
|
-
if (entityManager) {
|
|
433
|
-
// propertyChanged will be fired during loading but we only want to fire it once per entity, not once per property.
|
|
434
|
-
// so propertyChanged is fired in the entityManager mergeEntity method if not fired here.
|
|
435
|
-
if ((!entityManager.isLoading) && (!entityManager.isRejectingChanges)) {
|
|
436
|
-
entityAspect.propertyChanged.publish(propChangedArgs);
|
|
437
|
-
// don't fire entityChanged event if propertyChanged is suppressed.
|
|
438
|
-
entityManager.entityChanged.publish({ entityAction: EntityAction.PropertyChange, entity: entity, args: propChangedArgs });
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
entityAspect.propertyChanged.publish(propChangedArgs);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
function updateStateAndValidate(context) {
|
|
446
|
-
let entityAspect = context.entityAspect;
|
|
447
|
-
let entityManager = entityAspect.entityManager;
|
|
448
|
-
if (entityManager == null || entityManager.isLoading)
|
|
449
|
-
return;
|
|
450
|
-
let property = context.property;
|
|
451
|
-
if (entityAspect.entityState.isUnchanged() && !property.isUnmapped) {
|
|
452
|
-
entityAspect.setModified();
|
|
453
|
-
}
|
|
454
|
-
if (entityManager.validationOptions.validateOnPropertyChange) {
|
|
455
|
-
// entityAspect.entity is NOT the same as parent in the code below. It's use is deliberate.
|
|
456
|
-
entityAspect._validateProperty(context.newValue, { entity: entityAspect.entity, property: property, propertyName: context.propertyName, oldValue: context.oldValue });
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1wcm9wZXJ0eS1pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2JyZWV6ZS1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvZGVmYXVsdC1wcm9wZXJ0eS1pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBMkMsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3Qyx3QkFBd0I7QUFDeEIsTUFBTSxVQUFVLDBCQUEwQixDQUF5QixRQUF3QixFQUFFLFFBQWEsRUFBRSxhQUF1QjtJQUNqSSwrQ0FBK0M7SUFFL0MsSUFBSSxRQUFRLEtBQUssU0FBUztRQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxrRUFBa0U7SUFDL0csSUFBSSxRQUFRLEdBQUcsYUFBYSxFQUFFLENBQUM7SUFFL0IsSUFBSSxRQUFRLEdBQUksUUFBZ0IsQ0FBQyxRQUFRLENBQUM7SUFDMUMsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtRQUM5Qiw0RkFBNEY7UUFDNUYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUNqRCxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xDLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQztTQUNKO2FB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Q0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQzFIO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvcmUgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wbGV4VHlwZSwgRGF0YVByb3BlcnR5LCBOYXZpZ2F0aW9uUHJvcGVydHksIEVudGl0eVByb3BlcnR5IH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBFbnRpdHlLZXkgfSBmcm9tICcuL2VudGl0eS1rZXknO1xyXG5pbXBvcnQgeyBFbnRpdHlBc3BlY3QsIENvbXBsZXhBc3BlY3QsIEVudGl0eSwgU3RydWN0dXJhbE9iamVjdCB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IEVudGl0eVN0YXRlIH0gZnJvbSAnLi9lbnRpdHktc3RhdGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlBY3Rpb24gfSBmcm9tICcuL2VudGl0eS1hY3Rpb24nO1xyXG5pbXBvcnQgeyBFbnRpdHlRdWVyeSB9IGZyb20gJy4vZW50aXR5LXF1ZXJ5JztcclxuXHJcbi8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFByb3BlcnR5SW50ZXJjZXB0b3IodGhpczogU3RydWN0dXJhbE9iamVjdCwgcHJvcGVydHk6IEVudGl0eVByb3BlcnR5LCBuZXdWYWx1ZTogYW55LCByYXdBY2Nlc3NvckZuOiBGdW5jdGlvbikge1xyXG4gIC8vICd0aGlzJyBpcyB0aGUgZW50aXR5IGl0c2VsZiBpbiB0aGlzIGNvbnRleHQuXHJcblxyXG4gIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSBuZXdWYWx1ZSA9IG51bGw7IC8vIHJlbW92ZT8gdG8gYWxsb3cgYXNzaWdubWVudCB0byB1bmRlZmluZWQgaW4gQmFiZWwgY29uc3RydWN0b3JzP1xyXG4gIGxldCBvbGRWYWx1ZSA9IHJhd0FjY2Vzc29yRm4oKTtcclxuXHJcbiAgbGV0IGRhdGFUeXBlID0gKHByb3BlcnR5IGFzIGFueSkuZGF0YVR5cGU7XHJcbiAgaWYgKGRhdGFUeXBlICYmIGRhdGFUeXBlLnBhcnNlKSB7XHJcbiAgICAvLyBhdHRlbXB0cyB0byBjb2VyY2UgYSB2YWx1ZSB0byB0aGUgY29ycmVjdCB0eXBlIC0gaWYgdGhpcyBmYWlscyByZXR1cm4gdGhlIHZhbHVlIHVuY2hhbmdlZFxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmICFwcm9wZXJ0eS5pc1NjYWxhcikge1xyXG4gICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlLm1hcChmdW5jdGlvbiAobnYpIHtcclxuICAgICAgICByZXR1cm4gZGF0YVR5cGUucGFyc2UobnYsIHR5cGVvZiBudik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmV3VmFsdWUgPSBkYXRhVHlwZS5wYXJzZShuZXdWYWx1ZSwgdHlwZW9mIG5ld1ZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGV4aXQgaWYgbm8gY2hhbmdlIC0gZXh0cmEgY3J1ZnQgaXMgYmVjYXVzZSBkYXRlVGltZXMgZG9uJ3QgY29tcGFyZSBjbGVhbmx5LlxyXG4gIGlmIChuZXdWYWx1ZSA9PT0gb2xkVmFsdWUgfHwgKGRhdGFUeXBlICYmIGRhdGFUeXBlLm5vcm1hbGl6ZSAmJiBuZXdWYWx1ZSAmJiBvbGRWYWx1ZSAmJiBkYXRhVHlwZS5ub3JtYWxpemUobmV3VmFsdWUpID09PSBkYXRhVHlwZS5ub3JtYWxpemUob2xkVmFsdWUpKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gQ0FOTk9UIERPIE5FWFQgTElORSBiZWNhdXNlIGl0IGhhcyB0aGUgcG9zc2liaWxpdHkgb2YgY3JlYXRpbmcgYSBuZXcgcHJvcGVydHlcclxuICAvLyAnZW50aXR5QXNwZWN0JyBvbiAndGhpcycuICAtIE5vdCBwZXJtaXR0ZWQgYnkgSUUgaW5zaWRlIG9mIGEgZGVmaW5lZCBwcm9wZXJ0eSBvbiBhIHByb3RvdHlwZS5cclxuICAvLyBsZXQgZW50aXR5QXNwZWN0ID0gbmV3IEVudGl0eUFzcGVjdCh0aGlzKTtcclxuXHJcbiAgbGV0IHByb3BlcnR5TmFtZTogc3RyaW5nO1xyXG4gIGxldCBlbnRpdHlBc3BlY3QgPSAodGhpcyBhcyBhbnkpLmVudGl0eUFzcGVjdCBhcyBFbnRpdHlBc3BlY3Q7XHJcbiAgaWYgKGVudGl0eUFzcGVjdCkge1xyXG4gICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZTtcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IGxvY2FsQXNwZWN0ID0gKHRoaXMgYXMgYW55KS5jb21wbGV4QXNwZWN0IGFzIENvbXBsZXhBc3BlY3Q7XHJcbiAgICBpZiAobG9jYWxBc3BlY3QpIHtcclxuICAgICAgZW50aXR5QXNwZWN0ID0gbG9jYWxBc3BlY3QuZ2V0RW50aXR5QXNwZWN0KCk7XHJcbiAgICAgIHByb3BlcnR5TmFtZSA9IGxvY2FsQXNwZWN0LmdldFByb3BlcnR5UGF0aChwcm9wZXJ0eS5uYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGRvZXMgbm90IHlldCBoYXZlIGFuIEVudGl0eUFzcGVjdCBzbyBqdXN0IHNldCB0aGUgcHJvcFxyXG4gICAgICByYXdBY2Nlc3NvckZuKG5ld1ZhbHVlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gTm90ZSB0aGF0IHdlIG5lZWQgdG8gaGFuZGxlIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gcHJvY2Vzcywgbm90IGp1c3Qgb25lIGluIG9yZGVyIHRvIGF2b2lkIHJlY3Vyc2lvbi5cclxuICAvLyAoIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBudWxsIHByb3BhZ2F0aW9uIHdpdGggZmtzIHdoZXJlIG51bGwgLT4gMCBpbiBzb21lIGNhc2VzLilcclxuICAvLyAodGhpcyBtYXkgbm90IGJlIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBuZXdWYWx1ZSA9PT0gb2xkVmFsdWUgdGVzdCBhYm92ZSlcclxuICBsZXQgaW5Qcm9jZXNzID0gZW50aXR5QXNwZWN0Ll9pblByb2Nlc3MgPSBlbnRpdHlBc3BlY3QuX2luUHJvY2VzcyB8fCBbXTtcclxuICAvLyBjaGVjayBmb3IgcmVjdXJzaW9uXHJcbiAgaWYgKGluUHJvY2Vzcy5pbmRleE9mKHByb3BlcnR5KSA+PSAwKSByZXR1cm47XHJcbiAgaW5Qcm9jZXNzLnB1c2gocHJvcGVydHkpO1xyXG5cclxuICB0cnkge1xyXG5cclxuICAgIGxldCBjb250ZXh0OiBJQ29udGV4dCA9IHtcclxuICAgICAgcGFyZW50OiB0aGlzLFxyXG4gICAgICBwcm9wZXJ0eTogcHJvcGVydHksXHJcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSxcclxuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxyXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcclxuICAgICAgZW50aXR5QXNwZWN0OiBlbnRpdHlBc3BlY3RcclxuICAgIH07XHJcblxyXG4gICAgaWYgKChwcm9wZXJ0eSBhcyBhbnkpLmlzQ29tcGxleFByb3BlcnR5KSB7XHJcbiAgICAgIHNldERwVmFsdWVDb21wbGV4KGNvbnRleHQsIHJhd0FjY2Vzc29yRm4pO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5pc0RhdGFQcm9wZXJ0eSkge1xyXG4gICAgICBzZXREcFZhbHVlU2ltcGxlKGNvbnRleHQsIHJhd0FjY2Vzc29yRm4pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2V0TnBWYWx1ZShjb250ZXh0LCByYXdBY2Nlc3NvckZuKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0Q2hhbmdlRXZlbnRzKGNvbnRleHQpO1xyXG5cclxuICB9IGZpbmFsbHkge1xyXG4gICAgaW5Qcm9jZXNzLnBvcCgpO1xyXG4gIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250ZXh0IHtcclxuICBwYXJlbnQ6IFN0cnVjdHVyYWxPYmplY3Q7XHJcbiAgcHJvcGVydHk6IEVudGl0eVByb3BlcnR5O1xyXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xyXG4gIGVudGl0eUFzcGVjdDogRW50aXR5QXNwZWN0O1xyXG4gIG9sZFZhbHVlOiBhbnk7XHJcbiAgbmV3VmFsdWU6IGFueTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0RHBWYWx1ZVNpbXBsZShjb250ZXh0OiBJQ29udGV4dCwgcmF3QWNjZXNzb3JGbjogYW55KSB7XHJcbiAgbGV0IHBhcmVudCA9IGNvbnRleHQucGFyZW50O1xyXG4gIGxldCBwcm9wZXJ0eSA9IGNvbnRleHQucHJvcGVydHkgYXMgRGF0YVByb3BlcnR5O1xyXG4gIGxldCBlbnRpdHlBc3BlY3QgPSBjb250ZXh0LmVudGl0eUFzcGVjdDtcclxuICBsZXQgb2xkVmFsdWUgPSBjb250ZXh0Lm9sZFZhbHVlO1xyXG4gIGxldCBuZXdWYWx1ZSA9IGNvbnRleHQubmV3VmFsdWU7XHJcblxyXG4gIGxldCBlbnRpdHlNYW5hZ2VyID0gZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXI7XHJcblxyXG4gIGlmICghcHJvcGVydHkuaXNTY2FsYXIpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbnNjYWxhciBkYXRhIHByb3BlcnRpZXMgYXJlIHJlYWRvbmx5IC0gaXRlbXMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQgYnV0IHRoZSBjb2xsZWN0aW9uIG1heSBub3QgYmUgY2hhbmdlZC5cIik7XHJcbiAgfVxyXG5cclxuICAvLyBzdG9yZSBhbiBvcmlnaW5hbCB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSBpZiBub3QgYWxyZWFkeSBzZXRcclxuICBpZiAoZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzVW5jaGFuZ2VkT3JNb2RpZmllZCgpKSB7XHJcbiAgICBsZXQgcHJvcE5hbWUgPSBwcm9wZXJ0eS5uYW1lO1xyXG4gICAgLy8gbG9jYWxBc3BlY3QgaXMgbm90IHRoZSBzYW1lIGFzIGVudGl0eUFzcGVjdCBmb3IgY29tcGxleCBwcm9wc1xyXG4gICAgbGV0IGxvY2FsQXNwZWN0ID0gRW50aXR5QXNwZWN0LmlzRW50aXR5KHBhcmVudCkgPyBwYXJlbnQuZW50aXR5QXNwZWN0IDogcGFyZW50LmNvbXBsZXhBc3BlY3Q7XHJcbiAgICBpZiAobG9jYWxBc3BlY3Qub3JpZ2luYWxWYWx1ZXNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gb3RoZXJ3aXNlIHRoaXMgZW50cnkgd2lsbCBiZSBza2lwcGVkIGR1cmluZyBzZXJpYWxpemF0aW9uXHJcbiAgICAgIGxvY2FsQXNwZWN0Lm9yaWdpbmFsVmFsdWVzW3Byb3BOYW1lXSA9IG9sZFZhbHVlICE9PSB1bmRlZmluZWQgPyBvbGRWYWx1ZSA6IHByb3BlcnR5LmRlZmF1bHRWYWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGlmIHdlIGFyZSBjaGFuZ2luZyB0aGUga2V5IHVwZGF0ZSBvdXIgaW50ZXJuYWwgZW50aXR5R3JvdXAgaW5kZXhlcy5cclxuICBpZiAocHJvcGVydHkuaXNQYXJ0T2ZLZXkgJiYgZW50aXR5TWFuYWdlciAmJiAhZW50aXR5TWFuYWdlci5pc0xvYWRpbmcpIHtcclxuICAgIC8vICdlbnRpdHlUeXBlJyBvbiB0aGUgbmV4dCBsaW5lIGJlIG51bGwgZm9yIGNvbXBsZXggcHJvcGVydGllcyBidXQgaXQgd2lsbCBvbmx5IGJlIHJlZidkIHdpdGhpbiB0aGlzXHJcbiAgICAvLyBmbiB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBwYXJ0IG9mIHRoZSBrZXlcclxuICAgIGxldCBlbnRpdHlUeXBlID0gKHBhcmVudCBhcyBFbnRpdHkpLmVudGl0eVR5cGU7XHJcbiAgICBsZXQga2V5UHJvcHMgPSBlbnRpdHlUeXBlLmtleVByb3BlcnRpZXM7XHJcbiAgICBsZXQgdmFsdWVzID0ga2V5UHJvcHMubWFwKGZ1bmN0aW9uIChwKSB7XHJcbiAgICAgIGlmIChwID09PSBwcm9wZXJ0eSkge1xyXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gcGFyZW50LmdldFByb3BlcnR5KHAubmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbGV0IG5ld0tleSA9IG5ldyBFbnRpdHlLZXkoZW50aXR5VHlwZSwgdmFsdWVzKTtcclxuICAgIGlmIChlbnRpdHlNYW5hZ2VyLmdldEVudGl0eUJ5S2V5KG5ld0tleSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gZW50aXR5IHdpdGggdGhpcyBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgY2FjaGU6IFwiICsgbmV3S2V5LnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgbGV0IG9sZEtleSA9IChwYXJlbnQgYXMgRW50aXR5KS5lbnRpdHlBc3BlY3QuZ2V0S2V5KCk7XHJcbiAgICBsZXQgZWcgPSBlbnRpdHlNYW5hZ2VyLl9maW5kRW50aXR5R3JvdXAoZW50aXR5VHlwZSk7XHJcbiAgICBlZy5fcmVwbGFjZUtleShvbGRLZXksIG5ld0tleSk7XHJcbiAgfVxyXG5cclxuICAvLyBwcm9jZXNzIHJlbGF0ZWQgdXBkYXRlcyAoIHRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCkgZmlyc3Qgc28gdGhhdCBjb2xsZWN0aW9uIGR1cHMgY2hlY2sgd29ya3MgcHJvcGVybHkuXHJcbiAgLy8gdXBkYXRlIGludmVyc2UgcmVsYXRpb25zaGlwXHJcblxyXG4gIGxldCByZWxhdGVkTmF2UHJvcCA9IHByb3BlcnR5LnJlbGF0ZWROYXZpZ2F0aW9uUHJvcGVydHk7XHJcbiAgaWYgKHJlbGF0ZWROYXZQcm9wICYmIGVudGl0eU1hbmFnZXIpIHtcclxuICAgIC8vIEV4YW1wbGU6IGJpZGlyZWN0aW9uYWwgZmtEYXRhUHJvcGVydHk6IDEtPm46IG9yZGVyIC0+IG9yZGVyRGV0YWlsc1xyXG4gICAgLy8gb3JkZXJEZXRhaWwub3JkZXJJZCA8LSBuZXdPcmRlcklkIHx8IG51bGxcclxuICAgIC8vICAgID09PiBvcmRlckRldGFpbC5vcmRlciA9IGxvb2t1cE9yZGVyKG5ld09yZGVySWQpXHJcbiAgICAvLyAgICA9PT4gKHNlZSBzZXQgbmF2UHJvcCBhYm92ZSlcclxuICAgIC8vICAgICAgIGFuZFxyXG4gICAgLy8gRXhhbXBsZTogYmlkaXJlY3Rpb25hbCBma0RhdGFQcm9wZXJ0eTogMS0+MTogb3JkZXIgLT4gaW50ZXJuYXRpb25hbE9yZGVyXHJcbiAgICAvLyBpbnRlcm5hdGlvbmFsT3JkZXIub3JkZXJJZCA8LSBuZXdPcmRlcklkIHx8IG51bGxcclxuICAgIC8vICAgID09PiBpbnRlcm5hdGlvbmFsT3JkZXIub3JkZXIgPSBsb29rdXBPcmRlcihuZXdPcmRlcklkKVxyXG4gICAgLy8gICAgPT0+IChzZWUgc2V0IG5hdlByb3AgYWJvdmUpXHJcblxyXG4gICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHtcclxuICAgICAgbGV0IHJlbGF0ZWRFbnRpdHk6IEVudGl0eTtcclxuICAgICAgbGV0IGtleTogRW50aXR5S2V5O1xyXG4gICAgICBpZiAocmVsYXRlZE5hdlByb3AuaW52Rm9yZWlnbktleU5hbWVzLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIHByb3BlcnR5IGlzIHJlbGF0ZWQgYnkgZmllbGQgd2hpY2ggaXMgbm90IHRoZSBQS1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KHJlbGF0ZWROYXZQcm9wLmVudGl0eVR5cGUuZGVmYXVsdFJlc291cmNlTmFtZSkud2hlcmUocmVsYXRlZE5hdlByb3AuaW52Rm9yZWlnbktleU5hbWVzWzBdLCAnZXEnLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgY29uc3QgcXJlc3VsdCA9IGVudGl0eU1hbmFnZXIuZXhlY3V0ZVF1ZXJ5TG9jYWxseShxdWVyeSk7XHJcbiAgICAgICAgaWYgKHFyZXN1bHQubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICByZWxhdGVkRW50aXR5ID0gcXJlc3VsdFswXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gcHJvcGVydHkgaXMgcmVsYXRlZCBieSB0aGUgUEtcclxuICAgICAgICBrZXkgPSBuZXcgRW50aXR5S2V5KHJlbGF0ZWROYXZQcm9wLmVudGl0eVR5cGUsIFtuZXdWYWx1ZV0pO1xyXG4gICAgICAgIHJlbGF0ZWRFbnRpdHkgPSBlbnRpdHlNYW5hZ2VyLmdldEVudGl0eUJ5S2V5KGtleSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZWxhdGVkRW50aXR5KSB7XHJcbiAgICAgICAgcGFyZW50LnNldFByb3BlcnR5KHJlbGF0ZWROYXZQcm9wLm5hbWUsIHJlbGF0ZWRFbnRpdHkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGl0IG1heSBub3QgaGF2ZSBiZWVuIGZldGNoZWQgeWV0IGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBhZGQgaXQgYXMgYW4gdW5hdHRhY2hlZENoaWxkLlxyXG4gICAgICAgIGlmIChrZXkpIHtcclxuICAgICAgICAgIC8vIFRPRE8gY3VycmVudGx5IF9saW5rUmVsYXRlZGVudGl0aWVzIG9ubHkgd29ya3Mgd2l0aCBQSyByZWxhdGlvbnMsIHNvIHdlIG9ubHkgYWRkIHRob3NlLlxyXG4gICAgICAgICAgZW50aXR5TWFuYWdlci5fdW5hdHRhY2hlZENoaWxkcmVuTWFwLmFkZENoaWxkKGtleSwgcmVsYXRlZE5hdlByb3AsIHBhcmVudCBhcyBFbnRpdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXJlbnQuc2V0UHJvcGVydHkocmVsYXRlZE5hdlByb3AubmFtZSwgbnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmVudC5zZXRQcm9wZXJ0eShyZWxhdGVkTmF2UHJvcC5uYW1lLCBudWxsKTtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHByb3BlcnR5LmludmVyc2VOYXZpZ2F0aW9uUHJvcGVydHkgJiYgZW50aXR5TWFuYWdlciAmJiAhZW50aXR5TWFuYWdlci5faW5LZXlGaXh1cCkge1xyXG4gICAgLy8gRXhhbXBsZTogdW5pZGlyZWN0aW9uYWwgZmtEYXRhUHJvcGVydHk6IDEtPm46IHJlZ2lvbiAtPiB0ZXJyaXRvcmllc1xyXG4gICAgLy8gdGVycml0b3J5LnJlZ2lvbklkIDwtIG5ld1JlZ2lvbklkXHJcbiAgICAvLyAgICA9PT4gbG9va3VwUmVnaW9uKG5ld1JlZ2lvbklkKS50ZXJyaXRvcmllcy5wdXNoKHRlcnJpdG9yeSlcclxuICAgIC8vICAgICAgICAgICAgICAgIGFuZFxyXG4gICAgLy8gRXhhbXBsZTogdW5pZGlyZWN0aW9uYWwgZmtEYXRhUHJvcGVydHk6IDEtPjE6IG9yZGVyIC0+IGludGVybmF0aW9uYWxPcmRlclxyXG4gICAgLy8gaW50ZXJuYXRpb25hbE9yZGVyLm9yZGVySWQgPC0gbmV3T3JkZXJJZFxyXG4gICAgLy8gICAgPT0+IGxvb2t1cE9yZGVyKG5ld09yZGVySWQpLmludGVybmF0aW9uYWxPcmRlciA9IGludGVybmF0aW9uYWxPcmRlclxyXG4gICAgLy8gICAgICAgICAgICAgICAgYW5kXHJcbiAgICAvLyBFeGFtcGxlOiB1bmlkaXJlY3Rpb25hbCBma0RhdGFQcm9wZXJ0eTogMS0+bjogcmVnaW9uIC0+IHRlcnJpdG9yaWVzXHJcbiAgICAvLyB0ZXJyaXRvcnkucmVnaW9uSWQgPC0gbnVsbFxyXG4gICAgLy8gICAgPT0+IGxvb2t1cFJlZ2lvbih0ZXJyaXRvcnkub2xkUmVnaW9uSWQpLnRlcnJpdG9yaWVzLnJlbW92ZShvbGRUZXJyaXRvcnkpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgYW5kXHJcbiAgICAvLyBFeGFtcGxlOiB1bmlkaXJlY3Rpb25hbCBma0RhdGFQcm9wZXJ0eTogMS0+MTogb3JkZXIgLT4gaW50ZXJuYXRpb25hbE9yZGVyXHJcbiAgICAvLyBpbnRlcm5hdGlvbmFsT3JkZXIub3JkZXJJZCA8LSBudWxsXHJcbiAgICAvLyAgICA9PT4gbG9va3VwT3JkZXIoaW50ZXJuYXRpb25hbE9yZGVyLm9sZE9yZGVySWQpLmludGVybmF0aW9uYWxPcmRlciA9IG51bGw7XHJcblxyXG4gICAgbGV0IGludk5hdlByb3AgPSBwcm9wZXJ0eS5pbnZlcnNlTmF2aWdhdGlvblByb3BlcnR5O1xyXG5cclxuICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIGxldCBrZXkgPSBuZXcgRW50aXR5S2V5KGludk5hdlByb3AucGFyZW50VHlwZSwgW29sZFZhbHVlXSk7XHJcbiAgICAgIGxldCByZWxhdGVkRW50aXR5ID0gZW50aXR5TWFuYWdlci5nZXRFbnRpdHlCeUtleShrZXkpO1xyXG4gICAgICBpZiAocmVsYXRlZEVudGl0eSkge1xyXG4gICAgICAgIGlmIChpbnZOYXZQcm9wLmlzU2NhbGFyKSB7XHJcbiAgICAgICAgICByZWxhdGVkRW50aXR5LnNldFByb3BlcnR5KGludk5hdlByb3AubmFtZSwgbnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHJlbW92ZSAndGhpcycgZnJvbSBvbGQgcmVsYXRlZCBuYXYgcHJvcFxyXG4gICAgICAgICAgbGV0IHJlbGF0ZWRBcnJheSA9IHJlbGF0ZWRFbnRpdHkuZ2V0UHJvcGVydHkoaW52TmF2UHJvcC5uYW1lKTtcclxuICAgICAgICAgIC8vIGFyci5zcGxpY2UoYXJyLmluZGV4T2YodmFsdWVfdG9fcmVtb3ZlKSwgMSk7XHJcbiAgICAgICAgICByZWxhdGVkQXJyYXkuc3BsaWNlKHJlbGF0ZWRBcnJheS5pbmRleE9mKHBhcmVudCksIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIGxldCBrZXkgPSBuZXcgRW50aXR5S2V5KGludk5hdlByb3AucGFyZW50VHlwZSwgW25ld1ZhbHVlXSk7XHJcbiAgICAgIGxldCByZWxhdGVkRW50aXR5ID0gZW50aXR5TWFuYWdlci5nZXRFbnRpdHlCeUtleShrZXkpO1xyXG5cclxuICAgICAgaWYgKHJlbGF0ZWRFbnRpdHkpIHtcclxuICAgICAgICBpZiAoaW52TmF2UHJvcC5pc1NjYWxhcikge1xyXG4gICAgICAgICAgcmVsYXRlZEVudGl0eS5zZXRQcm9wZXJ0eShpbnZOYXZQcm9wLm5hbWUsIHBhcmVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlbGF0ZWRFbnRpdHkuZ2V0UHJvcGVydHkoaW52TmF2UHJvcC5uYW1lKS5wdXNoKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGl0IG1heSBub3QgaGF2ZSBiZWVuIGZldGNoZWQgeWV0IGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBhZGQgaXQgYXMgYW4gdW5hdHRhY2hlZENoaWxkLlxyXG4gICAgICAgIGVudGl0eU1hbmFnZXIuX3VuYXR0YWNoZWRDaGlsZHJlbk1hcC5hZGRDaGlsZChrZXksIGludk5hdlByb3AsIHBhcmVudCBhcyBFbnRpdHkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcmF3QWNjZXNzb3JGbihuZXdWYWx1ZSk7XHJcblxyXG4gIHVwZGF0ZVN0YXRlQW5kVmFsaWRhdGUoY29udGV4dCk7XHJcblxyXG4gIC8vIGlmIChwcm9wZXJ0eS5pc1BhcnRPZktleSAmJiAoIXRoaXMuY29tcGxleEFzcGVjdCkpIHtcclxuICBpZiAocHJvcGVydHkuaXNQYXJ0T2ZLZXkpIHtcclxuICAgIC8vIHByb3BvZ2F0ZSBwayBjaGFuZ2UgdG8gYWxsIHJlbGF0ZWQgZW50aXRpZXM7XHJcbiAgICBsZXQgZW50aXR5VHlwZSA9IChwYXJlbnQgYXMgRW50aXR5KS5lbnRpdHlUeXBlO1xyXG4gICAgbGV0IHByb3BlcnR5SXggPSBlbnRpdHlUeXBlLmtleVByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSk7XHJcbiAgICAvLyB0aGlzIHBhcnQgaGFuZGxlcyBvcmRlci5vcmRlcklkID0+IG9yZGVyRGV0YWlsLm9yZGVySWRcclxuICAgIC8vIGJ1dCB3b24ndCBoYW5kbGUgcHJvZHVjdC5wcm9kdWN0SWQgPT4gb3JkZXJEZXRhaWwucHJvZHVjdElkIGJlY2F1c2UgcHJvZHVjdFxyXG4gICAgLy8gZG9lc24ndCBoYXZlIGFuIG9yZGVyRGV0YWlscyBwcm9wZXJ0eS5cclxuICAgIGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAobnApIHtcclxuICAgICAgbGV0IGludmVyc2VOcCA9IG5wLmludmVyc2U7XHJcbiAgICAgIGxldCBma05hbWVzID0gaW52ZXJzZU5wID8gaW52ZXJzZU5wLmZvcmVpZ25LZXlOYW1lcyA6IG5wLmludkZvcmVpZ25LZXlOYW1lcztcclxuXHJcbiAgICAgIGlmIChma05hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICBsZXQgbnBWYWx1ZSA9IHBhcmVudC5nZXRQcm9wZXJ0eShucC5uYW1lKTtcclxuICAgICAgaWYgKCFucFZhbHVlKSByZXR1cm47XHJcbiAgICAgIGxldCBma05hbWUgPSBma05hbWVzW3Byb3BlcnR5SXhdO1xyXG4gICAgICBpZiAobnAuaXNTY2FsYXIpIHtcclxuICAgICAgICBucFZhbHVlLnNldFByb3BlcnR5KGZrTmFtZSwgbmV3VmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5wVmFsdWUuc2xpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAoaXY6IGFueSkge1xyXG4gICAgICAgICAgaXYuc2V0UHJvcGVydHkoZmtOYW1lLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gdGhpcyBoYW5kbGVzIHVuaWRpcmVjdGlvbmFsIHByb2JsZW1zIG5vdCBjb3ZlcmVkIGFib3ZlLlxyXG4gICAgaWYgKGVudGl0eU1hbmFnZXIpIHtcclxuICAgICAgbGV0IGludmVyc2VGb3JlaWduS2V5UHJvcGVydGllcyA9IGVudGl0eVR5cGUuaW52ZXJzZUZvcmVpZ25LZXlQcm9wZXJ0aWVzO1xyXG4gICAgICBsZXQgYmFzZUVudGl0eVR5cGUgPSBlbnRpdHlUeXBlLmJhc2VFbnRpdHlUeXBlO1xyXG4gICAgICB3aGlsZSAoYmFzZUVudGl0eVR5cGUpIHtcclxuICAgICAgICBpbnZlcnNlRm9yZWlnbktleVByb3BlcnRpZXMgPSBpbnZlcnNlRm9yZWlnbktleVByb3BlcnRpZXMuY29uY2F0KGJhc2VFbnRpdHlUeXBlLmludmVyc2VGb3JlaWduS2V5UHJvcGVydGllcyk7XHJcbiAgICAgICAgYmFzZUVudGl0eVR5cGUgPSBiYXNlRW50aXR5VHlwZS5iYXNlRW50aXR5VHlwZTtcclxuICAgICAgfVxyXG4gICAgICBpbnZlcnNlRm9yZWlnbktleVByb3BlcnRpZXMuZm9yRWFjaCgoaW52RmtQcm9wKSA9PiB7XHJcbiAgICAgICAgaWYgKGludkZrUHJvcC5yZWxhdGVkTmF2aWdhdGlvblByb3BlcnR5IS5pbnZlcnNlID09IG51bGwpIHtcclxuICAgICAgICAgIC8vIHRoaXMgbmV4dCBzdGVwIG1heSBiZSBzbG93IC0gaXQgaXRlcmF0ZXMgb3ZlciBhbGwgb2YgdGhlIGVudGl0aWVzIGluIGEgZ3JvdXA7XHJcbiAgICAgICAgICAvLyBob3BlZnVsbHkgaXQgZG9lc24ndCBoYXBwZW4gb2Z0ZW4uXHJcbiAgICAgICAgICBlbnRpdHlNYW5hZ2VyIS5fdXBkYXRlRmtWYWwoaW52RmtQcm9wLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaW5zdXJlIHRoYXQgY2FjaGVkIGtleSBpcyB1cGRhdGVkLlxyXG4gICAgZW50aXR5QXNwZWN0LmdldEtleSh0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldERwVmFsdWVDb21wbGV4KGNvbnRleHQ6IElDb250ZXh0LCByYXdBY2Nlc3NvckZuOiBGdW5jdGlvbikge1xyXG4gIGxldCBwcm9wZXJ0eSA9IGNvbnRleHQucHJvcGVydHkgYXMgRGF0YVByb3BlcnR5O1xyXG4gIGxldCBvbGRWYWx1ZSA9IGNvbnRleHQub2xkVmFsdWU7XHJcbiAgbGV0IG5ld1ZhbHVlID0gY29udGV4dC5uZXdWYWx1ZTtcclxuXHJcbiAgLy8gVG8gZ2V0IGhlcmUgaXQgbXVzdCBiZSBhIENvbXBsZXhQcm9wZXJ0eVxyXG4gIC8vICdkYXRhVHlwZScgd2lsbCBiZSBhIGNvbXBsZXhUeXBlXHJcbiAgbGV0IGRhdGFUeXBlID0gcHJvcGVydHkuZGF0YVR5cGUgYXMgQ29tcGxleFR5cGU7XHJcbiAgaWYgKHByb3BlcnR5LmlzU2NhbGFyKSB7XHJcbiAgICBpZiAoIW5ld1ZhbHVlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihjb3JlLmZvcm1hdFN0cmluZyhcIllvdSBjYW5ub3Qgc2V0IHRoZSAnJTEnIHByb3BlcnR5IHRvIG51bGwgYmVjYXVzZSBpdCdzIGRhdGF0eXBlIGlzIHRoZSBDb21wbGV4VHlwZTogJyUyJ1wiLCBwcm9wZXJ0eS5uYW1lLCBwcm9wZXJ0eS5kYXRhVHlwZS5uYW1lKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFvbGRWYWx1ZSkge1xyXG4gICAgICBsZXQgY3RvciA9IGRhdGFUeXBlLmdldEN0b3IoKTtcclxuICAgICAgb2xkVmFsdWUgPSBuZXcgY3RvcigpO1xyXG4gICAgICByYXdBY2Nlc3NvckZuKG9sZFZhbHVlKTtcclxuICAgIH1cclxuICAgIGRhdGFUeXBlLmRhdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGRwKSB7XHJcbiAgICAgIGxldCBwbiA9IGRwLm5hbWU7XHJcbiAgICAgIGxldCBudiA9IG5ld1ZhbHVlLmdldFByb3BlcnR5KHBuKTtcclxuICAgICAgb2xkVmFsdWUuc2V0UHJvcGVydHkocG4sIG52KTtcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoY29yZS5mb3JtYXRTdHJpbmcoXCJZb3UgY2Fubm90IHNldCB0aGUgbm9uLXNjYWxhciBjb21wbGV4IHByb3BlcnR5OiAnJTEnIG9uIHRoZSB0eXBlOiAnJTInLlwiICtcclxuICAgICAgICAgICAgXCJJbnN0ZWFkIGdldCB0aGUgcHJvcGVydHkgYW5kIHVzZSBhcnJheSBmdW5jdGlvbnMgbGlrZSAncHVzaCcgb3IgJ3NwbGljZScgdG8gY2hhbmdlIGl0cyBjb250ZW50cy5cIixcclxuICAgICAgICBwcm9wZXJ0eS5uYW1lLCBwcm9wZXJ0eS5wYXJlbnRUeXBlLm5hbWUpKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBzZXROcFZhbHVlKGNvbnRleHQ6IElDb250ZXh0LCByYXdBY2Nlc3NvckZuOiBGdW5jdGlvbikge1xyXG5cclxuICBsZXQgcGFyZW50ID0gY29udGV4dC5wYXJlbnQgYXMgRW50aXR5O1xyXG4gIGxldCBwcm9wZXJ0eSA9IGNvbnRleHQucHJvcGVydHkgYXMgTmF2aWdhdGlvblByb3BlcnR5O1xyXG4gIGxldCBlbnRpdHlBc3BlY3QgPSBjb250ZXh0LmVudGl0eUFzcGVjdDtcclxuICBsZXQgb2xkVmFsdWUgPSBjb250ZXh0Lm9sZFZhbHVlO1xyXG4gIGxldCBuZXdWYWx1ZSA9IGNvbnRleHQubmV3VmFsdWU7XHJcblxyXG4gIGlmICghcHJvcGVydHkuaXNTY2FsYXIpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbnNjYWxhciBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIHJlYWRvbmx5IC0gZW50aXRpZXMgY2FuIGJlIGFkZGVkIG9yIHJlbW92ZWQgYnV0IHRoZSBjb2xsZWN0aW9uIG1heSBub3QgYmUgY2hhbmdlZC5cIik7XHJcbiAgfVxyXG5cclxuICBsZXQgZW50aXR5TWFuYWdlciA9IGVudGl0eUFzcGVjdC5lbnRpdHlNYW5hZ2VyO1xyXG4gIGxldCBpbnZlcnNlUHJvcCA9IHByb3BlcnR5LmludmVyc2U7XHJcblxyXG4gIC8vIG1hbmFnZSBhdHRhY2htZW50IC1cclxuICBpZiAobmV3VmFsdWUgIT0gbnVsbCkge1xyXG4gICAgaWYgKCFuZXdWYWx1ZS5lbnRpdHlBc3BlY3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IG5ld0FzcGVjdCA9IG5ld1ZhbHVlLmVudGl0eUFzcGVjdDtcclxuICAgIGlmIChlbnRpdHlNYW5hZ2VyKSB7XHJcbiAgICAgIGlmIChuZXdBc3BlY3QuZW50aXR5U3RhdGUuaXNEZXRhY2hlZCgpKSB7XHJcbiAgICAgICAgaWYgKCFlbnRpdHlNYW5hZ2VyLmlzTG9hZGluZykge1xyXG4gICAgICAgICAgZW50aXR5TWFuYWdlci5hdHRhY2hFbnRpdHkobmV3VmFsdWUsIEVudGl0eVN0YXRlLkFkZGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKG5ld0FzcGVjdC5lbnRpdHlNYW5hZ2VyICE9PSBlbnRpdHlNYW5hZ2VyKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbiBFbnRpdHkgY2Fubm90IGJlIGF0dGFjaGVkIHRvIGFuIGVudGl0eSBpbiBhbm90aGVyIEVudGl0eU1hbmFnZXIuIE9uZSBvZiB0aGUgdHdvIGVudGl0aWVzIG11c3QgYmUgZGV0YWNoZWQgZmlyc3QuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKG5ld0FzcGVjdCAmJiBuZXdBc3BlY3QuZW50aXR5TWFuYWdlcikge1xyXG4gICAgICAgIGVudGl0eU1hbmFnZXIgPSBuZXdBc3BlY3QuZW50aXR5TWFuYWdlcjtcclxuICAgICAgICBpZiAoIWVudGl0eU1hbmFnZXIhLmlzTG9hZGluZykge1xyXG4gICAgICAgICAgZW50aXR5TWFuYWdlciEuYXR0YWNoRW50aXR5KGVudGl0eUFzcGVjdC5lbnRpdHkhLCBFbnRpdHlTdGF0ZS5BZGRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwcm9jZXNzIHJlbGF0ZWQgdXBkYXRlcyAoIHRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCkgZmlyc3Qgc28gdGhhdCBjb2xsZWN0aW9uIGR1cHMgY2hlY2sgd29ya3MgcHJvcGVybHkuXHJcbiAgLy8gdXBkYXRlIGludmVyc2UgcmVsYXRpb25zaGlwXHJcbiAgaWYgKGludmVyc2VQcm9wKSB7XHJcbiAgICAvLy9cclxuICAgIGlmIChpbnZlcnNlUHJvcC5pc1NjYWxhcikge1xyXG4gICAgICAvLyBFeGFtcGxlOiBiaWRpcmVjdGlvbmFsIG5hdlByb3BlcnR5OiAxLT4xOiBvcmRlciAtPiBpbnRlcm5hdGlvbmFsT3JkZXJcclxuICAgICAgLy8gb3JkZXIuaW50ZXJuYXRpb25hbE9yZGVyIDwtIGludGVybmF0aW9uYWxPcmRlciB8fCBudWxsXHJcbiAgICAgIC8vICAgID09PiAob2xkSW50ZXJuYXRpb25hbE9yZGVyLm9yZGVyID0gbnVsbClcclxuICAgICAgLy8gICAgPT0+IGludGVybmF0aW9uYWxPcmRlci5vcmRlciA9IG9yZGVyXHJcbiAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gVE9ETzogbnVsbCAtPiBOdWxsRW50aXR5IGxhdGVyXHJcbiAgICAgICAgb2xkVmFsdWUuc2V0UHJvcGVydHkoaW52ZXJzZVByb3AubmFtZSwgbnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICBuZXdWYWx1ZS5zZXRQcm9wZXJ0eShpbnZlcnNlUHJvcC5uYW1lLCBwYXJlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBFeGFtcGxlOiBiaWRpcmVjdGlvbmFsIG5hdlByb3BlcnR5OiAxLT5uOiBvcmRlciAtPiBvcmRlckRldGFpbHNcclxuICAgICAgLy8gb3JkZXJEZXRhaWwub3JkZXIgPC0gbmV3T3JkZXIgfHwgbnVsbFxyXG4gICAgICAvLyAgICA9PT4gKG9sZE9yZGVyKS5vcmRlckRldGFpbHMucmVtb3ZlKG9yZGVyRGV0YWlsKVxyXG4gICAgICAvLyAgICA9PT4gb3JkZXIub3JkZXJEZXRhaWxzLnB1c2gobmV3T3JkZXIpXHJcbiAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IG9sZFNpYmxpbmdzID0gb2xkVmFsdWUuZ2V0UHJvcGVydHkoaW52ZXJzZVByb3AubmFtZSk7XHJcbiAgICAgICAgbGV0IGl4ID0gb2xkU2libGluZ3MuaW5kZXhPZihwYXJlbnQpO1xyXG4gICAgICAgIGlmIChpeCAhPT0gLTEpIHtcclxuICAgICAgICAgIG9sZFNpYmxpbmdzLnNwbGljZShpeCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHNpYmxpbmdzID0gbmV3VmFsdWUuZ2V0UHJvcGVydHkoaW52ZXJzZVByb3AubmFtZSk7XHJcbiAgICAgICAgLy8gcmVjdXJzaW9uIGNoZWNrIGlmIGFscmVhZHkgaW4gdGhlIGNvbGxlY3Rpb24gaXMgcGVyZm9ybWVkIGJ5IHRoZSByZWxhdGlvbkFycmF5XHJcbiAgICAgICAgc2libGluZ3MucHVzaChwYXJlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChwcm9wZXJ0eS5pbnZGb3JlaWduS2V5TmFtZXMgJiYgZW50aXR5TWFuYWdlciAmJiAhZW50aXR5TWFuYWdlci5faW5LZXlGaXh1cCkge1xyXG4gICAgbGV0IGludkZvcmVpZ25LZXlOYW1lcyA9IHByb3BlcnR5LmludkZvcmVpZ25LZXlOYW1lcztcclxuICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIEV4YW1wbGU6IHVuaWRpcmVjdGlvbmFsIG5hdlByb3BlcnR5OiAxLT4xOiBvcmRlciAtPiBpbnRlcm5hdGlvbmFsT3JkZXJcclxuICAgICAgLy8gb3JkZXIuSW50ZXJuYXRpb25hbE9yZGVyIDwtIGludGVybmF0aW9uYWxPcmRlclxyXG4gICAgICAvLyAgICA9PT4gaW50ZXJuYXRpb25hbE9yZGVyLm9yZGVySWQgPSBvcmRlcklkXHJcbiAgICAgIC8vICAgICAgYW5kXHJcbiAgICAgIC8vIEV4YW1wbGU6IHVuaWRpcmVjdGlvbmFsIG5hdlByb3BlcnR5OiAxLT5uOiBvcmRlciAtPiBvcmRlckRldGFpbHNcclxuICAgICAgLy8gb3JkZXJEZXRhaWwub3JkZXIgPC14eHggbmV3T3JkZXJcclxuICAgICAgLy8gICAgPT0+IENBTidUIEhBUFBFTiBiZWNhdXNlIGlmIHVuaWRpcmVjdGlvbmFsIGJlY2F1c2Ugb3JkZXJEZXRhaWwgd2lsbCBub3QgaGF2ZSBhbiBvcmRlciBwcm9wXHJcbiAgICAgIGxldCBwa1ZhbHVlcyA9IHBhcmVudC5lbnRpdHlBc3BlY3QuZ2V0S2V5KCkudmFsdWVzO1xyXG4gICAgICBpbnZGb3JlaWduS2V5TmFtZXMuZm9yRWFjaCggKGZrTmFtZSwgaSkgPT4ge1xyXG4gICAgICAgIG5ld1ZhbHVlIS5zZXRQcm9wZXJ0eShma05hbWUsIHBrVmFsdWVzW2ldKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBFeGFtcGxlOiB1bmlkaXJlY3Rpb25hbCBuYXZQcm9wZXJ0eTogMS0+MTogb3JkZXIgLT4gaW50ZXJuYXRpb25hbE9yZGVyXHJcbiAgICAgIC8vIG9yZGVyLmludGVybmF0aW9uYWxPcmRlciA8LSBudWxsXHJcbiAgICAgIC8vICAgID09PiAob2xkIGludGVybmF0aW9uYWxPcmRlcikub3JkZXJJZCA9IG51bGxcclxuICAgICAgLy8gICAgICAgIGFuZFxyXG4gICAgICAvLyBFeGFtcGxlOiB1bmlkaXJlY3Rpb25hbCBuYXZQcm9wZXJ0eTogMS0+bjogb3JkZXIgLT4gb3JkZXJEZXRhaWxzXHJcbiAgICAgIC8vIG9yZGVyRGV0YWlsLm9yZGVyIDwteHh4IG5ld09yZGVyXHJcbiAgICAgIC8vICAgID09PiBDQU4nVCBIQVBQRU4gYmVjYXVzZSBpZiB1bmlkaXJlY3Rpb25hbCBiZWNhdXNlIG9yZGVyRGV0YWlsIHdpbGwgbm90IGhhdmUgYW4gb3JkZXIgcHJvcFxyXG4gICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgIGludkZvcmVpZ25LZXlOYW1lcy5mb3JFYWNoKCAoZmtOYW1lKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZmtQcm9wID0gb2xkVmFsdWUuZW50aXR5VHlwZS5nZXRQcm9wZXJ0eShma05hbWUpO1xyXG4gICAgICAgICAgaWYgKCFma1Byb3AuaXNQYXJ0T2ZLZXkpIHtcclxuICAgICAgICAgICAgLy8gZG9uJ3QgdXBkYXRlIHdpdGggbnVsbCBpZiBmayBpcyBwYXJ0IG9mIHRoZSBrZXlcclxuICAgICAgICAgICAgb2xkVmFsdWUuc2V0UHJvcGVydHkoZmtOYW1lLCBudWxsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmF3QWNjZXNzb3JGbihuZXdWYWx1ZSk7XHJcblxyXG4gIHVwZGF0ZVN0YXRlQW5kVmFsaWRhdGUoY29udGV4dCk7XHJcblxyXG4gIC8vIHVwZGF0ZSBmayBkYXRhIHByb3BlcnR5IC0gdGhpcyBjYW4gb25seSBvY2N1ciBpZiB0aGlzIG5hdlByb3BlcnR5IGhhc1xyXG4gIC8vIGEgY29ycmVzcG9uZGluZyBmayBvbiB0aGlzIGVudGl0eS5cclxuICBpZiAocHJvcGVydHkucmVsYXRlZERhdGFQcm9wZXJ0aWVzKSB7XHJcbiAgICBsZXQgZW50aXR5U3RhdGUgPSBlbnRpdHlBc3BlY3QuZW50aXR5U3RhdGU7XHJcbiAgICAvLyBpZiBlaXRoZXIgc2lkZSBvZiBuYXYgcHJvcCBpcyBkZXRhY2hlZCBkb24ndCBjbGVhciBma3MuIE5vdGU6IG9sZFZhbHVlIGluIG5leHQgbGluZSBjYW5ub3QgYmUgbnVsbCBzbyBubyBjaGVjayBpcyBuZWVkZWQuXHJcbiAgICBpZiAobmV3VmFsdWUgPT0gbnVsbCAmJiAoZW50aXR5U3RhdGUuaXNEZXRhY2hlZCgpIHx8IG9sZFZhbHVlLmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZS5pc0RldGFjaGVkKCkpKSByZXR1cm47XHJcbiAgICBpZiAoZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAvLyB3ZSBtYXkgaGF2ZSBpbnZlcnNlIHByb3BzIGluZGljYXRpbmcgdGhlIHJlbGF0ZWQgcHJvcCBvbiB0aGUgb3RoZXIgZW50aXR5LCBpZiBpdCBpcyBub3QgdGhlIG90aGVyIGVudGl0eSdzIFBLXHJcbiAgICBsZXQgaW52ZXJzZUtleVByb3BzID0gcHJvcGVydHkuaW52Rm9yZWlnbktleU5hbWVzO1xyXG4gICAgaWYgKCEoaW52ZXJzZUtleVByb3BzICYmIGludmVyc2VLZXlQcm9wcy5sZW5ndGgpKSB7XHJcbiAgICAgIC8vIG90aGVyd2lzZSwgdGhpcyBwcm9wIGlzIHJlbGF0ZWQgdG8gdGhlIG90aGVyIGVudGl0eSdzIFBLXHJcbiAgICAgIGludmVyc2VLZXlQcm9wcyA9IHByb3BlcnR5LmVudGl0eVR5cGUua2V5UHJvcGVydGllcy5tYXAoayA9PiBrLm5hbWUpO1xyXG4gICAgfVxyXG4gICAgaW52ZXJzZUtleVByb3BzLmZvckVhY2goZnVuY3Rpb24gKGtleVByb3AsIGkpIHtcclxuICAgICAgbGV0IHJlbGF0ZWREYXRhUHJvcCA9IHByb3BlcnR5LnJlbGF0ZWREYXRhUHJvcGVydGllc1tpXTtcclxuICAgICAgLy8gRG8gbm90IHRyYXNoIHJlbGF0ZWQgcHJvcGVydHkgaWYgaXQgaXMgcGFydCBvZiB0aGF0IGVudGl0eSdzIGtleVxyXG4gICAgICBpZiAobmV3VmFsdWUgfHwgIXJlbGF0ZWREYXRhUHJvcC5pc1BhcnRPZktleSkge1xyXG4gICAgICAgIGxldCByZWxhdGVkVmFsdWUgPSBuZXdWYWx1ZSA/IG5ld1ZhbHVlLmdldFByb3BlcnR5KGtleVByb3ApIDogcmVsYXRlZERhdGFQcm9wLmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICBwYXJlbnQuc2V0UHJvcGVydHkocmVsYXRlZERhdGFQcm9wLm5hbWUsIHJlbGF0ZWRWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcG9zdENoYW5nZUV2ZW50cyhjb250ZXh0OiBJQ29udGV4dCkge1xyXG4gIGxldCBlbnRpdHlBc3BlY3QgPSBjb250ZXh0LmVudGl0eUFzcGVjdDtcclxuXHJcbiAgbGV0IGVudGl0eU1hbmFnZXIgPSBlbnRpdHlBc3BlY3QuZW50aXR5TWFuYWdlcjtcclxuICBsZXQgZW50aXR5ID0gZW50aXR5QXNwZWN0LmVudGl0eTtcclxuXHJcbiAgbGV0IHByb3BDaGFuZ2VkQXJncyA9IHsgZW50aXR5OiBlbnRpdHkhLCBwYXJlbnQ6IGNvbnRleHQucGFyZW50LCBwcm9wZXJ0eTogY29udGV4dC5wcm9wZXJ0eSwgcHJvcGVydHlOYW1lOiBjb250ZXh0LnByb3BlcnR5TmFtZSwgb2xkVmFsdWU6IGNvbnRleHQub2xkVmFsdWUsIG5ld1ZhbHVlOiBjb250ZXh0Lm5ld1ZhbHVlIH07XHJcbiAgaWYgKGVudGl0eU1hbmFnZXIpIHtcclxuICAgIC8vIHByb3BlcnR5Q2hhbmdlZCB3aWxsIGJlIGZpcmVkIGR1cmluZyBsb2FkaW5nIGJ1dCB3ZSBvbmx5IHdhbnQgdG8gZmlyZSBpdCBvbmNlIHBlciBlbnRpdHksIG5vdCBvbmNlIHBlciBwcm9wZXJ0eS5cclxuICAgIC8vIHNvIHByb3BlcnR5Q2hhbmdlZCBpcyBmaXJlZCBpbiB0aGUgZW50aXR5TWFuYWdlciBtZXJnZUVudGl0eSBtZXRob2QgaWYgbm90IGZpcmVkIGhlcmUuXHJcbiAgICBpZiAoKCFlbnRpdHlNYW5hZ2VyLmlzTG9hZGluZykgJiYgKCFlbnRpdHlNYW5hZ2VyLmlzUmVqZWN0aW5nQ2hhbmdlcykpIHtcclxuICAgICAgZW50aXR5QXNwZWN0LnByb3BlcnR5Q2hhbmdlZC5wdWJsaXNoKHByb3BDaGFuZ2VkQXJncyk7XHJcbiAgICAgIC8vIGRvbid0IGZpcmUgZW50aXR5Q2hhbmdlZCBldmVudCBpZiBwcm9wZXJ0eUNoYW5nZWQgaXMgc3VwcHJlc3NlZC5cclxuICAgICAgZW50aXR5TWFuYWdlci5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5Qcm9wZXJ0eUNoYW5nZSwgZW50aXR5OiBlbnRpdHksIGFyZ3M6IHByb3BDaGFuZ2VkQXJncyB9KTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgZW50aXR5QXNwZWN0LnByb3BlcnR5Q2hhbmdlZC5wdWJsaXNoKHByb3BDaGFuZ2VkQXJncyk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZUFuZFZhbGlkYXRlKGNvbnRleHQ6IElDb250ZXh0KSB7XHJcbiAgbGV0IGVudGl0eUFzcGVjdCA9IGNvbnRleHQuZW50aXR5QXNwZWN0O1xyXG4gIGxldCBlbnRpdHlNYW5hZ2VyID0gZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXI7XHJcbiAgaWYgKGVudGl0eU1hbmFnZXIgPT0gbnVsbCB8fCBlbnRpdHlNYW5hZ2VyLmlzTG9hZGluZykgcmV0dXJuO1xyXG4gIGxldCBwcm9wZXJ0eSA9IGNvbnRleHQucHJvcGVydHk7XHJcblxyXG4gIGlmIChlbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNVbmNoYW5nZWQoKSAmJiAhcHJvcGVydHkuaXNVbm1hcHBlZCkge1xyXG4gICAgZW50aXR5QXNwZWN0LnNldE1vZGlmaWVkKCk7XHJcbiAgfVxyXG5cclxuICBpZiAoZW50aXR5TWFuYWdlci52YWxpZGF0aW9uT3B0aW9ucy52YWxpZGF0ZU9uUHJvcGVydHlDaGFuZ2UpIHtcclxuICAgIC8vIGVudGl0eUFzcGVjdC5lbnRpdHkgaXMgTk9UIHRoZSBzYW1lIGFzIHBhcmVudCBpbiB0aGUgY29kZSBiZWxvdy4gSXQncyB1c2UgaXMgZGVsaWJlcmF0ZS5cclxuICAgIGVudGl0eUFzcGVjdC5fdmFsaWRhdGVQcm9wZXJ0eShjb250ZXh0Lm5ld1ZhbHVlLFxyXG4gICAgICAgIHsgZW50aXR5OiBlbnRpdHlBc3BlY3QuZW50aXR5LCBwcm9wZXJ0eTogcHJvcGVydHksIHByb3BlcnR5TmFtZTogY29udGV4dC5wcm9wZXJ0eU5hbWUsIG9sZFZhbHVlOiBjb250ZXh0Lm9sZFZhbHVlIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { BreezeEnum } from './enum';
|
|
2
|
-
/** EntityAction is an 'Enum' containing all of the valid actions that can occur to an 'Entity'.
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
export class EntityAction extends BreezeEnum {
|
|
6
|
-
/** Is this an 'attach' operation? ( Attach, AttachOnQuery or AttachOnImport) */
|
|
7
|
-
isAttach() {
|
|
8
|
-
return !!this._isAttach;
|
|
9
|
-
}
|
|
10
|
-
/** Is this a 'detach' operation? ( Detach, Clear) */
|
|
11
|
-
isDetach() {
|
|
12
|
-
return !!this._isDetach;
|
|
13
|
-
}
|
|
14
|
-
/** Is this a 'modification' operation? ( PropertyChange, MergeOnQuery, MergeOnSave, MergeOnImport, RejectChanges) */
|
|
15
|
-
isModification() {
|
|
16
|
-
return !!this._isModification;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
/** Entity was attached via an AttachEntity call. */
|
|
20
|
-
EntityAction.Attach = new EntityAction({ _isAttach: true });
|
|
21
|
-
/** Entity was attached as a result of a query. */
|
|
22
|
-
EntityAction.AttachOnQuery = new EntityAction({ _isAttach: true });
|
|
23
|
-
/** Entity was attached as a result of an import. */
|
|
24
|
-
EntityAction.AttachOnImport = new EntityAction({ _isAttach: true });
|
|
25
|
-
/** Entity was detached */
|
|
26
|
-
EntityAction.Detach = new EntityAction({ _isDetach: true });
|
|
27
|
-
/** Properties on the entity were merged as a result of a query. */
|
|
28
|
-
EntityAction.MergeOnQuery = new EntityAction({ _isModification: true });
|
|
29
|
-
/** Properties on the entity were merged as a result of an import. */
|
|
30
|
-
EntityAction.MergeOnImport = new EntityAction({ _isModification: true });
|
|
31
|
-
/** Properties on the entity were merged as a result of a save */
|
|
32
|
-
EntityAction.MergeOnSave = new EntityAction({ _isModification: true });
|
|
33
|
-
/** A property on the entity was changed. */
|
|
34
|
-
EntityAction.PropertyChange = new EntityAction({ _isModification: true });
|
|
35
|
-
/** The EntityState of the entity was changed. */
|
|
36
|
-
EntityAction.EntityStateChange = new EntityAction();
|
|
37
|
-
/** AcceptChanges was called on the entity, or its entityState was set to Unmodified. */
|
|
38
|
-
EntityAction.AcceptChanges = new EntityAction();
|
|
39
|
-
/** RejectChanges was called on the entity. */
|
|
40
|
-
EntityAction.RejectChanges = new EntityAction({ _isModification: true });
|
|
41
|
-
/** The EntityManager was cleared. All entities detached. */
|
|
42
|
-
EntityAction.Clear = new EntityAction({ _isDetach: true });
|
|
43
|
-
EntityAction.prototype._$typeName = "EntityAction";
|
|
44
|
-
Error['x'] = EntityAction.resolveSymbols();
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2JyZWV6ZS1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvZW50aXR5LWFjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRW5DOztFQUVFO0FBRUYsTUFBTSxPQUFPLFlBQWEsU0FBUSxVQUFVO0lBdUMxQyxnRkFBZ0Y7SUFDaEYsUUFBUTtRQUNOLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUNELHFEQUFxRDtJQUNyRCxRQUFRO1FBQ04sT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBQ0QscUhBQXFIO0lBQ3JILGNBQWM7UUFDWixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7O0FBaERELG9EQUFvRDtBQUM3QyxtQkFBTSxHQUFHLElBQUksWUFBWSxDQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDdkQsbURBQW1EO0FBQzVDLDBCQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztBQUM1RCxxREFBcUQ7QUFDOUMsMkJBQWMsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0FBRTdELDBCQUEwQjtBQUNuQixtQkFBTSxHQUFHLElBQUksWUFBWSxDQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFFdkQsbUVBQW1FO0FBQzVELHlCQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNsRSxxRUFBcUU7QUFDOUQsMEJBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ25FLGlFQUFpRTtBQUMxRCx3QkFBVyxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFFakUsNENBQTRDO0FBQ3JDLDJCQUFjLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztBQUVuRSxpREFBaUQ7QUFDMUMsOEJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztBQUU5Qyx3RkFBd0Y7QUFDakYsMEJBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0FBQzFDLDhDQUE4QztBQUN2QywwQkFBYSxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFbEUsNkRBQTZEO0FBQ3RELGtCQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztBQXFCdEQsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDO0FBQ25ELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVlemVFbnVtfSBmcm9tICcuL2VudW0nO1xyXG5cclxuLyoqIEVudGl0eUFjdGlvbiBpcyBhbiAnRW51bScgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbGlkIGFjdGlvbnMgdGhhdCBjYW4gb2NjdXIgdG8gYW4gJ0VudGl0eScuIFxyXG4gXHJcbiovXHJcblxyXG5leHBvcnQgY2xhc3MgRW50aXR5QWN0aW9uIGV4dGVuZHMgQnJlZXplRW51bSB7XHJcblxyXG4gIC8qKiBFbnRpdHkgd2FzIGF0dGFjaGVkIHZpYSBhbiBBdHRhY2hFbnRpdHkgY2FsbC4gKi9cclxuICBzdGF0aWMgQXR0YWNoID0gbmV3IEVudGl0eUFjdGlvbiggeyBfaXNBdHRhY2g6IHRydWUgfSk7XHJcbiAgLyoqICBFbnRpdHkgd2FzIGF0dGFjaGVkIGFzIGEgcmVzdWx0IG9mIGEgcXVlcnkuICovXHJcbiAgc3RhdGljIEF0dGFjaE9uUXVlcnkgPSBuZXcgRW50aXR5QWN0aW9uKHsgX2lzQXR0YWNoOiB0cnVlfSk7XHJcbiAgLyoqICBFbnRpdHkgd2FzIGF0dGFjaGVkIGFzIGEgcmVzdWx0IG9mIGFuIGltcG9ydC4gKi9cclxuICBzdGF0aWMgQXR0YWNoT25JbXBvcnQgPSBuZXcgRW50aXR5QWN0aW9uKHsgX2lzQXR0YWNoOiB0cnVlfSk7XHJcblxyXG4gIC8qKiBFbnRpdHkgd2FzIGRldGFjaGVkICovXHJcbiAgc3RhdGljIERldGFjaCA9IG5ldyBFbnRpdHlBY3Rpb24oIHsgX2lzRGV0YWNoOiB0cnVlIH0pO1xyXG5cclxuICAvKiogUHJvcGVydGllcyBvbiB0aGUgZW50aXR5IHdlcmUgbWVyZ2VkIGFzIGEgcmVzdWx0IG9mIGEgcXVlcnkuICovXHJcbiAgc3RhdGljIE1lcmdlT25RdWVyeSA9IG5ldyBFbnRpdHlBY3Rpb24oeyBfaXNNb2RpZmljYXRpb246IHRydWUgfSk7XHJcbiAgLyoqIFByb3BlcnRpZXMgb24gdGhlIGVudGl0eSB3ZXJlIG1lcmdlZCBhcyBhIHJlc3VsdCBvZiBhbiBpbXBvcnQuICovXHJcbiAgc3RhdGljIE1lcmdlT25JbXBvcnQgPSBuZXcgRW50aXR5QWN0aW9uKHsgX2lzTW9kaWZpY2F0aW9uOiB0cnVlIH0pO1xyXG4gIC8qKiBQcm9wZXJ0aWVzIG9uIHRoZSBlbnRpdHkgd2VyZSBtZXJnZWQgYXMgYSByZXN1bHQgb2YgYSBzYXZlICovXHJcbiAgc3RhdGljIE1lcmdlT25TYXZlID0gbmV3IEVudGl0eUFjdGlvbih7IF9pc01vZGlmaWNhdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgLyoqIEEgcHJvcGVydHkgb24gdGhlIGVudGl0eSB3YXMgY2hhbmdlZC4gKi9cclxuICBzdGF0aWMgUHJvcGVydHlDaGFuZ2UgPSBuZXcgRW50aXR5QWN0aW9uKHsgX2lzTW9kaWZpY2F0aW9uOiB0cnVlfSk7XHJcblxyXG4gIC8qKiBUaGUgRW50aXR5U3RhdGUgb2YgdGhlIGVudGl0eSB3YXMgY2hhbmdlZC4gKi9cclxuICBzdGF0aWMgRW50aXR5U3RhdGVDaGFuZ2UgPSBuZXcgRW50aXR5QWN0aW9uKCk7XHJcblxyXG4gIC8qKiBBY2NlcHRDaGFuZ2VzIHdhcyBjYWxsZWQgb24gdGhlIGVudGl0eSwgb3IgaXRzIGVudGl0eVN0YXRlIHdhcyBzZXQgdG8gVW5tb2RpZmllZC4gKi9cclxuICBzdGF0aWMgQWNjZXB0Q2hhbmdlcyA9IG5ldyBFbnRpdHlBY3Rpb24oKTtcclxuICAvKiogUmVqZWN0Q2hhbmdlcyB3YXMgY2FsbGVkIG9uIHRoZSBlbnRpdHkuICovXHJcbiAgc3RhdGljIFJlamVjdENoYW5nZXMgPSBuZXcgRW50aXR5QWN0aW9uKHsgX2lzTW9kaWZpY2F0aW9uOiB0cnVlfSk7XHJcblxyXG4gIC8qKiBUaGUgRW50aXR5TWFuYWdlciB3YXMgY2xlYXJlZC4gIEFsbCBlbnRpdGllcyBkZXRhY2hlZC4gKi9cclxuICBzdGF0aWMgQ2xlYXIgPSBuZXcgRW50aXR5QWN0aW9uKHsgX2lzRGV0YWNoOiB0cnVlfSk7XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9pc0F0dGFjaD86IGJvb2xlYW47XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2lzRGV0YWNoPzogYm9vbGVhbjtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfaXNNb2RpZmljYXRpb246IGJvb2xlYW47XHJcbiAgLyoqIElzIHRoaXMgYW4gJ2F0dGFjaCcgb3BlcmF0aW9uPyAoIEF0dGFjaCwgQXR0YWNoT25RdWVyeSBvciBBdHRhY2hPbkltcG9ydCkgKi9cclxuICBpc0F0dGFjaCgpIHtcclxuICAgIHJldHVybiAhIXRoaXMuX2lzQXR0YWNoO1xyXG4gIH1cclxuICAvKiogSXMgdGhpcyBhICdkZXRhY2gnIG9wZXJhdGlvbj8gKCBEZXRhY2gsIENsZWFyKSAqL1xyXG4gIGlzRGV0YWNoKCkge1xyXG4gICAgcmV0dXJuICEhdGhpcy5faXNEZXRhY2g7XHJcbiAgfVxyXG4gIC8qKiBJcyB0aGlzIGEgJ21vZGlmaWNhdGlvbicgb3BlcmF0aW9uPyAoIFByb3BlcnR5Q2hhbmdlLCBNZXJnZU9uUXVlcnksIE1lcmdlT25TYXZlLCBNZXJnZU9uSW1wb3J0LCBSZWplY3RDaGFuZ2VzKSAqL1xyXG4gIGlzTW9kaWZpY2F0aW9uKCkge1xyXG4gICAgcmV0dXJuICEhdGhpcy5faXNNb2RpZmljYXRpb247XHJcbiAgfVxyXG59XHJcbkVudGl0eUFjdGlvbi5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiRW50aXR5QWN0aW9uXCI7XHJcbkVycm9yWyd4J10gPSBFbnRpdHlBY3Rpb24ucmVzb2x2ZVN5bWJvbHMoKTtcclxuXHJcblxyXG5cclxuIl19
|